事情本身不复杂,线索都在日志里。给 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 不看颜色只看结构,彩色商品图去重必须叠加颜色特征,单靠汉明距离阈值调参解决不了语义上的不同款。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189