原文: Milvus 实战 | 基于 Milvus 的图像查重系统-2020.12.08
出处: ZILLIZ - 微信公众号
背景:
由于巨大的利益,论文造假屡见不鲜,在部分国家或地区甚至形成了论文造假的产业链. 目前大部分论文查重系统只能检查论文文字,不能检查图片. 因此,论文图片查重已然成为了学术论文原创性检测的重要部分.
本项目主要针对论文图像进行查重. 算法是整个查重系统中的核心. 本项目基于深度学习的方法,通过 ResNet 模型推理得到图像的特征向量,并利用 Milvus 构建图像特征向量库. 同时,Milvus 会自动为向量构建索引. 进行查重任务时,需要先将图像转化为特征向量,接着再使用 Milvus 进行向量检索,得到疑似图片. 将查重图片和疑似图片根据图像配准算法进行对比,最终得到对比结果.
1. 系统概要
本系统由两大模块组成——构建向量库及查找图片生成查重报告.
构建向量库:每个用户都可以创建一个属于自己的向量库. 用户可以将自己的图像或论文数据上传到服务端,由服务端解析出图像数据,并通过模型推理得到图像的特征向量,最终将向量导入 Milvus 库中.
查找图片生成查重报告:用户上传图像数据,服务端得到特征向量后会在 Milvus 中进行搜索并返回 top-k 个疑似图像. 查重系统对得到的图像进行图像配准,最终生成查重报告.
2. 基本步骤
2.1. 图像提取
根据用户上传数据的类型,系统将自动判断是通过直接解压得到图片还是从论文 PDF 文档中提取图片. 本项目中使用的是 PDF 解析库—— PyMuPDF. PDF 文档作为一种结构化的文件格式,由一些称为“对象”的模块组成. 每个对象都有数字标号,从而可以被其他对象引用. 解析图像的大致流程为:
- 打开 PDF 文件
- 创建解析对象
- 存储文档结构,并处理文档中每一页图片,
- 提取文档中每一页的图像进行存储.
2.2. 特征向量提取
卷积神经网络对图像处理有出色的表现,因此本项目采用基于卷积神经网络的 ResNet 模型进行图像特征提取.
ResNet 模型结构如下图所示:
特征提取主要依靠网络的卷积层和池化层来完成. 卷积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量,类似于一个前馈神经网络的神经元. 卷积核在工作时,会有规律地扫过输入特征,在感受野内对输入特征做矩阵元素乘法求和并叠加偏差量,也就是说使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值.
在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤. 池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量. 池化层选取池化区域的步骤与卷积核扫描特征图的步骤相同,由池化大小、步长和填充控制. 为了防止图像数据过大,池化层会对图像进行采样降维,但依然保持图像最基本的特征.
但是,经过全连接层后,此前得到的特征会失去空间拓扑结构,被展开为向量. 为保留图像特征,需要去除此模型的全连接层.
2.3. 向量库构建与检索
Milvus 是一款开源的分布式向量相似度搜索引擎. Milvus 不仅集成了业界成熟的向量相似度搜索技术,而且还对高性能计算框架进行了大幅度优化,支持针对 TB 级向量的增删改操作和近实时查询,具有高度灵活、稳定可靠以及高速查询等特点. Milvus 集成了 Faiss、NMSLIB、Annoy 等广泛应用的向量索引库,提供了一整套简单直观的 API,用户可以针对不同场景选择不同的索引类型.
Milvus 适用于多种场景,与深度学习相融合的架构如下图所示:
本项目使用 docker 启动 GPU 版本的 Milvus 服务. 用户上传的图像数据将被转化为特征向量并导入 Milvus 库. Milvus 根据具体参数(如索引类型、向量维数等)对特征向量进行存储并建立索引. 具体而言,在用户查重任务中,用户上传查重图像,图像被转化为特征向量. 用户在 Milvus 中对向量进行检索,检索时 Milvus 使用余弦距离进行计算并返回 top-k 个结果. 值得一提的是,Milvus 支持多种计算向量相似性的方法,包括欧氏距离、余弦距离、Tanimoto 系数等.
2.4. 图像配准
Milvus 会返回 top-K 个与搜索向量相似的结果. 之后,根据这些结果我们会采用 SIFT 算法进行图像配准. SIFT 特征算法配准是基于物体上一些局部外观的兴趣点,而非影像的大小、旋转与否. SIFT 算法对于光线、噪声等微视角改变的容忍度也相当高.
SIFT 特征检测包括以下四步:
[1] - 尺度空间极值检测
[2] - 关键点定位
[3] - 方向确定
[4] - 关键点描述
使用 opencv 进行 SIFT 特征提取,提取的 SIFT 特征最终为其关键点描述符,即一个128维的向量. 在得到查重图像和疑似图像的 SIFT 关键点描述符后,利用最近邻算法对两张图像进行匹配并获得两张图像的匹配关系. 然后再使用 RANSAC 算法进行匹配关系的过滤,得到最终的匹配关系. 使用 opencv 的绘图函数,利用匹配关系绘制两张图像的关键点和其特征匹配的连线,得到相似点图像.
3. 结果展示
左上角图像为上传的待查重图像,右下角图像为疑似重用图像.
4. 总结
本项目通过结合深度学习与 Milvus 搭建图像查重系统. Milvus 向量检索引擎,根据用户上传图像的特征向量构建向量库,并通过近实时搜索功能精确而迅速地返还搜索结果. Milvus 提供丰富的文档资料,便于用户上手. 此外,Milvus 的用户交流群帮助用户在遇到问题时获得及时的反馈,保证了卓越的用户体验.
5. 参考资料
https://zhuanlan.zhihu.com/p/90677337
https://github.com/milvus-io/milvus
https://github.com/milvus-io/bootcamp
https://docs.opencv.org/master/db/d27/tutorial_py_table_of_contents_feature2d.html