基于DarkNet框架实现YOLOV4的训练

YOLOV4

论文:《Yolov4: Optimal Speed and Accuracy of Object Detection》

项目代码:AlexeyAB/darknet

一、编译源码

GitHub上下载项目源码

Linux:根据自己需求修改Makefile,然后make就完事

Windows:使用CMake进行编译,可自行修改CMakeLists.txt,或者安装MinGW执行Makefile,毕竟Makefile相对比较好修改

编译后会生成darknet.exe

二、准备数据集

 运行以下代码,会在当前目录新建train和val文件夹,数据集分割成训练集和验证集,分别放入两个文件夹中,并建立train.txt和val.txt文件

import os
import random
import shutil

image_Path=r'C:\Users\User\Desktop\marked\data'          #数据集路径
val_num=20                                               #验证集数据量
folder_txt_dir = ["train","val"]

def Creating_folder(folder_txt_dir):    
    '创建train和val文件夹'
    for foler in folder_txt_dir:
        data_path =os.path.join(str(os.getcwd()),foler)
        folder = os.path.exists(data_path)
        if not folder:                 
            os.makedirs(data_path)
    print('创建train和val文件夹成功')

def Split_datasets(paths):             
    '索引所有图片'    
    images=[]
    train_num_list=[]
    val_num_list=[]
    for path,folder,imgs in os.walk(paths):
        for img in imgs:
            if img.endswith(".jpg"):
                images.append(os.path.join(path,img))
            
    '分割数据集'        
    alist = random.sample(range(0,len(images)),val_num)
    alist.sort(reverse=True)
    for n in alist:
        val_num_list.append(images[n])
        images.pop(n)
    train_num_list=images    
                       
    '移动图片'
    train_path=os.path.join(str(os.getcwd()),'train')
    val_path=os.path.join(str(os.getcwd()),'val')        
    for train in train_num_list:
        fpath,fname=os.path.split(train)
        shutil.copy(train, os.path.join(train_path,fname))
    for val in val_num_list:
        fpath,fname=os.path.split(val)
        shutil.copy(val, os.path.join(val_path,fname))
        
    print('分割数据集成功')
        
def make_txt(folder_txt_dir):
    '创建train.txt和val.txt'
    for txt in folder_txt_dir:
        data_path =os.path.join(str(os.getcwd()),txt)
        image_list=os.listdir(txt)
        with open(file=txt+'.txt',mode='a+') as f:
            for name in image_list:
                if name.endswith(".jpg"):
                    item=os.path.join(data_path,name)  
                    f.write(item)
                    f.write("\n")
                    
    print('创建train.txt和val.txt成功')

if __name__ =='__main__':
    Creating_folder(folder_txt_dir)
    Split_datasets(image_Path)
    make_txt(folder_txt_dir)

然后新建class.txt,写入物体类别(一行写一个)

标注数据集:

在Make Sense上进行标志数据集,点击Get Started,然后点击Click here to select them,选择分割好的train或者val文件夹,选中里面所有图片,然后点击Object Detection,点击Load labels from file,点击Click here to select them,选择刚才建立好的class.txt文件

标注图片时注意下对应标签,标注结束点击Actions,点击Export Annotations下载标志文件,将里面的图片.txt文件复制到train或者val文件夹下。

然后将category.txt改为category.names

可以得到如下目录结构

 

 

三、配置训练文件

主要是一个.data文件和.cfg文件

新建obj.data

写入obj.data时记得删掉#和后面的注释
classes=5                         #种类数目
train=data/train.txt              #train.txt文件路径
vaild=data/test.txt               #test.txt文件路径
names=data/category.names         #标签文件路径
backup=backup                     #训练好的权重文件将放在该路径下

​新建yolo-obj.cfg

复制项目文件中yolov4.cfg内容

主要修改batch、subdivision、width、height、max_batches、steps以及每个yolo层中classes和前面一个卷积层中filters

具体修改可以参考这里:关于yolo配置文件以及训练时各参数的含义

四、训练模型

训练模型主要用到yolo-obj.cfg、obj.data、darknet.exe(可以拿出来放置在任意文件夹中使用)、pthreadVC2.dll(在darknet-master/build/darknet/x64路径下)、预训练模型yolov4.conv.137(下载地址)

在darknet.exe的目录路径终端下输入:darknet detector train obj.data路径 yolo-obj.cfg路径 yolov4.conv.137路径

正常训练下

基于DarkNet框架实现YOLOV4的训练_第1张图片

五、使用训练好的模型预测图片

在darknet.exe的目录路径终端下输入:darknet detector test obj.data路径 yolo-obj.cfg路径 训练好的模型权重文件.weights的路径 预测图片路径

基于DarkNet框架实现YOLOV4的训练_第2张图片

 这里是由于我没有编译时没有选择OpenCV,预测效果相对较好的

基于DarkNet框架实现YOLOV4的训练_第3张图片 

 也可以使用darknet-master\darknet_images.py进行预测(这里需要darknet.dll)。

你可能感兴趣的:(机器视觉,深度学习,计算机视觉,目标检测)