数据特点
截取出来的图片需要包含有目标(浮球)。截取的图片尽可能包含不同的外界环境,例如:阴天和晴天,白天和黑夜等。条件允许的情况下,截取尽可能多的图片。截取步骤
使用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张作为测试集。
编写简单的重命名脚本,以阿拉伯数字为图片数据命名。(选做步骤,只是为了更加清晰。)
使用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比较简单,反过来比较复杂)
从yovoV5官方网站下载源代码
解压源程序,复制到项目目录下。测试过程的项目名是yolo v5
在pycharm中打开终端,将yolov5目录设为当前工作目录
安装依赖包
pip install -U -r requirements.txt创建和配置数据目录
在YOLO V5的同级目录下建立coco128文件夹,其目录结构为: 一定要注意这个文件夹和yoloV5文件夹是并列的,而不是其子文件夹!images文件夹中存放图片文件,labels文件夹中存放标签文件。train2017中存放的都是训练集,val2017中存放验证集。修改训练参数
根据电脑的配置和数据情况修改训练参数。
修改配置文件
根据上图中配置好的参数,修改配置文件。例如,在上图中选择了coco128.yam,则需要在coco128.yam文件中配置目标检测的种类及其数量。
# number of classes nc: 2 # class names names: ['ball', 'fish']在以上测试数据中,只有“ball”和“fish”两种数据。 同理,由于选择了yoloV5S,需要修改yolov5s.yam文件中的设置。只用修改nc变量的值。
执行train.py,开始训练,观察日志。
等待训练结束。
标签情况
数据收敛情况
在训练过程中,会自动生成一个收敛情况图。默认的训练轮次为300。由于测试中使用的数据比较单一,这里讲训练轮次降低到了100轮,各个参数基本达到了收敛。
标记情况
在测试集中的表现情况
视频中的表现
测试模型在原始视频中的表现
批量重命名脚本
@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)