Darknet 训练与部署 YoLov3 模型
基于 YoLo 的目标检测
本项目主要针对灰度图像 .bmp 进行目标检测, 要求高效、准确地从灰度图像中检测出目标物体.
环境
- Windows 10
 - Visual Studio 2017
 - NVIDIA Geforce RTX 2060
 - CUDA 10.2
 - cuDNN
 
数据集构建
 首先需要采集足够多的图片, 然后使用 labelImg 工具进行图片标注.
从 Github 官方仓库 https://github.com/tzutalin/labelImg/releases/tag/v1.8.1 下载 windows_v1.8.1.zip, 解压后可以直接运行其中的labelImg.exe 打开软件, 解压路径不可以有中文.
软件使用可以参考 labelImg 使用教程 图像标定工具
注意, 软件中存储格式要从 PascalVOC(标签文件存储为 xml 格式) 改为yolo(标签文件存储为 txt 格式).
构建好的数据集包括若干张 .bmp 图片及其对应的同名 .txt 文件.
YoLo 模型训练
darknet 框架
官方版本(作者: Joseph Redmon)
Darknet 是一个用 C 和 CUDA 编写的开源神经网络框架。速度快,安装方便,支持 CPU 和 GPU 计算.
官网: https://pjreddie.com/darknet/
官网安装教程: https://pjreddie.com/darknet/install/  
1  | Darknet is easy to install with only two optional dependancies:  | 
该框架的作者 Joseph Redmon 仅在 linux 和 mac 系统中测试过, 要在 windows 系统下使用还要想其他办法.
windows 适配版(作者: AlexeyAB)
AlexeyAB 在原项目的基础上增加了darknet 在 windows 上的适配.
官方 Github 仓库: https://github.com/AlexeyAB/darknet
Release 版: https://github.com/AlexeyAB/darknet/releases/tag/darknet_yolo_v3
AlexeyAB-DarkNet 源码解析: https://github.com/BBuf/Darknet  
从上述 Release 地址下载 darknet.zip 解压后即可运行.
手动编译 Darknet
安装 CUDA, cuDNN, OpenCV 后下载 Darknet 源码进行编译得到 darknet.exe.
- 编译 Darknet
 - WIN10 下配置 Yolov3(VS2019,GPU)+opencv 训练自己的数据集(绝对详细,小白型记录)
 - Yolov3:win10 下训练自己的数据(GPU 版)(详细步骤)
 
AlexeyAB Release 版
既然 AlexeyAB 提供了他构建好的二进制包, 那么我们直接用就好了
There are attached compiled binary files of Darknet for Windows x64 (559 MB): https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3/darknet.zip
从上述网址下载 darknet.zip 文件, 解压缩后在 darknet\build\ 路径下的 darknet 就是编译好的包, 其子目录 x64\ 下的 darknet.exe 和darknet_no_gpu.exe就是编译得到的可执行文件. 在该路径下同时还有一个 yolov3.weights 文件就是预训练的权重, 以便直接用于模型推理, 同时该文件也可以在 darknet 官网找到. 另一个 darknet53.conv.74 也是权重文件, 在训练自己的数据集时会用到.
预训练权重:
https://pjreddie.com/media/files/yolov3.weights
https://pjreddie.com/media/files/darknet53.conv.74  
测试 
 打开 Powershell, 进入 darknet\build\darknet\x64\ 路径下, 运行如下命令:  
.\darknet.exe detect .\cfg\yolov3.cfg .\yolov3.weights .\data\dog.jpg
运行结束后会弹出一张图, 其中框选出了图中的truck,bicycle,dog.
训练自己的数据集
 可以参考 AlexeyAB 的 github 仓库:
https://github.com/AlexeyAB/darknet
或者他的中文翻译版:
https://github.com/BBuf/Darknet    
数据集组织
开始训练之前需要准备: 数据集图片文件、使用 LabelImg 标注的标签文件、训练集和验证集划分文件、预训练模型参数、数据集类别文件、数据集说明文件、yolov3 配置文件.
例如对于一个从 .bmp 格式图片中提取出标定板 board 的项目来说, 需要组织如下结构的文件, 其中大多数文件名其实是可以自定义的,但是务必要统一.
1  | - darknet_data\  | 
其中部分文件是从官方文件复制修改而来的, 根据实际情况, 作如下修改:
train.txt/val.txt
如下所示的文本文件, 每行列出一张图片相对
darknet.exe的路径. 当然也可以写出绝对路径. 后面将用 python 脚本来自动生成.
1  | ./darknet_data/dataset/image1.bmp  | 
board.data
总类别数 classes=1
train 和 valid 描述了训练接和验证集的文件名, 写出其相对于darknet.exe的路径 (注意,darknet_data 整个文件夹要放置到和darknet.exe相同路径下).
names 指出标签名文件位置
backup 表示训练后的权重文件放置位置, 模型每迭代 100 次保存当前最好的参数, 每 1000 次保存一下当前参数.
1  | classes= 1  | 
board.names
标签文件, 文件内每个标签名占一行
1  | board  | 
Generatefilename.py
将图片文件名分成训练集和验证集两类, 分别写入 train.txt 和 val.txt 文件内. 可以用绝对路径表示, 也可以用相对于
darknet.exe的相对路径表示. 如下的 python 脚本可以自动化地生成这两个文件. 注意根据实际情况修改rootdir的路径和分类时的阈值.
1  | import os  | 
yolov3-board.cfg
从官方
yolov3-voc.cfg文件复制修改而来.
要修改的地方包括
1  | subdivisions=32 # 这里可以设置为 16,32 或 64. 如果设置得太小则可能会内存不足. 视情况增大即可.  | 
训练
在 powershell 中执行如下命令:
1  | PS C:\Users\Username> .\darknet.exe detector train .\darknet_data\board.data .\darknet_data\yolov3-board.cfg .\darknet_data\pretrainedweight\darknet53.conv.74 .\darknet_data\trainedweights >> .\darknet_data\yolov3-board.log  | 
测试
基于 OpenCV 的模型部署
1  | 
  | 
Darknet 训练与部署 YoLov3 模型