ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

中古奢品瑕疵检测:图像识别技术链路与工程实践解析

中古奢品瑕疵检测:图像识别技术链路与工程实践解析 千旗中古每天要上新上千件中古奢品每件商品至少拍十几张图这些图从拍摄完成到挂上页面中间还有一关看起来不起眼、但直接影响成交和口碑的工序——瑕疵检测。过去这道工序完全靠鉴定师肉眼一张一张看高峰期一张包图要看三四十秒一天下来眼睛发花边角磨损和五金氧化这类细节最容易漏。现在我们把这套流程搬到了图像识别服务上拍品图入库后自动完成瑕疵定位、风险分级和标注输出鉴定师只需要对着AI给出的证据做复核。这篇文章就把这条技术链路完整拆开讲清楚每个环节怎么设计、模型怎么选、数据怎么喂、线上踩过哪些坑希望能给同样在做中古或二手非标品交易的同学一些参考。1. 先说清楚为什么中古奢品交易最缺的就是标准答案1.1 同一只包三个人给出三种报价问题出在哪中古奢侈品和数码产品最大的区别是手机电池健康度可以用一个数字表示但一只LV老花水桶包的使用感很难用一个数字概括。它可能边角磨了但配皮保持得好五金有划痕但内里干净面料整体变色但油边没有裂。这些状态组合起来才是这件商品的真实价值可磨到什么程度算严重在每个人眼里都不一样。我们内部做过一次测试把同一批商品图发给三组鉴定师让他们分别标出需要提醒买家的瑕疵点。结果非常有意思三组鉴定师标注的重合率只有六成左右。有人觉得包底四角轻微磨损属于正常使用痕迹不用特别写有人坚持只要露出帆布底层就必须标明显磨损。这不是谁对谁错而是非标品的状态描述天然缺乏统一尺度。这个问题放到平台上会被放大。买家看到的图是几十张照片但他不可能每张都放大看买家信任的是平台的验货报告。如果报告里漏掉了一处边油开裂交易后必然引发纠纷。所以我们刚开始做这个项目时定的目标就很朴素不是用AI替代鉴定师而是让AI先把海量图片里的可疑点找出来给鉴定师一份按风险排序的候选清单让人的经验用在真正难判断的地方。1.2 AI不能替代鉴定师但可以先当质检助理在项目立项前团队内部有过争论市面上的通用瑕疵检测模型能不能直接拿来用结论是不行。通用模型擅长检测工业产品上的划痕、凹坑、脏污背景是可控的工厂流水线中古奢品是典型的非受控场景背景可能是沙发、地毯、手持实拍同一件商品在不同光照下看起来像两件东西。还有个更麻烦的点很多瑕疵其实是中古商品的正常特征。植鞣革用久了会变成蜜色这是很多买家追求的养牛效果不算瑕疵可同一块植鞣革上如果有一块深色水渍价值就会明显折损。模型必须学会区分状态特征和风险缺陷这个语义层次的判断靠通用预训练模型是搞不定的。所以我们最终采用的技术路线是用图像识别技术做逐级筛选用结构化风险标注承接业务规则。AI负责在海量图片里找出高概率存在问题的区域并给出是什么问题、有多大可能、位于哪里的结构化输出业务系统根据这些输出决定商品要不要发回重拍、要不要转人工精细验、上架展示时要标注到什么程度。这套分工下来AI是助理鉴定师是决策者。2. 拍品图到风险标注的整体链路我们是怎么串起来的2.1 一次检测请求在服务端都干了什么商品拍摄完成后图片会进入一个异步任务队列。每张图经过链路处理最终输出一个结构化的检测结果大致流程是这样的图片入库读取Exif信息记录拍摄设备、时间、分辨率和GPS如果有。图像预处理长边缩放到统一尺寸校正透视畸变做光照归一化。一级检测区域定位识别图中的包袋本体并进一步切分出包身、边角、五金件、肩带、内里等关键区域。二级判断瑕疵识别对每个关键区域做细粒度分析输出瑕疵类别和置信度。三级分割像素级定位对高置信度区域生成瑕疵掩膜得到精确到像素的轮廓。风险标注结合业务规则把检测结果映射为风险等级和标注信息推送至审核队列。注意第3步和第4步的区别。我们一开始也想跳过区域定位直接做整图瑕疵检测实验效果很差。原因不复杂一只包的照片里包身可能只占画面四成一个划痕可能只占画面的0.5%直接在整图上做目标检测正负样本比例极不均衡。先定位区域再在区域内找瑕疵等于把问题拆成了两个更简单的子问题。2.2 这不是一个模型而是三个模型的接力赛整个技术链路里跑了三个深度模型各自职责不同区域检测模型负责找包在哪里、哪里是边角、哪里是五金。我们用的是一阶段检测网络生产环境推理速度快单张图的区域检测耗时控制在120毫秒以内。瑕疵分类模型对抠出来的区域做瑕疵类别判断。这个模型是链路的瓶颈因为它要看很多细节我们最终选用了一种带注意力机制的分类网络输入分辨率定在640x640单区域推理在80毫秒上下。瑕疵分割模型对置信度高的区域做像素级分割生成可展示的掩膜。分割只在必要时才跑避免全图分割带来的算力浪费。用一个伪代码可以把这个接力关系说清楚def run_inspection(image_id: str) - InspectionResult: img load_image(image_id) img preprocess(img) # 缩放、光照归一化、透视校正 part_boxes detect_parts(img) # 模型1定位包身/边角/五金/内里 findings [] for box in top_k(part_boxes, min_score0.35): roi crop_by_box(img, box) cls, score classify_defect(roi) # 模型2判断该区域有何种瑕疵 if score 0.55: continue mask None if score 0.75: # 模型3高置信度才做像素级分割 mask segment_defect(roi) findings.append(make_finding(box, cls, score, mask)) return build_risk_output(findings)这段代码看起来简单但工程上坑很多。比如top_k怎么设置、置信度阈值定多少直接影响漏检率和误报率再比如三个模型之间的坐标体系必须统一ROI裁剪时要注意边界否则模型2看到的区域和模型1输出的框对不上训练得再好也白搭。3. 数据是这条路线的起点也是最烧钱的一环3.1 冷启动阶段去哪找种子数据图像识别项目最怕的就是先有鸡还是先有蛋没有模型就标不了数据没有数据就训不了模型。我们冷启动时的做法是混搭三路数据源第一路是采集实拍图做定向标注。平台本身就有大量历史商品图和对应的验货记录这是最有价值的种子数据。虽然历史验货记录里没有像素级标注但有边角磨损五金华痕这样的文字描述可以做弱监督训练。第二路是引入工业瑕疵检测的公开数据集做预训练底座。这类数据集的瑕疵形态划痕、凹坑、氧化和中古品有相似之处模型先在这些数据上学会什么是异常再迁移到中古品上收敛会快很多。第三路是主动制造仿真瑕疵。买一批高仿样品或者代替品用砂纸、颜料、刀具人为做出不同类型的磨损和划痕拍成图加入训练集。这个做法看起来土但非常有效尤其是对深色皮革上的浅划痕仿真图能填补真实数据里的空白分布。数据量级上我们最终用在训练集里的有效瑕疵图大约在几十万张的量级。这个数字听起来大拆到具体类别上其实很紧张光边角磨损一类就分了磨白、露布、破洞三个子类每个子类的有效样本都只有几千张。中古瑕疵检测本质上是一个长尾问题数据只会不够用不会嫌多。3.2 标注规范比标注数量更重要踩过最大的坑是前期标注质量失控。团队刚开始用外包标注给外包同学的规范文档写得太粗结果不同标注员对划痕的理解完全不一样。有人把一条连续划痕标成一个框有人拆成三个框有人把边角磨损的范围画得很夸张把完好的部分也圈进去。用这批数据训出来的模型预测结果也是五花八门。后来我们把标注规范细化成了可量化的规则拿关键几类举例瑕疵类别标注规则常见位置检测难度边角磨损沿磨损区域外沿画多边形包含毛边但不包含正常皮革包底四角、手柄根部中边油开裂按连续开裂段画线状多边形断裂超过2毫米才标提手、包边中五金氧化/划痕框选受影响的金属面范围不按划痕走线锁扣、链环中高皮革划痕按连续划痕首尾点连线标注长度不足1厘米不标包身、翻盖高污渍/水渍按斑块实际边缘标注浅色面料需额外标渗透范围内里、面料低植鞣革变色不标为瑕疵标为状态项配皮、肩带基准分类表里有个细节值得展开植鞣革变色不标为瑕疵这个决定当时内部讨论了很久。从模型训练角度看植鞣革变色区域和瑕疵区域一样颜色异常如果硬性标注成瑕疵模型就会学到颜色不均匀就是有问题导致大量正常中古包被误报。我们最终单独建了一个状态项类别让模型输出时区分这是特征性状态和这是风险缺陷从根上把这个语义冲突解掉了。4. 图像预处理和瑕疵检测每一环都有隐蔽的坑4.1 拍品图的归一化没有想象中简单拍品图不是实验室图像拍摄环境五花八门。有的卖家在室内黄光下拍有的在自然光下拍有的图自带滤镜。如果直接把这些图喂给模型模型很容易学到光线规律而不是瑕疵规律。我们预处理做了三件事。第一件事是光照归一化先做白平衡校正再做局部直方图均衡。中古包常见的瑕疵集中在深色皮革上直方图均衡能拉开划痕和背景的灰度差检测率提升非常明显。第二件事是透视校正用包袋的边缘检测结果估算透视矩阵把斜拍的包校正到正面视角。第三件事是尺度归一化长边缩放到2560像素再按检测需求缩到网络输入尺寸。这里必须提醒一个容易犯的错误不要在预处理时做太强的图像增强。我们初期为了让看起来更清晰叠加了锐化和对比度拉伸结果模型在线上出现了大量误报后来排查发现是锐化把皮革纹理里的细纹强化成了假划痕。预处理的原则是还原拍摄现场的真实观感而不是把图修漂亮。4.2 检测网络选型对比与线上表现模型选型没有一步到位我们做了三轮替换。第一轮用检测网络直接做端到端瑕疵框检测小瑕疵漏检率太高放弃。第二轮改成两级检测先用通用检测切区域再用分类器判断瑕疵性价比显著提升。第三轮在分类器之后加了分割模型专门处理需要精确轮廓的瑕疵比如边油开裂、污渍边缘这才满足业务对标注精度的要求。实际落地时我们对比过几组方案方案精度表现单图耗时显存占用结论YOLOv8x 端到端检测中小目标漏检45ms中不适合直接做瑕疵检测Faster R-CNN ROI分类高小目标依旧有漏检150ms高精度最高但太重YOLOv8 区域检测 EfficientNetV2分类较高漏检和误报平衡好120ms中低最终采用YOLOv8 分类 U-Net分割高轮廓精细180ms中高置信度ROI才启用Production环境用的是第三种方案但我在离线实验中发现检测区域的网络 backbone 用 YOLOv8 的 CSPDarknet 已经足够瓶颈在分类模型对极小目标的识别上。EfficientNetV2分类器如果输入分辨率从480提到640划痕检测的召回率能涨两到三个点代价是耗时多20毫秒。线上我们折中选了512分辨率后续再按GPU负载逐步提。4.3 瑕疵小、纹理杂分割怎么做才稳老花、棋盘格这类图案配皮上做分割是一件很麻烦的事。图案本身就有高对比度的纹理模型很容易把纹理边界当成瑕疵边界分割出来的掩膜会沿着图案纹路乱跑。我们的做法是给分割模型增加一个纹理一致性约束在损失函数里加入对局部梯度方向一致性的惩罚项让模型倾向于输出平滑、紧凑的掩膜而不是细碎的纹理碎片。训练时还专门做了一种数据增强——把同一张瑕疵图同时做灰度化和保留彩色两个分支输入让模型学习颜色变化不等于结构变化。这一层的价值主要体现在体验上。审核员打开检测结果时看到的不是一个大方框而是一个贴合瑕疵边缘的轮廓标注。这个轮廓可以直接叠加在商品图上买家的阅读成本低很多一眼就知道这个磨损具体在哪个位置、有多大范围。5. 风险标注怎么落到业务上从框到等级的最后一公里5.1 风险等级的映射规则模型输出的是一堆检测框和置信度但这些原始信息不能直接给业务用。业务需要一个决策依据这件商品能不能直接上架还是要人工复核、补拍图甚至限制拍卖。我们设计了一套四级风险映射规则等级定义典型情形系统动作L0无瑕疵/特征性状态植鞣革蜜色变化、正常使用折痕直接通过展示时不额外赔标L1轻微瑕疵微小划痕、局部五金小氧化点展示图加轻标注不需要人工干预L2明显瑕疵边角明显磨损、边油开裂、水渍斑块自动打回要求补拍细节图转人工复核L3高危瑕疵结构性损伤、油边断裂、大面积磨损、疑似修补强制人工验货限制上架或影响报价这个映射表不是拍脑袋定的而是从交易纠纷数据里反推出来的。我们拉了过去一年因为瑕疵描述不准确引发的退换货记录标记出哪些描述漏报会导致纠纷再把这些描述对应到模型输出的检测类别上形成了现在的规则。做规则映射时一定要有业务人员在现场工程师自己推导的规则往往太理想化。5.2 自动标注结果与人工复核的协作方式AI标注的结果不会直接对外展示必须先过人工复核。但复核的效率要有节奏L0级结果秒过L1级结果批量过L2级结果逐张确认L3级结果必须由高级鉴定师处理。系统给复核员呈现的信息不是干巴巴的坐标框而是证据包原图裁片、局部放大图、模型置信度、相似样本对比图。有次一个复核员反映她看到某个检测结果标的是五金氧化但裁片很小看不清就想不起来该不该放过。后来我们在证据包里加了一张同型号五金的全新状态对比图她一瞄就能判断氧化程度复核速度直接翻倍。这类交互细节对落地效果的影响不亚于模型本身的精度。自动标注和人工复核之间还设计了一个闭环复核员每驳回一条AI标注这条数据会进入错题本定期抽出来分析。错题本数据显示大部分驳回集中在两类情况一是植鞣革变色被误判为污渍二是浅色面料上的阴影被误判为划痕。这两类问题后来都通过调整训练数据配比明显缓解了。6. 踩坑记录与后续演进6.1 最容易翻车的三类误报线上运行半年多三类误报是我印象最深的第一类是背景干扰。很多人拍照时包放在沙发或地毯上背景纹理杂乱。有一次系统把沙发缝线识别成边油开裂这是典型的背景干扰。后来我们在训练集里加大了复杂背景的占比推理时也用区域检测结果先把背景裁剪掉误报率降了一大截。第二类是光线阴影。深色包拍摄时经常有环境光的反光或窗帘阴影反光区域在灰度图上和划痕很像。这种情况没有完美的解药我们只能在预处理阶段加一个反光检测器高反光区域直接标注需重拍不让模型硬猜。第三类是包袋本身的设计元素。比如某些品牌的做旧五金、做旧皮边本身就是出厂时的设计模型却当成磨损。这个问题的解法很笨但有效把高发车型号和年份录入知识库检测到这些型号时自动下调风险等级把设计元素排除出风险范围。6.2 数据不均衡被淹没的少见瑕疵边角磨损和五金氧化占了全部样本的六成内里粘皮配皮干裂拉链掉齿这些少见瑕疵样本量很少模型学不好漏检率长期居高不下。我们为每类瑕疵设定了一个最低样本量红线低于红线的类别用伪样本补用图像编辑工具把真实瑕疵贴到不同颜色、不同材质的背景包上再通过随机形变生成一批看起来不完全一样的训练图。这个办法能把少类样本从几百张补到几千张但有个明显副作用伪样本的纹理细节和真实瑕疵有差异模型可能在真实场景里产生误报。所以伪样本只用来做预训练或者辅助训练不能占比超过三成。6.3 下一步把验货报告结构化目前整条链路已经稳定运行但我心里清楚目前的风险标注还停留在指出位置、标出等级的阶段距离生成结构化验货报告还有一段距离。我们正在尝试的方向是把检测输出和商品信息型号、年份、皮质类型关联起来自动生成一段可读的描述比如包身左下角存在一条长约4厘米的划痕深度较浅未伤及帆布底层五金锁扣存在多处氧化点已影响光泽度。这一步做出来之后鉴定师只需要微调措辞验货报告的产出速度应该还能再快一截。开发过程中我自己最大的体会是这类项目真正的门槛不在深度学习模型本身而在业务规则和数据质量的互相磨合。模型给出的是一个概率业务需要的是一个可执行的决策这中间隔着大量踩坑、标注规则迭代、误报分析和交互设计。如果你也在做类似的事情不妨把一半的精力放在链路设计和规则映射上模型反而不是最花时间的那部分。
返回列表