图像去重. 删除重复或相似的图像.
计算图片相似度的应用很广泛, 如google, baidu, 360等搜索引擎以图搜图的功能就是其典型应用.
1. 感知哈希算法(Perceptual hash algorithm).
phash算法可以使用Python调用Opencv库实现, 但是运行效率会比较慢. 可以这样处理: 在http://phash.org/官网上安装C版本的phash计算方法, 然后使用Python调用即可. phash只支持在Linux下运行.
Github上有一个imagehash库, 可以支持average hashing (aHash), perception hashing (pHash), difference hashing (dHash), wavelet hashing (wHash).
pip install ImageHash
2. 如果图像发生了旋转, 或者是基于内容的判断相似度, 那么再使用Hash算法判断图像的相似度就不合适了. 可以采用提取图像特征的方法, 如SIFT特征.
- 首先对图像提取SIFT/SURF特征, 然后使用最近邻的快速匹配算法. 即SIFT/SURF+FLANN.
- 使用SIFT或SURF特征时, 在detectAndCompute()阶段, 时间会较长, 因此也可以使用ORB特征. ORB+BF.
3. 使用训练好的ImageNet模型提取图像特征, 然后再计算图像的相似度.
结论:
1) 如果使用Hash算法, 那么基于内容的图像去重的准确率和召回率是很低的. 就算fingerprints长度再大, 也是如此. Hash算法可用于对于同一幅图像做了缩放, 水印, 调整色度的图像的相似度.
2) 采用提取SIFT/SURF/ORB特征, 然后在做特征点匹配的方法, 对于同一幅图像做了缩放, 水印, 旋转, 裁剪等常规操作后, 是可以判断相似度的.
4. 目前基于内容的图像去重任务已经明确.
即在网上抓取的衣服的图像可能是是有重复的, 这里的重复是指: 图像可能经历了旋转, 裁剪, 水印, 字幕等等比较初级的变换. 在这样的重复基础上进行图像去重, 那么上述两种方法是可以使用这种类型的去重任务的.
1) 数据集可以借助于DeepFashion数据集制作一些, 常见变换的衣物图像.
这些变换可参考https://www.infoq.cn/article/image-similarity-algorithm-on-mobile-client. 具体代码可见.
2) 计算相似度时间比较.
使用SURF特征匹配时间统计:
对于301 x 128(H x W)的图像, 耗时为0.039s, 39ms, 毫秒级.
使用ORB特征匹配时间统计:
对于301 x 128(H x W)的图像, 耗时为0.015, 15ms, 毫秒级.
使用SIFT特征匹配时间统计:
对于301 x 128(H x W)的图像, 耗时为0.31, 310ms, 毫秒级.
SURF特征匹配方法比ORB特征匹配方法效果要好很多, 比SIFT特征匹配方法省时很多!
使用phash时间统计:
对于301 x 128(H x W)的图像, 耗时为0.034s, 34ms, 毫秒级.
综上, 在进行基于内容的图像去重时, 采用基于SURF特征匹配的方法!