之前训练了云服务器上训练了YOLOV3,后来想训练一下YOLOV4,结果发现自己忘得差不多了,因此在训练完打算写一篇备忘,记录一下过程
需求:自己在图片中标注对象,然后训练自己的权重文件,拿到opencv中去用,不涉及到tf,Keras这些东西,就是最简单的训练出yolov4.weights,然后给cv::dnn::readNetFromDarknet()去用就OK
数据:个人习惯性先处理数据,因为简单,在任何电脑上只要安装了anaconda即可处理
需求:即标注数据,得到网络输入,终极目标:得到图像中目标的描述文件(txt文件)+图像的目录
最终是要在darknet-master\build\darknet\VOCdevkit\VOC2007\labels文件夹下得到如下 格式的TXT文件
其中darknet-master是从GitHub下载的YOLOV4源码的压缩文件的解压目录文件夹
第一个参数:0是指类别编号
第二个参数:0.4641255605381166是归一化后的中心点X坐标
第三个参数:0.34266926449098883 是归一化后的中心点Y坐标
第四个参数:0.04633781763826607是归一化后的目标宽度W
第五个参数:0.03263516804676084是归一化后的目标高度Y
为了实现这一步,过程与方法有两种:
法一:
(1)安装anaconda,在anaconda中新建labelImgenv环境,在labelImgenv环境中安装labelImg
(1.1)conda create -n labelImgenv
(1.2)conda activate labelImgenv
(1.3)pip install labelImg
(1.4)labelImg
直接使用labelImg标注工具进行标注,这块儿我一直喜欢用anaconda工具安装,使用是选择保存格式为YOLO格式(在save按钮下面,原为pascalVOC,点一下就是YOLO)
(2)第二种方法就是借用以前的coco, vol数据集,写函数把从这些数据集读取目标信息,进行转换,然后写入\labels文件夹中的TXT文件,这种方法我操作过,确实比第一种繁琐一些,主要需要去借用别人的代码,改各种文件路径,最后殊途同归,目的也是数据。根据自己的需求吧,要是想处理coco, vol数据集(不是指格式,而是指借用以前标注的json文件等),就可以这种
环境:
(1)系统:Windows10专业版64位,这个有一点记不清了,好像是Windows10的某些版本不支持CUDA的安装,因此图方便的话,在重做系统的时候尽量不要做一些比较少见+最新的系统(win10一个系统会有很多版本号,在MSDN上下载的时候可以就可以发现),因为硬件NVIDIA显卡可能不支持,特别是显卡较老,很可能不兼容最新系统
故障现象(大致):鲁大师能检测到独显的存在,后面的记不住了,大概率是显卡驱动安装不成功,小概率是CUDA安装不成功,这个可以问问店家,这款显卡测试过哪些版本号的系统,尽量安装测试过的版本号
(2)版本:Windows下训练YOLOV4,需要CUDA>10.0,cudnn>7.0,我用的是CUDA10.2,cudnn7.6.5,我的GPU是NVIDIA GTX 1660
这一步我安装的没有出现错误,也就没什么记录的,教程可以参考:https://blog.csdn.net/m0_37605642/article/details/98854753
其中,关于第二步,配置CUDNN,所谓的合并其实就是
(2.1)把CUDNN文件中bin文件夹中的文件复制到CUDA安装目录下的bin文件夹中去
(2.2)把CUDNN文件中include文件夹中的文件复制到CUDA安装目录下的include文件夹中去
(2.3)把CUDNN文件中lib文件夹中的文件复制到CUDA安装目录下的lib文件夹中去
这一步这篇文章讲的很详细:https://blog.csdn.net/weixin_38673554/article/details/90513732
(3)下载编译darknet:这一步主要就是编译生成darknet.exe(有GPU),无GPU生成darknet_no_gpu.exe
参照:https://blog.csdn.net/clover_my/article/details/89885187
此处需要注意的是:支持YOLOV4的最低版本是OpenCV4.4!!(推理)这个在此处其实不影响你编译,我在GPU上编译的时候是安装的OpenCV4.3,最后也成功编译生成并训练得到了yolov4_final.weights,但是readNetFromDarknet不成功,所以最好一步到位,直接用OpenCV4.4以上版本!!!
(4)数据组织
(4.1 一级目录:VOCdevkit)在D:\........\darknet-master\build\darknet\VOCdevkit文件夹下有一个VOC2007文件夹与train.txt文件(先空着)
(4.1.1 二级目录:VOC2007)VOC2007文件夹下有labels文件夹和JPEGImages文件夹
(4.1.1.1 三级目录一:labels)labels文件夹中是labelImg标注出来的数据,直接拷贝进来即可(我选择性的标注了一些文件,所以编号不连续)
(4.1.1.2 三级目录二:JPEGImages)存原始图片
4.2 填写train.txt,里面是JPEGImages里面jpg文件的全路径名,大概这种
新建一个 train.txt,复制:
dir /b/s/p/w *.jpg > train.txt
修改后缀.txt----->.bat
双击运行
得到train.txt,放到文件夹:D:\........\darknet-master\build\darknet\VOCdevkit
5 训练数据集
(5.1修改yolov4.cfg)这个和修改yolov3.cfg基本一样,没啥大区别,这个就是cfg文件比较多,修改哪里的都欧克,但是最后训练的时候要写对,我修改的是darknet-master\build\darknet\x64\cfg文件夹下的
(5.1.1)修改batchsize,可以不改,跑起来后代码会提示你怎么设置
[net]
batch=64
subdivisions=64
(5.1.2)修改classes,搜索,一共有三个,修改成实际数量
(5.1.3)修改filters,比较多,按照filters = ((5 + 类别数) * 3 )修改,方法是搜索filters=255,改成18(我的是类别数 = 1,(5 + 1 )* 3 = 18)
(5.2设置训练路径)打开darknet-master\build\darknet\x64\data下的voc.data文件,修改
classes= 1
train = D:\。。。。。\darknet-master\build\darknet\VOCdevkit\train.txt
#valid = D:\。。。。。\darknet-master\build\darknet\VOCdevkit\test.txt
#difficult = data/difficult_2007_test.txt
names = data/voc.names
backup = D:\。。。。。\darknet-master\build\darknet\x64\results
(5.3设置目标名称)打开darknet-master\build\darknet\x64\data下的voc.names文件,修改
填上自己的对象名称即可
(5.4)下载预训练模型,放进darknet-master\build\darknet\x64\weights_pr
(5.5)训练模型,新建 开始训练.bat 在文件夹:darknet-master\build\darknet\x64下
输入:darknet.exe detector train .\data\voc.data .\cfg\yolov4.cfg .\weights_pr\darknet53.conv.74 .\results
这些路径就是你5.1 / 5.2 / 5/3步骤修改的,所以如果你修改了其他位置的,替换对应位置即可,不太熟悉./的可以直接全路径吧
参数解释:
.\data\voc.data------------------------------------------>darknet-master\build\darknet\data\voc.data
.\cfg\yolov4.cfg------------------------------------>darknet-master\build\darknet\cfg\yolov4.cfg
.\weights_pr\darknet53.conv.74 ------------------->darknet-master\build\darknet\weights_pr\darknet53.conv.74
.\results--------------------------------------------------->darknet-master\build\darknet\results
这块的路径太多,容易乱,最好有自己的习惯
有下面这张图应该就OK了,这张是我刚刚用CPU跑的,凑活看看吧
实际上GPU就是快,我在GTX1660上跑的,大概360张左右的图片,50000步跑了24个小时就OK了,在CPU上跑了一下,一步跑了居然五个小时。。。。
CPU跑的话,无非就是就是生成darknet_no_gpu.exe,同时在5.5使用的是darknet_no_gpu.exe 而不是,darknet.exe
报错:
(1)
提示:Can't open label file. (This can be normal only if you use MSCOCO): D:/.。。。。/darknet-master/build/darknet/VOCdevkit/VOC2007/labels/010033.txt
原因:打不开文件,因为train.txt中的JPEGImages名称生成的多了,没有对应的labels/010033.txt
解决办法:删掉对应的名称,可以程序可以自己手动
实际上好像你不删也能运行