事情本身不复杂,线索都在日志里。给 8 万张商品图做去重,用 imagehash 的 phash 取 64 位指纹,汉明距离小于 8 判为重复,结果同款不同色的商品被合并,红色和蓝色款只剩一张。
第一反应是「没有结合裁剪与白底归一提高可比性」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。pHash 主要保留结构信息,颜色被灰度化丢弃。少数情况下是阈值 8 对图案简单的商品过于宽松。
少数情况下是同款不同角度也被判成重复,人工无法区分。
先看两张不同颜色图的指纹距离
python -c "from PIL import Image;import imagehash;a=imagehash.phash(Image.open('red.jpg'));b=imagehash.phash(Image.open('blue.jpg'));print(a-b)"
叠加颜色直方图做二次判定
python -c "from PIL import Image;import numpy as np;h=lambda p:np.histogram(np.array(Image.open(p).convert('RGB')),bins=16,range=(0,256))[0];print(np.linalg.norm(h('red.jpg')-h('blue.jpg')))"
再往下把阈值收紧到 4 并只对白底图生效
python -c "from PIL import Image;import imagehash;print(imagehash.phash(Image.open('a.jpg'))-imagehash.phash(Image.open('b.jpg'))<=4)"
人工抽检 200 组确认误合并率
python audit_dedup.py --pairs pairs.csv --sample 200 --max-false-merge 0.02
恢复的判定其实很直接。同款不同色的 63 组图片不再被合并,去重率从 21% 降到 14%,抽检 200 组误合并率降到 1.5%。
这里还有个坑。pHash 不看颜色只看结构,彩色商品图去重必须叠加颜色特征,单靠汉明距离阈值调参解决不了语义上的不同款。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
