0. 使用到的环境和工具
- Python 3.8.5
- PyCharm 2020.1.3
- yolo V5
- PyTorch 1.6.0
- Anaconda 管理工具
- labelImg, numpy, pandas等依赖包
- pot player播放器
- 含有GPU的计算机
- cuda
- cudnn
1. 准备训练数据
1.1 截取目标图片
-
数据特点
- 截取出来的图片需要包含有目标(浮球)。
- 截取的图片尽可能包含不同的外界环境,例如:阴天和晴天,白天和黑夜等。
- 条件允许的情况下,截取尽可能多的图片。
-
截取步骤
-
使用pot player播放器打开DAV视频文件。
-
找到含有浮球的视频片段。
-
在播放器中依次选择:Pot Player --> 视频 --> 图像截取 --> 连续截图。 如下图所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCV9Leju-1602160908049)(https://i.loli.net/2020/10/08/piM2Fz4mhsqr1jW.png)]
-
配置截图选项。这里按帧截取,如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E5kBkPC6-1602160908058)(https://i.loli.net/2020/10/08/ZdzvchpoeNuDiY9.png)]
-
重复选择视频片段,按照上述步骤截取多段数据。在测试案例中,共采集了2497张有效图片。其中2246张作为训练集,251张作为测试集。
-
编写简单的重命名脚本,以阿拉伯数字为图片数据命名。(选做步骤,只是为了更加清晰。)
-
1.2 为截取好的图片打标签
-
使用anaconda创建一个Python3.8环境,专门用于打标签。
conda create -n my_yolo_label python=3.8.5
-
激活创建的环境
conda activate my_yolo_label
-
安装程序运行需要的第三方依赖
pip install pyqt5 pip install pyqt5-tools pip install lxml pip install labelImg
-
打开labelImg
labelImg
-
开始打标签
-
点击Open Dir,选择到存放图片文件的目录,右下角的File List会展示出文件夹下所有的图片文件
-
点击Change Save Dir,选择保存标签文件的目录。
-
在键盘上敲下w,用鼠标标注出浮球区域,输入“ball”
-
ctrl + s,保存标签
-
按下“D”,标注下一张图片
-
常用快捷键:
快捷键 作用 ctrk + s 保存文件 w 矩形框 d 下一张 a 上一张
默认的标签类型是不是yolo格式的txt文件,而是Pascal VOC的xml格式。为了满足扩展需求,建议不修改默认设置,保存xml文件,在需要txt文件时,使用脚本做简单的转化。(这是因为从xml转到txt比较简单,反过来比较复杂)
-
2. 搭建训练环境
-
从yovoV5官方网站下载源代码
-
解压源程序,复制到项目目录下。测试过程的项目名是yolo v5
-
在pycharm中打开终端,将yolov5目录设为当前工作目录
-
安装依赖包
pip install -U -r requirements.txt
3. 开始训练
-
创建和配置数据目录
- 在YOLO V5的同级目录下建立coco128文件夹,其目录结构为:
- 一定要注意这个文件夹和yoloV5文件夹是并列的,而不是其子文件夹!
- images文件夹中存放图片文件,labels文件夹中存放标签文件。train2017中存放的都是训练集,val2017中存放验证集。
- 在YOLO V5的同级目录下建立coco128文件夹,其目录结构为:
-
修改训练参数
根据电脑的配置和数据情况修改训练参数。
-
修改配置文件
根据上图中配置好的参数,修改配置文件。例如,在上图中选择了coco128.yam,则需要在coco128.yam文件中配置目标检测的种类及其数量。
# number of classes nc: 2 # class names names: ['ball', 'fish']
在以上测试数据中,只有“ball”和“fish”两种数据。
同理,由于选择了yoloV5S,需要修改yolov5s.yam文件中的设置。只用修改nc变量的值。 -
执行train.py,开始训练,观察日志。
-
等待训练结束。
4. 训练结果
-
标签情况
-
数据收敛情况
在训练过程中,会自动生成一个收敛情况图。默认的训练轮次为300。由于测试中使用的数据比较单一,这里讲训练轮次降低到了100轮,各个参数基本达到了收敛。
-
标记情况
在测试集中的表现情况
-
视频中的表现
测试模型在原始视频中的表现
5. 常见问题
-
批量重命名脚本
@echo off setlocal enabledelayedexpansion set var=0 echo %var% set /a i = i + var for %%x in (*) do ( if not "%%x"=="rename.bat" ( set /a i+=1 rename "%%x" "!i!.jpg" ) ) pause
-
部分截取的数据没有目标物体,删除后导致的图片文件和标签文件不一一对应,需要找到两个文件夹中文件的不同。为此编写了如下脚本:
import os img_path = "D:\\PEGImages" anno_path = "D:\\Annotations" img_list = os.listdir(img_path) anno_list = os.listdir(anno_path) for img in img_list: if img in anno_list: continue else: print(img) for anno in anno_list: if anno in img_list: continue else: print(anno)