news 2026/10/6 7:57:38

ImageAI 自定义检测模型训练实战:YOLOv3/TinyYOLOv3 数据集准备、模型训练与 mAP 评估

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ImageAI 自定义检测模型训练实战:YOLOv3/TinyYOLOv3 数据集准备、模型训练与 mAP 评估
  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】ImageAI

A python library built to empower developers to build applications and systems with self-contained Computer Vision capabilities

项目地址:https://gitcode.com/gh_mirrors/im/ImageAI
点击查看免费下载

ImageAI 为自定义目标检测模型的训练提供了目前最简洁的入口:你只需准备一份符合 YOLO 格式的标注数据集,再编写几行 Python 代码,即可基于YOLOv3或TinyYOLOv3架构训练出属于自己的检测模型,并用训练产出的模型权重 + JSON 配置文件完成对任意对象类别的检测。本文以仓库内 imageai/Detection/Custom/CUSTOMDETECTIONTRAINING.md 为骨架,结合 DetectionModelTrainer 实现、数据集加载器、锚框生成与 mAP 验证等源码细节,带你走通「数据集准备 → 训练 → 指标解读 → 模型选用 → 部署检测」的完整链路。

一、训练能力总览:能做什么

从文档与源码看,ImageAI 自定义检测训练的核心能力包括:

  • 在任意自定义对象类别的图像数据集上训练YOLOv3或TinyYOLOv3检测模型;
  • 支持从零训练,也支持加载预训练yolov3.pt/tiny-yolov3.pt权重进行迁移学习(官方推荐,精度更高);
  • 训练过程中自动为你的数据集生成最匹配的锚框(anchor boxes),并将类别名与锚框写入 JSON 配置文件;
  • 每个 epoch 自动在验证集上计算mAP@0.5、mAP@0.5-0.95、recall、precision等指标,并据此挑选最优模型权重保存;
  • 训练产物(模型 .pt 文件 + detection_config.json)可直接交给CustomObjectDetection类做图像/视频/摄像头实时检测。

在动手之前需要明确:当前仓库(ImageAI 3.x)已切换到PyTorch 后端,训练与推理均使用.pt/.pth权重文件;imageai/backend_check/model_extension.py中的extension_check()会直接拒绝.h5(TensorFlow 时代的模型)并提示安装 2.1.6 及更早版本才能使用 TF 模型。这一迁移背景可参考仓库根目录的 BACKEND_MIGRATION.md。

二、第一步:准备自定义数据集

2.1 采集与标注

按原文档的步骤,数据集准备流程如下:

  1. 确定目标类别并采集图片:为每类对象收集约 200 张(最低建议)或更多的图片,样本越多、角度/光照/背景越多样,训练出的模型泛化能力越强。
  2. 标注图片:ImageAI 采用YOLO 格式标注。可使用跨平台(Windows / Linux / macOS)的LabelImg标注工具完成框选与类别标记。
  3. 产出标注文件:每张图片对应一个同名.txt标注文件,例如图片为image(1).jpg、image(2).jpg……则标注为image(1).txt、image(2).txt……标注文件逐行描述图中的每一个对象。

标注文件的格式可以从数据集加载器 imageai/Detection/Custom/yolo/dataset.py 的__load_raw_label()中确认:每行 5 列,即类别索引 中心x 中心y 宽 高,且坐标必须归一化到 0~1 区间(源码中对负值和越界值有显式断言校验)。例如一张只含一个目标的图片,其.txt可能长这样:

0 0.5000 0.4500 0.3000 0.4000

如果图中同时出现多个对象,则一行写一个对象,类别索引必须与object_names_array中给出的顺序严格对应。

2.2 目录结构:train 与 validation

按文档要求,创建数据集根目录(例如hololens-yolo),内部结构如下:

>> hololens-yolo >> train >> images >> img_1.jpg (含 Object_1) >> images >> img_2.jpg (含 Object_2) >> images >> img_3.jpg (含 Object_1, Object_3 ...) >> annotations >> img_1.txt >> annotations >> img_2.txt >> annotations >> img_3.txt >> validation >> images >> img_151.jpg >> images >> img_152.jpg >> images >> img_153.jpg >> annotations >> img_151.txt >> annotations >> img_152.txt >> annotations >> img_153.txt

划分原则:将每类对象图片的70%~80% 放入 train/images,其余放入 validation/images,并把对应标注放入各自的 annotations 子目录。图片文件名(不含扩展名)必须与标注文件名(不含扩展名)完全一致,这是LoadImagesAndLabels通过__img_path2label_path()按文件名一一对应读取的硬性约束;文件名不一致会导致标注缺失,训练时该图将被视为无目标样本。

数据集目录结构同样被DetectionModelTrainer.setDataDirectory()(见 imageai/Detection/Custom/init.py)在运行时校验:目录必须真实存在,其下必须有train/images、train/annotations、validation/images、validation/annotations四个子目录。加载器源码LoadImagesAndLabels在train=True/False时分别拼接train与validation路径,并逐张读取images下的 jpg 图片及其同名.txt标注。

官方同时提供了一份已标注的Hololens / Headsets(Hololens 与 Oculus 头盔)示例数据集hololens-yolo.zip以及预训练模型yolov3.pt,可从项目官方 Release 资源中获取,用于快速跑通本文全部流程。

三、第二步:开始训练——6 行代码

准备好数据集后,训练代码极其简洁,完整示例如下:

from imageai.Detection.Custom import DetectionModelTrainer trainer = DetectionModelTrainer() trainer.setModelTypeAsYOLOv3() trainer.setDataDirectory(data_directory="hololens-yolo") trainer.setTrainConfig(object_names_array=["hololens"], batch_size=4, num_experiments=200, train_from_pretrained_model="yolov3.pt") # 训练多个对象时,例如: # trainer.setTrainConfig(object_names_array=["hololens", "google-glass", "oculus", "magic-leap"], batch_size=4, num_experiments=200, train_from_pretrained_model="yolov3.pt") trainer.trainModel()

逐行拆解:

from imageai.Detection.Custom import DetectionModelTrainer trainer = DetectionModelTrainer() trainer.setModelTypeAsYOLOv3() trainer.setDataDirectory(data_directory="hololens-yolo")
  • 第一行导入训练器类DetectionModelTrainer;
  • 第二行实例化训练器;
  • 第三行把网络类型设置为YOLOv3(如需更轻量的网络,可调用setModelTypeAsTinyYOLOv3()切换为TinyYOLOv3);
  • 第四行传入数据集目录路径(即上一步的hololens-yolo文件夹)。

核心配置写在setTrainConfig()中,参数说明如下表(默认值以 源码签名 为准):

参数说明默认值备注
object_names_array数据集中的对象类别名列表,顺序必须与标注文件中的类别索引一致必填如["hololens"]单类,或多类["hololens", "oculus"]
batch_size训练的批大小4越大通常精度越好(如 8、16),但显存占用越高
num_experiments训练轮数,即 epochs100文档示例用200,可视数据量与收敛情况调整
train_from_pretrained_model迁移学习用的预训练权重路径(yolov3.pt或tiny-yolov3.pt)None(从零训练)可选;传入后会自动校验文件扩展名必须为.pt/.pth

trainModel()会拉起完整的训练循环:自动生成锚框、创建输出目录、逐 epoch 训练并在验证集上评估,直到跑完所有 epochs。

四、训练背后的源码级原理

4.1 锚框自动生成(AutoAnchor)

训练启动时控制台最先打印锚框生成日志,对应源码 imageai/Detection/Custom/yolo/custom_anchors.py 的generate_anchors()。其原理是:

  • 从训练集所有标注中统计目标框的宽高分布;
  • 用K-means 聚类初始化n个锚框(YOLOv3 为n=9,TinyYOLOv3 为n=6);
  • 再通过遗传算法进化约 1000 代,以「锚框与真实框宽高比优于阈值(thr)的样本占比」为适应度函数迭代优化,得到与你数据集目标尺寸最匹配的锚框;
  • 日志中thr=0.25: 1.0000 best possible recall表示当前锚框集合理论上能达到的最佳召回率,n=9, img_size=416, metric_all=...则给出锚框适配度统计。

生成的 9 个锚框会按尺寸从小到大排序,并分别分配给 YOLOv3 的三个检测层(anchor_masks 依次为(6,7,8)、(3,4,5)、(0,1,2),见 imageai/yolov3/yolov3.py),用于大、中、小三种尺度目标的检测;TinyYOLOv3 只有两个检测层,对应 mask(3,4,5)与(0,1,2)(见 imageai/yolov3/tiny_yolov3.py)。

4.2 迁移学习权重加载

若在setTrainConfig()中传入了train_from_pretrained_model,训练器会在__set_training_param()→__load_model()中执行:

  1. 用torch.load读取预训练权重;
  2. 过滤掉与当前模型结构不匹配的键(尤其当类别数不同导致检测层前卷积通道数变化时,new_state_dict只保留形状一致的层);
  3. 以load_state_dict(..., strict=False)非严格方式加载,然后打印:
==================== Pretrained YOLOv3 model loaded to initialize weights ====================

若加载失败(例如文件损坏),会回退为随机权重初始化并给出提示。因此迁移学习模式下,网络主干特征提取层的预训练参数被复用,只重新学习检测层,通常能显著提升收敛速度与最终精度。

4.3 训练循环:优化器、损失与 AMP

从trainModel()的实现细节看,训练环节具备以下特点:

  • 优化器:SGD(lr=1e-2, momentum=0.6, nesterov=True),偏置项单独分组不加权重衰减,BatchNorm 权重不衰减,其余权重使用weight_decay=5e-4 * (batch_size * accumulate / 64)缩放;配合LambdaLR线性衰减学习率(从 1.0 衰减到 0.01)。
  • 学习率预热(warmup):前nw = max(3 * nb, 1000)个 batch 内,学习率从 0 线性升到初始值、动量从 0.8 升到 0.9,以稳定训练初期。
  • 梯度累积:accumulate = max(round(64 / batch_size), 1),等效于名义批大小 64,让小 batch 也能稳定更新。
  • 混合精度(AMP):在 GPU 上通过torch.cuda.amp自动混合精度训练,降低显存占用。
  • 损失函数:见 imageai/Detection/Custom/yolo/compute_loss.py,由三部分组成——边界框回归损失(基于CIoU,权重 0.05)、目标性损失(BCE,三个检测层按[4.0, 1.0, 0.4]加权)、类别损失(BCE,按0.5 * (nc / 80)缩放,单类时类别损失恒为 0)。三者之和即每个 batch 的反向传播目标。

4.4 产物生成与模型保存策略

训练器在trainModel()开始时会在数据集目录下自动创建两个子目录并写入配置:

  • json/:写入{数据集名}_{模型类型}_detection_config.json,内容为{"labels": [...], "anchors": [...]}。例如hololens-yolo数据集 + YOLOv3 会生成hololens-yolo_yolov3_detection_config.json,这正是后续CustomObjectDetection推理时必须配套加载的配置文件。
  • models/:存放训练产出的模型权重。

模型保存采用「只留最优」策略(见 imageai/Detection/Custom/init.py 的trainModel()):

  • 每个 epoch 的验证阶段结束后,比较当前mAP@0.5与历史最优值best_fitness;
  • 若mAP50 提升,则保存新权重并删除旧的上一最优权重,文件名格式为{模型类型}_{数据集名}_mAP-{mAP50}_epoch-{epoch}.pt,例如官方示例中的yolov3_hololens-yolo_mAP-0.82726_epoch-73.pt;
  • 全部 epochs 跑完后,额外保存一份{模型类型}_{数据集名}_last.pt作为最后一轮权重;
  • 训练结束打印总耗时,并清空 GPU 缓存。

五、读懂训练控制台输出

训练启动后控制台输出形如(来自 examples/custom_detection_train.py 中的真实示例):

Generating anchor boxes for training images... thr=0.25: 1.0000 best possible recall, 6.93 anchors past thr n=9, img_size=416, metric_all=0.463/0.856-mean/best, past_thr=0.549-mean: ==================== Pretrained YOLOv3 model loaded to initialize weights ==================== Epoch 1/200 ---------- Train: 30it [00:14, 2.09it/s] box loss-> 0.09820, object loss-> 0.27985, class loss-> 0.00000 Validation: 15it [01:45, 7.05s/it] recall: 0.085714 precision: 0.000364 mAP@0.5: 0.000186, mAP@0.5-0.95: 0.000030

5.1 头部日志:锚框与预训练权重

  • Generating anchor boxes for training images...以及随后一行统计:表示 ImageAI 已按 4.1 节所述,为你的数据集自动生成了最匹配的锚框;
  • Pretrained YOLOv3 model loaded to initialize weights:表示预训练yolov3.pt已成功加载用于初始化权重(未传预训练模型时无此行)。

5.2 每个 epoch 的三类损失

Train:段输出三类损失(数值越小越好,随训练推进应持续下降):

  • box loss:边界框回归损失(基于 CIoU),衡量预测框与真实框的重合质量;
  • object loss:目标性损失,衡量网格单元「此处有目标」的置信度判断;
  • class loss:类别分类损失。若始终为 0.0000,是因为数据集只有单一类别(单类时类别分支不参与计算,与源码if nc > 1的判断一致),属正常现象。

5.3 验证指标:recall / precision / mAP

Validation:段输出当前 epoch 的验证指标(源自 imageai/Detection/Custom/yolo/validate.py 的validate.run(),它在 10 个 IoU 阈值[0.5, 0.55, ..., 0.95]上计算指标):

  • recall / precision:召回率与精确率;
  • mAP@0.5:IoU 阈值为 0.5 时的平均精度均值,训练中以它作为模型保存的排序依据;
  • mAP@0.5-0.95:COCO 风格的严格指标,对 10 个 IoU 阈值求平均,更全面地反映定位精度。

这些指标应随训练推进整体上升(过程中出现小幅度波动属正常)。精度曲线与 AP 的计算实现位于 imageai/Detection/Custom/yolo/metric.py(ap_per_class/compute_ap,按 COCO 101 点插值法对 PR 曲线积分)。每当 mAP50 创新高,就会在models/目录保存一个新模型,因此训练结束后,models/中文件名 mAP 最高的那个权重即当前数据条件下的最优模型。

六、关于模型评估的说明

原文档引言中曾提到一个独立的evaluateModel()函数,用于按指定的 IoU 与 NMS 阈值评估已保存模型的 mAP。需要说明的是:在当前仓库的 PyTorch 后端实现中,mAP 评估已被内建到trainModel()的每个 epoch 验证阶段——validate.run()在每个 epoch 自动完成 NMS(nms_thresh=0.6、objectness_thresh=0.001)并计算上述全部指标,无需再单独调用评估函数。因此「选模型」这件事在训练过程中就已自动完成:直接取models/目录中文件名里 mAP 值最高的.pt文件即可。

七、训练完成之后:用自定义模型做检测

训练产出的两个关键文件:

  • 最优权重,如models/yolov3_hololens-yolo_mAP-0.82726_epoch-73.pt;
  • 配置json/hololens-yolo_yolov3_detection_config.json。

将两者与imageai.Detection.Custom.CustomObjectDetection配合,即可在任意图片上完成自定义检测。完整用法(含对象裁剪、隐藏标签、numpy 数组输入输出等进阶能力)见 imageai/Detection/Custom/CUSTOMDETECTION.md,其核心调用如下:

from imageai.Detection.Custom import CustomObjectDetection detector = CustomObjectDetection() detector.setModelTypeAsYOLOv3() detector.setModelPath("yolov3_hololens-yolo_mAP-0.82726_epoch-73.pt") detector.setJsonPath("hololens-yolo_yolov3_detection_config.json") detector.loadModel() detections = detector.detectObjectsFromImage(input_image="holo2.jpg", output_image_path="holo2-detected.jpg") for detection in detections: print(detection["name"], " : ", detection["percentage_probability"], " : ", detection["box_points"])

若需要把自定义模型用于视频/摄像头实时检测,可进一步参考 imageai/Detection/Custom/CUSTOMVIDEODETECTION.md。

八、工程实践建议与注意事项

  • batch_size 与硬件:默认batch_size=4,在 Google Colab 上即可运行;但文档明确建议使用比 Colab K80 更强的 GPU,因为更大的 batch(如 8、16)通常带来更好的精度。训练器自动检测cuda可用性,无 GPU 时回退到 CPU(速度会明显下降)。
  • 优先迁移学习:从零训练需要极大数据量且收敛慢;官方建议在预训练yolov3.pt/tiny-yolov3.pt基础上微调,精度更易达标。
  • 类别顺序一致性:object_names_array的顺序必须与标注.txt中的类别索引一一对应,错位会导致训练出的模型类别混乱。
  • 单类场景:class loss 恒为 0 是正常的,只需关注 box loss、object loss 与 mAP 指标。
  • 文件命名:权重必须为.pt/.pth;.h5(TensorFlow 旧模型)会被extension_check()直接拒绝。
  • 数据量下限:每类目标建议至少 200 张图;训练/验证按 70%~80% / 20%~30% 划分,并保证验证集覆盖足够多样的场景。

九、快速验证:仓库自带的测试与示例

仓库提供了可直接参考的端到端样例与自动化测试,便于验证训练流程的正确性:

  • examples/custom_detection_train.py:与本文一致的完整训练脚本,含控制台输出示例,可直接替换data_directory、类别数组与预训练权重路径后运行;
  • test/test_custom_detection_training.py:对 YOLOv3 与 TinyYOLOv3 两种模型、迁移学习与从零训练四种组合进行参数化测试(batch_size=2, num_experiments=2),并在结束后断言json/下生成了{数据集名}_{模型类型}_detection_config.json、models/下存在.pt权重文件——这恰好覆盖了「训练产物完整」这一核心验收点。

从准备标注数据集、理解锚框自动生成与损失构成,到解读 mAP 指标并挑选最优权重,再到底层源码的调用链验证——至此,你已具备用 ImageAI 训练任意自定义目标检测模型的完整能力,训练产物可直接无缝接入图像、视频与摄像头实时检测场景。

  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】ImageAI

A python library built to empower developers to build applications and systems with self-contained Computer Vision capabilities

项目地址:https://gitcode.com/gh_mirrors/im/ImageAI
点击查看免费下载

相关推荐

上一篇:ZMK Devicetree 全面指南:从声明式树结构到键位映射的底层原理
下一篇:Earnings Reviewer Managed Agent Cookbook:用三层隔离架构构建财报电话会议到研报草稿的自动化流水线

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 7:56:19

【Agent】【workflow】5.函数调用代理工作流案例

1. 案例目标本案例展示了如何使用LlamaIndex工作流构建一个函数调用代理(Function Calling Agent)。主要目标包括:实现一个能够自动选择和调用工具的智能代理构建具有记忆功能的状态化工作流展示如何使用支持函数调用的LLM(如OpenAI)来处理复杂任务实现流式响应功能…

作者头像 李华
网站建设 2026/10/6 7:54:24

【AI智能体】Codex + Obsidian 打造专业知识库实战详解

目录 一、前言 二、Codex 与Obsidian 介绍 2.1 Codex 是什么 2.2 Codex能做什么? 2.3 Obsidian 介绍 2.3.1 Obsidian 是什么 2.3.2 Obsidian 核心特点 2.3.3 Obsidian 使用场景 三、Obsidian 安装部署 3.1 获取安装包 3.2 Obsidian 安装过程 3.3 初始化与…

作者头像 李华
网站建设 2026/10/6 7:51:26

WorkBuddy 营销战役:从一句“做增长”到素材、渠道、指标完整作战图

WorkBuddy 营销战役:从一句“做增长”到素材、渠道、指标完整作战图 [!NOTE] 营销计划常把创意、投放和指标写在不同文档里,最后没人知道哪个素材服务哪个人群、成功怎么算。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、Markdown、Python 3.11、表格工具 与人工审…

作者头像 李华