darknet 是由 C 和 CUDA 开发的,不需要配置其他深度学习的框架(如,tensorflow、caffe 等),支持 CPU 和 GPU 运算,而且安装过程非常简单。
背景:ubuntu18.04
cuda 10.2 cudnn765
1 cmake安装和查看版本(安装之后补充)
cmake -version
2 opencv安装和查看版本(安装之后补充)
# 安装pkg-config
sudo apt-get install pkg-config
pkg-config --modversion opencv4
3 下载项目
git clone https://github.com/AlexeyAB/darknet.git
4 修改darknet/Makefile,即
修改一些基本配置
cd darknet # 在darknet目录里即可
vim Makefile # 或直接打开Makefile文件
“i”:插入修改,“Esc”:退出插入,“:wq” +“回车键”:保存并退出。
(安装了opencv,OPENCV=1)
编译(或:make)(就算不执行这一步的修改,git下来之后也需要编译)
make clean;make all
5 在darknet项目里下载权重(我这里使用了yolov4)
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
6 暂时在darknet里新建weights文件夹,方便管理weights们
7 测试:
下载已有的weights:
官网 GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet ) Pre-trained models
点击或
wget
https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
# 在darknet根目录里:
./darknet detector test cfg/coco.data cfg/yolov4.cfg weights/yolov4.weights data/dog.jpg
(以后推理也用这个格式:)
./darknet detector test
config.data、cfg、weights、数据的路径 -thresh 0.6
# 阈值设置可加可不加:-thresh指的是置信度多少下的推理
#(0.6是显示预测值大于60%的标签)
会显示结果,也会在根目录里生成:
1 数据集的准备:train和test(这里暂时无,可放),里面是图片和标签
—— 数据集目录名(CLT34)
——train目录
——images目录(里面是图片)
——labels目录(里面是txt的label)
——train.list(图片绝对路径)
生成list命令:
train(训练集)和vaild(测试集)写.jpg的list:
在数据集目录名里面运行终端(第一个):
# 含义:列出train里面的jpg,写进list里面
find `pwd`/train -name \*.jpg > train.list
find `pwd`/test -name \*.jpg > test.list
生成:
参考文件的格式,不要参考构造
(另外一种情况:images和label好像是要放一起,自己复制粘贴到images里面,否则会报错cant open)
1.1 我这里意图把把默认的(JPEGImages)那个图片文件夹的名字改成简洁的上面的images,于是需要在里做一下更改:
修改darknet的src/utils.c之后就可以分开放,修改275行,将注释去掉:
2 其他训练需要的内容准备:
为了自己方便训练,将所有训练要使用的材料放到一个文件夹里(应该是必须在darknet根目录下放文件夹),如图,看到里面有5个需要放置的东西,下面逐一介绍。
(config.两个的格式也可以是.txt,如:name.txt data.txt)
2.1 weight里面:再次下载预训练权重:yolov4.conv.137(慢)
官网啥都有:GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet )
(区分pre-trained model & pre-trained weights )
点击下载,或复制其链接然后:
wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137
2.2 cfg里面:复制darknet/cfg里yolov4-custom.cfg一份过来,并随意改名为 yolov4-obj.cfg
修改内容:
(1)testing:测评模型时batch、subdivisions必须为1,训练注释掉(下面有图)。不注释我这里会出现error,但enter可以跳过。但不清楚对训练是否存在影响。
(2)batch64,sub16.( 相当于batch_size是4)
(本地测试显卡拉的话,batch这里设置1,sub4)
(3)width和height也根据自己配置调小:608 to 416,我608会报错,改成416
(4)max_batches:一般一个类2000次,我没设置,同时修改steps=0.8max_batches,0.9max_batches。 训练次数达到max_batches后停止学习,一次为跑完一个batch,也就是别的深度学习模型的一个iteration(epoch=iteration*batch)
(5)(learning_rate开始训练前一般设置在0.001~0.01)
(6)修改每个[yolo]层下的classes,以及每个[yolo]层前一个[convolutional]的filters。(这里有三个yolo层)
【filters = (classes + 5)* 3】(3是yolo层的个数,大模型是3个yolo层)我是34个类,所以是117。
(7)至于anchor:好像可以重新聚类生成,但我不太会,留个坑4 config.names放自己的类
2.3 config.names
2.4 config.data 这个名字与格式可以是 .txt、.list 如:name.txt、name.list等
里面要写train的文件
先说后两个,比较简单,写之前说的config.names路径和权重存储路径
于是在data里生成了 train.list和test.list,把这config.data里面的train和valid路径补充好
3 训练:
./darknet detector train /home/susan/darknet/CLT34New/config.data /home/susan/darknet/CLT34New/yolov4-obj.cfg /home/susan/darknet/CLT34New/yolov4.conv.137 -map
(本地)
./darknet detector train build/darknet/x64/data/config.data build/darknet/x64/data/cfg/yolov4-obj.cfg build/darknet/x64/data/weights/yolov4.conv.137
backup里生成了权重;会出现图片
4 test:
./darknet detector map /home/susan/darknet/CLT34New/config.data /home/susan/darknet/CLT34New/yolov4-obj.cfg /home/susan/darknet/CLT34New/backup/yolov4-obj_best.weights
只需要:a.准备测试集(test文件夹里:images、labels、test.list),b.准备 backup里生成的新权重,c.修改config.data里面的valid路径,d.确保names路径正确。
结果例子:
5 推理只能生成一张图片
补充:
一、下面有个小例子讲解2.2(2)这个设置:
sub一般设置16,不能太大或太小,且为8的倍数,其实也没啥硬性规定,看着舒服就好。batch的值可以根据显存占用情况动态调整,一次性加减sub大小即可,通常情况下batch越大越好.
二、训练时终端出现:
为观察暂停:
How to train (to detect your custom objects)
训练次数达How to train (to detect your custom objects)到max_batches后停止学习,一次为跑完一个batch
Region xx: cfg文件中yolo-layer的索引;
Avg IOU:当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1;
Class: 标注物体的分类准确率,越大越好,期望数值为1;
obj: 越大越好,期望数值为1;
No obj: 越小越好;
.5R: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本
0.75R: 以IOU=0.75为阈值时候的recall;
count:正样本数目。
在darknet在默认的训练情况下在1000次之前每100次保存一次模型权重,1000之后则每10000次才保存一次模型权重
三、显卡显示:
train的时候:
四、另外:voc标准数据集(可参考这位博主)
没试过
Darknet框架下如何利用自己的数据集训练YOLOv4模型_乐观的lishan的博客-CSDN博客_darknet yolov4
可以根据~/darknet/scripts/voc_eval.py 将voc生成txt