YOLO3训练自己数据(超详细步骤)

YOLO3训练自己数据(超详细步骤)须知:对于占比较小的目标检测效果不好,虽然每个格子可以预测多个boundingbox,但是最终只选择IOU(预测的矩形框和真实目标的交集与并集之比)最高的boundingbox作为物体检测输出,即每个格子最多只预测出一个物体。当一个格子中包含多个物体时,如鸟群等,却只能检测出其中一个。另外,YOLO对车牌识别的效果一般。一:下载YOLO3项目gitclonehttps://githu…

大家好,又见面了,我是你们的朋友全栈君。

须知: 对于占比较小的目标检测效果不好,虽然每个格子可以预测多个bounding box,但是最终只选择IOU(预测的矩形框和真实目标的交集与并集之比)最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当一个格子中包含多个物体时,如鸟群等,却只能检测出其中一个。另外,YOLO对车牌识别的效果一般。

一:下载YOLO3项目

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

二:修改makefile配置

如果不使用相关功能,不必修改路径。

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

CC=gcc
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/usr/local/cuda/include/ #修改为自己的路径
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand #修改为自己的路径
endif

保存后退出,在当前路径make一下。

三:准备数据

首先创建一个目录来存储所有数据,如VOCdevkit/来包含VOC训练数据的子目录。创建子目录各文件夹结构如下所示:
—VOCdevkit
——VOC2019
———Annotations
———ImageSets
————Main
———JPEGImages

图片及标注可以从网上找,也可自己爬取后使用labelImg标注。
图片放入JPEGImages文件夹中。
对应图片标注生成的XML文件放入Annotations文件夹中。

labelImg下载方式:使用git命令

git clone https://github.com/tzutalin/labelImg

安装:

$ sudo apt-get install pyqt4-dev-tools # 安装PyQt4
$ sudo pip install lxml # 安装lxml,如果报错,可以试试下面语句
$ sudo apt-get install python-lxml

在labelImg目录下执行:

python labelImg.py

快捷键:
Ctrl + u 加载目录中的所有图像,鼠标点击Open dir同功能
Ctrl + r 更改默认注释目标目录(xml文件保存的地址)
Ctrl + s 保存
Ctrl + d 复制当前标签和矩形框
space 将当前图像标记为已验证
w 创建一个矩形框
d 下一张图片
a 上一张图片
del 删除选定的矩形框
Ctrl++ 放大
Ctrl– 缩小

Main中包含train.txt和val.txt

使用如下代码可生成对应的两个txt文件(代码位置与主目录同级)

import os
from os import listdir, getcwd
from os.path import join
if __name__ == '__main__':
    source_folder='/home/lixiaoyu/darknet/scripts/VOCdevkit/VOC2019/JPEGImages/'
    dest='/home/lixiaoyu/darknet/scripts/VOCdevkit/VOC2019/ImageSets/Main/train.txt' 
    dest2='/home/lixiaoyu/darknet/scripts/VOCdevkit/VOC2019/ImageSets/Main/val.txt'  
    file_list=os.listdir(source_folder)       
    train_file=open(dest,'a')                 
    val_file=open(dest2,'a')                  
    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=int(file_name) 
        
        if(file_num<80000):                     
            
            train_file.write(file_name+'\n')  
        else :
            val_file.write(file_name+'\n')    
    train_file.close()
val_file.close()

在VOCdevkit同级目录下载voc_label.py文件

wget https://pjreddie.com/media/files/voc_label.py

修改文件中sets和classes,如:

sets=[('2019', 'train'), ('2019', 'val')]

classes = ["1",“2”,“3”]

运行它

python voc_label.py

几分钟后,此脚本将生成所有必需的文件。如2019_train.txt和2019_val.txt文件,还会在VOCdevkit/VOC2019/labels/中生成大量标签文件。
类似于:

0 0.449074074074 0.679861111111 0.685185185185 0.456944444444

即:

<object-class> <x> <y> <width> <height>

四:下载预训练权重

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

五:修改3个配置文件

1.现在转到Darknet目录。我们必须更改cfg/voc.data配置文件以指向您的数据:

classes= 3
train  = /home/lixiaoyu/darknet/scripts/2019_train.txt
valid  = /home/lixiaoyu/darknet/scripts/2019_val.txt
names = /home/lixiaoyu/darknet/data/voc.names
backup = backup(忘说了...backup文件夹要自己创建在Darknet目录下)

2.更改data/voc.names(数据集的标签名)如本例:

1
2
3

3.修改cfg/yolov3-voc.cfg

[net]
#Testing
#batch=1
#subdivisions=1
#Training
batch=64 #批次,显存不够可减小,但会出现Nan问题(解决办法:增大batch。。。)
subdivisions=16 #训练迭代包含16组,每组4张图片
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]
size=1
stride=1
pad=1
filters=24  #3*(类别+5)
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=3  #类别
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1  #如果显存很小,将random设置为0,关闭多尺度训练
......

[convolutional]
size=1
stride=1
pad=1
filters=24  #这儿
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=3  #还有这儿
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0  
......

[convolutional]
size=1
stride=1
pad=1
filters=24  #。。。
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=3  #。。。
num=9
jitter=.3  
ignore_thresh = .5  
truth_thresh = 1 
random=0  

六:训练

普通训练:

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

若想使用多个GPU训练

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

如终止训练,权重会保存在backup文件夹下。如果要从检查点停止并重新启动训练

./darknet detector train cfg/coco.data cfg/yolov3.cfg backup/yolov3.backup -gpus 0,1,2,3

七:关于训练时打印的日志详解

如图所示:

Region 82 Avg IOU: 0.874546, Class: 0.983519, Obj: 0.984566, No Obj: 0.008776, .5R: 1.000000, .75R: 0.750000,  count: 4
Region 94 Avg IOU: 0.686372, Class: 0.878314, Obj: 0.475262, No Obj: 0.000712, .5R: 1.000000, .75R: 0.200000,  count: 5
Region 106 Avg IOU: 0.893751, Class: 0.762553, Obj: 0.388385, No Obj: 0.000089, .5R: 1.000000, .75R: 1.000000,  count: 1

三个尺度上预测不同大小的框,82卷积层为最大预测尺度,使用较大的mask,可以预测出较小的物体,94卷积层 为中间预测尺度,使用中等的mask, 106卷积层为最小预测尺度,使用较小的mask,可以预测出较大的物体。

下面以其中一个为例:

Region 82 Avg IOU: 0.874546, Class: 0.983519, Obj: 0.984566, No Obj: 0.008776, .5R: 1.000000, .75R: 0.750000,  count: 4

详解:
Region Avg IOU: 表示在当前subdivision内的图片的平均IOU,代表预测的矩形框和真实目标的交集与并集之比。
Class: 标注物体分类的正确率,期望该值趋近于1。
Obj: 越接近1越好。
No Obj: 期望该值越来越小,但不为零。
count: count后的值是所有的当前subdivision图片中包含正样本的图片的数量。

每过一个批次会返回一个输出:

1: 806.396851, 806.396851 avg, 0.000000 rate, 1.457291 seconds, 64 images

1: 指示当前训练的迭代次数
806.396851:是总体的Loss(损失)
806.396851 avg:是平均Loss,这个数值应该越低越好,一般到0.几的时候就可直接退出训练。
0.000000 rate:代表当前的学习率,是在.cfg文件中定义的。
1.843955 seconds:表示当前批次训练花费的总时间。
64 images:这一行最后的这个数值是1*64的大小,表示到目前为止,参与训练的图片的总量。

八:测试

./darknet detect cfg/yolov3.cfg yolov3.weights data/one.jpg
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149085.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • eureka 集群失败的原因_Eureka集群的那些坑

    eureka 集群失败的原因_Eureka集群的那些坑今天遇到一个Eureka集群的一个坑。问题现场类似是这样的:两台Eureka组成的服务注册中心集群,两台服务提供方server1、server2,两个服务调用方client1、client2。正常的情况下:client1和client2通过服务中心获取的服务提供方的注册的元数据信息,然后本地缓存调用server2、server1的服务API是没问题的。调用server的api服务时采用的Feign…

    2022年5月8日
    181
  • 电脑上怎么看用户名和密码_电脑超级用户名和密码

    电脑上怎么看用户名和密码_电脑超级用户名和密码大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。以windows7为例,电脑的用户名和密码的查看方法是:1、找到“我的电脑”或计算机;2、单击鼠标右键,打开“管理”;3、点击“本地用户和组”;4、选择用户,单击打开;5、查看用户及密码,也可以开机启动Windows,当运行到“正在启动WindowsXP”的提示界面时,按“F8”键调出系统启动选择菜单,选择“带命令行安全模式”;…

    2022年10月11日
    2
  • OSI参考模型——物理层详解

    OSI参考模型——物理层详解一 物理层的基本功能物理层是 OSI 参考模型的最低层 它利用传输介质为通信的主机之间建立 管理和释放物理连接 实现比特流的透明传输 传输单位是比特 保证比特流通过传输介质的正确传输 1 与数据链路的关系物理层屏蔽了物理层采用的传输介质 通信设备和通信技术的差异性 指定不同类型的物理协议 使得数据链路只需要考虑如何使用物理层的服务 而不用考虑物理层采用了那种传输介质 2 物理层的协议类型计算机网路

    2025年8月31日
    2
  • vim 复制粘贴「建议收藏」

    vim 复制粘贴「建议收藏」VIM编辑器1.复制和粘贴整行我们都知道复制的快捷键是“nyy”,粘贴的快捷键是“p”。Tips1.“yy”是复制光标所在行,“nyy”是复制包括光标所在行以及向下的“n-1”行**,一共n行。2.“p”是将已经复制的数据,粘贴在光标所在行的下一行。“P”为粘贴在光标所在行的上一行。2.粘贴和复制一个单词当我们想粘贴一行数据中的某些单词时有一些快捷键如下:yw 复制一个单词(包括单词后面的空白字符)4yl 复制当前光标下的字符、以及后面三个字符,总共四个字符4yh 复制光标前面

    2022年9月23日
    2
  • 移位寄存器-Verilog

    移位寄存器-Verilog//五位循环右移moduleregister_right( inputclk, input [4:0]data_in, outputreg[4:0]data_out); always@(posedgeclk)begin data_out<=({data_in[0],data_in[4:1]});endendmodule

    2022年7月16日
    13
  • linux时间戳转换成时间指令_时间戳转换公式

    linux时间戳转换成时间指令_时间戳转换公式原文地址:http://wanping.blogbus.com/logs/28663569.html1、时间戳转换为正常显示的时间格式Freebsd系统下:转换命令为:date-r1112173761    或者:date-r1112173761+”%Y-%m-%d%T%z”(年月日的格式不一样)Linux系统下:转换

    2022年10月2日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号