最近推出了yolo-v4我也准备试着跑跑实验看看效果,看看大神的最新操作
这里不做打标签工作和配置cuda工作,需要的可以分别百度搜索 VOC格式数据集制作,cuda和cudnn配置
我们直接利用VOC格式训练自己数据集的模型
笔者也是 根据官方github的readme操作的 没看懂可以进入官方链接看看英文介绍,或者在issue里面提问,笔者花了一天 也算是跑通了数据集的代码。
paper
https://arxiv.org/abs/2004.10934
github
https://github.com/AlexeyAB/darknet
— 1.首先测试原始权重效果
– 1.下载预训练权重
– 2.编译
– 3.测试
— 2.训练自己的数据集
– 1.创建yolo-obj.cfg 文件
– 2.制作obj.names
– 3.制作obj.data
– 4.放入源图片
– 5.制作train.txt
– 6.开始训练
1.下载预训练权重
放上链接
有翻墙则:
https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
百度网盘:
链接:https://pan.baidu.com/s/16wOHbaa2mG7cTZ_RcGjRnw
提取码:99bl
下载好yolov4.weights 权重后 放在主目录下即可
2.编译文件 该方法为使用makefile方法编译
打开Makefile文件 修改该文件
修改该文件中前4行 —- 0都改为1
代表使用GPU测试和训练(前提是安装好了cuda和cudnn的机器,安装方法 直接百度搜 cuda和cudnn就有很多教程)
如果没安装过cuda则不用改
执行以下命令编译
make
然后主目录中出现darknet文件
3.运行该文件
./darknet
如果编译成功则会出现以下信息
usage: ./darknet<function>
现在可以测试初始预训练权重效果了
./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg
成功则在主目录下出现predictions.jpg 图片为预测后的图片
效果如下
2.训练自己的数据集
–2.1创建yolo-obj.cfg 文件,将 yolov4-custom.cfg 中的内容复制到 yolo-obj.cfg里面并做以下修改。
–2.1.1修改subdivisions=16(如果报内存不足,将subdivisions设置为32或64)
–2.1.2修改max_batches=classes*2000 例如有2个类别人和车 ,那么就设置为4000
–2.1.3修改steps为80% 到 90% 的max_batches值 比如max_batches=4000,则steps=3200,3600
–2.1.4修改classes,先用ctrl+F搜索 [yolo] 可以搜到3次,每次搜到的内容中 修改classes=你自己的类别 比如classes=2
–2.1.5修改filters,一样先搜索 [yolo] ,每次搜的yolo上一个[convolution] 中 filters=(classes + 5)x3 比如filters=21
–2.1.6如果要用[Gaussian_yolo] ,则搜索[Gaussian_yolo] 将[filters=57
] 的filter 修改为 filters=(classes + 9)x3 (这里我没用到,但是还是修改了)
–2.2制作obj.names,在build\darknet\x64\data\ 文件夹下创建obj.names文件。内容为你的类别 比如人和车 那么obj.names 为如下
person
car
–2.3制作obj.data,在build\darknet\x64\data\文件夹下创建obj.data文件。内容如下
classes= 2
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
笔者在这读取不到data/下文件 所以改为绝对路径 就可以了 这是我的obj.data文件
–2.4放入源图片,在build\darknet\x64\data\文件夹下创建obj文件夹,存放所有的原始图片
笔者在这里遇到问题,就是我是VOC格式的图片如下
└── VOCdevkit
└── VOC2012
├── Annotations
├── ImageSets
│ ├── Main
├── JPEGImages
但是yoloV4需要的训练集不是这样,现在说下制作过程
先进入script下有一个文件voc_label.py,利用该代码可以得到我们想要的txt标注信息 类似xml文件信息
首先注释掉classes=[………….] 替换里面类别为自己的类别(我是做垃圾检测 所以是litter) 然后我的voc是2007的 所以也取消掉2012的修改如下
然后将所有出现的 VOCdevkit修改为 VOCdevkit2007 ,因为我的目录是 (这里根据你们的数据集更改 要求找到对应的目录就可以了)
–VOCdevkit2007
–VOC2007
–ImageSets
然后在同级目录下会出现labels文件 这个就是xml对应的txt文件,
将labels中文件放入之前的build\darknet\x64\data\obj中
那么obj文件中会同时存在源图片同名txt文件
这样就完成了txt的制作了
–2.5最后是制作train.txt
–2.5.1需要以下格式的train.txt
–2.5.2可以使用如下代码制作
import os
from os import listdir, getcwd
from os.path import joinif __name__ == '__main__':
source_folder =r'G:\jianfeng\project\rubblish_det\yolov4\darknet-master\darknet-master\cfg\JPEGImages'
dest = r'G:\jianfeng\project\rubblish_det\yolov4\darknet-master\darknet-master\cfg\1/train.txt'
dest2 = r'G:\jianfeng\project\rubblish_det\yolov4\darknet-master\darknet-master\cfg\1/val.txt'
file_list = os.listdir(source_folder)
train_file = open(dest, 'a')
val_file = open(dest2, 'a')
i=0
for file_obj in file_list:
file_name, file_extend = os.path.splitext(file_obj) if (i%4 ==0):
#val_file.write(file_name+".jpg" + '\n') 相对路径
val_file.write("build/darknet/x64/data/obj/"+file_name+".jpg" + '\n')
else:
#train_file.write(file_name+".jpg" + '\n')
train_file.write("build/darknet/x64/data/obj/"+file_name+".jpg" + '\n')
i+=1
train_file.close()
val_file.close()
其中dest和dest2可以根据自己需要更改
但是这里遇到些问题就是 我的程序无法识别相对路径data/,所以我把路径改为了绝对路径 build/darknet/x64/data/obj/下的文件。如下
现在就完成了所以制作,可以开始训练了
–2.6.下载权重 和之前的权重不一样
链接:https://pan.baidu.com/s/1yhB8pRcGH84gyRWeNictBA
提取码:gi4d
下载好放入主目录中
–2.7.开始训练
./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137
如果要使用gpu的话输入以下
./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -gpus gpu_id
出现以下画面 则正在训练
最终效果图
———————————————————————————————————————————————————————————————————————————————
错误问题总结:
1.mosaic=1 – compile Darknet with OpenCV for using mosaic=1
因为在设置中使用了opencv(c++版本),而我们没有安装导致的。将之前修改的yolo-obj.cfg中搜索mosaic将1改为0。
mosaic=1 #--》 更改为0
2.make时 出现以下错误
chmod +x *.sh
g++ -std=c++11 -std=c++11 -Iinclude/ -I3rdparty/stb/include -DGPU -I/usr/local/cuda/include/ -DCUDNN -DCUDNN_HALF -Wall -Wfatal-errors -Wno-unused-result -Wno-unknown-pragmas -fPIC -Ofast -DGPU -DCUDNN -I/usr/local/cudnn/include -DCUDNN_HALF -c ./src/image_opencv.cpp -o obj/image_opencv.o
In file included from ./src/image.h:3:0,
from ./src/image_opencv.h:4,
from ./src/image_opencv.cpp:1:
include/darknet.h:41:26: fatal error: cuda_runtime.h: No such file or directory
compilation terminated.
Makefile:165: recipe for target 'obj/image_opencv.o' failed
make: *** [obj/image_opencv.o] Error 1
出现原因是cuda的path不对导致
先查看自己cuda版本 输入 nvcc -V
查看主目录下Makefile文件
搜/usr/local/cuda/xxx 目录
我的原始文件是/usr/local/cuda/xxx ,cuda版本是9.0 所以
将cuda –>改为cuda-9.0 即可 如下
/usr/local/cuda-9.0/xxx
测试test.txt数据集时的命令(并将结果保存至result.txt中):
./darknet detector test darknet.data darknet-yolov3.cfg darknet-yolov3_final.weights -thresh 0.25 -dont_show -ext_output < data/test.txt > result.txt
恭喜你看完了,有问题可以评论,或者去github上面提问,问作者问题更靠谱哦 ^ – ^