目录
配置流程参考:https://blog.csdn.net/weixin_42731241/article/details/81352013
https://blog.csdn.net/weixin_42731241/article/details/81474920
1.下载yolov3项目工程
git clone https://github.com/pjreddie/darknet
cd darknet
make
2.修改Makefile配置,使用GPU训练
GPU=1 #如果使用GPU设置为1,CPU设置为0
CUDNN=1 #如果使用CUDNN设置为1,否则为0
OPENCV=0 #如果调用摄像头,还需要设置OPENCV为1,否则为0,后续图片检测无法绘制,但可以保存
OPENMP=0 #如果使用OPENMP设置为1,否则为0
DEBUG=0 #如果使用DEBUG设置为1,否则为0
........................................................
ARCH= -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_35,code=[sm_35,compute_35]
.........................................................
NVCC=/usr/local/cuda-9.0/bin/nvcc #第23行
.........................................................
COMMON+= -DGPU -I/usr/local/cuda-9.0/include/ #第49行
..........................................................
LDFLAGS+= -L/usr/local/cuda-9.0/lib64 -lcuda -lcudart -lcublas -lcurand #第51行
只需改第23行对应着自己的cuda路径的数字,另外几行可以不需要改动,因为后两处我没有改,没有影响检测和训练。
3.测试图片
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg #使用下载的权重文件进行图片检测
出现yolov3 CUDA Error: out of memory darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.
修改 ./cfg/yolov3.cfg文件内:
取消test注释,改为train注释:
4.生成label文件
修改./scripts/voc_label.py,这个文件就是根据Main中txt里的文件名,生成相应的txt,里面存放的是它们的路径,共三处
数据类型不同话,这里踩了第一个坑,jpg与JPG大小写不同,不能识别,出现error stb:cannot fopen
1) 生成对应的五种txt文件
2).生成label 文件:对应annotation文件
第一列类别编号,从0开始,后四列标记框位置信息
这里出现第二个坑,训练时候出现全nan,因为好多博客都忽略这一点,想到annotation没有用,之后看了代码发现生成label文件为空,经查找发现我标记名错误airplane(记成plane),所以转换完成后看一下label文件
5.修改名称类别
1)修改cfg/voc.data
classes= 1 #classes为训练样本集的类别总数
train = /home/zbb/darknet/scripts/2007_train.txt #train的路径为训练样本集所在的路径
valid = /home/zbb/darknet/scripts/2007_val.txt #valid的路径为验证样本集所在的路径
names = data/voc.names #names的路径为data/voc.names文件所在的路径
backup = backup
这里train,valid路径必须是完整的,否则会报错误找不到
2)修改data/voc.name
airplane
#修改为自己样本集的标签名即第一步中标注的标签名
3)修改cfg/yolov3-voc.cfg
将test注释,train取消注释,notepad++查找yolo,修改与其对应convolutional对应的random,classes,filters
[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=8
......
[convolutional]
size=1
stride=1
pad=1
filters=18 #---------------#75,修改为3*(classes+5)
activation=linear
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=1 #---------------修改为标签类别个数,1类
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0 #1,将random设置为0,关闭多尺度训练,out of memory显存不大
......
[convolutional]
size=1
stride=1
pad=1
filters=18 #---------------修改同上
activation=linear
[yolo]
mask = 3,4,5
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=1 #---------------修改同上
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0
......
[convolutional]
size=1
stride=1
pad=1
filters=18 #---------------修改同上
activation=linear
[yolo]
mask = 0,1,2
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=1 #---------------修改同上
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0
6.下载预训练模型:
wget https://pjreddie.com/media/files/darknet53.conv.74
7.开始训练:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg scripts/darknet53.conv.74 -gpus 0
8.测试评测
单张检测,(多张见博客https://blog.csdn.net/babyzbb636/article/details/100534359)
训练后会在backup文件夹下生成权重文件,利用生成的权重文件进行测试
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_900.weights data/34.jpg
添加置信度https://blog.csdn.net/qq_34795071/article/details/86665620
在./src/image.c内的修改draw_detections,内容如下:
for(i = 0; i < num; ++i){
char labelstr[4096] = {0};
int class = -1;
char possible[10];//存放检测的置信值
for(j = 0; j < classes; ++j){
sprintf(possible,"%.2f",dets[i].prob[j]);//置信值截取小数点后两位赋给possible
if (dets[i].prob[j] > thresh){
if (class < 0) {
strcat(labelstr, names[j]);
strcat(labelstr, possible);//标签中加入置信值
class = j;
} else {
strcat(labelstr, ", ");
strcat(labelstr, names[j]);
strcat(labelstr, possible);//标签中加入置信值
}
printf("%s: %.0f%%\n", names[j], dets[i].prob[j]*100);
}
}
修改位置如下:
结果如下: