YOLOv3训练自己的数据详细步骤

本文详细介绍如何使用YOLOv3进行目标检测训练,包括下载工程项目、配置GPU环境、准备训练数据集、修改配置文件、下载预训练权重、启动训练及识别流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 下载YOLOv3工程项目

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

2. 修改Makefile配置,使用GPU训练,修改如下:

GPU=1 #如果使用GPU设置为1,CPU设置为0
CUDNN=1  #如果使用CUDNN设置为1,否则为0
OPENCV=0 #如果调用摄像头,还需要设置OPENCV为1,否则为0
OPENMP=0  #如果使用OPENMP设置为1,否则为0
DEBUG=0  #如果使用DEBUG设置为1,否则为0

CC=gcc
NVCC=/home/user/cuda-9.0/bin/nvcc   #NVCC=nvcc 修改为自己的路径
AR=ar
ARFLAGS=rcs
OPTS=-Ofast
LDFLAGS= -lm -pthread 
COMMON= -Iinclude/ -Isrc/
CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC
...
ifeq ($(GPU), 1) 
COMMON+= -DGPU -I/home/hebao/cuda-9.0/include/  #修改为自己的路径
CFLAGS+= -DGPU
LDFLAGS+= -L/home/hebao/cuda-9.0/lib64 -lcuda -lcudart -lcublas -lcurand  #修改为自己的路径
endif

保存完成后,在此路径下执行make,如果出现如下错误:

Loadingweights from yolo.weights...Done!
CUDA Error:invalid device function
darknet: ./src/cuda.c:21: check_error: Assertion `0' failed.
Aborted (core dumped)

这是因为配置文件Makefile中配置的GPU架构和本机GPU型号不一致导致的。更改前默认配置如下(不同版本可能有变):

ARCH= -gencode arch=compute_30,code=sm_30 \
      -gencode arch=compute_35,code=sm_35 \
      -gencode arch=compute_50,code=[sm_50,compute_50] \
      -gencode arch=compute_52,code=[sm_52,compute_52]
#      -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?
# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52

CUDA官方说明文档:http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#virtual-architecture-feature-list

然后重新编译即可:
这里写图片描述

3. 准备训练数据集

按下列文件夹结构,将训练数据集放到各个文件夹下面,生成4个训练、测试和验证txt文件列表
VOCdevkit
—VOC2007
——Annotations
——ImageSets
———Layout
———Main
———Segmentation
——JPEGImages
Annotations中是所有的xml文件
JPEGImages中是所有的训练图片
Main中是4个txt文件,其中test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集。

3. 生成2007_train.txt和2007_val.txt文件

下载voc_label.py文件,将文件下载到VOCdevkit同级的路径下,生成训练和验证的文件列表
wget https://pjreddie.com/media/files/voc_label.py

修改sets为训练样本集的名称
sets=[('2007', 'train')]
修改classes为训练样本集的类标签
classes=[str(i) for i in range(10)]

运行python voc_label.py,生成2007_train.txt训练文件列表。

4.下载Imagenet上预先训练的权重

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

5. 修改cfg/voc.data

classes= 10  #classes为训练样本集的类别总数
train  = /home/user/darknet/2007_train.txt  #train的路径为训练样本集所在的路径
valid  = /home/user/darknet/2007_val.txt  #valid的路径为验证样本集所在的路径
names = data/voc.names  #names的路径为data/voc.names文件所在的路径
backup = backup

6. 在darknet文件夹下面新建文件夹backup

7. 修改data/voc.name为样本集的标签名

0
1
2
3
4
5
6
7
8
9

8. 修改cfg/yolov3-voc.cfg

关于cfg修改,以10类目标检测为例,主要有以下几处调整(蓝色标出):

[net]
# Testing            ### 测试模式                                          
# batch=1
# subdivisions=1
# Training           ### 训练模式,每次前向的图片数目 = batch/subdivisions 
batch=64
subdivisions=16
width=416            ### 网络的输入宽、高、通道数
height=416
channels=3
momentum=0.9         ### 动量 
decay=0.0005         ### 权重衰减
angle=0
saturation = 1.5     ### 饱和度
exposure = 1.5       ### 曝光度 
hue=.1               ### 色调
learning_rate=0.001  ### 学习率 
burn_in=1000         ### 学习率控制的参数
max_batches = 50200  ### 迭代次数                                          
policy=steps         ### 学习率策略 
steps=40000,45000    ### 学习率变动步长 
scales=.1,.1         ### 学习率变动因子  



[convolutional]
batch_normalize=1    ### BN
filters=32           ### 卷积核数目
size=3               ### 卷积核尺寸
stride=1             ### 卷积核步长
pad=1                ### pad
activation=leaky     ### 激活函数

......

[convolutional]
size=1
stride=1
pad=1
filters=45  #3*(10+4+1)
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=10  #类别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0  #1,如果显存很小,将random设置为0,关闭多尺度训练;
......

[convolutional]
size=1
stride=1
pad=1
filters=45  #3*(10+4+1)
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=10  #类别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0  #1,如果显存很小,将random设置为0,关闭多尺度训练;
......

[convolutional]
size=1
stride=1
pad=1
filters=45  #3*(10+4+1)
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=10  #类别
num=9
jitter=.3  # 数据扩充的抖动操作
ignore_thresh = .5  #文章中的阈值1
truth_thresh = 1  #文章中的阈值2
random=0  #1,如果显存很小,将random设置为0,关闭多尺度训练;

9. 开始训练

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1

10. 识别

将训练得到的weights文件拷贝到darknet/weights文件夹下面

./darknet detect cfg/yolov3-voc.cfg weights/yolov3.weights data/dog.jpg
YOLOv8 (You Only Look Once version 8) 是一种实时目标检测算法,以下是训练自定义数据集的一般步骤: 1. **准备数据**: - 收集或创建包含标注图片的数据集。每个图像应有对应的目标框及其类别标签。 - 使用工具如LabelImg或VOCAnnotationEditor为图片生成XML或TXT格式的标注文件。 2. **预处理数据**: - 将所有图像转换成统一尺寸,通常YOLOv8建议使用416x416或更大的输入大小。 - 分离训练集和验证集,并可能对数据进行增强,如随机裁剪、旋转、翻转等,以防过拟合。 3. **下载模型权重**: - 从官方GitHub仓库或其他可靠的资源获取基础的YOLOv8预训练权重,如`yolov8.weights`。 4. **配置训练脚本**: - 使用Darknet框架提供的`yolov8.cfg`配置文件作为起点,根据需要调整超参数,如学习率、批量大小、训练轮数等。 - 可能需要用到的脚本是`darknet detector train`命令行工具。 5. **开始训练**: - 运行`./darknet detect cfg/yolov8.cfg data/your_dataset.yaml yolov8.weights -dont_show > output.txt`,这里`data/your_dataset.yaml`是包含训练设置的文件,其中指定了数据路径和类别。 - 训练过程中会输出损失和其他指标,监控验证集的表现。 6. **评估和调整**: - 检查训练过程中的验证精度,如果效果不佳,尝试调整网络结构、增加训练时间或更改其他参数。 7. **保存最终模型**: - 当满意模型性能时,可以使用`darknet save`命令将权重保存到新的模型文件中,供后续使用。 注意:实际训练过程中可能会遇到各种问题,如内存不足、计算速度慢等,需要针对具体情况解决。在每一步骤完成后都应保存训练状态,以便于回溯和继续训练
评论 87
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值