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 模型