linux下YoLov3学习(一):训练自己的数据集

目录

 

1.下载yolov3项目工程

2.修改Makefile配置,使用GPU训练

3.测试图片

4.生成label文件

5.修改名称类别

6.下载预训练模型:

7.开始训练:

8.测试评测


配置流程参考: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);
            }
        }
 

修改位置如下:

结果如下:

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值