从接触深度学习开始一直都做的是人脸识别,基本上也一直都在用mxnet. 记得之前在刚接触的时候看到博客中写到,深度学习分三个层次,第一个层次是分类,第二个层次是检测,第三个层次是分割。人脸识别算是分类问题,也就是一直在第一个层次···一直都想有机会了解下第二个层次,奈何精力有限,工作中也没有实际的项目需要。最近正好有个不急的检测项目,趁此机会入门检测吧。工作中听同事提到yolov5效果不错,而且文档指导也比较丰富,因此选择从此入手,顺便也熟悉下pytorch。本文就以训练一个简单的皮卡丘检测作为入门吧,也激发下对检测的学习兴趣,暂时不涉及网络,anchor等细节的理解,只以训练完为目标。
环境准备安装torch这些就不说了,本次训练基于yolov5官方项目:
https://github.com/ultralytics/yolov5
clone后,pip install -r requirements.txt安装各项依赖
基本的目录结构如下:
data: 训练数据和数据配置文件以及训练配置
models: 模型配置文件
utils: 数据读取、nms等各种训练测试中用到的脚本
weight:
train.py: 训练脚本
test.py:测试脚本
detect.py: 运行脚本
https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
根据官方指导,按需要的格式准备数据集:
一个图片文件对应一个同名的.txt label文件
label文件中每一行表示一个目标,格式为:class x_center y_center box_width box_height, 其中数值都是归一化的。类别从0开始
按类似目录方式防止数据,yolov5通过将图片路径中最后一个images换成labels去寻找对应的标签
coco/images/000000109622.jpg # image coco/labels/000000109622.txt # label本文中用的数据来源于 目标检测数据集(皮卡丘) 中,但原文是mxnet用的rec格式,因此需要转换成yolo格式。我已经转好了:
链接: 百度网盘数据集 提取码: rek1
下载后解压即可得到符合格式要求的数据。
数据示例:
在data目录下,我们可以看到一个coco.yaml,内容如下:
# COCO 2017 dataset - first 128 training images # Train command: python train.py --data coco128.yaml # Default dataset location is next to /yolov5: # /parent_folder # /coco128 # /yolov5 # download command/URL (optional) # download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip # train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/] train: ./data/coco128/images/train2017/ # 训练集图片路径 val: ./data/coco128/images/train2017/ # 验证集图片路径 # number of classes,类别数 nc: 80 # class names,类别名 names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']仿照这个格式,建立皮卡丘数据集的配置文件:
# COCO 2017 dataset - first 128 training images # Train command: python train.py --data coco128.yaml # Default dataset location is next to /yolov5: # /parent_folder # /coco128 # /yolov5 # download command/URL (optional) # download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip # train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/] train: ./data/pikachu/images/train/ # 128 images val: ./data/pikachu/images/val/ # 128 images # number of classes nc: 1 # class names names: ['pikachu'] 训练参数配置训练参数配置在data/hyp.finetune.yaml和hyp.scratch.yaml中,前者是finetune用的,后者是从头训练的。这次我们直接用hyp.finetune.yaml,先不做修改。
模型配置模型配置在models/yolov5s.yaml中。目前也不做修改。
开始训练训练使用train.py脚本,主要参数有:
--weights 预训练权重,“”表示从头训 --cfg 模型配置文件路径 --data 数据配置文件路径 --hyp 训练参数配置文件路径 --epochs 训练的epoch数 --batch-size --img-size 网络的输入大小 --noautoanchor 是否自动计算anchor --device 设备号 --workers dataloader线程数