这事得从去年秋天说起。运营妹子小李每天要审核上千张用户上传的商品图,眼睛都快看瞎了。她盯着屏幕时间久了,经常揉眼睛跟我说“哥,我快成斗鸡眼了”。我当时正喝着奶茶,随口说了句“要不我写个脚本帮你看看”。她眼睛一下子亮了,第二天桌上就多了杯波霸王奶茶。我就知道这活接下了。
最开始想法很简单。图片审核主要查三样东西:有没有违规内容,图片清不清晰,水印位置对不对。我翻了翻Python的图像处理库,OpenCV和Pillow是主力。安装的时候出了点小插曲,OpenCV在Windows上要配环境变量,搞了我半小时。小李在旁边一边核对数据一边问我“好了没”,我只能说快了快了。
第一版脚本粗糙得很。先写个模糊检测,用拉普拉斯算子算方差。方差低于设定值就标记为模糊图。然后又加了人脸检测,用OpenCV自带的Haar级联分类器。识别率还行,就是速度慢了点。小李测试后跟我说“有些猫猫狗狗也被识别成人脸了”。我改了下逻辑,只检测图片中央区域的人脸,减少误报。
水印检测是最头疼的。用户上传的图,水印位置五花八门。有的在左上角,有的在右下角,有的压着商品。我用模板匹配的方法,把公司logo和标准水印做成几个固定模板。对每张图片做多尺度匹配。匹配度高的直接通过,匹配度低的要人工复审。这个方案准确率大概在85%左右,比纯人工快了很多。
小李给了个关键建议:按批次处理。她每天早上导出前一天的图片压缩包,我写了个定时任务,每天凌晨3点跑一次。脚本自动解压、分析、生成结果表格。她上班打开邮件就能看到哪些图有问题。这功能一出,她惊呼“我多睡了半小时”。当天中午又给我点了杯杨枝甘露。
代码核心就三个函数。第一个check_blur,接受图片路径返回布尔值。第二个check_watermark,返回匹配分数。第三个check_face,返回人脸区域坐标。我为了跑起来快,用了多线程。一次处理100张图,大概40秒完成。小李之前手动审100张要一个多小时。这效率差距,她自己都不敢信。
调试阶段出了不少笑话。有一次脚本把纯白色背景的商品图全部标记为“模糊”。查了半天发现是图片压缩太厉害,边缘细节丢失了。我调整了模糊阈值,对不同分辨率的图片用了自适应参数。还有一次把穿着豹纹衣服的模特识别成动物,弄得小李哭笑不得。我跟她说“这是AI的审美问题,我改不了”。后来在分类器里加了个“模特姿势”判断条件,误报才降下来。
现在这个脚本跑了快半年,处理了十几万张图片。小李不用再盯着屏幕看,只需要每周五下午花半小时复核一下标记可疑的图片。她的工作效率翻了好几倍,我也攒下了20多杯奶茶。前几天她在群里发了个链接,是杯装奶茶的批发价。我装作没看见,她就在工位上喊“哥,夏天到了,蜜桃乌龙要不要”。
技术层面上说,这个方案有个更大的价值。脚本生成的分析数据可以用来做质量报告。哪些时间段的图片模糊率高,哪些品类的图片容易出问题,每个月汇总一张表。运营主管看到这个报告觉得特别好,主动来找我聊。我说代码可以开源,但奶茶要管够。他愣了一下,然后笑了。小李在旁边小声说“排长马上要升连长了”。
如果你也想搞类似的工具,我建议别一上来就想搞多复杂。先跑通基础流程,再慢慢优化。用Pillow做缩放和格式转换,OpenCV做核心检测,Tkinter写个简单的图形界面。数据存储用CSV就行,不用整MySQL。小李现在每天的操作就是:打开软件,拖入图片文件夹,点一下“开始审核”。等进度条跑完,弹窗显示“处理完成”。她就会转过来跟我说“今天的奶茶晚点下单,我现在要去开会”。