前言
之前一篇『YOLO v4 建置心得 -- Windows 环境』介绍如何建置 YOLO4(Darknet),并进行物件侦测(Object Detection), 但是,下载的标準模型只能侦测 MS COCO 资料集的80种物件,如果要侦测自订的物件,就必须使用自订资料集来训练模型,因此,以下就来实作模型训练。
準备训练资料
YOLO 模型训练主要分两个步骤:
标注资料:可使用各式标注工具,将图像内的物件框起来,一般存档的格式有YOLO、COCO、VOC等,本文使用的是YOLO格式。模型训练:有了图像及标注档后,就可以进行模型训练,以下会详细介绍完整的程序。标注工具有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 官网』。
因为程序实在非常冗长,因此笔者稍作整理,以方便读者快速设定。
建置 Darknet执行档,请参阅『YOLO v4 安装心得 -- Windows 环境』。
下载预训模型 yolov4.conv.137 至 weights 目录(需新增)。
切换至 darknet-master\build\darknet\x64 目录。
複製 cfg\yolov4-custom.cfg 为 cfg\yolo-obj.cfg。以下5~10步骤修改yolo-obj.cfg档案内设定。
batch=16:原始文件为64,批次过大会造成笔者PC记忆体不足(GPU),读者可依据本身的GPU记忆体调配。记忆体不足的错误讯息为『Error: cuDNN isn't found FWD algo for convolution』。
max_batches=2000:公式为 类别数(classes) x 2000。
steps=1600,1800:公式为 max_batches 的 80%、90%。
设定模型输入的图像尺寸。
width=416
height=416
[yolo]段落的classes=80更改为classes=1:共3个,可直接使用编辑器的『取代』直接置换,须视类别个数调整
。
[yolo]段落的上面一个[convolutional]段落的filters=255更改为filters=18,共3个,请小心修改,filters值须视类别个数调整,公式为(类别个数+5) x 3。
新增档案 build\darknet\x64\data\obj.names,内容如下,须列出所有类别:
Rabbits
新增档案 build\darknet\x64\data\obj.data,内容如下:
# 视类别个数调整classes = 1train = data/train.txtvalid = data/test.txtnames = data/obj.namesbackup = backup/
複製训练资料(*.jpg、 *.txt) 至 build\darknet\x64\data\obj\ 目录(需新增)。部分档名过长,训练可能出现错误,可修改成较短的档名。使用Labelimg开启上述目录,可观看标注的图像,如下:
新增档案 build\darknet\x64\data\train.txt,档案内容为每个图像档名。前面加data/obj/。
训练指令如下,若训练时有些档案找不到,试着将档名及txt档名改短:
darknet.exe detector train data/obj.data cfg/yolo-obj.cfg weights/yolov4.conv.137
笔者训练约2小时,过程的损失函数如下图,最后会存至 chart_yolo-obj.png。
训练后的权重档会储存在backup目录,档名为 yolo-obj_final.weights。
如果训练中途停止,或要延长训练週期,可执行指令如下:
darknet.exe detector train data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_2000.weights
其中yolo-obj_2000.weights为执行2000训练週期的权重档,以上指令表示由第2000週期继续训练。
测试指令如下: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
输出如下:
Python 测试
修改darknet.py 最后第三行,指定相关设定档:
import sysprint(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
输出如下:
也可以自网路上下载图档试试看,注意要是同品种的兔兔,白兔可认不出来喔。
工商广告一下:
PyTorch:
开发者传授 PyTorch 秘笈
预计 2022/6/20 出版。
TensorFlow:
深度学习 -- 最佳入门迈向 AI 专题实战。