[控场AI]
· 9 分钟阅读· 4,560 字

花朵计数模型压力测试:总数对了,结构错了

花朵计数模型压力测试:总数对了,结构错了

Bloom-Counter 的 99.7% 召回率源于模拟器与检测器共调,压力测试揭示其在光照和遮挡下的结构性失败。

开源项目 Bloom-Counter 宣称 99.7% 的检测召回率,但作者通过压力测试发现,这一数字源于模拟器与检测器共调,且评分只算总数不算结构,无法证明真实性能。作者保留检测器原样,系统性地打破模拟器的两个隐藏假设——光照稳定和花朵不重叠,测量其失败模式。结果显示:变暗和阴影下总误差为 0.0%,但实际有 1/6 到 1/4 的花蕾被错误降级为花苞;遮挡会使花蕾碎成花苞尺寸的碎片,0.8 倍半径覆盖下总误差达 +81%;白平衡+CLAHE 预处理能修复全局光照偏移,但在过曝与含噪图像上是净伤害;面积拆分法仅在 0.8–1.2 倍半径的重叠区间有效。作者据此提出四条实践建议,并指出真实标注数据的缺失是最大未解问题。

一个"完美"分数背后的结构性漏洞

开源项目 Bloom-Counter 的 README 上挂着一个漂亮的数字:6 张模拟照片、357 朵花、99.7% 检测召回率。但作者 Guangyi Zhao 在压力测试后得出了一个不太舒服的结论——这个 99.7% 什么也证明不了。

原因藏在代码里。simulator/generate.py 第 23 行的注释直言不讳:花朵的 BGR 颜色是"调校到检测器 HSV 花瓣范围之内"的。生成器按检测器的口味画花,检测器再把它们数出来。这不是测量,是合谋。另一处细节同样致命:模拟器的 _place 函数用拒绝采样保证任意两朵花永不重叠,而 examples/demo.py 的评分公式是(检出的花蕾+花苞)/(真值花蕾+花苞)——只有总数,没有逐目标匹配,没有分类别拆解。

真实的温室恰好把这两个假设都倒过来:光线全天摆动,叶片遮挡是常态,花朵成簇生长。作者于是保留检测器原样,系统性地打破模拟器的两个隐藏假设,测量它先怎么坏、坏得多严重、以及两种廉价补救是否真的有用。

花朵计数管道压力测试

方法:更严格的评分暴露更早的失败

检测器是原封不动的 ColorSegmentationDetector:min_area=120 平方像素、bloom_area_min=900 平方像素(连通域达到 900 记为花蕾,低于则记为花苞)、形态学核 7。它在 HSV 空间对粉、白、黄三种花瓣范围做阈值,闭运算加开运算,然后数连通域。

场景来自仓库自带的模拟器,四张 1280×960 图像(种子 101/202/303/404),共 210 个目标:134 个花蕾、76 个花苞,每个都有真值中心和半径。

评分方式换掉了总数比值,改用贪心中心距离匹配:检测中心必须落在同标签真值目标的 max(38 px, 1.1 × 半径) 以内才算命中,输出精确率、召回率和 F1,并单独报告花蕾召回率与花苞召回率。作为对照,在未扰动场景上这套严格评分仍然给出精确率=召回率=F1=1.000,零误报——基线完美,恰恰因为两者是共调的,这正是问题所在。

两组压力测试:光照(gamma 0.6/1.6/2.2、曝光 −50 与过曝 +60、左到右阴影渐变、半幅阴影、暖色偏、低光加高斯噪声)与遮挡(叶色椭圆覆盖 60% 目标的真实中心,覆盖半径为目标的 0.5/0.8/1.1 倍;以及在现有花蕾旁按 2.2 到 0.45 倍半径的偏移额外绘制花蕾,模拟成簇)。

HSV 颜色空间与阈值分割

检测器工作的 HSV 空间是一种将颜色分解为色调(Hue)、饱和度(Saturation)、明度(Value)的表示方式。相比 RGB,HSV 更接近人类对颜色的感知,且能将颜色信息(H、S)与亮度信息(V)分离,因此常用于基于颜色的目标分割。在本例中,检测器为粉色、白色、黄色花瓣分别设定了 H、S、V 三个通道的阈值范围,落在范围内的像素被标记为前景。这种方法的优点是计算简单、无需训练数据,但缺点也显而易见:阈值需要人工调校,且对光照变化敏感——明度 V 的偏移会直接导致像素跌出阈值范围。理解这一点,就能明白为何后续光照压力测试中,变暗会先从边缘“啃食”花瓣掩膜。

光照:先降级,后消失

结果里最值得警惕的一组数字是:曝光 −50、阴影渐变、半幅阴影三种条件下,总误差都是 0.0%。按仓库 demo 的评分,这三次都是完美运行。但实际上有六分之一到四分之一的花蕾已经丢了,还多出二十来个幽灵花苞。

机制不难追。变暗先从边缘啃食花瓣掩膜:V 通道跌破粉色范围下限,掩膜收缩,连通域面积跟着缩水。一旦面积跌破 900 平方像素那条线,目标不会消失——它被重新分类成花苞。这个分类器先降级,再删除:gamma 2.2 时只剩 45 个花蕾,而"花苞"膨胀到 179 个,总数只偏了 +6.7%。

暖色偏则从反方向失败:花蕾完好(白、黄范围兜底),但花苞召回率精确归零——花苞只存在于粉色一个范围里,色偏把它们的色相推出了边界。76 个花苞全军覆没,检出的 25 个"花苞"是碎片误报。过曝又是另一种坏法:召回率保持 1.000,精确率掉到 0.933,多出 15 个误报——褪色的叶片碎片冒充花苞。变亮不丢目标,它制造目标。

好消息也是真的:gamma 0.6 提亮、暗到 gamma 1.6、低光加噪声都没有影响检测器,它的鲁棒区间比作者预期的宽。失败阈值落在 1.9 与 2.2 之间某处,但采样稀疏,且 1.9 那次还夹带了噪声,无法精确定位悬崖位置。

灰度世界白平衡与 CLAHE

灰度世界白平衡假设:一幅正常图像中,所有颜色的平均值应趋于灰色。基于此假设,算法计算图像 RGB 三通道的均值,并分别对通道进行增益调整,使三者均值相等,从而校正全局色偏。CLAHE(限制对比度自适应直方图均衡)则是一种局部对比度增强技术:它将图像分成若干小块,对每块分别做直方图均衡,并用裁剪阈值限制对比度放大,以避免噪声过度增强。两者组合常用于预处理,以抵消光照不均和色温变化。但正如文中所指出的,白平衡对高光截断的图像无能为力——信息已丢失,任何增益都无法恢复;而 CLAHE 在低光含噪图像上会放大噪声,产生大量误报。

预处理:修得好全局偏移,修不好截断与噪声

灰度世界白平衡加 V 通道 CLAHE,按失败类型分得很干净:全局亮度和色相偏移几乎全救回来了——gamma 2.2 召回率从 0.576 回到 1.000,暖色偏从 0.638 回到 1.000,两种阴影都从约 0.9 回到 1.000。

代价同样明确:在本来就正常的图像上,它会凭空造出 13–18 个幽灵花苞。过曝图像的高光已被截断,信息没了,召回率反而从完美跌到 0.319。低光加噪声的图像上产生 155 个误报花苞。作者诚实注明:白平衡与 CLAHE 是作为一个管线整体测试的,从未单独消融,无法判断坏案例里是哪一步在捣乱。但操作结论成立:给预处理加门控,先测量帧的全局偏移统计量,确有偏移才开启。

遮挡:小目标先死,碎片冒充花苞

半半径覆盖时,所有未被遮挡的目标仍能找到,但被遮的 31% 没了——而且倒下的是花苞。花苞半径只有 11–17 像素,中心一盖,残余碎片跌破 min_area=120,被当噪声丢弃。花蕾更大,还能保留一圈花瓣活下来。

0.8 倍半径覆盖时出现了整项研究里最怪的数字:总误差 +81%。遮挡不只是删除,它还创造。被部分覆盖的花蕾碎成多块,每块落进 120–900 平方像素的区间,每块都被记成一个花苞:检出 297 个花苞,真值只有 76 个。一张叶子茂密的照片会同时少算花蕾、多算花苞,而多算的那部分误差更大。

作者做了一次参数消融,把 min_area 从 120 降到 40:轻度遮挡下召回率从 0.776 升到 0.981、花苞召回率从 0.382 升到 0.947,代价是误报从 4 涨到 49,总误差从 −20.5% 翻成 +21.4%。重度遮挡下几乎什么都换不来,还多出碎片。这是一个只在轻度遮挡区间划算的精确率换召回率交易,不是修复方案。

连通域分析与面积阈值分类

连通域分析是指将二值掩膜中相互连接的像素集合识别为一个独立目标,并计算其面积、外接矩形、质心等属性。本检测器利用连通域面积进行分类:面积大于等于 900 平方像素的连通域记为花蕾,介于 120 到 900 之间的记为花苞,小于 120 的视为噪声丢弃。这种基于面积的规则简单直观,但存在结构性缺陷:当目标被部分遮挡时,一个花蕾可能碎裂成多个小块,每块面积恰好落入花苞区间,导致一个花蕾被误计为多个花苞;当目标变暗时,掩膜收缩也会使花蕾面积跌破 900,被降级为花苞。因此,面积阈值分类器在光照和遮挡变化下极易发生类别迁移,而非简单的漏检。

重叠:成簇永远少算,面积拆分只在一个区间有效

两朵花一旦相触,形态学闭运算把它们焊成一个连通域,所有偏移下都少算 42–57 个花蕾。基于面积的拆分估计在 0.8–1.2 倍半径区间确实有效(−49 → −4,−54 → +10)。但偏移更大时会过度校正(2.2 倍处 +27)。过度校正多半是估计器自找的:它按面积缩放每个花蕾框,而单朵花蕾半径本来就在 30 到 49 像素间波动,一朵大的孤立花蕾会被向上取整成"一朵半"。偏移越大,真实合并越少,这种系统性膨胀就越占主导。

组合压力(gamma 1.6 加 0.8 倍叶片覆盖)把召回率压到 0.429,预处理只能提到 0.500。预处理修得了全局偏移,修不了物理上被藏起来的东西,这条边界值得说清楚。

给实践者的四条结论

一、计数管道的验收指标必须是分类别、逐目标匹配的精确率/召回率,外加花蕾与花苞比值的显式误差。 只看总数,会把作者实验中三个条件认证为 0.0% 误差,而其中六分之一到四分之一的花蕾已经错了。

二、在变暗和中度遮挡这两种最常见的退化下,面积阈值分类器的主要失败模式是类别迁移,而非漏检。 盯住类别构成的漂移,比盯住总数更早报警。边界也要记住:极端欠曝和 1.1 倍覆盖下目标是真的消失了(被遮召回率 0.014),没有迁移可看。

三、预处理应当有条件触发,由测量到的全局偏移驱动。 在截断或含噪输入上,它是净伤害。

四、小类别目标在遮挡下需要自己的保护策略。 降低 min_area 只在轻度遮挡下划算。单帧之外的候选方案是跨天跟踪——昨天的花苞被今天的叶子挡住,从时间序列里恢复。这个想法没有得到本文任何实验的验证(全部是静态单帧,风摆和视角变化未测试),但失败模式指向它,也把路线图上的视频/多帧去重优先级提前了。

为什么不直接换成训练好的检测器?BloomDetector 接口已经在那里,换后端不动其他任何东西。但没有真实标注照片就无从训练。这项研究的价值在于:摸清基线在光照与遮挡下的失败边界,让任何未来的后端都得通过同一套破坏性测试,并排对比数字。

局限与未解问题

一切都是合成的:程序画的花、平涂的叶片遮挡物、全局参数化光照。真实温室的光有方向性和光谱,真实叶片有纹理和半透明。这些数字应当看作失败方向和量级的下界,而非田间精度。光照变换是整图级的,局部镜面反射和镜头眩光没有建模。白平衡/CLAHE 这对组合从未单独消融。2.2 倍偏移的重叠组被三方合并污染,那一行两端都不是干净的读数。四个场景、210 个目标,没有计算置信区间。拆分估计器的单位面积取自本批次中位数,必须按品种和相机距离重新标定,这种迁移尚未测试。真实照片验证仍然缺席——路线图上的训练后端的和真实标注集都还没动工,这是这条线上最大的未解问题。

#花朵计数#计算机视觉压力测试#HSV颜色分割#目标检测评估#Bloom-Counter#遮挡与光照鲁棒性#CLAHE预处理#开源项目分析
分享:

相关推荐