
1. TinyPerson数据集与YOLOv8训练概述TinyPerson是一个专注于小目标检测的公开数据集包含大量远距离拍摄的人物图像目标尺寸普遍较小。这类数据在安防监控、无人机巡检等场景中非常常见。由于YOLOv8是目前最先进的实时目标检测框架之一将TinyPerson数据集转换为YOLO格式进行训练具有很高的实用价值。原始数据集采用COCO JSON格式存储标注信息而YOLOv8训练需要TXT格式的标注文件。这个转换过程看似简单但实际操作时会遇到几个典型问题坐标系的转换、文件路径的处理、类别ID的映射等。我在处理这个数据集时发现很多新手会在这些环节出错导致训练时出现找不到标签或坐标越界等错误。2. COCO到YOLO格式转换详解2.1 理解两种格式的本质差异COCO格式使用绝对坐标和原始像素值标注信息存储在JSON文件中结构如下{ images: [{file_name: 001.jpg, width: 640, height: 480}], annotations: [{image_id: 0, bbox: [100, 200, 50, 80]}] }而YOLO格式要求每个图像对应一个TXT文件使用相对坐标0-1之间格式class_id x_center y_center width height2.2 完整转换脚本解析这个增强版的转换脚本增加了错误处理和日志记录import os import json from tqdm import tqdm import argparse import logging # 配置日志记录 logging.basicConfig(filenameconversion.log, levellogging.INFO) def validate_bbox(size, box): 检查边界框是否有效 if box[2] 0 or box[3] 0: logging.warning(fInvalid bbox dimensions: {box}) return False if box[0] 0 or box[1] 0: logging.warning(fNegative bbox coordinates: {box}) return False if (box[0] box[2]) size[0] or (box[1] box[3]) size[1]: logging.warning(fBbox exceeds image boundaries: {box}) return False return True def convert(size, box): 核心坐标转换函数 dw 1. / size[0] dh 1. / size[1] x box[0] box[2] / 2.0 y box[1] box[3] / 2.0 w box[2] h box[3] return (round(x*dw,6), round(y*dh,6), round(w*dw,6), round(h*dh,6)) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--json_path, requiredTrue, help输入COCO JSON文件路径) parser.add_argument(--save_path, requiredTrue, help标签输出目录) parser.add_argument(--img_dir, help图像目录用于生成训练列表) args parser.parse_args() # 创建输出目录 os.makedirs(args.save_path, exist_okTrue) with open(args.json_path) as f: data json.load(f) # 处理类别映射 id_map {cat[id]: i for i, cat in enumerate(data[categories])} # 生成类别文件 with open(f{args.save_path}/classes.txt, w) as f: f.write(\n.join([cat[name] for cat in data[categories]])) # 处理每张图像 for img in tqdm(data[images]): img_id img[id] filename img[file_name] base_name os.path.splitext(filename)[0] label_path os.path.join(args.save_path, f{base_name}.txt) annotations [ann for ann in data[annotations] if ann[image_id] img_id] with open(label_path, w) as f: for ann in annotations: if validate_bbox((img[width], img[height]), ann[bbox]): box convert((img[width], img[height]), ann[bbox]) f.write(f{id_map[ann[category_id]]} { .join(map(str, box))}\n) logging.info(转换完成)关键改进点增加了边界框验证逻辑使用exist_okTrue避免目录已存在的错误更清晰的日志记录更健壮的文件路径处理3. YOLOv8训练配置实战3.1 数据集目录结构规范正确的目录结构对训练成功至关重要tinyperson/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ ├── train.txt └── val.txt3.2 数据配置文件tinyperson.yamlpath: /path/to/tinyperson train: images/train val: images/val names: 0: person3.3 完整训练命令与参数解析基础训练命令yolo detect train datatinyperson.yaml modelyolov8n.pt epochs100 imgsz640高级参数配置yolo detect train \ datatinyperson.yaml \ modelyolov8s.pt \ epochs300 \ patience50 \ batch16 \ imgsz640 \ optimizerAdamW \ lr00.001 \ cos_lrTrue \ label_smoothing0.1 \ dropout0.2 \ weight_decay0.0005针对小目标的特殊配置yolo detect train \ --data tinyperson.yaml \ --model yolov8n.pt \ --imgsz 1280 \ # 使用更大分辨率检测小目标 --batch 8 \ # 减小batch size以适应大分辨率 --mosaic 0.5 \ # 调整mosaic数据增强概率 --copy_paste 0.2 \ # 启用copy-paste增强 --fliplr 0.5 \ --degrees 10.0 \ --translate 0.1 \ --scale 0.5 \ --shear 2.04. 小目标检测的优化技巧4.1 数据增强策略针对小目标的特点我推荐这些增强组合大尺度训练使用1280x1280或更大的输入尺寸马赛克增强提高小目标的上下文信息随机粘贴人工增加小目标的密度适度旋转不超过10度避免目标变形4.2 模型结构调整修改YOLOv8的配置文件# yolov8.yaml head: - [-1, 1, nn.Upsample, [None, 2, nearest]] # 上采样层 - [[-1, -2], 1, Concat, [1]] # 增加特征融合 - [-1, 3, C2f, [512]] # 增加小目标检测头4.3 训练监控与调优使用WB等工具监控关键指标yolo detect train ... projecttinyperson nameexp1 wandbTrue重点关注mAP0.5:0.95整体检测精度mAP0.5小目标检测效果P/R曲线查准率与召回率平衡5. 常见问题与解决方案5.1 标签文件找不到典型错误WARNING: No labels found in /path/to/labels/train检查步骤确认标签文件与图像文件同名仅扩展名不同检查标签文件是否为空小目标可能被过滤验证目录结构是否符合YOLO要求5.2 坐标越界错误解决方案在转换脚本中添加边界检查使用clip_coords函数限制坐标范围检查原始标注是否有误5.3 训练不收敛的可能原因学习率问题尝试lr00.01到lr00.0001的范围数据不平衡小目标占比过低时增加复制粘贴增强模型容量不足换用更大的YOLOv8模型如yolov8m.pt输入分辨率过低至少使用640x640推荐1280x12806. 实际效果验证在TinyPerson验证集上的典型表现模型输入尺寸mAP0.5推理速度(FPS)YOLOv8n6400.42120YOLOv8n12800.5345YOLOv8s12800.5835提升小目标检测的关键点增大输入分辨率效果最明显适当增加模型深度有帮助数据增强策略影响显著我在实际项目中发现对于密集小目标场景将YOLOv8的检测头增加到3个同时使用1280x1280的输入尺寸可以在保持实时性的同时将mAP提升15%以上。训练时要注意观察验证集指标避免过拟合。