YOLO v4 模型训练实作

前言

之前一篇『YOLO v4 安装心得 -- Windows 环境』介绍如何建置 YOLO4(Darknet),并进行物件侦测(Object Detection), 但是,下载的标准模型只能侦测 MS COCO 资料集的80种物件,如果要侦测自订的物件,就必须使用自订资料集来训练模型,因此,以下就来实作模型训练。

准备训练资料

YOLO 模型训练主要分两个步骤:

  1. 标注资料:可使用各式标注工具,将图像内的物件框起来,一般存档的格式有YOLO、COCO、VOC等,本文使用的是YOLO格式。
  2. 模型训练:有了图像及标注档後,就可以进行模型训练,以下会详细介绍完整的程序。

标注工具有LabelImg、LabelMe等软件,可参阅『13 Best Image Annotation Tools of 2021』。常用的是LabelImg,相关指令如下:
安装:pip install LabelImg
执行:LabelImg
操作可参阅『LabelImg 影像标注工具使用教学,制作深度学习用的资料集』

两个步骤都非常费时,因此,本文选择直接下载已标注好的资料集,只有一个类别 -- 兔子,网址为『Eastern Cottontail Rabbits Dataset』。 内容是一个图档(.jpg)对应一个同名的备注档(.txt),备注档的格式有五栏:类别代码、物件左上角X轴座标、左上角Y轴座标、物件宽度、物件高度。

训练

训练程序详阅『YOLO v4 官网』

因为程序实在非常冗长,因此笔者稍作整理,以方便读者快速设定。

  1. 建置 Darknet执行档,请参阅『YOLO v4 安装心得 -- Windows 环境』

  2. 下载预训模型 yolov4.conv.137 至 weights 目录(需新增)。

  3. 切换至 darknet-master\build\darknet\x64 目录。

  4. 复制 cfg\yolov4-custom.cfg 为 cfg\yolo-obj.cfg。以下5~10步骤修改yolo-obj.cfg档案内设定。

  5. batch=16:原始文件为64,批次过大会造成笔者PC记忆体不足(GPU),读者可依据本身的GPU记忆体调配。记忆体不足的错误讯息为『Error: cuDNN isn't found FWD algo for convolution』。

  6. max_batches=2000:公式为 类别数(classes) x 2000。

  7. steps=1600,1800:公式为 max_batches 的 80%、90%。

  8. 设定模型输入的图像尺寸。
    width=416
    height=416

  9. [yolo]段落的classes=80更改为classes=1:共3个,可直接使用编辑器的『取代』直接置换,须视类别个数调整

  10. [yolo]段落的上面一个[convolutional]段落的filters=255更改为filters=18,共3个,请小心修改,filters值须视类别个数调整,公式为(类别个数+5) x 3。

  11. 新增档案 build\darknet\x64\data\obj.names,内容如下,须列出所有类别:
    Rabbits

  12. 新增档案 build\darknet\x64\data\obj.data,内容如下:

# 视类别个数调整
classes = 1
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
  1. 复制训练资料(*.jpg、 *.txt) 至 build\darknet\x64\data\obj\ 目录(需新增)。部分档名过长,训练可能出现错误,可修改成较短的档名。使用Labelimg开启上述目录,可观看标注的图像,如下:
    https://ithelp.ithome.com.tw/upload/images/20220119/20001976LZGMRkGzCy.png

  2. 新增档案 build\darknet\x64\data\train.txt,档案内容为每个图像档名。前面加data/obj/。

  3. 训练指令如下,若训练时有些档案找不到,试着将档名及txt档名改短:
    darknet.exe detector train data/obj.data cfg/yolo-obj.cfg weights/yolov4.conv.137

  4. 笔者训练约2小时,过程的损失函数如下图,最後会存至 chart_yolo-obj.png。
    https://ithelp.ithome.com.tw/upload/images/20211111/20001976lgSNCDkJOW.png

  5. 训练後的权重档会储存在backup目录,档名为 yolo-obj_final.weights。

  6. 如果训练中途停止,或要延长训练周期,可执行指令如下:
    darknet.exe detector train data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_2000.weights

其中yolo-obj_2000.weights为执行2000训练周期的权重档,以上指令表示由第2000周期继续训练。

  1. 测试指令如下:
darknet.exe detector test data/obj.data cfg\yolo-obj.cfg backup\yolo-obj_final.weights 

或者

darknet detector test data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_final.weights data\obj\4616855_80b098a3_jpg.rf.a0a319f1836215681493f06c81856b99.jpg

或者一次测试多个档案:

darknet detector test data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_final.weights < data/train.txt

输出如下:
https://ithelp.ithome.com.tw/upload/images/20211111/200019764gCrdrYCkV.png

Python 测试

修改darknet.py 最後第三行,指定相关设定档:

import sys

print(performDetect(sys.argv[1], configPath = "./cfg/yolo-obj.cfg", weightPath = "./backup/yolo-obj_final.weights", metaPath= "./data/obj.data"))

测试指令如下:

python .\darknet_custom.py data\obj\4616855_80b098a3_jpg.rf.a0a319f1836215681493f06c81856b99.jpg

输出如下:
https://ithelp.ithome.com.tw/upload/images/20211111/20001976hwlIhAETBo.png

也可以自网路上下载图档试试看,注意要是同品种的兔兔,白兔可认不出来喔。

工商广告一下:
深度学习 -- 最佳入门迈向 AI 专题实战
https://ithelp.ithome.com.tw/upload/images/20210817/20001976mCaS636cqk.jpg


<<:  恶意程序(malware)

>>:  STM32的开发生态,Cube、HAL库、LL库

DAY27:实作专案之动机及方向

今天先跟大家说明在我的学习过程中做出的一个小小专题,这个专题在当初还有跟三个同学共同完成,那就先说明...

Day 27【Deploy NFT - Deploy on Testnet】Hey Listen, I QUIT!!

【前言】 在这之前我们已经在 Day 20 介绍过了 IPFS,今天我们要来介绍如何把我们的 NF...

菜鸡的机器学习入门

Day1 简介 前言 今天先简单介绍为什麽要写这个,其实训练一个模型不难,许多相关的教学都讲得相当清...

[Day 06] - 用Spring Boot 建立Controller

回顾前一天讲的MVC,下达request到Controller後,由Service去执行资料的 增/...

分散式链路追踪 - Jaeger

在 OpenTelemetry 中有提到 trace 的概念。而 Trace 由多个 Span 组成...