乐趣区

关于神经网络:救救小王吧如何快速搞定图像相似性检测问题

相似性图像检测,是模型训练过程中常呈现的问题,本文介绍了 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

退出移动版