0x00 Soul 新增图片查重功能
据微博互联网博主 @赵宏民 发文称社交软件 Soul 上,新增了图片&文本查重功能,当系统识别到出现重复照片或文本时会提示「系统识别该文字(图片)曾在站内出现过」
我认为这个功能可以从很大程度上增加了盗图的难度,但是从技术角度来看,Soul 使用的查重方法是否容易绕过?是否会催生贩卖绕过识别图片或技术的黑产团伙?目前来看都不是一个定数,但如果此类技术被大范围推广,一定会催生出许多以此为生的黑产作坊,无疑又增加了一个黑灰产的对抗方向
0x01 对图片识别方法的猜测
我首先在朋友圈调查了一下大家认为是如何实现的,大部分的回答是 Hash ,我认为在整个查重体系中 Hash 可以当作一个维度,假设图片原封不动的被重新上传才会被查验出来,但只要经过一丁点修改,Hash 就会完全改变,所以只靠 Hash 判断我认为太单一了
猜想一:特征向量
这里首先感谢一下朋友圈的 @patch 师傅,对我这篇文章提供了方向上的帮助,我猜测这里是将图片的特征向量提取出来做机器学习,再结合图片分辨率、长度宽度等进行综合判断,一开始我我只查到针对验证码等简单图像的特征向量的相关文章,大概思路就是将图片灰度化后二值化,最后再转化为数组点阵进行机器学习,这里贴一下基于 Python 实现的源码(原文地址见引用):
from PIL import Image
import numpy as np
#将二值化后的数组转化成网格特征统计图
def get_features(array):
#拿到数组的高度和宽度
h, w = array.shape
data = []
for x in range(0, w/4):
offset_y = x * 4
temp = []
for y in range(0,h/4):
offset_x = y * 4
#统计每个区域的1的值
temp.append(sum(sum(array[0+offset_y:4+offset_y,0+offset_x:4+offset_x])))
data.append(temp)
return np.asarray(data)
#打开一张图片
img = Image.open("numImage/3.jpg")
#将图片化为32*32的
img = img.resize((32, 32))
#二值化
img = img.point(lambda x:1 if x > 120 else 0)
#将图片转换为数组形式,元素为其像素的亮度值
img_array = np.asarray(img)
print img_array
#得到网格特征统计图
features_array = get_features(img_array)
print features_array
features_vector =features_array.reshape(features_array.shape[0]*features_array.shape[1])
print features_vector
后来我仔细一想,这样考虑是错误的,Soul 每天处理的必然不是简单的数字图片,那么特征向量能否胜任复杂的图片查重吗?我找到了一篇论文给大家作为参考:基于复杂网络的图像特征提取及多特征融合方案探究
猜想二:aHashdHashpHash算法
这个是方向是朋友圈师傅 @Tracy McGrady 师傅提出的,这三剑客的本质从名字就可以预见,还是基于 Hash 实现的(这么一看朋友圈大多数人说的是对的),在部分过程中也与特征向量有些共通之处,如都需要进行灰度处理等,如果想具体了解可以见引用的关于这三剑客的文章,我作为小白就不在关公面前舞大刀了
aHash | dHash | pHash | |
---|---|---|---|
中文名称 | 平均哈希算法 | 差异哈希算法 | 感知哈希算法 |
特点 | 速度快,精确度较差 | 速度快,判断效果比aHash好 | 速度慢,相对aHash鲁棒性更好 |
0x02 引用
-
Python提取数字图片特征向量 —— www.k2zone.cn -
图片相似度识别:aHash算法 —— 三猫后端 -
图片相似度识别:dHash算法 —— 三猫后端 -
图片相似度识别:pHash算法 —— 三猫后端 -
开源矢量数据库 Milvus(https://github.com/milvus-io/milvus)
原文始发于微信公众号(天禧信安):【快报】Soul 新增查重功能和我对图片查重落地的猜想
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论