darknet训练yolov4模型

darknet训练yolov4模型

安装darknet环境安装部署

这里以windows环境为例,其他环境看官网说明

源码下载

  1. 下载源码
git clone https://github.com/AlexeyAB/darknet.git
  1. 下载完成后用cmake 打开

在这里插入图片描述
Configure >> Generate >> Open Project
然后在vs 上编译出 darknet.exe
在这里插入图片描述
在输出文件夹中得到daeknet.exe
在这里插入图片描述

准备数据集打标签(以识别篮球为例)

这里用labelImg工具打标签

pip install labelImg
  1. 新建一个文件夹
    在这里插入图片描述
  2. 进入文件夹下在新建两个文件夹cfg和data
    用于存放配置文件已经训练数据集
    在这里插入图片描述
  3. 进入data文件夹下新建如下如下文件夹和文件
    用于存放图片 、图片索引文件 以及标签文件
    在这里插入图片描述
    打开config.data,输入以下内容
    这里只识别篮球一个种类 所以classes=1,有多少种类classes就设为多少
    在这里插入图片描述
    打开config.names,输入种类名称
    在这里插入图片描述
  4. 将图片移到前面新建的那个images文件夹中用labelImg工具打开文件夹

在这里插入图片描述
选择高级模式Advancedmode 和 自动保存 auto save mode
格式选择yolo格式 ,保存位置选择图片文件夹
在这里插入图片描述
然后对所有的图片开始打标签在这里插入图片描述

  1. 删除图片文件夹里面的classes.txt ,然后将标签文件全部拷贝到labels文件夹里面(注意这里是拷贝过去,images文件夹下存放图片和标签,labels文件夹下存放标签)

  2. 将darknet文件夹下的cfg文件夹下面的yolov4_custom.cfg文件拷贝到前面新建的cfg文件夹下并修改以下几个地方

#batch和sub是结合使用的,例如这儿的batch=64,sub=16表示训练的过程中将一次性加载64张图片进内存,然后分16次完成前向传播,
	#意思是每次4张,前向传播的循环过程中累加loss求平均,待64张图片都完成前向传播后,再一次性后传更新参数
#调参经验:sub一般设置16,不能太大或太小,且为8的倍数;
	#batch的值可以根据显存占用情况动态调整,一次性加减sub大小即可,通常情况下batch越大越好,
	#还需注意一点,在测试的时候batch和sub都设置为1,避免发生神秘错误!
batch=64
subdivisions=16

width=416		#将网络的size改为416*416 (需要是32的倍数)
height=416

max_batches = 2000  #训练次数(由于我这里图片比较少,所以先设为2000次,一般设置为classes*2000 ,不要小于训练图片数,也不要小于classes * 2000)

steps=1600,1800 (一般设置为max_batches的80%,90%)

修改所有的yolo层上面的filters=3*(classes + 5),以及yolo层的classes种类数
在这里插入图片描述

分离数据集与测试集

  1. 写个脚本Process.py将数据集和测试集分离出来并将索引记录子txt文件中(这里在网上随便找了一个,也可以自己写一个)
    在这里插入图片描述
import os
import random
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import math

trainval_percent = 0.2  		#测试集比例
train_percent = 0.8				#训练集比例
picSuffix='.jpg'				#图片格式

sets = ['train', 'test','val']
labelfilepath = 'data/labels'
txtsavepath = 'data/ImageSets'
total_label = os.listdir(labelfilepath)
 
def StepOne():
    num = len(total_label)
    list = range(num)
    tv = int(num * trainval_percent)
    tr = int(tv * train_percent)
    #tv = int(num * trainval_percent)
    #tr = int(tv * train_percent)
    trainval = random.sample(list, tv)
    train = random.sample(trainval, tr)

    ftrainval = open('data/ImageSets/trainval.txt', 'w')
    ftest = open('data/ImageSets/test.txt', 'w')
    ftrain = open('data/ImageSets/train.txt', 'w')
    fval = open('data/ImageSets/val.txt', 'w')

    for i in list:
        name = total_label[i][:-4] + '\n'
        if i in trainval:
            ftrainval.write(name)
            if i in train:
                ftest.write(name)
            else:
                fval.write(name)
        else:
            ftrain.write(name)

    ftrainval.close()
    ftrain.close()
    fval.close()
    ftest.close()

def StepTow():
    for image_set in sets:
        if not os.path.exists('data/labels/'):
            os.makedirs('data/labels/')
        image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
        list_file = open('data/%s.txt' % (image_set), 'w')
        for image_id in image_ids:
            list_file.write('data/images/%s%s\n' % (image_id,picSuffix))
        list_file.close()

if __name__ == "__main__":
    StepOne()
    StepTow()
    
  1. 运行脚本,在data文件夹下以及data/Imagesets文件夹下生成下面这些文件
python Process.py

在这里插入图片描述
在这里插入图片描述

下载预训练模型

data同级目录下新建weights文件夹,并下载预训练模型存放其中
下载预训练模型
在这里插入图片描述

重定anchors

anchors其实就是在训练之前人为设定的先验框,网络输出结果的框就是在anchors的基础上进行调整的。所以说先验框设定的好坏对于模型的输出效果影响还是挺大的。在yolo中一般设定一个物体的先验框的个数一般是9个

  1. 从darknet的编译目录下找darknet.exe这个可执行文件,我们这里是在Release下,将其拷贝到我们这个工程路径下(data同级路径下)

在这里插入图片描述
在这里插入图片描述

  1. 从darknet目录下拷贝pthreadVC2.dll文件到这里
    在这里插入图片描述
  2. 运行命令算出anchors
darknet.exe detector calc_anchors data/config.data -num_of_clusters 9 -width 416 -height 416

成功后会在当前路径下生成anchors.txt文件
将其中的内容拷贝下来,修改cfg/yolov4_custom.cfg文件的anchors (下面三个地方)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  1. 新建文件夹backup(在data同级路径下)

训练模型

执行命令:

darknet.exe detector train data/config.data  cfg/yolov4-custom.cfg  weights/yolov4.conv.137 -map

如果出现memory error 则将配置文件cfg/yolov4-custom.cfg的batch调小再试

正在训练:
在这里插入图片描述
训练完成:
在这里插入图片描述

生成的文件在backup文件夹中

测试效果

写一个简单的测试程序测试一下

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
#include <sys/time.h>
#include "yolo_v2_class.hpp"

double const lbk_get_time_ms(){
    double t;
    struct timeval tv;
    gettimeofday(&tv, NULL);
    t =  tv.tv_sec*1000. + tv.tv_usec/1000.;
    return t;
}


int main(){
    std::string cfg_file =      "model/yolov4-custom.cfg";
    std::string weights_file =  "model/yolov4-custom_final.weights";
    std::string filename =      "testImage/img0.jpg";
    
    Detector detector(cfg_file, weights_file);

    cv::Mat mat_img = cv::imread(filename);
    auto det_image = detector.mat_to_image_resize(mat_img);

    double t0 = lbk_get_time_ms();
    std::vector<bbox_t> result_vec = detector.detect_resized(*det_image, mat_img.size().width, mat_img.size().height);

    for (auto &i : result_vec) {
        std::cout << "obj_id = " << i.obj_id << ",  x = " << i.x << ", y = " << i.y << ", w = " << i.w << ", h = " << i.h << std::setprecision(3) << ", prob = " << i.prob << std::endl;
    }
    
    float min_prop = 0.6f; //可信度过滤
    for (auto &i : result_vec) {
        if(i.prob > min_prop){
            cv::rectangle (mat_img, cv::Rect(i.x,i.y,i.w,i.h), cv::Scalar(0, 0, 255), 2, 8, 0);
            if(i.obj_id == 0){
                cv::putText(mat_img, "basketball", cv::Point(i.x,i.y), cv::FONT_HERSHEY_COMPLEX, 2, cv::Scalar(0, 255, 255), 2, 8, 0);
            }else{
                cv::putText(mat_img, std::to_string(i.obj_id - 1), cv::Point(i.x,i.y), cv::FONT_HERSHEY_COMPLEX, 2, cv::Scalar(0, 255, 255), 2, 8, 0);
            }
            
        }
        
    }

    cv::imwrite("testImage/res.jpg",mat_img);
    std::cout << "time :" << (lbk_get_time_ms() - t0) << std::endl;
}

在这里插入图片描述
位置有点歪,不过鉴于咱们训练集只有几十张图片,这样的效果就还不错了!

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 首先,需要准备好训练数据集和标注文件,可以使用标注工具如LabelImg等进行标注。 2. 接着,需要下载darknet框架和yolov4-tiny模型的权重文件。 3. 在darknet目录下,修改配置文件yolov4-tiny.cfg,将其中的batch、subdivisions、classes、filters等参数根据自己的数据集进行修改。 4. 将训练数据集和标注文件放入darknet/data目录下。 5. 在命令行中输入以下命令进行训练: ./darknet detector train data/obj.data cfg/yolov4-tiny.cfg yolov4-tiny.weights 6. 训练过程中可以通过命令行输出的信息来观察训练情况,也可以使用工具如TensorBoard等进行可视化。 7. 训练完成后,可以使用训练好的模型进行目标检测,具体方法可以参考darknet官方文档。 ### 回答2: Darknet是一种流行的开源深度学习框架,它支持各种计算机视觉任务,例如对象检测、分类、语义分割等。Yolov4-tiny是一种基于深度神经网络的对象检测模型,其速度和准确性优于之前的版本,由于其轻量级的特性,适合在边缘设备上进行部署。在使用Darknet训练Yolov4-tiny时,需要以下几个步骤。 1. 数据集准备和标注 准备和标注数据集是深度学习的第一步。数据集包括许多图像,每张图像上都标有框框来标注出对象的位置,同时还需要给每个对象打上标签。这通常需要使用专业的工具,例如LabelImg或VIA。数据集的质量和数量对于模型的准确性至关重要。 2. 修改配置文件 在训练模型之前,需要使用配置文件指定许多参数,例如学习率、训练迭代次数、批量大小等。这些参数的设置将直接影响模型的性能和训练时间。在Yolov4-tiny的配置文件中,将输入图像的大小设置为416x416,并且根据自己的数据集修改标签类别数量、训练、验证和测试集路径等参数。此外,还可以尝试调整不同的超参数来改进模型性能。 3. 下载预训练权重 通常情况下,可以使用预训练的权重来加速模型训练。在Yolov4-tiny的情况下,可以从官方网站下载预训练的权重,并将其作为初始权重进行训练。 4. 开始训练模型 完成配置文件和权重下载后,可以使用Darknet开始训练模型。在命令行中输入相应的命令,包括配置文件路径、权重路径、数据集路径等。训练过程可能需要几个小时到几天,具体时间取决于数据集的大小和复杂性。 5. 评估训练模型模型训练完成后,可以使用测试集对模型进行评估,查看其在不同指标下的表现,例如mAP(mean average precision)。评估结果可以帮助了解模型训练的效果,以及在实际应用中模型的性能如何。 6. 部署模型 最后,可以将训练好的模型部署到边缘设备上进行使用,例如实时对象检测和跟踪。在部署模型时,需要考虑设备的性能和存储容量,并根据具体需求进行优化,例如芯片加速、量化等。 ### 回答3: YoloV4-tiny是一种物体检测算法模型,其可用于实现高效的实时目标检测应用。而darknet则是实现该模型训练深度学习框架,其可在Linux和Windows平台上运行。下面将详细介绍darknet训练YoloV4-tiny的步骤和方法。 首先,需要在计算机上安装darknet,可通过下载源代码后进行编译安装,也可直接使用已编译好的可执行文件。安装成功后,需要下载训练用的数据集,并将其转换为darknet可用的格式,通常为txt格式的标注文件和jpg格式的图片。将数据集放入darknet目录下的data文件夹中。 接下来,需要准备好yolov4-tiny的配置文件。配置文件包括模型参数、训练参数、数据集路径等,可参照darknet自带的yolov4-tiny.cfg文件进行设置。其中,需要注意的是网络结构的参数需要与数据集的类别数目对应,否则会导致训练结果不准确。另外,还需设置学习率、批次大小、迭代次数等训练参数。 完成配置文件的设置后,就可开始训练模型了。在命令行中输入训练命令,如“./darknet detector train data/obj.data cfg/yolov4-tiny.cfg yolov4-tiny.weights -gpus 0,1”,其中参数含义分别为:数据集路径、配置文件路径、预训练权重路径、使用GPU设备和数量。 训练过程中,darknet会输出每一轮训练的损失值和预测精度,可通过观察损失值变化来判断训练进展情况。训练完成后,会在darknet目录下生成新的权重文件,可用于实际应用。 总的来说,训练YoloV4-tiny需要准备好数据集、配置文件和训练参数,并在darknet中进行训练训练过程需要耗费一定时间和计算资源,但能得到高效、准确的检测模型,适用于各种物体检测应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值