相似性图像检测,是模型训练过程中常出现的问题,本文介绍了 4 个常用的哈希算法,并通过 Colab 代码,展示了完整的训练过程。

新晋炼丹师小王最近遇到了一个难题,愁的头发掉了好几根儿。

一问才知道,原来是他师傅给他分配了一个深度学习模型训练的任务,但是训练模型的图像数据集,略微有那么一丝丝复杂:

里边除了已有的公开数据集外,还包含一些从 Google、Bing 等网站上爬取的图像。

重复图像的存在,使得模型性能变得十分不可靠,毕竟:

* 重复图像将 bias 引入数据集,使得深度学习模型不得不学习重复图像的特定模式;

* 特定的学习模式,会使得深度学习模型概括新图像的能力下降。

手动删除重复图像,绝对不是最优解,原因是数据集中的图像数量动辄成百上千万,手动检查和删除会是一个非(丧)常(心)繁(病)琐(狂)的过程,将会耗费大量时间。

哈希算法成为小王最先想到的解决方案。

图像相似性检索,「哈希」一下

哈希算法是解决图像相似性检索的「魔法工具」,它可以对任意一组输入数据进行计算,得到一个固定长度的输出摘要(字符串)。

比较输出摘要,结果越接近,就说明图像越相似。

哈希算法具有以下特点:

* 相同的输入一定得到相同的输出;

* 不同的输入大概率得到不同的输出;

注意: 哪怕两张输入图像之间,只有一个字节之差,输出的哈希值也可能天差地别。

ImageHash Python 库中,常用的哈希算法包括 aHash、pHash、dHash 及 wHash。

 Average Hash (aHash):均值哈希算法,将图像切割成 8x8 的灰度图像,并依据像素值是否大于图像所有颜色的平均值,来设置哈希值中的 64 位。

aHash 计算速度快,不受图像尺寸大小影响,但对均值敏感,例如对图像进行伽马校正或直方图均衡会影响均值,从而导致报率,准确度无法保证。

aHash 图像处理效果展示

 Perceptual Hash (pHash):感知哈希算法,与 aHash 类似,区别是 pHash 不依赖 average color,而是依赖离散余弦变换 (DCT),并依据频率 (frequency) 而非颜色值 (color value) 进行比较。

pHash 能避免伽马校正或颜色直方图被调整带来的影响,它准确率高、误报少,但计算速度比较慢。

pHash 图像处理效果展示

 Difference Hash (dHash):差异值哈希算法与 aHash 原理类似,只是不使用平均颜色值的信息,而是使用梯度(相邻像素的差异)。

dHash 算法运行速度与 aHash 相当,但误报率非常低。

dHash 图像处理效果展示

 Wavelet Hash (wHash):小波哈希算法,与 pHash 非常相似,但是 wHash 使用的是离散小波变换 (discrete wavelet transformation),而非 DCT。

wHash 比 pHash 更迅速,更准确,误报更少。

wHash 图像处理效果展示

不同哈希算法效果对比详见:TESTING DIFFERENT IMAGE HASH FUNCTIONS

善用轮子:用现成模块进行相似图像检测

作为一名合格的工程师,避免重复造轮子、提高开发效率,是小王一贯的追求。

经过搜索查找,小王发现了 Jina Hub 的 ImageHasher Executor。

查阅相关文档后小王发现,Executor 对应神经搜索系统中的不同模块,实现数据处理的核心功能,可以直接使用。

Flow 则对应整套神经搜索系统,它将多个 Executor 连接起来,构建成一套完整的搜索系统,轻松实现相似图像检测。

直接上代码:

!gdown --id 1wPg_Yx2ydcgsDA3BYO-Lw8ym5vjT0oQ3
!unzip data.zip -d images
! mkdir index
! mv images/*1.* index/
! mkdir query
!mv images/*.* query/
!pip install jina imagehash

创建一个索引 Document 的 Flow:

from jina import Flow
from docarray import Document, DocumentArray
import matplotlib.pyplot as plt
!rm -rf workspace

包含图像的 Document 将被编码成哈希值,接下来可以使用上述 4 种哈希算法中的任何一种,并用 SimpleIndexer 进行存储:

# Creating a DocumentArray object
docs_index = DocumentArray.from_files('index/*')
docs_index = [doc.load_uri_to_image_tensor() for doc in docs_index]# Creating the indexing flow with ImageHasher and SimpleIndexer
flow = (Flow().add(uses='jinahub://ImageHasher/v0.2', uses_metas={'hash_type': 'dhash'}).add(uses='jinahub://SimpleIndexer',uses_metas={'workspace': 'workspace'},uses_with={'match_args': {'limit': 1, 'metric': 'euclidean', 'use_scipy': True}},)
)# Indexing the Documents using the flow
with flow:flow.post(on='/index', inputs=docs_index)
def print_matches(resp):for idx, doc in enumerate(resp.docs):print('-'*50)print(f'Query {idx + 1}')plt.imshow(doc.tensor)plt.show()for match in doc.matches:print('Matching query -->')plt.imshow(match.tensor)plt.show()

查询任何一个新的 Document,并在索引数据中找到匹配的 Document:

docs_query = DocumentArray.from_files('query/*')
docs_query = [doc.load_uri_to_image_tensor() for doc in docs_query]# Using the same flow to find matches
# Opening the flow for incoming queries
with flow:flow.post(on='/search',inputs=docs_query,on_done=print_matches,)

整个过程跑下来,一起来看看小王的相似图像检测结果吧!

即使图像只是像素、滤镜或尺寸不同,也可以利用哈希算法检测出来

炼丹师小王利用 Jina Hub ImageHasher Executor,终于解决了数据集中的相似图像问题,并将代码都放到了 Colab 上。

参与更多深度学习、哈希算法相关讨论,找到组织戳→Slack。

热心小王期待大家的加入!


参考文献:

Imagehashing--Find duplicates 完整 Colab

ImageHasher Executor

廖雪峰的官方网站--哈希算法

相似图像检测方法

Testing different image hash functions

An image hashing library written in Python

救救小王吧:如何快速解决图像相似性检测问题?相关推荐

  1. 计算机数据恢复教程视频,视频删了怎么恢复?小技巧帮你快速解决

    视频删了怎么恢复?小技巧帮你快速解决 2019年07月03日 17:20作者:黄页编辑:黄页 分享 视频删了怎么恢复?如何能够将电脑上误删除的一些重要视频文件给恢复呢?相信很多人都想要知道这个答案,毕 ...

  2. 解决图像目标检测两框重叠问题

    文章目录 1 问题现象 2 解决办法 3 Non-Maximum Suppression 原理 3.1 什么是非极大值抑制 3.2 为什么要用非极大值抑制 3.3 如何使用非极大值抑制 3.4 效果 ...

  3. 我的世界Java版黑屏加闪退_我的世界中国版手游快速解决闪退黑屏方法 为什么会闪退黑屏...

    玩游戏玩的最紧张刺激的时候,突然屏幕一黑,推出游戏了,这个感觉你气不气,有木有!我的世界中国版手游将端游的经典玩法完美的传承下来,制作精良的游戏画质,足以媲美端游,但是也就是因为制作优良,所以会导致个 ...

  4. 设备台式计算机显示叹号,台式电脑显示感叹号怎么办,快速解决win7网络图标黄色问题...

    随着电脑的普遍,电脑网络问题也是越来越多,最近常有朋友反映win7网络图标黄色问题,win7网络图标黄色是一个非常常见的问题,几乎隔三差五就会有win7网络图标黄色的情况发生,所以今天小编教大家快速解 ...

  5. 移动硬盘如何分区?教您快速解决!

    案例:怎么对移动硬盘进行分区? [我平常找一个文件需要耗费很长时间,十分麻烦.我现在想通过对移动硬盘进行分区的方式,整理好我的文件,方便使用时查找.有没有人知道移动硬盘怎么分区?教教我!] 移动硬盘作 ...

  6. kernel-power错误导致计算机系统崩溃,自动重启,教你快速解决win10系统出现无规律蓝屏重启Kernel-Power41错误问题...

    电脑在使用过程中,避免不了会遇到一些问题,比如常见的蓝屏故障,近日有用户升级win10系统后,在使用过程中经常会程序爱你无规律蓝屏重启,并提示Kernel-Power41错误,经过分析可能是硬件引起, ...

  7. 快速识别图像的人工智能图像识别小程序分享

    一.产品概况 1. 介绍与需求 1.1 产品简介 识相 Insight 是一款免费的 快速识别图像,获取相关知识,提升生活信息认知 的小程序.产品通过利用人工智能的图像识别技术,对图像进行快速识别分析 ...

  8. 计算机快速格式化u盘启动,小编教你如何解决u盘打不开提示格式化

    在使用U盘的过程中,我们常会遇到u盘打不开提示格式化的情况,明明之前使用良好的U盘,如今插到电脑上却显示"无法打开,需要进行格式化"操作.对此,小编教你如何解决u盘打不开提示格式化 ...

  9. 图形图像处理-之-高质量的快速的图像缩放 中篇 二次线性插值和三次卷积插值

    from:http://blog.csdn.net/housisong/article/details/1452249 图形图像处理-之-高质量的快速的图像缩放 中篇 二次线性插值和三次卷积插值    ...

最新文章

  1. 关于iOS7以后版本号企业公布问题
  2. 【数字信号处理】傅里叶变换性质 ( 傅里叶变换频移性质 | 证明过程 )
  3. Ehcache中核心类和方法
  4. tomcat8源码分析-Connector初始化
  5. IOS的pch文件,NSTimer定时器,运行消息循环,随机色使用
  6. 协方差公式性质证明过程_论文推荐 | 刘志平:等价条件平差模型的方差-协方差分量最小二乘估计方法...
  7. 人工智能、区块链、算法...这30个大数据热词你知道吗?
  8. 判断一个数字是整数还是小数
  9. 双线性映射:零知识证明的引擎
  10. C语言:提取字符串中的数字
  11. node.js文件加密
  12. win7看视频卡顿或声音画面不同步的解决步骤
  13. 我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下: 1、 长度13位; 2、 以86的国家码打头; 3、 手机号码的每一位都是数字。
  14. 可以通过培训“速成速转”
  15. 如何免费下载IEEE论文
  16. python+opencv读取视频并设置可调整窗口大小
  17. easyUI 分页中引入了lang-zh_CN.js却仍然显示英文,不显示中文
  18. SpringBoot中配置拦截器时,跨域失效
  19. Java复习攻略03
  20. Docker 运行percona tokudb 引擎

热门文章

  1. C++ 函数的递归调用
  2. 2020支付行业七大预测:聚合支付牌照有望正式落地
  3. 8051单片机Proteus仿真与开发实例-OLED显示屏(SSD1306控制器)I2C驱动显示中文及图片仿真
  4. JAVA关于Calendar类的使用
  5. python常见函数sort()对列表元素进行排序
  6. 《C语言程序教程》课后编程题
  7. 2007年9月19日
  8. 关于GIT怎么将本地仓库和远程仓库进行关联
  9. guava之限流RateLimiter
  10. 程序、任务、进程和线程的联系与区别