首页 > 其他分享 >Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!

Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!

时间:2022-11-07 15:37:54浏览次数:121  
标签:datasets YOLOV3 自定义 zhangkf Darknet pos jpg home NFPA


YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!

文章目录

  • ​​一. YOLOV3网络结构​​
  • ​​二. YOLOV3 Darknet 编译​​
  • ​​2.1. Clone项目文件​​
  • ​​2.2. 根据环境,修改Makefile 文件​​
  • ​​2.3. 项目编译​​
  • ​​2.4. 基于yolo.weights模型参数测试单张图片​​
  • ​​2.5. 基于yolo.weights模型参数测试多张图片​​
  • ​​2.6. 基于yolo.weights模型参数来测试video​​
  • ​​三. YOLOV3 训练自定义数据​​
  • ​​3.1. 数据准备​​
  • ​​3.2. 训练数据集文件​​
  • ​​3.3. 数据集配置​​
  • ​​3.4. 模型训练​​
  • ​​3.5. 模型简单测试​​
  • ​​四. YOLOV3 训练VOC格式数据集​​
  • ​​4.1. 利用voc制作自己的数据集​​
  • ​​4.2. 迁移到darknet中​​
  • ​​4.3. 局部修改​​
  • ​​4.4. COCO数据集​​
  • ​​4.5. 修改 COCO 训练用的 cfg 配置文件​​
  • ​​4.6. 模型训练​​
  • ​​参考文章​​
  • 上一篇博客​​YOLOV3-Darknet环境搭建+训练COCO数据集了解!​​

一. YOLOV3网络结构


Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_coco数据集

二. YOLOV3 Darknet 编译

2.1. Clone项目文件

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

2.2. 根据环境,修改Makefile 文件

  • 例如修改如下:这里可以参考我上一篇文章:​​yolov3检测模型之darknet环境搭建+训练ms coco数据集!​​
GPU=1    # 0 或 1其中1表示使用GPU,0表示使用CPU
CUDNN=1 # 0 或 1其中1表示使用cuda加速,并且在nvcc填写cuda路径,文件的配置可以参看上一篇博客;
OPENCV=1 # 0 或 1其中1表示使用opencv
OPENMP=0 # 0 或 1
DEBUG=0 # 0 或 1

# 使用 GPU 和 CUDA 时,根据 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

# Darknet 默认使用 stb_image.h 进行图片加载.
# https://github.com/nothings/stb/blob/master/stb_image.h
# 在使用 OpenCV 时,
ifeq ($(OPENCV), 1)
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv` -lstdc++
COMMON+= `pkg-config --cflags opencv`
# LDFLAGS+= `pkg-config --libs opencv4` -lstdc++
# COMMON+= `pkg-config --cflags opencv4`
endif

# CUDA 库路径:
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand
endif

# CUDNN:
ifeq ($(CUDNN), 1)
COMMON+= -DCUDNN
CFLAGS+= -DCUDNN
LDFLAGS+= -lcudnn
endif
......
......

更改ARCH配置的时候,根据自己的GPU型号来定。我的GPU是GTX1080的计算能力是6.1。故更改为如下:吧前面几行语句注释掉,只保留值为52的那个。

  • compute_30表示显卡的计算能力是3.0。
  • 注意:每次修改完makefile都要重新Make一下才能生效。
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]

2.3. 项目编译

make  -j8  # 这里的8表示用8线程进行编译,这样编译时间比较短,建议使用多核心,这台服务器是16核心32线程,
###### 清楚环境用 make clean
  • 到这一步时遇到错误,这个错误是在darknet目录下执行make指令显示的错误。显示内容如下:
./src/image_opencv.cpp:5:10: fatal error: opencv2/opencv.hpp: 没有那个文件或目录
#include "opencv2/opencv.hpp"
compilation terminated.
Makefile:86: recipe for target 'obj/image_opencv.o' failed
make: *** [obj/image_opencv.o] Error 1
make: *** 正在等待未完成的任务....

出现上面错误的原因是之前我安装的opencv是python的,即opencv_python。这里模型的训练需要用到c++的opencv。所以这里再装一遍opencv。

  • OpenCV的安装参考我之前的博客(这里我安装的是opencv-3.4.4):安转opencv
  • 官网链接进行下载指定的版本:​​进入官网链接!​
cd opencv
sudo pip3 install cmake #如果已经安装过cmake,则该步骤省略
#安装依赖库
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev:i386 libtiff5-dev
  • 创建一个编译文件夹并且进入
mkdir build # 创建编译的文件目录
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4 ..

上面的指令修改安装路径到/usr/local/opencv4,可以自己修改到自己需要的位置,如果该命令中不加-D CMAKE_INSTALL_PREFIX=/usr/local/opencv4,则默认各部分分别安装在/usr/local/目录的include/ bin/ lib/3个文件夹下。注意上面指令路径
后面还有两个点。

make -j16   # 根据自己的电脑进行选择!
  • 问题1: 下载ippicv_2019_lnx_intel64_general_20180723.tgz失败。手动下载该文件。
链接:https://pan.baidu.com/s/1psONpvP9zVXo1GhW4-WGvQ 
提取码:2snk
下载完了之后,要到ippicv.cmake中修改下载地址,这样就不用再在网上下载了。
#############找到
/opencv_source/opencv/3rdparty/ippicv/ippicv.cmake
将其中的
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}ippicv/"
改为步骤1中手动下载的文件的本地路径(也就是将网络下载的模式改为本地文件下载的模式):
############Linux
"file:///home/UserName/Downloads/" #(仅供参考,根据自己的路径填写)
############windows
"file://E:/softs/open/lib_softs/"
  • make编译指令不需要再前面添加sudo,这样的创建的一些文件就需要sudo权限。进行make install安装
sudo make install  # make -j16 执行没有错误之后。
  • 安装完成,配置opencv编译环境。
sudo gedit /etc/ld.so.conf.d/opencv.conf
############# 在打开的空文件末尾添加上:
/usr/local/opencv4/lib
############# 终端输入使配置的路径生效
sudo ldconfig
  • 环境配置完成,进行测试,进入到opencv/samples/cpp/example_cmake目录下。因为更改了opencv的安装路径,所以这里测试前需要CMakeLists.txt文件的14行find_package(OpenCV REQUIRED)前面加上
set(OpenCV_DIR /usr/local/opencv4/lib/cmake/opencv4)
############ 终端在opencv/samples/cpp/example_cmake目录下执行:
cmake .
########### 注意cmake后面有一个点;接着在终端输入
make -j16
########### 输入
./opencv_example
########### 正常结果是:电脑打开了摄像头,在摄像头采集到的图片左上角出现hello opencv字样,即配置成功。
########### 若电脑没有摄像头,则另一种检测方法是终端输入:
python3
import cv2
cv2.__version__
  • 配置成功的结果是显示出opencvz的版本号,注意指令version前后都是有两个_符号。安装完成opencv4.1.0后,在darknet下编译还是有和之前一样的错误,故使用另一种方法:卸载该版本的opencv,software/opencv/build路径下(从github下载包的路径,不是后来的安装路径)终端输入:因为在这个路径下存在文件cmake_uninstall.cmake。
sudo make uninstall
  • 然后再把local安装路径下和software下载包的路径下把opencv4的文件全部删除。local文件夹下的需要sudo来删除文件夹。
sudo rm -r opencv4

还有不懂的参考作者:​​yolov3训练自己的数据集——第一次实操完整记录!​​

2.4. 基于yolo.weights模型参数测试单张图片

# 下载预训练模型
wget https://pjreddie.com/media/files/yolov3.weights
# 或着tiny版本:
wget https://pjreddie.com/media/files/yolov3-tiny.weights

# 简单测试,默认是在 ID=0 的 GPU 上运行
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

# 指定 GPU ID
./darknet -i 1 detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

# 修改预测结果的置信阈值:
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0.2

detect 是命令;后面三个分别是参数;参数cfg/yolov3.cfg表示网络模型;参数yolov3.weights表示网络权重;参数data/dog.jpg表示需要检测的图片。



Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_自定义数据集_02

2.5. 基于yolo.weights模型参数测试多张图片

  • 不需要给定测试图片的路径,直接输入以下指令,然后程序会提示你输入测试图像路径,直到ctrl+c退出程序。
./darknet detect cfg/yolo.cfg yolo.weights

2.6. 基于yolo.weights模型参数来测试video

  • video检测,使用opencv检测视频。终端输入:
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

三. YOLOV3 训练自定义数据

3.1. 数据准备

  • 主要是创建图片的 txt 文件
  • 对每个 .jpg 图片创建一个对应的 .txt 文件,其具有相同的文件名,即:一张图片对应一个 txt Label 文件,如图片名为 0001.jpg,则对应的 Label 文件为 0001.txt;
  • 并且在 txt Label 文件中保存了物体类别 ID 和物体的位置坐标,每个目标占一行,格式为:
<object-class> <x> <y> <width> <height>

其中:

  • ​<object-class>​​ 类别ID(第几个类别,从 0 开始索引, classes-1), 整型数值;
  • ​<x> <y>​​​ 物体边界框中心点坐标x、物体边界框中心点坐标y. [0.0 - 1.0] 间的浮点数值,相对于图片的 width 和 height 的比值.,如: ​​<x> = <absolute_x> / <image_width>​​​ 和 ​​<height> = <absolute_height> / <image_height>​​;
  • ​<width> <height>​​ 物体边界框宽度、物体边界框高度, 相对于图片的 width 和 height 的比值;
  • 如,对于图片 0001.jpg,可以创建包含如下信息的标注文件 0001.txt:
1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
2 0.420312 0.395833 0.140625 0.166667
...
  • 示例1:比如,图片尺寸为 360*480,其包含一个目标物体:dog. 有:
image_width = 360
image_height = 480
absolute_x = 30 (dog x position from image)
absolute_y = 40 (dog y position from image)
absolute_height = 200 (original height of dog from image)
absolute_width = 200 (original width of dog from image)
  • 则,可以得到 txt 标注文件内容每行包含 ​​<class_number> (<absolute_x> / <image_width>) (<absolute_y> / <image_height>) (<absolute_width> / <image_width>) (<absolute_height> / <image_height>)​​. 如:
0 (30/360) (40/480) (200/360) (200/480)
0 0.0833 0.0833 0.556 0.417
  • 示例2: VOC 到 YOLO 标注Label 的转换:
# voc box:
# xmin,xmax,ymin,ymax
def convert(size, box):
dw = 1./(size[0]) # 图片 width
dh = 1./(size[1]) # 图片 height
x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x,y,w,h)

3.2. 训练数据集文件


Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_Darknet_03

  • 图片和标注文件准备好后,即可制作训练数据和测试数据集文件:
import glob, os

# 数据集的位置
imgs_dir = '/home/zhangkf/datasets/NFPA'
print(imgs_dir)

#用作 test 的图片数据的比例
percentage_test = 10;

#创建训练数据集和测试数据集:train.txt 和 test.txt
file_train = open('/home/zhangkf/datasets/train.txt', 'w')
file_test = open('/home/zhangkf/datasets/test.txt', 'w')

counter = 1
index_test = round(100 / percentage_test)
for pathAndFilename in glob.iglob(os.path.join(imgs_dir, "*.jpg")):
title, ext = os.path.splitext(os.path.basename(pathAndFilename))

if counter == index_test:
counter = 1
file_test.write(imgs_dir + "/" + title + '.jpg' + "\n")
else:
file_train.write(imgs_dir + "/" + title + '.jpg' + "\n")
counter = counter + 1
  • 会得到两个文件:train.txt 和 test.txt,内容格式类似于:
  • train.txt 部分
/home/zhangkf/datasets/NFPA/pos-44.jpg
/home/zhangkf/datasets/NFPA/pos-53.jpg
/home/zhangkf/datasets/NFPA/pos-79.jpg
/home/zhangkf/datasets/NFPA/pos-286.jpg
/home/zhangkf/datasets/NFPA/pos-1.jpg
/home/zhangkf/datasets/NFPA/pos-294.jpg
/home/zhangkf/datasets/NFPA/pos-192.jpg
/home/zhangkf/datasets/NFPA/pos-41.jpg
/home/zhangkf/datasets/NFPA/pos-65.jpg
/home/zhangkf/datasets/NFPA/pos-99.jpg
/home/zhangkf/datasets/NFPA/pos-55.jpg
/home/zhangkf/datasets/NFPA/pos-87.jpg
/home/zhangkf/datasets/NFPA/pos-247.jpg
/home/zhangkf/datasets/NFPA/pos-259.jpg
/home/zhangkf/datasets/NFPA/pos-179.jpg
/home/zhangkf/datasets/NFPA/pos-81.jpg
/home/zhangkf/datasets/NFPA/pos-120.jpg
/home/zhangkf/datasets/NFPA/pos-128.jpg
/home/zhangkf/datasets/NFPA/pos-98.jpg
/home/zhangkf/datasets/NFPA/pos-194.jpg
/home/zhangkf/datasets/NFPA/pos-297.jpg
/home/zhangkf/datasets/NFPA/pos-138.jpg
/home/zhangkf/datasets/NFPA/pos-106.jpg
  • test.txt部分
/home/zhangkf/datasets/NFPA/pos-281.jpg
/home/zhangkf/datasets/NFPA/pos-293.jpg
/home/zhangkf/datasets/NFPA/pos-13.jpg
/home/zhangkf/datasets/NFPA/pos-39.jpg
/home/zhangkf/datasets/NFPA/pos-46.jpg
/home/zhangkf/datasets/NFPA/pos-89.jpg
/home/zhangkf/datasets/NFPA/pos-237.jpg
/home/zhangkf/datasets/NFPA/pos-283.jpg
/home/zhangkf/datasets/NFPA/pos-274.jpg
/home/zhangkf/datasets/NFPA/pos-159.jpg
/home/zhangkf/datasets/NFPA/pos-37.jpg
/home/zhangkf/datasets/NFPA/pos-145.jpg
/home/zhangkf/datasets/NFPA/pos-107.jpg
/home/zhangkf/datasets/NFPA/pos-165.jpg
/home/zhangkf/datasets/NFPA/pos-260.jpg
/home/zhangkf/datasets/NFPA/pos-97.jpg
/home/zhangkf/datasets/NFPA/pos-296.jpg
/home/zhangkf/datasets/NFPA/pos-90.jpg
/home/zhangkf/datasets/NFPA/pos-150.jpg
/home/zhangkf/datasets/NFPA/pos-116.jpg
/home/zhangkf/datasets/NFPA/pos-197.jpg
/home/zhangkf/datasets/NFPA/pos-199.jpg
/home/zhangkf/datasets/NFPA/pos-17.jpg
/home/zhangkf/datasets/NFPA/pos-21.jpg
/home/zhangkf/datasets/NFPA/pos-196.jpg
/home/zhangkf/datasets/NFPA/pos-245.jpg
/home/zhangkf/datasets/NFPA/pos-193.jpg
/home/zhangkf/datasets/NFPA/pos-23.jpg

3.3. 数据集配置

  • 标签名(类别名)文件 - 如​​NFPA/obj.names​​(每一行为一个标签(类别)):
NFPA #每一行为一个类别
  • 数据集配置文件 - 如 ​​NFPA/obj.data​​,注意这里只是打注释便于理解,实际中不要有这个;
classes= 1                                             # 标签(类别)数量
train = /home/zhangkf/datasets/NFPA_dataset/train.txt # 训练数据集文件
valid = /home/zhangkf/datasets/NFPA_dataset/test.txt # 测试数据集文件
names = /home/zhangkf/datasets/NFPA_dataset/obj.names # 标签名(类别名)文件
backup = /home/zhangkf/datasets/NFPA_dataset/backup # 模型保存备份路径
  • 模型配置文件 - 如 ​​NFPA/yolov3-tiny.cfg​​:
[net]
# Testing
batch=1 # 测试时,取消该两行注释,并注释掉 Training 的两行
subdivisions=1
# Training
# batch=64 # 训练时,取消该两行注释,并注释掉 Testing 的两行
# batchsize,每 batch 个样本更新一次模型参数
# subdivisions=16 # 每批训练的个数=batch/subvisions
# 根据GPU显存修改,显存不够改大一些
# darknet代码中,会将batch/subdivisions记为batch
width=416 # 网络输入的宽度
height=416 # 网络输入的高度
channels=3 # 网络输入的通道数
momentum=0.9
decay=0.0005 # 权重衰减正则项,防止过拟合.
angle=0 # 旋转角度,数据增强
saturation = 1.5 # 调整饱和度,数据增强
exposure = 1.5 # 调整曝光量,数据增强
hue=.1 # 调整Hue,数据增强

learning_rate=0.001 # 初始学习率
burn_in=1000
max_batches = 50200 # 训练的最大迭代次数
policy=steps # 学习率调整策略,如 constant,step,exp,ploy,setps,random等
steps=40000,45000 # 学习率衰减的迭代次数处
scales=.1,.1 # 学习率变化的比例,累计相乘
  • 并修改网络输出通道数 - ​​[yolo]​​​ 标签及上一​​[convolutional]​​ 标签(包含三处):
[convolutional]
size=1
stride=1
pad=1
filters=18 # 注意:filters = 3 * ( classes + 5 ),如,filters=3*(1+4+1)
activation=linear

[yolo]
mask = 0,1,2 # 当前属于的第几个预选框
anchors = 10,13, 16,30, 33,23, # 预选框,可手工挑选,
30,61, 62,45, 59,119, # 也可 K-means 从训练样本中得到.
116,90, 156,198, 373,326
classes=1 # 修改为自定义数据集的类别数
num=9 # 预选框的个数, anchors的总数
jitter=.3 # 添加抖动来增加噪声,以抑制过拟合
ignore_thresh = .5 # 论文里的阈值1
truth_thresh = 1 # 论文里的阈值2
random=1 # 0 - 关闭多尺度训练(显存小时可以设置为0.)

3.4. 模型训练

  • 模型训练:
./darknet detector train \
/path/to/NFPA/obj.data \
/path/to/NFPA/yolov3-tiny.cfg \
/path/to/yolov3-tiny.conv.15
  • 模型训练过程如:
yolov3-tiny
layer filters size input output
0 conv 16 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 16 0.150 BFLOPs
1 max 2 x 2 / 2 416 x 416 x 16 -> 208 x 208 x 16
2 conv 32 3 x 3 / 1 208 x 208 x 16 -> 208 x 208 x 32 0.399 BFLOPs
3 max 2 x 2 / 2 208 x 208 x 32 -> 104 x 104 x 32
4 conv 64 3 x 3 / 1 104 x 104 x 32 -> 104 x 104 x 64 0.399 BFLOPs
5 max 2 x 2 / 2 104 x 104 x 64 -> 52 x 52 x 64
6 conv 128 3 x 3 / 1 52 x 52 x 64 -> 52 x 52 x 128 0.399 BFLOPs
7 max 2 x 2 / 2 52 x 52 x 128 -> 26 x 26 x 128
8 conv 256 3 x 3 / 1 26 x 26 x 128 -> 26 x 26 x 256 0.399 BFLOPs
9 max 2 x 2 / 2 26 x 26 x 256 -> 13 x 13 x 256
10 conv 512 3 x 3 / 1 13 x 13 x 256 -> 13 x 13 x 512 0.399 BFLOPs
11 max 2 x 2 / 1 13 x 13 x 512 -> 13 x 13 x 512
12 conv 1024 3 x 3 / 1 13 x 13 x 512 -> 13 x 13 x1024 1.595 BFLOPs
13 conv 256 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 256 0.089 BFLOPs
14 conv 512 3 x 3 / 1 13 x 13 x 256 -> 13 x 13 x 512 0.399 BFLOPs
15 conv 255 1 x 1 / 1 13 x 13 x 512 -> 13 x 13 x 255 0.044 BFLOPs
16 yolo
17 route 13
18 conv 128 1 x 1 / 1 13 x 13 x 256 -> 13 x 13 x 128 0.011 BFLOPs
19 upsample 2x 13 x 13 x 128 -> 26 x 26 x 128
20 route 19 8
21 conv 256 3 x 3 / 1 26 x 26 x 384 -> 26 x 26 x 256 1.196 BFLOPs
22 conv 18 1 x 1 / 1 26 x 26 x 256 -> 26 x 26 x 18 0.006 BFLOPs
23 yolo
Loading weights from /home/zhangkf/darknet-master/darknet53.conv.74...Done!
Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
Resizing
384
Loaded: 0.000031 seconds
Region 16 Avg IOU: 0.683222, Class: 0.499940, Obj: 0.499600, No Obj: 0.499578, .5R: 1.000000, .75R: 0.250000, count: 8
Region 23 Avg IOU: 0.230419, Class: 0.497310, Obj: 0.499917, No Obj: 0.499317, .5R: 0.142857, .75R: 0.000000, count: 7
Region 16 Avg IOU: 0.733487, Class: 0.500262, Obj: 0.499577, No Obj: 0.499578, .5R: 1.000000, .75R: 0.375000, count: 8
Region 23 Avg IOU: 0.152336, Class: 0.497174, Obj: 0.500159, No Obj: 0.499307, .5R: 0.000000, .75R: 0.000000, count: 5
1: 277.039764, 277.039764 avg, 0.000000 rate, 0.203770 seconds, 24 images
Loaded: 0.000037 seconds
Region 16 Avg IOU: 0.733951, Class: 0.500144, Obj: 0.499601, No Obj: 0.499578, .5R: 1.000000, .75R: 0.454545, count: 11
Region 23 Avg IOU: 0.240497, Class: 0.497174, Obj: 0.500157, No Obj: 0.499313, .5R: 0.000000, .75R: 0.000000, count: 3
Region 16 Avg IOU: 0.606808, Class: 0.500103, Obj: 0.499518, No Obj: 0.499578, .5R: 1.000000, .75R: 0.000000, count: 5
Region 23 Avg IOU: 0.198287, Class: 0.497175, Obj: 0.500158, No Obj: 0.499323, .5R: 0.000000, .75R: 0.000000, count: 9
2: 277.279144, 277.063690 avg, 0.000000 rate, 0.188760 seconds, 48 images
Loaded: 0.000036 seconds
  • 注意1: 关于yolov3-tiny.conv.15
./darknet partial ./cfg/yolov3-tiny.cfg ./pretrained/yolov3-tiny.weights ./pretrained/yolov3-tiny.conv.15 15
  • 注意2:训练时的注意事项

3.5. 模型简单测试

  • 训练得到模型后,即可简单测试下;如:
./darknet detector test  ~/datasets/NFPA_dataset/obj.data  \
cfg/yolov3-tiny.cfg yolov3-tiny_50000.weights /home/zhangkf/datasets/NFPA/pos-283.jpg
  • 输出结果类似于如下: 目前正在训练。。。。。。。。。。。。。。。明天补充:最终训练完成!


Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_YOLOV3_04

四. YOLOV3 训练VOC格式数据集

4.1. 利用voc制作自己的数据集

  • 在目录下新建VOC2007,并在VOC2007下新建Annotations,ImageSets和JPEGImages三个文件夹。在ImageSets下新建Main文件夹。文件目录如下所示:


Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_Darknet_05

  • 将自己的数据集图片拷贝到JPEGImages目录下。将数据集label文件拷贝到Annotations目录下。在VOC2007下新建test.py文件夹,将下面代码拷贝进去运行,将生成四个文件:train.txt,val.txt,test.txt和trainval.txt。
import os
import random

trainval_percent = 0.90 # 整个数据集中,作为训练验证集的比例数
train_percent = 1. # 训练验证集中用于训练的数据的比例,根据实际情况修改
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath) # 得到整个注释文件的文件名

num = len(total_xml) # 文件个数
list = range(num) # 0到num
tv = int(num * trainval_percent) # 训练验证文件的个数
tr = int(tv * train_percent) # 训练文件的个数
trainval = random.sample(list, tv) # 从0到num中随机选取tv个
train = random.sample(trainval, tr) # 从trainval中随机选取tr个

ftrainval = open('ImageSets/Main/trainval.txt', 'w') #写模式打开trainval.txt,下同
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')

for i in list: # 遍历文件
name = total_xml[i][:-4] + '\n' # 取不带格式的文件名
if i in trainval: # 分别写入不同的文件下
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)

ftrainval.close() # 关闭文件
ftrain.close()
fval.close()
ftest.close()
  • 生成后的目录结构如下所示:


Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_数据集_06

  • 做好这一步之后,自己的数据集基本做好了,接下来需要转移阵地到代码环境中去。

4.2. 迁移到darknet中

  • 在代码的darknet目录下新建VOCdevkit文件夹,然后把刚才制作的VOC2007文件夹拷贝到该文件夹下。有的读者可能了解过YOLOV3的label,YOLOV3的label标注的一行五个数分别代表类别(从 0 开始编号), BoundingBox 中心 X 坐标,中心 Y 坐标,宽,高。这些坐标都是 0~1 的相对坐标。和我们刚才标注的label不同,因此我们需要下面的py文件帮我们转换label。
wget https://pjreddie.com/media/files/voc_label.py
  • 这里需要修改两个地方,sets和classes,classes根据自己需要修改。


Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_coco数据集_07

  • 接下来运行该文件,我们的目录下会生成三个txt文件2007_train.txt,2007_val.txt,2007_test.txt,VOCdevkit下的VOC2007也会多生成一个labels文件夹,下面是真正会使用到的label,点开看发现已经转化成YOLOV3需要的格式了。这时候自己的数据集正式完成。
python voc_label.py
cat 2007_train.txt 2007_val.txt > train.txt

4.3. 局部修改

  • 1、修改cfg/voc.data(根据自己的路径修改。)


Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_coco数据集_08

  • 2、修改data/voc.names和coco.names(打开对应的文件都是原本数据集里的类,改成自己的类就行。)


Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_Darknet_09

  • 3、修改参数文件cfg/yolov3-voc.cfg
ctrl+f搜 yolo, 总共会搜出3个含有yolo的地方。
每个地方都必须要改2处, filters:3*(5+len(classes))它前面的一个卷积层中的;
其中:classes: len(classes) = 1,这里以单个类dog为例
filters = 18
classes = 1
可修改:random = 1:原来是1,显存小改为0。(是否要多尺度输出。)



Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_数据集_10

  • 参数文件开头的地方可以选训练的batchsize,要注意!


Darknet框架2:YOLOV3-使用Darknet训练检测自定义模型+COCO数据集!_Darknet_11

  • 如果读者按照步骤已经耐心的到这里了,可以舒一口气了,离成功只差一步了。下载darknet53的预训练模型。
wget https://pjreddie.com/media/files/darknet53.conv.74
  • 开始训练:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

4.4. COCO数据集

  • ​[scripts/get_coco_dataset.sh]()​​ 是COCO数据集图片和标签获取的脚本,运行即可:
cp scripts/get_coco_dataset.sh data
cd data
bash get_coco_dataset.sh
  • 也可以手工下载 COCO 数据集:
# COCO 图片
wget -c https://pjreddie.com/media/files/train2014.zip
wget -c https://pjreddie.com/media/files/val2014.zip
unzip -q train2014.zip
unzip -q val2014.zip

# COCO Metadata
wget -c https://pjreddie.com/media/files/instances_train-val2014.zip
wget -c https://pjreddie.com/media/files/coco/5k.part
wget -c https://pjreddie.com/media/files/coco/trainvalno5k.part
wget -c https://pjreddie.com/media/files/coco/labels.tgz
tar xzf labels.tgz
unzip -q instances_train-val2014.zip

# 图片列表
paste <(awk "{print \"$PWD\"}" <5k.part) 5k.part | tr -d '\t' > 5k.txt
paste <(awk "{print \"$PWD\"}" <trainvalno5k.part) trainvalno5k.part | tr -d '\t' > trainvalno5k.txt

4.5. 修改 COCO 训练用的 cfg 配置文件

  • ​[cfg/coco.data]()​​ 配置文件,指定 COCO 数据集的相关信息
classes= 80
train = /home/pjreddie/data/coco/trainvalno5k.txt
valid = coco_testdev
#valid = data/coco_val_5k.list
names = data/coco.names
backup = /home/pjreddie/backup/ # 训练结果文件保存的路径
eval=coco

4.6. 模型训练

./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74

# 多 GPU 训练
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74 -gpus 0,1,2,3

# 从断点 checkpoint 恢复训练
./darknet detector train cfg/coco.data cfg/yolov3.cfg backup/yolov3.backup -gpus 0,1,2,3

参考文章

在这里参考了以下作者文章,在这里真诚的表示感谢!


标签:datasets,YOLOV3,自定义,zhangkf,Darknet,pos,jpg,home,NFPA
From: https://blog.51cto.com/u_15866474/5829903

相关文章

  • uniapp引入微信小程序自定义视频组件--记录
    官方文档:https://zh.uniapp.dcloud.io/tutorial/miniprogram-subject.html在pages.json同级目录下创建目录和文件:wxcomponents:   my-video-play:index.js ......
  • Vue3必会技巧-自定义Hooks
    Vue3自定义Hooks定义:个人理解:一些可复用的方法像钩子一样挂着,可以随时被引入和调用以实现高内聚低耦合的目标,应该都能算是hook;为什么Vue3要用自定义Hook?:结论:就是为了......
  • Elasticsearch拼音搜索:自定义分词器的模板
    PUT/test{"settings":{"analysis":{"analyzer":{"my_analyzer":{"tokenizer":"ik_max_word","filter":"py"}......
  • 使用Web Component自定义组件
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="widt......
  • DataGear 自定义数据可视化图表
    DataGear内置了很多常用的图表(折线图、柱状图、饼图、散点图、雷达图、地图等等),能满足大部分数据可视化需求,当内置图表无法满足时,则可以通过自定义图表或插件的方式,实现特......
  • Ant Design Vue自定义文件上传设置progress进度条
    前言在使用AntDesignVue的upload文件上传功能的时候,我们为了规范前端代码,所以会封装接口请求到对应的ts或js文件并引用,这个时候我们会更多的使用自定义文件上传的功......
  • 23种设计模式之自定义Spring框架(五)
    7,自定义Spring框架7.1spring使用回顾自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟。数据访问层。定义UserDao接口及其子......
  • PyQt5中处理自定义槽的手段(对于界面继承的封装)
    自定义槽由于我打算用QT编辑器来设计Qt界面,所以少不了ui转py的这一步骤。但是每次转ui时,都会自动覆盖原来的文件,这样的话,如果需要在源文件的基础上添加自定义槽,就很麻烦......
  • vue 自定义v-model
    怎么通过子组件修改父级组件的表单组件v-model绑定的变量。其中,子组件这样写,通过@input事件(这个事件主要用于监听,只有输入值变化了就会触发input),然后触发修改父组件的sel......
  • WPF 自定义控件 动画仪表盘控件 Gauge
    原文网址:https://blog.csdn.net/weixin_42850577/article/details/124008594WPF自制动画仪表盘控件Gauge  Xaml代码:<StyleTargetType="{x:Typectrl:ArcGauge......