之前一篇『YOLO v4 安装心得 -- Windows 环境』介绍如何建置 YOLO4(Darknet),并进行物件侦测(Object Detection), 但是,下载的标准模型只能侦测 MS COCO 资料集的80种物件,如果要侦测自订的物件,就必须使用自订资料集来训练模型,因此,以下就来实作模型训练。
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 = 1
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = 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
输出如下:
修改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
输出如下:
也可以自网路上下载图档试试看,注意要是同品种的兔兔,白兔可认不出来喔。
工商广告一下:
深度学习 -- 最佳入门迈向 AI 专题实战。
今天先跟大家说明在我的学习过程中做出的一个小小专题,这个专题在当初还有跟三个同学共同完成,那就先说明...
【前言】 在这之前我们已经在 Day 20 介绍过了 IPFS,今天我们要来介绍如何把我们的 NF...
Day1 简介 前言 今天先简单介绍为什麽要写这个,其实训练一个模型不难,许多相关的教学都讲得相当清...
回顾前一天讲的MVC,下达request到Controller後,由Service去执行资料的 增/...
在 OpenTelemetry 中有提到 trace 的概念。而 Trace 由多个 Span 组成...