1. 为什么选YOLOV4做绝缘子检测,而不是更新的模型
1.1 一个反直觉的选型结论
很多人一上来就问:现在都有YOLOv8、YOLOv10了,为什么还要用YOLOV4?这个问题我在实际项目里被问过不下十次。我的回答通常很直接:在绝缘子检测这个特定场景下,YOLOV4的性价比仍然非常高,尤其是当你需要自己从零训练、自己标注数据、自己部署到边缘设备的时候。
先说背景。绝缘子检测属于电力巡检领域的经典视觉任务,核心目标是从航拍或地面拍摄的输电线路图像中,把绝缘子目标框出来,有时还要进一步判断是否存在破损、自爆、污闪等缺陷。这个任务有几个特点:目标尺度变化大、背景复杂(天空、树木、杆塔、导线混杂)、样本不均衡(正常绝缘子远多于缺陷绝缘子)。YOLOV4在2020年发布时,凭借CSPDarknet53主干、PANet颈部、Mish激活函数、CIoU损失、Mosaic数据增强等组合,在COCO上做到了43.5% AP,速度在Tesla V100上约65 FPS。放到今天看,这个数字不算顶尖,但它的结构清晰、复现资料多、训练门槛低,对于很多刚入门的团队来说,仍然是首选。
我自己的经验是:如果你手头只有几千张标注图,算力只有一两张消费级显卡,团队里没有人专门搞过检测模型调参,那YOLOV4的“开箱即用”程度反而比新模型更友好。新模型虽然精度高,但依赖更复杂的训练技巧、更精细的超参调整,稍不注意就训崩。而YOLOV4的配置文件虽然看起来冗长,但每一项都有明确含义,改起来心里有底。
1.2 绝缘子检测对模型的实际需求
绝缘子检测不是发论文,它是要落地的。落地场景通常有三种:无人机机载实时检测、巡检图像离线批量处理、边缘计算盒子部署。这三种场景对模型的要求完全不同。
无人机机载要求低延迟、低功耗,模型不能太大,输入分辨率通常压到416甚至320;离线批量处理追求高召回率,可以接受慢一点,输入可以到608;边缘盒子则介于两者之间,既要速度又要精度,还得考虑模型量化后的掉点问题。
YOLOV4的灵活之处在于,它提供了多个尺度的预训练权重和可调输入尺寸。你可以用yolov4.cfg配608输入做离线高精度,也可以用yolov4-tiny.cfg配416输入做实时检测。tiny版本参数量只有约6M,在Jetson Nano上都能跑到20 FPS以上,这对于无人机机载来说非常关键。相比之下,一些新模型的最小版本参数量仍然偏大,或者对特定推理框架的支持不够成熟。
还有一个容易被忽略的点:绝缘子检测的数据集往往不大。公开的绝缘子数据集,比如某电力巡检竞赛放出的数据,通常也就几千张。在这种数据规模下,大模型的过拟合风险很高。YOLOV4配合Mosaic增强和适当的数据扩充,反而能训出更稳的结果。我试过用同一个数据集分别训YOLOV4和某个新模型,在验证集上YOLOV4的mAP只低了1.2个百分点,但训练时间少了近一半,显存占用也低不少。
1.3 开源模型和数据集到底怎么选
标题里提到“开源模型、数据集及源码”,这三样东西的质量直接决定项目能不能跑起来。我先说数据集。
绝缘子检测的公开数据集主要有几个来源:一是某电力研究院放出的航拍绝缘子数据集,包含正常和缺陷两类,标注格式是VOC XML;二是某高校实验室整理的绝缘子自爆数据集,图像分辨率较高,但样本量偏少;三是一些竞赛平台上的脱敏数据,质量参差不齐。我的建议是:不要只用一个数据集,尽量做混合训练。不同来源的数据在光照、角度、背景上差异很大,混合之后模型的泛化能力会明显提升。
模型方面,YOLOV4的官方权重是基于COCO训练的,直接拿来检测绝缘子效果很差,因为绝缘子不在COCO的80类里。所以必须做迁移学习。通常的做法是:加载yolov4.conv.137作为主干预训练权重,然后修改cfg文件的类别数和卷积层输出,重新训练。这里有个坑:很多人直接加载yolov4.weights然后改类别,结果训练时loss震荡严重。原因是官方weights的最后一层卷积输出维度是255(对应80类),你改成18(对应1类)之后,这一层的权重是随机初始化的,但前面的层已经适应了80类的特征分布,直接微调容易破坏原有特征。正确做法是用darknet的partial加载方式,只加载前137层,让后面的层从头学。
源码方面,YOLOV4的原版是Darknet框架,C语言写的,编译依赖OpenCV和CUDA。如果你不熟悉C编译,可以用AlexeyAB的darknet分支,它对Windows和Linux的支持都更好,还提供了mAP计算、多尺度训练等实用工具。另外,PyTorch版本的YOLOV4也有不少开源实现,比如某开发者维护的pytorch-YOLOv4,适合习惯Python生态的人。但要注意,PyTorch版本和原版在预处理、后处理上可能有细微差异,换框架时最好重新验证一遍。
2. 从零搭建绝缘子检测项目的完整链路
2.1 数据标注:别急着标,先想清楚类别定义
数据标注是整個项目里最耗时间、最容易返工的环节。我见过太多人标了几千张图之后发现类别定义有问题,只能全部重来。所以在动手之前,先想清楚三件事。
第一,你要检测什么。是只检测“绝缘子”这一个类别,还是要区分“正常绝缘子”和“缺陷绝缘子”?如果只检测绝缘子,那标注就简单,一个框搞定。如果要区分缺陷,那就要定义清楚什么是缺陷:是自爆(玻璃绝缘子掉片)、破损(瓷绝缘子裂开)、还是污闪(表面有放电痕迹)?不同缺陷的视觉特征差异很大,混在一起标会让模型困惑。
第二,框的粒度。绝缘子在图像里往往是一串,你是把整串框成一个目标,还是把每一片单独框出来?整串框的好处是标注快、目标大、容易检测;坏处是没法定位具体哪一片有问题。单片框的好处是精细,坏处是标注工作量翻几倍,而且小目标检测难度大。我的经验是:如果做缺陷检测,建议整串框加缺陷区域框结合。整串框用来定位绝缘子串,缺陷区域框用来标记具体问题位置。
第三,负样本怎么处理。绝缘子检测的难点之一是把绝缘子和背景里的类似物体区分开,比如杆塔上的横担、导线上的金具、甚至某些形状相似的树枝。如果你只标正样本,模型很容易把这些东西误检成绝缘子。所以要有意识地收集一些“看起来像但不是”的负样本图像,不标任何框,让模型学会抑制。负样本的比例控制在正样本的10%到20%左右比较合适。
标注工具我用过LabelImg、CVAT和Labelme。LabelImg最简单,适合VOC格式;CVAT功能强,支持多人协作和视频标注;Labelme适合做分割标注。对于绝缘子检测,LabelImg足够了。标注时注意:框要贴紧目标边缘,不要留太多背景;遮挡超过50%的目标建议标为difficult或者直接不标;同一张图里如果有多个绝缘子串,每个都要单独框。
2.2 数据增强:Mosaic不是万能的
YOLOV4自带的Mosaic增强是它的亮点之一。Mosaic把四张图拼成一张,让模型在一张图里看到更多上下文,对小目标检测特别有帮助。但我在绝缘子检测里发现,Mosaic用不好反而会掉点。
问题出在尺度上。绝缘子串在航拍图里通常是细长条,Mosaic拼接后,每张子图的尺度被压缩,绝缘子变得更小,如果原图分辨率不高,拼接后目标可能只有十几个像素,模型根本学不到有效特征。我的做法是:Mosaic的概率不要设太高,0.5左右比较合适;同时配合随机缩放,让模型适应不同尺度的绝缘子。另外,HSV色彩抖动对绝缘子检测很有用,因为航拍图像受光照影响大,同一串绝缘子在顺光和逆光下颜色差异明显,色彩抖动能提升模型的光照鲁棒性。
还有一个容易被忽略的增强:旋转。绝缘子串在图像里的方向不固定,水平、垂直、斜向都有。YOLOV4默认的增强里没有大角度旋转,你可以自己加一个随机旋转90度、180度、270度的操作,或者用更小的角度做随机旋转。注意旋转后要重新计算框的坐标,别把框转丢了。
2.3 配置文件修改:每个参数都要有理由
YOLOV4的cfg文件很长,但真正需要改的地方就那么几处。我按顺序说。
首先是batch和subdivisions。batch是每次迭代送入网络的图片总数,subdivisions是把batch分成几批送入显存。实际显存占用是batch/subdivisions张图。比如batch=64,subdivisions=16,就是每次送4张图进显存。如果你的显存是8G,建议从batch=64、subdivisions=16开始试;如果爆显存,就加大subdivisions或者减小batch。注意:batch不能小于subdivisions,否则每批不足一张图,训练会出问题。
然后是width和height。这是网络输入尺寸,必须是32的倍数。YOLOV4默认是608,但你可以改成416或512。尺寸越大,小目标检测越好,但速度越慢。绝缘子检测里,如果图像里绝缘子占比较大,416就够;如果绝缘子很小,建议512或608。我通常的做法是:训练时用608,推理时根据设备性能降到416或512。这样训练时模型学到了高分辨率特征,推理时降分辨率虽然会掉一点精度,但速度提升明显。
接下来是classes和filters。classes改成你的类别数,绝缘子检测通常是1或2。filters是每个YOLO层前面那个卷积层的输出通道数,计算公式是filters = (classes + 5) * 3。比如classes=1,filters就是18;classes=2,filters就是21。这个公式必须记牢,改错了训练直接报错。cfg里有三个YOLO层,每个前面的卷积层filters都要改。
还有anchors。YOLOV4默认的anchors是基于COCO数据集聚类得到的,对绝缘子不一定最优。如果你有足够的数据,建议用k-means重新聚类自己的anchors。具体做法是:把所有训练框的宽高提取出来,用k-means聚成9类,然后按面积从小到大排序,分别填入三个YOLO层的anchors。我试过重新聚类,mAP能提升1到2个百分点。如果数据量少,不聚类也行,但要把默认anchors里明显不合适的去掉,比如特别大的anchor(对应COCO里的大物体)在绝缘子检测里基本用不上。
2.4 训练过程:loss曲线会骗人
YOLOV4训练时输出的loss是各项损失的加权和,包括框回归损失、置信度损失、分类损失。很多人只看总loss,觉得降下去了就是训好了。这是个误区。总loss降不代表模型在验证集上表现好,过拟合的时候总loss也会降。
我的做法是:每训练1000次迭代,就用验证集跑一次mAP。Darknet提供了map参数,可以在训练过程中计算mAP。如果mAP在连续几次验证中不再提升,甚至下降,那就说明过拟合了,该早停或者加正则化。另外,关注各项loss的单独变化:如果框回归损失一直很高,说明anchors不合适或者学习率太大;如果分类损失震荡,可能是类别不平衡或者标注有噪声。
学习率方面,YOLOV4默认用steps策略,在80%和90%迭代时降学习率。这个策略对大多数情况够用,但如果你发现训练前期loss下降太慢,可以把初始学习率调大一点,比如从0.0013调到0.0026;如果后期loss震荡,就把steps提前,让学习率早点降下来。
还有一个实操细节:训练前一定要用darknet的partial加载预训练权重。命令是darknet detector train data/obj.data cfg/yolov4-obj.cfg yolov4.conv.137。注意最后那个权重文件是conv.137,不是yolov4.weights。conv.137只包含主干网络的前137层,不包含检测头,这样加载后检测头是随机初始化的,不会破坏主干特征。
3. 绝缘子检测里那些文档不会写的坑
3.1 小目标漏检:不是模型不行,是输入尺寸不对
绝缘子检测最常见的抱怨就是“小绝缘子检测不到”。很多人第一反应是模型太弱,换更大的模型。但我在实际排查中发现,八成的小目标漏检问题出在输入尺寸上。
举个例子:一张4000x3000的航拍图,绝缘子串可能只占200x50像素。如果你直接把原图缩放到608x608送入网络,绝缘子就变成了30x7像素,经过5次下采样后,在特征图上只剩不到1个像素,模型根本没法检测。正确的做法是:不要整图缩放,而是先切图再检测。把大图切成1000x1000的小块,每块之间有重叠,然后对每块单独检测,最后把结果拼回去。这样绝缘子在每块图里的相对尺寸就大了,检测效果好很多。
切图也有讲究。重叠区域不能太小,否则绝缘子刚好在切缝上会被切断。我一般设20%到30%的重叠。切图之后,每块图的检测结果要映射回原图坐标,然后做NMS合并。这里要注意:跨块的同一个绝缘子可能会被检测两次,NMS的IoU阈值要设得合适,太高会漏合并,太低会误删。我通常用0.45到0.5之间。
如果不想切图,另一个办法是用YOLOV4的letterbox预处理。Darknet默认的resize是直接拉伸,会改变宽高比,让细长的绝缘子变形。letterbox保持宽高比,用灰边填充,这样绝缘子的形状不变,检测更准。在cfg里把letterbox设为1就行。
3.2 误检:杆塔上的金具和绝缘子长得太像
绝缘子误检是另一个头疼的问题。最常见的误检来源是杆塔上的金具、导线连接器、甚至某些形状相似的鸟巢。这些东西在低分辨率下和绝缘子非常像,模型很难区分。
我的解决思路分三步。第一步,增加负样本。专门收集一批包含金具、连接器但不含绝缘子的图像,不标任何框,加入训练集。数量不用太多,几百张就有效果。第二步,调整NMS参数。YOLOV4默认的NMS阈值是0.45,对于绝缘子检测,可以适当降低到0.4,让重叠的框更容易被抑制。第三步,后处理过滤。根据绝缘子的形状特征做规则过滤,比如长宽比小于2的框直接丢弃(绝缘子串通常是细长的),面积过大或过小的框也丢弃。这些规则虽然简单,但能过滤掉相当一部分误检。
还有一个容易被忽略的点:置信度阈值不要设太低。很多人为了追求召回率,把置信度阈值降到0.1甚至0.05,结果误检暴增。我的经验是:在验证集上画PR曲线,找到召回率和精确率平衡的点。绝缘子检测通常0.3到0.5之间比较合适。如果某个场景下漏检特别严重,宁可单独调低那个场景的阈值,也不要全局降低。
3.3 模型量化后的精度掉点
如果你要把模型部署到边缘设备,量化是绕不开的。YOLOV4转TensorRT或者NCNN之后,INT8量化能带来2到3倍的速度提升,但精度掉点也很明显。我实测过,INT8量化后mAP可能掉3到5个百分点,对于绝缘子检测来说,这意味着不少漏检。
减少掉点的办法有几个。一是量化时用校准集,校准集要从训练集里随机抽,覆盖各种光照和背景,不要只用几张图。二是对敏感层做混合精度,比如检测头前面的几层保持FP16,只对主干做INT8。三是量化后做微调,用少量标注数据在量化模型上再训几个epoch,让模型适应量化误差。这个微调过程不需要太多数据,几百张就够,但效果很明显。
还有一个坑:不同推理框架的量化策略不一样。TensorRT的INT8量化对激活值范围很敏感,如果校准集里缺少某些极端光照的样本,量化后的激活值范围会偏窄,导致那些场景下精度暴跌。所以校准集一定要有代表性。NCNN的量化相对温和一些,但速度提升也没TensorRT那么大。选哪个框架,要根据你的硬件和精度要求权衡。
4. 开源资源怎么用才不踩雷
4.1 数据集:别拿来就用,先做清洗
公开的绝缘子数据集质量参差不齐,直接拿来训练往往效果不好。我拿到一个数据集之后,会先做三件事。
第一,检查标注一致性。同一个数据集里,不同标注员的风格可能不一样。有的人框得紧,有的人框得松;有的人把遮挡的绝缘子也标了,有的人没标。这些不一致会让模型困惑。我的做法是:随机抽100张图,自己重新标一遍,然后和原标注对比,如果IoU低于0.7的比例超过10%,就说明标注质量有问题,需要整体复查。
第二,检查类别平衡。绝缘子数据集里,正常样本通常远多于缺陷样本。如果直接训练,模型会偏向预测正常类,缺陷类的召回率很低。解决办法有两种:一是过采样缺陷样本,在训练时让缺陷样本重复出现;二是用focal loss或者类别权重,让模型更关注少数类。YOLOV4原版不支持focal loss,但你可以改损失函数,或者用带类别权重的版本。
第三,检查图像质量。有些数据集里的图像模糊、过曝、欠曝,这些低质量图像会拖累模型。我的做法是:用图像质量评估算法(比如拉普拉斯方差)筛一遍,把模糊的挑出来,能修就修,不能修就删。删掉10%到20%的低质量图像,模型效果反而更好。
4.2 源码:编译踩坑记录
Darknet的编译在Linux下相对顺利,在Windows下就比较折腾。我分别在Ubuntu和Windows上编译过,说几个关键点。
Linux下,OpenCV的版本很重要。Darknet对OpenCV 4.x的支持不如3.x好,如果你用4.x,可能会遇到cv::imread读取图像失败的问题。解决办法是编译时指定OpenCV路径,或者降级到3.4。CUDA版本也要注意,Darknet对CUDA 10.x支持最好,11.x可能需要改Makefile里的架构参数。另外,编译时一定要开GPU=1、CUDNN=1、OPENCV=1,否则训练速度慢得没法用。
Windows下,推荐用AlexeyAB的darknet分支,它提供了Visual Studio的工程文件,比原版好编译很多。但要注意:VS的版本要和CUDA匹配,比如CUDA 10.2对应VS 2019,CUDA 11.x对应VS 2022。还有,OpenCV的路径不能有空格和中文,否则编译会报奇怪的错误。我踩过这个坑,折腾了一下午才发现是路径问题。
编译成功之后,先用一张测试图跑一下darknet detector test,确认能正常推理。如果报错说找不到cudnn.dll或者opencv_world.dll,就把这些dll复制到darknet.exe同级目录。这个虽然是小问题,但第一次用的人很容易卡住。
4.3 预训练权重:conv.137和weights的区别
前面提过,训练时要用conv.137而不是weights。这里再展开说一下为什么。
yolov4.weights是完整的COCO预训练权重,包含主干、颈部和检测头。检测头的输出维度是255(80类)。如果你直接加载weights然后改cfg里的classes=1,Darknet会尝试把255维的权重加载到18维的层上,维度不匹配,要么报错,要么只加载部分权重,检测头随机初始化。更糟糕的是,主干和颈部的权重已经适应了80类的特征分布,直接微调容易导致灾难性遗忘。
conv.137只包含前137层,也就是主干网络和部分颈部,不包含检测头。加载conv.137之后,检测头是随机初始化的,但主干特征保留了下来。这样训练时,模型可以在保留通用特征的基础上,学习绝缘子的特定特征。这是迁移学习的标准做法,也是YOLOV4训练绝缘子检测的推荐方式。
如果你找不到conv.137,也可以自己从weights里截取。Darknet提供了partial参数,可以在cfg里指定从第几层开始加载。但更简单的办法是直接用官方提供的conv.137文件,网上很容易找到。
5. 训练完之后,怎么判断模型能不能用
5.1 mAP不是唯一指标
mAP是检测任务的标准指标,但它不能完全反映实际使用效果。我评估绝缘子检测模型时,会看四个指标。
第一,mAP@0.5。这是最常用的指标,IoU阈值0.5时的平均精度。绝缘子检测通常要求mAP@0.5在0.85以上才算可用。
第二,召回率。在固定置信度阈值下,模型能检出多少真实绝缘子。电力巡检里,漏检的代价很高,所以召回率比精确率更重要。我一般要求召回率在0.9以上。
第三,误检率。每张图平均有多少个误检框。这个指标在实际使用中很关键,因为误检太多会让巡检人员失去信任。我的经验是:每张图误检不超过0.5个,才算可接受。
第四,推理速度。在目标硬件上的FPS。无人机机载要求至少15 FPS,边缘盒子要求至少10 FPS,离线处理可以放宽到1 FPS。
这四个指标要综合看。有时候mAP很高,但召回率低,说明模型偏向精确率,漏检多;有时候召回率高但误检多,说明模型太激进。最好的模型是在召回率和误检率之间找到平衡,而不是单纯追求mAP。
5.2 可视化验证:别只看数字
数字指标之外,一定要做可视化验证。我通常会把验证集的检测结果画出来,一张一张看。重点看三类图:漏检的图、误检的图、置信度在阈值附近的图。
漏检的图能告诉你模型在什么场景下不行。是光照太暗?是绝缘子太小?还是被遮挡了?找到规律之后,可以针对性地补充数据或者调整预处理。
误检的图能告诉你模型把什么误认成了绝缘子。是金具?是鸟巢?还是某种纹理?找到之后,把这些负样本加入训练集。
置信度在阈值附近的图最有价值。这些图是模型“犹豫”的样本,往往包含一些边界情况。分析这些图,能帮你找到阈值设置是否合理,以及模型还有哪些盲区。
我还会做一个热力图分析,用Grad-CAM或者类似方法看模型关注图像的哪些区域。如果模型关注的是绝缘子本身,说明学对了;如果关注的是背景或者杆塔,说明模型走了捷径,泛化能力可能有问题。
5.3 部署前的最后一公里
模型训练好了,部署之前还有几件事要做。
第一,模型剪枝。YOLOV4的参数量约64M,对于边缘设备来说偏大。可以用通道剪枝把冗余的通道去掉,参数量能降到20M左右,速度提升明显,精度掉点通常在1个百分点以内。剪枝之后要微调几个epoch恢复精度。
第二,模型转换。根据目标硬件选择推理框架:NVIDIA Jetson用TensorRT,ARM设备用NCNN或MNN,x86服务器用OpenVINO。转换时注意输入输出的维度要和训练时一致,预处理和后处理也要对齐。我见过有人转换后忘了改预处理,结果检测框全部偏移。
第三,封装接口。把模型封装成API或者SDK,方便上层调用。接口要支持批量推理、异步调用、超时重试。如果是无人机机载,还要考虑模型加载时间,尽量在起飞前就加载好,不要在空中加载。
第四,监控和更新。部署之后要持续监控模型的输出,统计召回率、误检率、推理延迟。如果发现指标下降,可能是数据分布变了,需要重新训练。我一般会保留最近几个月的巡检图像,定期做增量训练,让模型适应新的场景。
6. 一些个人体会和后续扩展方向
6.1 绝缘子检测不是终点
绝缘子检测只是电力巡检视觉任务的第一步。检测到绝缘子之后,通常还要做缺陷分类、缺陷定位、甚至缺陷程度评估。这些任务可以串成一个流水线:先用YOLOV4检测绝缘子串,然后把检测框裁剪出来,送入分类网络判断是否有缺陷,如果有缺陷,再用分割网络定位缺陷区域。
这种流水线的好处是每个任务可以独立优化,坏处是误差会累积。检测框不准,后面的分类和分割都会受影响。所以检测环节的召回率和定位精度要尽可能高。我的做法是:检测阶段宁可多检一些,也不要漏检,把置信度阈值设低一点,让后面的分类网络去过滤误检。
6.2 小样本和零样本的挑战
绝缘子缺陷样本很难收集,尤其是某些罕见缺陷,可能几年才出现一次。这种情况下,传统的监督学习很难训出好的分类器。我试过几种小样本学习方法:原型网络、MAML、以及基于预训练特征的简单分类器。实测下来,在缺陷样本极少的情况下,用预训练特征加一个线性分类器,效果反而比复杂的小样本方法更稳。因为预训练特征已经包含了丰富的视觉信息,线性分类器不容易过拟合。
零样本检测更难,目前还没有特别成熟的方案。一个可能的思路是用视觉-语言模型,比如CLIP,把绝缘子缺陷的文本描述和图像特征对齐,实现零样本分类。但这方面我还在探索,没有形成稳定的方案。
6.3 数据闭环才是长期竞争力
最后说一个容易被忽略但非常重要的点:数据闭环。模型部署之后,会不断产生新的巡检图像。这些图像里,有些是模型检测正确的,有些是检测错误的。把检测错误的图像挑出来,人工修正标注,加入训练集,重新训练模型,这就是一个数据闭环。
数据闭环的价值在于:模型会随着使用越来越强。刚开始可能mAP只有0.8,经过几轮闭环之后,能提升到0.9以上。而且闭环能发现一些你之前没想到的场景,比如某种新型杆塔、某种特殊光照条件,这些场景在初始数据集里可能没有,但闭环能自动把它们找出来。
建立数据闭环的关键是降低人工修正的成本。如果每张图都要从头标注,没人愿意做。我的做法是:让模型先预标注,人工只做修正。模型检测错的框,人工删掉或者调整;模型漏掉的框,人工补上。这样标注效率能提升3到5倍。另外,优先修正置信度低的样本,这些样本对模型提升最大。
后续还可以考虑主动学习,让模型自己挑选最有价值的样本让人工标注。比如用不确定性采样,挑那些模型最不确定的图像;或者用多样性采样,挑那些和已有数据差异最大的图像。主动学习能把标注预算花在刀刃上,用更少的标注数据达到更好的效果。
我在实际项目里最大的体会是:绝缘子检测的技术门槛不高,但工程门槛不低。模型选型、数据标注、训练调参、部署优化,每个环节都有坑。YOLOV4虽然不是最新的模型,但它的生态成熟、资料丰富、可解释性强,对于刚入门的团队来说,仍然是一个很稳的起点。先把YOLOV4跑通,理解检测任务的完整链路,再去尝试新模型,会顺利很多。