由于项目原因,需要自己用yolo网络训练自己的网络,适逢端午,遂欲出一期简单的教学。
重要的资源和说明
Yolo v4, v3 and v2 for Windows and Linux
本教程基于AlexeyAB的darknet方案进行,该教程叙述详尽,只要跟着该教程走应该都能做出来。本文仅列举一些比较常见的错误。
建议教程就使用上述链接,其余链接版本过旧,不保证成功。
配置环境是非常繁琐的,可以看这个视频作为参考。
开始
1、自制数据集
笔者使用 LabelImg 软件进行配置。
使用方法/技巧:
- 首先打开data下的predefined_classes.txt,并往里面写入你需要分的类别
- Open Dir 打开需要标记的图片路径
- Change Save Dir 打开 label.txt 的存放路径(label.txt 就是标记数据,包括种类和位置)
- 按w开始画框,选择Advanced Mode可以不用按w就能画框,更加快速
- 标记时可以重叠,哪怕完全包含也可以。(比如标记汽车时也把车旁的人也标记进去了,这没关系)
- 记得
Change save format
,默认是PascalVOC
,要改成YOLO
- 如果不能打开该软件,考虑直接在下载目录处解压使用,不要解压后再复制到其他地方使用。
2、配置环境
配置环境根据视频和GitHub教程进行。
教程章节:Requirements for Windows, Linux and macOS
注意点:
- 安装CUDA需要和本机显卡匹配,笔者自定义安装CUDA结束后,安装的文件夹被删除,推测原因是:安装的目标路径和一开始给定的缓存路径是同一路径。但是笔者没有去验证这种可能性,用了标准安装方法,也能正常运行。
- 安装CUDNN需要和CUDA匹配,CUDNN下载需要注册,得自己找资源
- 安装Opencv,具体版本根据GitHub要求
- 据说要先安装visual studio,再安装CUDNN才不会出错
3、通过CMake编译
这一步会得到我们后面要使用的 darknet.exe
。照着视频和Github教程来即可。
教程章节:How to compile on Windows (using CMake
)
注意点:
-
使用CMake编译时,容易报错:
opencv ... has no binaries compatible with your configuration
解决方法:在CMake的路径中把OpenCV_DIR修改为
build/x64/vc15/lib
,环境变量那里也改成这个

- 在Visual Studio里生成解决方案(build)时,因为代码给的工程使用的CUDA一般而言和我们电脑支持的CUDA版本不一样,因此还需要对工程的有关部份进行修改,详情看视频
4、训练
这一步比较简单,看着GitHub教程即可。
教程章节:How to train (to detect your custom objects)
注意点:
-
需要自己进行修改的(教程没说,但是要根据自己网络调参):anchor、learning rate等超参数
-
教程里将label和image都放入obj文件夹中,执行训练命令,可能会出现
Can‘t open label file(This can be normal only if you use MSCOCO)
的报错。解决方法:在确保train.txt和valid.txt都指向无误后,重新确认一下是不是所有图片都有对应的label(特别是报错的那几个图片),笔者因为标注时漏了两张而出现该错误。
-
若出现
Error:Opencv ... in load_data_detection()
,则说明是train.txt和valid.txt中的路径错误,很可能是最后一个\
没有打(文件夹到文件那一层)。 -
若添加验证集(即有不同于train.txt的valid.txt),则验证集的选取要均匀,因为我们的数据集一般都是相邻好几个图片所拍摄的内容相近,因此如果验证集不连续,则训练和验证效果都不好(相当于没学的要考,学了的没考)。
-
教程中训练的命令为:
darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map
,其中map是同时画出mAP的图像,如果要训练自己的网络,则不需要添加权重文件(即所示命令中的yolov4.conv.137
),因为网络结构可能是不一样的,别人训练好的参数虽然可能可以加快你的网络收敛,但是网络都不一样也法用啊。 -
当loss几乎不再下降,mAP基本不变,recall接近1时,即可退出训练。
-
测试网络时的命令是:
darknet.exe detector test data/obj.data yolo-obj.cfg backup\last.weights
,可以添加参数:阈值,从而改变测试效果,即darknet.exe detector test data/obj.data yolo-obj.cfg backup\last.weights -thresh 0.5
。 -
x64\data
下的labels文件夹不要改动,它是存放字符图片的,和我们数据集中的label不是一回事。如果删掉了,那么你的yolo将不会有文字标识物品的类别。
笔者认为本章最难的地方在于路径的修改和匹配,网上还有很多配置数据集路径的方法,比如将图片和标签存到VOC2022下的JPEGImage和labels等文件夹。这些方法笔者没测试过,不过笔者能肯定,按照教程的方法是可以完成的,只要把常见的错误Can‘t open label file(This can be normal only if you use MSCOCO)
解决就好。
另外,教程中的技术上的细节这里并没有展开,那些细节能够帮助你更快的理解网络。
5、测试效果
这里就放几张图好了,嘻嘻。


- 本文作者: Oldsilly
- 本文链接: https://oldsilly.github.io/2022/06/05/使用yolo训练自己的网络/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!