今年 7 月,民政部等五部门印发《整治婚介机构乱象专项行动工作方案》,“关键信息审核流于形式”被列为整治重点。9 月以来,多地民政部门公开征集问题线索,点名的情况包括“仅凭口头陈述即建档入库”“不留存必要核验材料”。对做婚恋平台的工程团队来说,审核这件事,已经从运营的口头动作变成了必须用系统兜底的技术问题。
照片是会员资料里最容易造假、也最难审的一环。证件有核验接口,学历能接学信网,唯独照片——一张网图、一张盗来的生活照,模型未必拦得住,人工更看不过来。这篇记一下我们在婚恋系统里搭照片审核流水线的过程:先用感知哈希把明显重复的图筛出去,再让人工只看值得看的部分。
MD5 挡不住照骗,感知哈希可以
防盗图的第一反应是算哈希去重。但 MD5 这类精确哈希只认字节:同一张图过一次 JPEG 压缩、改一个像素,哈希值就面目全非。盗图者甚至不用刻意处理——微信里传一次图就重压缩了。
感知哈希(pHash)解决的是“长得像”的问题。流程不复杂:图片缩到 8×8 灰度,做一次离散余弦变换(DCT),取左上角低频分量,大于均值的记 1、小于的记 0,得到 64 位指纹。两张图的指纹做异或,数 1 的个数(汉明距离),距离小于阈值就判为相似。
importimagehashfrom PILimportImagedef photo_fingerprint(path):withImage.open(path)asimg:returnimagehash.phash(img)# 64 位感知指纹def find_similar(new_hash, known_hashes, threshold=8): for photo_id, h in known_hashes: if new_hash - h <= threshold: # 汉明距离 return photo_id return None我们拿库内历史照片做过验证(示例数据):压缩、轻微裁剪、加水印这类“无害变形”后的汉明距离大多落在 0–6,不同人的照片大多在 20 以上。阈值取 8–10 比较稳。定低了,会员换个滤镜就被要求重新上传;定高了,盗图照样混进来。
审核不是布尔值,是一条状态线
早期版本里,照片审核就是一个is_approved字段,很快发现不够用。一张照片的实际经历可能是:机审通过 → 人审驳回 → 会员重传 → 机审拦截(与库内已有图相似)→ 人工确认非盗图 → 上架。每一步都得可追溯,这也正好对应专项整治里“留存核验材料”的要求。
表结构大致长这样:
CREATETABLEphoto_moderation(idBIGINTPRIMARYKEY,member_idBIGINTNOTNULL,file_keyVARCHAR(128)NOTNULL,-- OSS 对象键 phash CHAR(16) NOT NULL, -- 64 位指纹的 hex machine_verdict TINYINT NOT NULL, -- 0 通过 1 疑似 2 拦截 similar_to BIGINT NULL, -- 相似命中的历史照片 id human_verdict TINYINT NULL, -- 0 通过 1 驳回 reviewer_id BIGINT NULL, status TINYINT NOT NULL, -- 状态机当前态 created_at DATETIME NOT NULL, KEY idx_phash (phash), KEY idx_member (member_id, status));状态流转:pending → machine_passed / machine_suspect → human_reviewing → published / rejected,驳回后重传回到pending。机审通过的图不直接上架,照样进人审队列;被 pHash 命中相似的照片标红优先处理。人工复审只看疑似样本,不碰全量。按我们婚恋平台后台的实际观察(示例数据),这一层初筛能砍掉约六成人审工作量。
异步回调要按"迟到重放"来设计
机审走的是云厂商的内容安全接口,提交之后靠回调拿结果。这在婚恋平台绕不开——照片属于 UGC,人工顶在前面不现实。这里踩过坑:回调会迟到,会重放,网络抖一下,同一张图的结果可能推两次。处理办法是老三样——按file_key做幂等键,回调进来先查状态机当前态,已到终态的直接忽略;再挂一个 10 分钟超时任务,回调没到的主动调查询接口补单。
还有个反直觉的点:别在回调里同步改会员状态再同步发通知。回调处理只写审核结果,上架、推送这些都丢进队列慢慢做。回调接口一旦响应慢,云厂商的指数退避重试会让堆积雪上加霜。
感知哈希不是终点,边界要讲清楚
pHash 拦得住“原图级盗用”,拦不住定向对抗:裁掉人脸区域、镜像翻转、深度改造型图,汉明距离会迅速拉开。所以这条流水线的定位是初筛加留痕,不是替代人审。命中相似的照片,系统把新图和相似历史图并排推给审核员,人来拍板。
申诉口也要留。误判盗图对婚恋平台是体验灾难——会员被当成骗子,多半转身就走。驳回时附上相似图截图(对方信息脱敏),会员能看到理由,也能提交补充材料走重审。
写在最后:审核流水线没有多高深,难在把“审核”从一句运营要求拆成可追溯的状态机和可量化的阈值。文中方案来自我们在婚恋行业 SaaS(云中红线)的一线实践,欢迎交流。