14年程序员:从零搭建CV系统,日均处理10万图
|
去年十一月份那会儿,我原以为从零搭个CV系统,日均处理十万图,顶多就是费点时间调参——结果被测试老陶的边界条件测试给整崩溃了。那天下午三点,他抱着一摞测试用例进来,眼镜片上还沾着机房的灰尘,说“你这模型对极端光照的识别率,我测了三百张图,有十二张直接跳过了”。我第一反应是“不可能啊,训练集里明明有类似场景”,结果他掏出手机,翻出一张测试环境抓拍的照片——画面里是下午四点的阳光斜射进窗户,在白色桌面上投出明暗分明的条纹,模型输出直接空了。 老陶这人,点了一辈子按钮,测试用例写得比开发文档还细。他当时坐在我对面,翘着二郎腿,手指敲着桌子说:“你这算法,是不是没考虑过‘非均匀光照’的边界?我查了日志,那十二张图里,有七张的明暗对比度超过1.8,模型直接把暗区当背景了。”我嘴上说着“不可能,训练时明明加了对比度增强”,心里却开始发虚——因为训练集里的对比度增强,是按0.8到1.5的区间调的,1.8以上的数据,确实没覆盖到。 那天晚上七点,老陶又来了,手里端着外卖盒,说“我加了个测试用例,把对比度调到2.0,模型输出还是空的”。我盯着屏幕上的日志,突然想起测试环境的摄像头和生产的型号不一样——测试用的是老款,动态范围小,生产用的是新款,动态范围大。老陶听了,冷笑一声:“所以你们开发总说‘测试环境全绿’,结果生产崩?我这儿有张对比图,测试环境拍出来的明暗条纹,宽度是生产的两倍。”他说着,把手机递过来,画面里是两台显示器,左边是测试环境的图,右边是生产的图,条纹宽度差得肉眼可见。 我原以为调整对比度增强参数就能解决问题,结果老陶又抛出个新问题:“你这模型对‘局部遮挡’的识别率,我测了五十张图,有八张把遮挡物当目标了。”他指着屏幕上的测试报告,说“比如这张,目标是个杯子,上面盖了块布,模型输出的是‘布’”。我凑过去看,发现训练集里确实没这种场景——训练时用的遮挡物,都是透明玻璃或薄纸,而测试用的是厚布。老陶敲着键盘,调出一张生产环境的抓拍图,说“生产里这种场景多了去了,比如仓库里货物被塑料布盖着,模型要是总把遮挡物当目标,那日均十万图的处理量,得错多少?” 那天晚上十点,老陶走了,留下我盯着满屏的测试报告发呆。我翻出训练集的标注文档,发现“遮挡物”的标注规则里,确实没写“厚布”这种场景——标注团队当时觉得“厚布”属于边缘情况,没必要专门标。可现在看来,这“边缘情况”在生产里根本不边缘。我打电话给标注负责人,对方在电话那头打了个哈欠,说“我们当时按80%的常见场景标的,剩下的20%,你们开发自己处理呗”。我挂了电话,心想“这20%的边缘情况,才是决定系统能不能站得住的关键”。 后来我花了三天时间,重新调了对比度增强参数,加了厚布遮挡的训练数据,还让老陶帮忙补了五百张极端光照的测试用例。系统上线后,日均处理十万图,错误率从0.3%降到了0.1%。老陶后来跟我说:“你这系统能站住,不是因为参数调得好,是因为优胜劣汰——测试环境没覆盖的边界条件,生产环境会帮你补上;你漏测的极端场景,用户会帮你发现。”他说这话时,正蹲在机房角落修测试用的摄像头,螺丝刀在手里转得飞快。 现在每次看到测试报告里“通过”的绿标,我都忍不住想——这绿标背后,有多少是老陶这种“点了一辈子按钮”的测试,用极端场景、边界条件、边缘用例,一点点抠出来的?开发总说“测试环境全绿”,可生产环境崩的时候,谁又记得测试环境里那些被漏掉的“边缘情况”?优胜劣汰的道理,在CV系统里适用,在测试里更适用——漏测的边界条件,早晚会变成生产环境的坑;而那些被测出来的“不可能”场景,才是系统真正站得住的底气。
文章配图,仅供参考 对了,老陶上周退休了,走之前把他的测试用例库传给了我——三百多页,全是手写的,字迹工整得像印刷体。我翻到最后一页,看到他写的一句话:“测试不是找茬,是帮开发把坑填平。”这话我记下了,以后写代码时,得时刻想着——那些被漏掉的边界条件,可能正躲在某个角落,等着给系统来一记重拳。(编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |





