巡检机器人的第一轮测试结束后,林默发现了一个问题。
视觉识别的准确率在实验室环境里是97%,但到了室外,光照变化剧烈,准确率直接掉到了78%。
“光照鲁棒性不够。”苏清颜看着测试数据,眉头皱成了川字,“模型是在室内光照条件下训练的,到了室外,阴影、逆光、反光,都会影响识别效果。”
“那怎么办?”林默问。
“两个方案。”苏清颜伸出两根手指,“第一,扩充训练数据集,加入各种光照条件下的图片,重新训练模型。第二,在预处理阶段做光照归一化,减少光照差异对特征提取的影响。”
“哪个更快?”
“第二个。光照归一化只需要加几行代码,先试试效果。不行的话再走第一条路。”
苏清颜打开笔记本,噼里啪啦敲了十几分钟,写了一个直方图均衡化的预处理函数,嵌入了图像识别的pipeline里。
重新测试。
室外,下午两点的太阳正毒,树莓派摄像头对准一个红色的三角锥。
预处理后的图像,光照被拉平了,红色区域的特征更加突出。模型识别——置信度91%。
“有效果,但还不够。”苏清颜咬了咬嘴唇,“91%还是偏低,至少要95%以上才算可靠。”
林默想了想:“要不两个方案一起上?你搞光照归一化,我扩充数据集。分头行动,两天之内搞定。”
苏清颜看了他一眼,点了点头。
“行。”
---
接下来的两天,两人像上了发条一样。
苏清颜负责优化预处理算法。她从直方图均衡化做到了自适应直方图均衡化,又从自适应做到了带色彩恢复的多尺度视网膜增强算法——一个听起来就很高级的算法,林默连名字都记不全。
林默负责扩充数据集。他拿着摄像头,在学校里到处跑——早上、中午、傍晚、阴天、晴天、室内、室外、阴影下、逆光中——拍了三千多张照片,标注了每一张中的目标物体。
“你这是要把整个江城大学都拍一遍?”苏清颜看到他手机里密密麻麻的照片,忍不住问。
“数据集越大,模型越鲁棒。”林默理直气壮。
“你拍归拍,别被人当变态。”苏清颜面无表情地说,“昨天有人跟我说,看到一个男生在女生宿舍楼下举着摄像头转悠,对着每个红色的东西拍半天。”
林默的脸一下子红了。
“那是意外!我在拍消防栓!消防栓是红色的!而且我没有对着女生宿舍拍!”
苏清颜看着他涨红的脸,嘴角微微抽了一下,像是在忍笑。
“行,信你。”
---
第二天晚上,两人在实验室里跑模型训练。
三千多张新图片,加上原来的数据集,一共四千五百张。用迁移学习在MobileNetV2上微调,GoogleColab的免费GPU跑了一个半小时,终于训练完成。
验证集准确率:96.8%。
比预期的95%还高。
“成了!”林默一拍桌子,站了起来。
苏清颜凑过来看屏幕上的评估报告,点了点头:“室外测试,我猜能到93%以上。”
“赌什么?”
“赌一顿饭。”
“行,输了请你吃好的。赢了……”林默想了想,“赢了你也得请我吃好的。”
“你这赌局,怎么都是你赚?”
“因为我是稳赢的。”
苏清颜白了他一眼,没再跟他争。
---
第二天上午,两人推着巡检机器人到室外做实地测试。
测试场地选在机械工程系楼前的广场。广场上有花坛、路灯、长椅、垃圾桶,环境复杂程度适中。
林默在平板电脑上设定好路径——绕广场一周,识别路径上的红色圆形物体。
机器人启动,履带发出均匀的咔嗒声,缓缓向前移动。
第一个目标:花坛边的一个红色灭火器。
摄像头对准,预处理,模型推理——置信度97%。位置标记,上传云端。
继续前进。
第二个目标:路灯杆上贴的一个红色圆形警示标志。
摄像头对准——阴影恰好覆盖了标志的一半。林默心里一紧。
预处理后的图像,阴影被拉平,红色区域依然清晰。模型推理——置信度94%。
“94%,过了。”苏清颜在旁边说,语气里带着一丝满意。
第三个目标:一个穿着红色T恤的路人。
机器人停下来了。摄像头对准了那个路人。
林默和苏清颜同时愣住了。
模型输出——置信度89%,类别判断:红色圆形物体。
“它不是!它不是红色圆形物体!它是个人!”林默差点喊出来。
苏清颜赶紧在平板上按下了急停。机器人停了下来,无辜地“看”着那个路人。
路人——一个胖胖的男生,被一台机器人对着拍了半天,一脸懵地看着林默和苏清颜。
“不好意思不好意思,我们在做测试,误识别了。”林默连忙跑过去解释。
胖男生看了看林默,又看了看机器人,挠了挠头:“你们这个机器人……眼神不太好使啊。”
林默尴尬地笑了笑。
等胖男生走远了,苏清颜蹲下来,看着机器人的摄像头,若有所思。
“问题出在哪儿?”林默凑过来。
“数据集的偏见。”苏清颜说,“训练数据里,红色圆形物体都是无生命的——消防栓、警示牌、水杯、三角锥。模型学到的特征,可能不只是‘红色圆形’,还包括了‘静止’‘无生命’这些隐含特征。但它没见过红色衣服的人,所以推理的时候,就把人身上的红色区域也当成目标了。”
“那怎么解决?”
“两个方向。第一,在数据集里加入‘红色衣服的人’作为负样本,告诉模型这个不是目标。第二,增加一个目标检测的前置步骤,先判断候选区域是不是人,再决定是否识别为红色圆形。”
“哪个更快?”
苏清颜想了想:“第二个。我可以调用一个开源的人体检测模型,做人脸或者人体检测。检测到人的话,直接跳过。”
“需要多久?”
“半天。”
“行,那就这么干。”
---
苏清颜说到做到。
下午四点,她把人体检测模块集成到了识别pipeline里。新的流程是:摄像头采集图像-人体检测(OpenCV的HOG特征+SVM)-如果检测到人体,跳过-如果没有人体,再做红色圆形识别。
重新测试。
还是那个广场,还是那条路径。
机器人经过那个胖男生站过的地方——这次没有识别,直接通过了。
“搞定。”苏清颜拍了拍手。
林默看着机器人的表现,满意地点了点头。
“苏清颜,你是真的强。”
苏清颜看了他一眼:“你也是。”
两个字,说得云淡风轻,但林默听出了其中的分量。
这是苏清颜第一次当面肯定他。
---
晚上,两人在实验室整理测试数据。
苏清颜在写实验报告,林默在优化机器人的电源管理模块。实验室里很安静,只有键盘声和偶尔的电流声。
“林默。”苏清颜突然开口。
“嗯?”
“你那个除草机,第一次测试的时候,避障功能的响应速度是0.3秒。你是怎么想到用电磁抬升机构的?”
林默愣了一下,没想到她会突然问这个。
“当时也没多想,”他如实说,“电磁铁响应快,结构简单,成本低。而且……我之前好像在哪儿见过类似的设计,就借鉴了一下。”
“在哪儿见过?”