先看现象。商品图是带透明通道的 PNG,为了压体积统一转成 JPEG 再送模型,结果透明背景全变成黑色,模型把黑块描述成污渍,识别结果明显跑偏。
把日志和配置对完,能解释这个现象的基本就这几处。RGBA 直接存 JPEG 时透明通道被丢弃成黑色。还有一种是转换前没有铺白底。
少数情况下是批量脚本统一 convert 忽略了模式。
不容易想到的是,压缩质量过低,边缘出现灰色描边。
第一件事是确认图片的模式
python -c "from PIL import Image;print(Image.open('a.png').mode)"
铺白底后再转 RGB 保存
python -c "from PIL import Image;im=Image.open('a.png').convert('RGBA');bg=Image.new('RGB',im.size,(255,255,255));bg.paste(im,mask=im.split()[3]);bg.save('a.jpg','JPEG',quality=92)"
批量处理并统计输出模式
python -c "import glob;from PIL import Image;print({Image.open(f).mode for f in glob.glob('out/*.jpg')})"
剩下的就是抽三张图重新跑识别对比结果
python call_api.py --files out/001.jpg out/002.jpg out/003.jpg
这类问题以前遇到过,但这次的触发条件和上次不一样。
恢复的判定其实很直接。输出图片背景为纯白,模型描述里不再出现黑块,识别准确率回到转换前水平。
提醒一点。透明图转 JPEG 一定要先合成底色,黑色不是压缩造成的,是 alpha 被丢掉后的默认值。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
