ubuntu18.04利用yolov4训练自己的数据集

ubuntu18.04利用yolov4训练自己的数据集

    • 1.opencv的安装
    • 2、安装yolov4
      • 2.1下载darknet
      • 2.2 验证安装测试安装是否成功(需要下载yolov4.weights)
    • 3、训练自己的数据集
      • 3.1 设置.cfg文件
      • 3.2 设置.data文件
        • 3.2.1处理数据集
        • 3.2.2 设置.data和.names文件

环境:ubuntu18.04 cuda10.1 cudnn7.6.3 opencv3.4.7
注意 首先要注意的一点是想要在ubuntu下运行yolov4,必须要求安装的cuda版本大于等于10.0,cudnn也要相应的版本。如果cuda低于该版本,需要卸载后重新安装。

1.opencv的安装

参考https://blog.csdn.net/public669/article/details/99044895

2、安装yolov4

参考https://blog.csdn.net/qq_44166805/article/details/105876028

2.1下载darknet

官网为 https://github.com/AlexeyAB/darknet,下载文件夹时,可以从github上下载,也可以在终端输入命令:

git clone https://github.com/AlexeyAB/darknet
cd darknet

由于网速较慢,我直接从师兄那边copy了一份,放在了/home/nvidia/文件夹下,改名为darknet。
ubuntu18.04利用yolov4训练自己的数据集_第1张图片
进入文件夹,打开Makefile
将GPU,CUDNN,OPENCV设为1
ubuntu18.04利用yolov4训练自己的数据集_第2张图片
设置完成后重新编译

make clean
make -j8

2.2 验证安装测试安装是否成功(需要下载yolov4.weights)

./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights data/dog.jpg -i 0 -thresh 0.25

由于自己没有coco数据集,没有办法验证,因此直接进行下一步,darknet安装完成。

3、训练自己的数据集

参考https://blog.csdn.net/qq_44166805/article/details/105876028

训练自己的数据集,一共需要设置一个.cfg文件,一个.data文件,一个FPGA.names文件。同时需要权重文件darknet53.conv.74。笔者使用了船舰集,该数据集已经有图片和符合yolo规范的txt标签以及.names文件。

3.1 设置.cfg文件

.cfg文件的名字随便取一个,笔者取了PAradar.cfg,放在cfg文件夹下。可以从darknet/cfg中复制一份yolov4-custom.cfg,修改名字和其中的参数。
具体操作为:
把第三行batch改为batch=64
把subdivisions那一行改为 subdivisions=16
(这两个参数按照自己的GPU的水平来定)
将max_batch更改为(数据集标签种类数(classes)*2000 但不小于4000 )
将第20的steps改为max_batch的0.8倍和0.9倍(第一次跑程序时可以少跑几趟验证自己设置的对不对)
把位于8-9行设为width=416 height=416 或者其他32的倍数(图像的尺寸,比较吃显存,自己可以适当增加或者减少)
将classes=80 改为你的类别数 (有三个地方,969行,1056行,1143行),笔者的数据集有5种类别,因此classes=5
改正[filters=255] 为 filters=(classes + 5)x3 (位置为查找yolo,每个yolo前面的[convolutional]里,注意只修改最接近yolo的那个filters需要修改,一共有三处)
修改后的cfg文件参考下面的网页,仔细看注释
https://blog.csdn.net/qq_44166805/article/details/105876028
这样.cfg文件就配置完成了,可以放在/darknet/cfg文件夹下

3.2 设置.data文件

3.2.1处理数据集

在scripts文件夹下创建文件夹VOCdevkit(因为scripts文件夹下有vov_label.py文件,它的作用下面会说,下面创建的文件也跟它有关),根据下图在VOCdevkit文件夹下创建文件,并放入相应的数据。
VOCdevkit
——VOC2020 #文件夹的年份可以自己取,但是要与你其他文件年份一致,看下一步就明白了
————labels #放入所有的yolo格式的txt文件
————ImageSets
——————Main #放入train.txt,val.txt文件
————JPEGImages 放入jpg图片
在Main文件夹下放置这两个文件
ubuntu18.04利用yolov4训练自己的数据集_第3张图片
其中Main中的txt文件是要写文件名,比如train.txt里写的是用来训练的图片的文件名(不包含后缀,只是文件名哦!!!),这个文件可以找代码生成(下面的python代码可以用),代码的话看懂他的作用,特别的文件的路径之类的,根据自己的情况修改下,就可以用(我自己是在自己的PC上弄好了这两个txt文件,然后用filezilla传到了scripts/VOCdevkit/VOC2020/ImagesSets/Main文件夹)

import os
from os import listdir, getcwd
from os.path import join
if __name__=='__main__':
    source_folder='/home/wz/darknet/scripts/VOCdevkit/VOC2021/JPEGImages'
    dest='/home/wz/darknet/scripts/VOCdevkit/VOC2021/ImageSets/Main/train.txt'   # train.txt文件路径
    dest2 = '/home/wz/darknet/scripts/VOCdevkit/VOC2021/ImageSets/Main/val.txt'  # val.txt文件路径
 file_list=os.listdir(source_folder)
    train_file=open(dest,'a')
    val_file = open(dest2, 'a')
    file_num=0
    for file_obj in file_list:
        file_path=os.path.join(source_folder,file_obj)
        file_name,file_extend=os.path.splitext(file_obj)
        file_num=file_num+1
        
        if(file_num%50==0): #每隔50张选取一张验证集
            val_file.write(file_name+'\n')
        else:
            train_file.write(file_name+'\n')
train_file.close()
val_file.close()

运行过之后会在Main中生成两个上述两个txt文件。
ubuntu18.04利用yolov4训练自己的数据集_第4张图片
修改voc_label.py,这个文件就是根据Main中txt里的文件名,生成相应的txt,里面存放的是它们的路径,但是这个文件也会完成标签转换的功能,由于我的船舰集已经包含了yolo的标签文件,因此需要屏蔽数据转换的函数,在下面用蓝色背景标出了

sets=[('2021', 'train'), ('2021', 'val')]   #这里要与Main中的txt文件一致
classes = [“freedom”,“nimitz”,”burke”,”ticonderoga”,”wasp”]        #你所标注的表签名,第一步中已经说过
……省略被屏蔽掉的函数……
for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
        #convert_annotation(year, image_id) #这里屏蔽掉
    list_file.close()

os.system("cat 2020_train.txt 2020_val.txt > train.txt")   #文件最后一句,意思是要将生成的文件合并,所以很据需要修改 

终端加载到voc_label.py所在目录,运行 python voc_label.py
运行后会生成2020_train.txt、2020_val.txt、train.txt,我把他们复制到了scripts/VOCdevkit/VOC2021文件夹内
ubuntu18.04利用yolov4训练自己的数据集_第5张图片

3.2.2 设置.data和.names文件

将船舰集的FPGA.names文件放到data目录下。
复制cfg文件夹下的voc.data,重命名为FPGA.data
用自己的编辑的文件路径替换原来的参数

classes= 2
train  = scripts/VOCdevkit/2020_train.txt
valid  = scripts/VOCdevkit/2020_val.txt
names = data/FPGA.names
backup = backup

然后就可以开始训练船舰集了。

./darknet detector train cfg/FPGA.data cfg/PAradar.cfg darknet53.conv.74 –map
./darknet detector train cfg/gtz.data cfg/gtz.cfg darknet53.conv.74 –map

说明:
.data文件的backup = backup一项表示训练好模型的存放位置

你可能感兴趣的:(python)