共计 3055 个字符,预计需要花费 8 分钟才能阅读完成。
相似性图像检测,是模型训练过程中常呈现的问题,本文介绍了 4 个罕用的哈希算法,并通过 Colab 代码,展现了残缺的训练过程。
新晋炼丹师小王最近遇到了一个难题,愁的头发掉了好几根儿。
一问才晓得,原来是他徒弟给他调配了一个深度学习模型训练的工作,然而训练模型的图像数据集,稍微有那么一丝丝简单:
里边除了已有的公开数据集外,还蕴含一些从 Google、Bing 等网站上爬取的图像。
反复图像的存在,使得模型性能变得非常不牢靠,毕竟:
- 反复图像将 bias 引入数据集,使得深度学习模型不得不学习反复图像的特定模式;
- 特定的学习模式,会使得深度学习模型概括新图像的能力降落。
手动删除反复图像,相对不是最优解,起因是数据集中的图像数量动辄成千盈百万,手动检查和删除会是一个非(丧)常(心)繁(病)琐(狂)的过程,将会消耗大量工夫。
哈希算法成为小王最先想到的解决方案。
图像相似性检索,「哈希」一下
哈希算法是解决图像相似性检索的「魔法工具」,它能够对任意一组输出数据进行计算,失去一个固定长度的输入摘要(字符串)。
比拟输入摘要,后果越靠近,就阐明图像越类似。
哈希算法具备以下特点:
- 雷同的输出肯定失去雷同的输入;
- 不同的输出大概率失去不同的输入;
留神: 哪怕两张输出图像之间,只有一个字节之差,输入的哈希值也可能天差地别。
ImageHash Python 库中, 罕用的哈希算法包含 aHash、pHash、dHash 及 wHash。
Average Hash (aHash): 均值哈希算法,将图像切割成 8×8 的灰度图像,并根据像素值是否大于图像所有色彩的平均值,来设置哈希值中的 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 上,参加更多深度学习、哈希算法相干探讨→找到组织。
热心小王期待大家的退出!
参考文献:
Imagehashing–Find duplicates 残缺 Colab
ImageHasher Executor
廖雪峰的官方网站 – 哈希算法
类似图像检测办法
Testing different image hash functions
An image hashing library written in Python