opencv图像配准_Milvus 实战 | 基于 Milvus 的图像查重系统
背景介绍
由于巨大的利益,论文造假屡见不鲜,在部分国家或地区甚至形成了论文造假的产业链。目前大部分论文查重系统只能检查论文文字,不能检查图片。因此,论文图片查重已然成为了学术论文原创性检测的重要部分。
本项目主要针对论文图像进行查重。算法是整个查重系统中的核心。本项目基于深度学习的方法,通过 ResNet 模型推理得到图像的特征向量,并利用 Milvus 构建图像特征向量库。同时,Milvus 会自动为向量构建索引。进行查重任务时,需要先将图像转化为特征向量,接着再使用 Milvus 进行向量检索,得到疑似图片。将查重图片和疑似图片根据图像配准算法进行对比,最终得到对比结果。
系统概要
本系统由两大模块组成——构建向量库及查找图片生成查重报告。
构建向量库:每个用户都可以创建一个属于自己的向量库。用户可以将自己的图像或论文数据上传到服务端,由服务端解析出图像数据,并通过模型推理得到图像的特征向量,最终将向量导入 Milvus 库中。
查找图片生成查重报告:用户上传图像数据,服务端得到特征向量后会在 Milvus 中进行搜索并返回 top-k 个疑似图像。查重系统对得到的图像进行图像配准,最终生成查重报告。
基本步骤
1. 图像提取
根据用户上传数据的类型,系统将自动判断是通过直接解压得到图片还是从论文 PDF 文档中提取图片。本项目中使用的是 PDF 解析库—— PyMuPDF。PDF 文档作为一种结构化的文件格式,由一些称为“对象”的模块组成。每个对象都有数字标号,从而可以被其他对象引用。解析图像的大致流程为:
- 打开 PDF 文件
- 创建解析对象
- 存储文档结构,并处理文档中每一页图片,
- 提取文档中每一页的图像进行存储。
2. 特征向量提取
卷积神经网络对图像处理有出色的表现,因此本项目采用基于卷积神经网络的 ResNet 模型进行图像特征提取。ResNet 模型结构如下图所示:
特征提取主要依靠网络的卷积层和池化层来完成。卷积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量,类似于一个前馈神经网络的神经元。卷积核在工作时,会有规律地扫过输入特征,在感受野内对输入特征做矩阵元素乘法求和并叠加偏差量,也就是说使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。
在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。池化层选取池化区域的步骤与卷积核扫描特征图的步骤相同,由池化大小、步长和填充控制。为了防止图像数据过大,池化层会对图像进行采样降维,但依然保持图像最基本的特征。
但是,经过全连接层后,此前得到的特征会失去空间拓扑结构,被展开为向量。为保留图像特征,需要去除此模型的全连接层。
3. 向量库构建与检索
Milvus 是一款开源的分布式向量相似度搜索引擎。Milvus 不仅集成了业界成熟的向量相似度搜索技术,而且还对高性能计算框架进行了大幅度优化,支持针对 TB 级向量的增删改操作和近实时查询,具有高度灵活、稳定可靠以及高速查询等特点。Milvus 集成了 Faiss、NMSLIB、Annoy 等广泛应用的向量索引库,提供了一整套简单直观的 API,用户可以针对不同场景选择不同的索引类型。
Milvus 适用于多种场景,与深度学习相融合的架构如下图所示:
本项目使用 docker 启动 GPU 版本的 Milvus 服务。用户上传的图像数据将被转化为特征向量并导入 Milvus 库。Milvus 根据具体参数(如索引类型、向量维数等)对特征向量进行存储并建立索引。具体而言,在用户查重任务中,用户上传查重图像,图像被转化为特征向量。用户在 Milvus 中对向量进行检索,检索时 Milvus 使用余弦距离进行计算并返回 top-k 个结果。值得一提的是,Milvus 支持多种计算向量相似性的方法,包括欧氏距离、余弦距离、Tanimoto 系数等。
4. 图像配准
Milvus 会返回 top-K 个与搜索向量相似的结果。之后,根据这些结果我们会采用 SIFT 算法进行图像配准。SIFT 特征算法配准是基于物体上一些局部外观的兴趣点,而非影像的大小、旋转与否。SIFT 算法对于光线、噪声等微视角改变的容忍度也相当高。SIFT 特征检测包括以下四步:
- 尺度空间极值检测
- 关键点定位
- 方向确定
- 关键点描述
使用 opencv 进行 SIFT 特征提取,提取的 SIFT 特征最终为其关键点描述符,即一个128维的向量。在得到查重图像和疑似图像的 SIFT 关键点描述符后,利用最近邻算法对两张图像进行匹配并获得两张图像的匹配关系。然后再使用 RANSAC 算法进行匹配关系的过滤,得到最终的匹配关系。使用 opencv 的绘图函数,利用匹配关系绘制两张图像的关键点和其特征匹配的连线,得到相似点图像。
结果展示
左上角图像为上传的待查重图像,右下角图像为疑似重用图像。
总结
本项目通过结合深度学习与 Milvus 搭建图像查重系统。Milvus 向量检索引擎,根据用户上传图像的特征向量构建向量库,并通过近实时搜索功能精确而迅速地返还搜索结果。Milvus 提供丰富的文档资料,便于用户上手。此外,Milvus 的用户交流群帮助用户在遇到问题时获得及时的反馈,保证了卓越的用户体验。
参考资料
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
欢迎加入 Milvus 社区
http://github.com/milvus-io/milvus | 源码
http://milvus.io | 官网
http://milvusio.slack.com | Slack 社区
http://zhihu.com/org/zilliz-11| 知乎
http://zilliz.blog.csdn.net | CSDN 博客
http://space.bilibili.com/478166626 | Bilibili
opencv图像配准_Milvus 实战 | 基于 Milvus 的图像查重系统相关推荐
- 基于Python的作业查重系统的设计和实现
<基于Python的作业查重系统的设计和实现>该项目采用技术Python的django框架.mysql数据库,项目含有源码.论文.PPT.配套开发软件.软件安装教程.项目发布教程.核心代码 ...
- Milvus 实战 | 基于 Milvus 的图像查重系统
背景介绍 由于巨大的利益,论文造假屡见不鲜,在部分国家或地区甚至形成了论文造假的产业链.目前大部分论文查重系统只能检查论文文字,不能检查图片.因此,论文图片查重已然成为了学术论文原创性检测的重要部 ...
- 毕业设计基于Springboot框架作业查重系统2.0版本
作业查重系统2.0版本 文章目录 作业查重系统2.0版本 前言 一.摘要 二.相关技术 1.系统框架 2.查重功能简介 3.相似度检测算法简介 4.系统功能架构图 三.系统功能运行图 1.登录 2.学 ...
- 基于Python实现的作业查重系统
<基于Python的作业查重系统的设计和实现>该项目采用技术Python的django框架.mysql数据库 ,项目含有源码.论文.PPT.配套开发软件.软件安装教程.项目发布教程.核心代 ...
- 图像配准系列之基于B样条的FFD自由变换原理与C++实现
基于B样条的FFD变换属于一种网格型的非刚性形变模型,它按照一定的间距在图像上分布一系列的网格点,使用网格点的位置来计算每个像素点的坐标偏移,最后根据坐标偏移对图像进行像素重采样,实现其非刚性形变. ...
- 图像配准系列之基于FFD形变与梯度下降法的图像配准
前面我们讲到梯度下降法时,就有提到:人们经常要求解一个问题的最优解,通常做法是对该问题进行数学建模,转换成一个目标函数,然后通过一定的算法寻求该函数的最小值,最终寻求到最小值时的输入参数就是问题的最优 ...
- 图像配准系列之基于FFD形变与粒子群算法的图像配准
在之前的文章中,我们分别使用了梯度下降发与LM算法来优化FFD形变的控制参数,达到图像配准的目的: 图像配准系列之基于FFD形变与梯度下降法的图像配准 图像配准系列之基于FFD形变与LM算法的图像配准 ...
- 图像的梯度方向matlab,基于梯度方向的图像边缘检测方法与流程
本发明具体涉及一种基于梯度方向的图像边缘检测方法. 背景技术: 边缘检测是图像处理的基本问题,在图像分割.特征提取.视觉导航等领域有广泛的应用.基于微分的边缘检测算法如Sobel算子.Prewitt算 ...
- 基于python的查重系统_答案在这!如何快速的通过论文查重检测?
想必同学们都知道,所谓的论文查重是使用论文查重系统软件来进行论文检测的.大部分的高校基本上是采用知网查重系统,在进行论文查重之前,我们有必要先了解一下论文查重的相关知识点.了解清楚之后,我们再进行论文 ...
最新文章
- disruptor框架为什么不流行_Java并发编程框架Disruptor
- 几个常见的Python面试题分享,帮你顺利求职
- Android TV Overscan
- 136_Power BI 自定义矩阵热力图
- python读取两行字符串_python - 如何为两行之间的行分配值,并在数据帧的列中使用特定字符串? - SO中文参考 - www.soinside.com...
- 【Ian Goodfellow 强推】GAN 进展跟踪 10 大论文(附下载)
- Data Lake Analytics,大数据的ETL神器! 1
- PSPNet: Pyramid Scene Parsing Network论文解读
- 常见的编程语言的特点与应用领域浅谈
- 人脸识别活体检测技术讨论:基于背景人脸相对运动的活体判断方法
- stm32学习(一)STM32简单介绍(初步了解单片机与STM32)
- [转载]教师节献礼-关于大学的一点思考
- 去哪儿网数据同步平台技术演进与实践
- TestFlight上架流程
- Pytest中测试用例参数化时ids中文乱码处理
- 关于NAS搭建的那些事
- prompt learning 提示学习初步心得及示例 代码
- 北大双杰——孔庆东和余杰
- MULLS: Versatile LiDAR SLAM via Multi-metric Linear Least Square 论文翻译
- 如何使用Python第三方库
热门文章
- 链路两段不同网段怎么通信_为什么不同网段不能通信(转)
- 安卓案例:利用相对布局实现注册页面
- 无心剑中译罗素《此生何求?》
- 【codevs2370】小机房的树,RMQ求LCA
- 字体在ppt中可以整体替换吗_如何给ppt整体改字体_教你给ppt整体改字体的方法-系统城...
- C#中结构体排序方法(Array.sort() + ICompare)
- 2017.10.8 球形空间产生器sphere 思考记录
- 【英语学习】【Level 08】U04 What I love L2 My favorite sport
- python 物理学中的应用_大学物理中Python的应用
- linux常用命令和操作笔记