zoukankan      html  css  js  c++  java
  • YOLOV4在linux下训练自己数据集(亲测成功)

    最近推出了yolo-v4我也准备试着跑跑实验看看效果,看看大神的最新操作

    这里不做打标签工作和配置cuda工作,需要的可以分别百度搜索   VOC格式数据集制作,cuda和cudnn配置

    我们直接利用VOC格式训练自己数据集的模型

    笔者也是 根据官方github的readme操作的 没看懂可以进入官方链接看看英文介绍,或者在issue里面提问,笔者花了一天 也算是跑通了数据集的代码。

    paper

    https://arxiv.org/abs/2004.10934

    github

    https://github.com/AlexeyAB/darknet#how-to-train-with-multi-gpu

    -- 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则不用改

     执行以下命令编译

    1 make

    然后主目录中出现darknet文件 

    3.运行该文件

    1 ./darknet

    如果编译成功则会出现以下信息

    1 usage: ./darknet<function>

    现在可以测试初始预训练权重效果了

    1 ./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,在builddarknetx64data 文件夹下创建obj.names文件。内容为你的类别 比如人和车 那么obj.names 为如下

    person
    car

    --2.3制作obj.data,在builddarknetx64data文件夹下创建obj.data文件。内容如下

    classes= 2
    train  = data/train.txt
    valid  = data/test.txt
    names = data/obj.names
    backup = backup/

    笔者在这读取不到data/下文件 所以改为绝对路径 就可以了 这是我的obj.data文件

    --2.4放入源图片,在builddarknetx64data文件夹下创建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中文件放入之前的builddarknetx64dataobj中

    那么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 join
    
    if __name__ == '__main__':
        source_folder =r'G:jianfengproject
    ubblish_detyolov4darknet-masterdarknet-mastercfgJPEGImages'
        dest = r'G:jianfengproject
    ubblish_detyolov4darknet-masterdarknet-mastercfg1/train.txt'
        dest2 = r'G:jianfengproject
    ubblish_detyolov4darknet-masterdarknet-mastercfg1/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" + '
    ')  相对路径
                val_file.write("build/darknet/x64/data/obj/"+file_name+".jpg" + '
    ')
            else:
               #train_file.write(file_name+".jpg" + '
    ')
                train_file.write("build/darknet/x64/data/obj/"+file_name+".jpg" + '
    ')
            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上面提问,问作者问题更靠谱哦 ^ - ^

  • 相关阅读:
    Django中间件
    cookies与session
    Django Form组件
    Django 自定义分页器
    Django 批量插入数据
    Ajax
    图书管理系统
    Django常用字段及参数、事务、数据库查询优化
    Django之F与Q查询
    课堂测试-统计单词个数和字母出现频率
  • 原文地址:https://www.cnblogs.com/bob-jianfeng/p/12888111.html
Copyright © 2011-2022 走看看