YOLOv4 训练自定义数据集
[Github 原文档] @Bobby Chen 记得留下小星星
YOLOv4 水下目标检测
0. 配置环境
- Ubuntu 16.04/18.04
- CUDA 10.0
- cuDNN 7.6.0
- Python 3.6
- OpenCV 4.2.0
- tensorflow-gpu 1.13.0
1. 下载依赖项 - [Github]
pip3 install -r requirements.txt
Download the source code
git clone https://github.com/AlexeyAB/darknet.git
cd darknet
vim Makefile
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
DEBUG=1
OPENMP=1
LIBSO=1
ZED_CAMERA=1
make
2. 下载预训练权重
[Google drive] - yolov4.conv.137
[Baidu drive] - yolov4.conv.137 code: nppt
3. 标记自定义数据集 (可跳过
LabelImg is a graphical image annotation tool - labelImg
Ubuntu Linux Python3 + Qt5
git clone https://github.com/tzutalin/labelImg.git
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
cd labelImg
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
4. 制作训练数据路径链接
-
├── JPEGImages
-
├── object_00001.jpg
-
└── object_00002.jpg
-
…
├── Annotations -
├── object_00001.xml
-
└── object_00002.xml
-
…
├── labels -
├── object_00001.txt
-
└── object_00002.txt
-
…
├── backup -
├── yolov3-voc-object.backup
-
└── yolov3-voc-object_20000.weights
-
…
├── cfg -
├── yolo3_object.data
-
└── yolov3-voc-object.cfg
-
JPEGImages – 储存所有的图片
-
Annotations – 储存所有的标注 [.xml] 文件
-
labels – 储存所有转换的 [.txt] 文件 (convert all [.xml] file to [.txt] file) 执行 voc_label.py 转换
python3 ./tools/voc_label.py (convert xml2txt and check your file paths)
a. 首先创建训练集文件夹和验证集文件夹,并在所有自定义数据目录执行
python3 ./tools/img2train.py [img_path]
将所有数据分为训练集和验证集并生成 train.txt 和 val.txt 两个文件
- train.txt – 该文件内容为所有训练图片名(不带.jpg后缀)
- val.txt – 该文件内容为所有验证集图片名(不带.jpg后缀)
b.执行 voc_label.py 获取以下带路径的文件(用于 .data 文件)
- object_train.txt – 该文件内容为所有训练集的 绝对路径
- object_val.txt – 该文件内容为所有验证集的 绝对路径
5. 制作和更改 [.names] [.data] 和 [.cfg] 文件
- .names 文件内容为训练类别
gedit train.names
Person
Car
Dog
Cat
...
创建 train.names 后保存退出
- .data 文件内容为创建以上文件的软链接(建议使用绝对路径)
gedit obj.data
classes= [类别数]
train = [object_train.txt 文件的绝对路径]
valid = [object_val.txt 文件的绝对路径]
names = [train.names 文件的绝对路径]
backup = backup/ #训练后权重存储的文件夹
-
.cfg 文件可以更改 darknet/cfg/yolov4-custom.cfg (复制 yolov4-custom.cfg 到本地进行更改) 需要更改以下部分:
-
change line batch to batch=64 (32 or 16)
-
change line subdivisions to subdivisions=16 (根据你的GPU性能可调整为 32 or 64.)
-
change line max_batches to (classes*2000 but not less than number of training images, and not less than 6000), f.e. max_batches=6000 if you train for 3 classes
-
change line steps to 80% and 90% of max_batches, f.e. steps=4800,5400
-
set network size width=416 height=416 or any value multiple of 32:
-
更改 cfg 文件中的类别数 将 classes=80 更改为自定义数据类别数,共有 3 个 [yolo]-layers 需要更改,位置如下:
-
更改 cfg 文件中的 [filters=255] 参数,更新后的 filters=(类别数 + 5)x3 ,位于每个 [yolo] layer 中最后的 [convolutional] 层,共有 3 个 [filters=255] 需要更改,位置如下:
-
5. 训练
-
训练及训练过程可视化
sudo ./darknet detector train [obj.data path] [yolov4-custom.cfg path] yolov4.conv.137 -map
-
使用多GPU训练
sudo ./darknet detector train [obj.data path] [yolov4-custom.cfg path] yolov4.conv.137 -gpus 0,1,2 -map
6. 测试
-
测试单张图片
./darknet detector test [obj.data path] [yolov4-custom.cfg path] [weights file path] [image path]
-
测试视频
./darknet detector demo [obj.data path] [yolov4-custom.cfg path] [weights file path] [video path]
-
测试视频并保存测试结果
./darknet detector demo [obj.data path] [yolov4-custom.cfg path] [weights file path] [video path] -out_filename [Custom naming]