• Ubuntu16.04中用yolov3训练自己的数据集


    一、配置yolo v3

    参考yolo v3官网https://pjreddie.com/darknet/yolo/

    下载darknet后进行编译:

    git clone https://github.com/pjreddie/darknet
    cd darknet
    make

    下载预训练权重文件:

    wget https://pjreddie.com/media/files/yolov3.weights

    接下来测试一下:测试data/dog.jpg图片的结果,如果能够正确识别,则说明配置成功。

    ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

    官网给出的是CPU版本的编译,如果需要使用GPU,则需要修改makefile的前几行:

    GPU=1
    CUDNN=1
    OPENCV=0
    OPENMP=0
    DEBUG=0

    二、准备及标注自己的数据集

     用LabelImg工具标注自己的数据集,github:

    git clone https://github.com/tzutalin/labelImg

    接着安装依赖的工具:

    sudo apt-get install pyqt4-dev-tools # 安装PyQt4
    sudo pip install lxml # 安装lxml,如果报错,可以试试下面语句
    sudo apt-get install python-lxml

    打开终端,进入LabelImg目录后使用make编译

    cd LabelImg
    make all

    编译成功后,即可在LabelImg文件夹中运行

    python labelImg.py

    注意:保存的标注文件有两种:.txt和.xml。我用的是.txt。voc_label.py脚本可以将.xml文件转化成.txt文件。位置:.\darknet\scripts\voc_label.py

    三、搭建yolo框架

    在darknet文件夹下新建project_yolov3文件夹,作为自己的训练数据集及配置文件的存放地,避免与已有的一些东西混在一起。

    在project_yolov3文件夹下新建如下文件夹,结构如下:

    backup
    cfg      yolov3-tiny.cfg
             .data
    data     .names
             images
             label

    backup用于存放训练时返回的模型及权重文件;

    cfg中从.\darknet\cfg中根据需要复制配置文件(我用的是yolov3-tiny.cfg),从.\darknet\cfg中复制voc.data文件修改名称为.data,根据自己的目录以及类别等修改里面相关内容。.cfg修改:首先是训练,所以训练的batch和subdivisions不要注释掉(可以根据电脑配置啥的修改这两个参数),而测试的要注释掉。修改filters(每一个yolo层的上一层的filters参数要改,其他的filters不需要改),修改后等于(类别数目+5)×3,修改每一个yolo层的classes类别数。另外还有一些参数可以修改,参考官网即可。

    data中首先从.\darknet\data中复制voc.names并修改名称为.names,然后按照自己的类别将类别名一行一行写入;

    data\images下存放所有图片;

    data\label文件夹存放所有标注文件(.txt);

    在data文件夹下新建一个my.sh文件,用于生成train.txt和test.txt,这两个txt文件记录训练和测试图片的路径。

    将my.sh放到对应的图片集所在的文件夹中。
    执行
    sh my.sh
    在生成的txt文件中,删除my.sh那一条记录就行。(因为这里用的是取这个脚本所在的路径,再加上文件名输出的,这样就是绝对路径了,所以要将.sh文件放到相应的文件夹中去。)

    my.sh:

    #!/bin/sh  
    #============ get the file name ===========  
    echo -e "请输入你要读取的文件夹路径\n当前路径为${PWD}" 
    read InputDir 
    echo "你输入的文件夹路径为${InputDir}" 
    echo -e "请输入你要将数据输出保存的文件路径\n当前路径为${PWD}" 
    read OutputFile 
    echo "输出保存的文件路径为${OutputFile}" 
    : > $OutputFile #清空OutputFile  
    #循环读取文件夹名  
    for file_a in ${InputDir}/*; do 
        temp_file=`basename $file_a` 
        #echo $temp_file >> $OutputFile 
        echo `pwd`/$temp_file  >> $OutputFile 
    done

     train.txt和test.txt的每一行是一张图片的绝对路径,内容示例:

    四、训练

     下载预训练模型:

    wget https://pjreddie.com/media/files/darknet53.conv.74

    最后开始训练:

    ./darknet detector train /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/.data /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/yolov3-tiny.cfg darknet53.conv.74  2>&1 | tee /media/taoting/4014F4A914F4A358/darknet/project_yolov3/visualization/train_yolov3.log

    命令中路径自行修改,其中2>&1 | tee /media/taoting/4014F4A914F4A358/darknet/project_yolov3/visualization/train_yolov3.log是保存训练的日志到文件。

    注意:
    1.  训练时默认是前1000次时,每100次保存一次模型,大于1000次时每10000次才保存一次模型。修改方式:找到./darknet/examples里面的detector.c,第149行修改就行。
    2.  训练可以中断,中断后只要从最后一次保存的模型那里继续开始训练就好。在darknet文件夹下打开终端,重新编译:
    make clean
    make
    如:
    ./darknet detector train /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/.data /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/yolov3-tiny.cfg /media/taoting/4014F4A914F4A358/darknet/project_yolov3/backup/yolov3-tiny_5900.weights
    3.  所有路径(特别是图片的路径和图片名最好是英文的,不然很容易训练自动终止)

     训练参数满意了之后就可以停止训练,进行测试了。

    五、测试

    先将cfg文件里修改到测试模式,保存后,重新编译,再测试图片。

    修改要输出的参数的方法:./src/image.c里的第287~300行;

    将置信度在类别标签后显示的方法:./src/image.c里的第246~257行加上有注释的那4行

            char possible[10];//存放检测的置信度
            for(j = 0; j < classes; ++j){
                sprintf(possible,"%.2f",dets[i].prob[j]);//置信度截取小数点后两位
                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);
                }
            }

    测试命令示例:这些命令也可以写相对路径

    ./darknet detector test /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/.data /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/yolov3-tiny.cfg /media/taoting/4014F4A914F4A358/darknet/project_yolov3/backup/yolov3-tiny_6000.weights 20181007_234258.jpg

     (https://blog.csdn.net/gusui7202/article/details/83781719)    这篇博客中有批量测试图片的方法

  • 相关阅读:
    【WinHec启示录】透过Windows 10技术布局,谈微软王者归来
    管中窥豹,物联网之我见
    微软借力.NET开源跨平台支持,布局物联网平台开发
    面向对象开发方式的开源硬件--.NET Gadgeteer
    【物联网智能网关-18】多通道远程安全升级
    vim 多文件编辑【超实用】
    debian下samba配置
    制作根文件系统的经验
    c语言: inline(gcc)
    Cramfs、JFFS2、YAFFS2的全面对比
  • 原文地址:https://www.cnblogs.com/taotingz/p/11316467.html
Copyright © 2020-2023  润新知