一文带你轻松入门图像检索

洞夭 = 0&1 make the world

 


 

作:巴斯光年

 

 


 

Hello,大家好我是巴斯光年,好久不见,前段时间忙着做MIND比赛,所以好久没有写文章了(最后一天掉出奖金区,泪了),今天给大家带一篇图像领域相关的入门系文章,适合有一定算法基础但不太了解CV领域的童鞋食用。话不多说让我们进入今天的主题。

前言     

        最近因为工作的需要,接触了一些图像检索相关的工作,对图像检索领域有了一些基本的认知,本文旨在通过一些具体的实例分享一些基础的图像检索的算法与理解,帮助非图像领域的小伙伴轻松掌握最基本、实用的图像检索的方法。接下来我会从图片去重、图片相似、语义相似这几个基础的检索场景出发对几个常用算法进行介绍。

 

场景简介

       为防止未接触过相关场景的您一脸懵逼,先简单介绍下这几个不同任务。

       假如从网上爬取了很多🍏的图片。由于是从网上爬虫获得的图片,他们必然存在大量重复。对现有的图片你需要做一个简单的图搜图的场景,为了用户体验,首先你需要对图片首先进行去重处理,不然如果出现的都是一摸一样的图片,体验也太差了!

 

       做完去重工作我们得到了独一无二的五张🍏图片,由于图4和图5是画面结构非常相近的两张图片,这就是图片相似。但是从理解的角度出发我们知道这五张图虽然长的不太一样,但其本质都是🍏,我们期望他们之间不应该因为画面的不同而出现较大的差异,所以这就又有了语义近似的需求,我们期望一种方法可以表达两张看似不同或看似相同的图片在语义层面的异同。

算法解析

  • 哈希算法

       图片哈希算法是一种非常经典、有效、并易于实现的一种图像处理方案,在图片去重、相似等相关的任务场景都可以使用,并且能在项目初期达到一个看起来还不错的效果!典型的哈希方案有Md5 hash、ahash、dhash、phash、大津法等。这里几种还是略有不同的,如MD5一般用于去除掉完全重复的图片(像素级的变化都会影响结果),而另外几个方案则用于去除外形大致相同的图片,大家需要根据场景需求确定哈希方案。

 这里简单介绍下dhash算法(优点又快又准易于实现适合上线):

       1.缩放转换,将图片缩放至17X16(缩放程度越高,整体细节越少,为了让大家看的更清楚,示例缩放至了65X64)

 

      2.灰度变换,RGB三通道映射到灰度单通道L = R * 299/1000 + G * 587/1000+ B * 114/1000 (降维,提速)

   

       3. 按行差分编码,从上到下逐行做差,大于0取1,小于等0取0,至此我们就可以得到关于一张图片16X16的256位Hash 指纹。

 

       4. 对不同图片的指纹进行汉明距离计算(异或操作),即可获得图片相似度。(通过掐定不同的阈值,可以有效控制图片相似程度,如阈值取26,即可控制大致图片90%的相似度,26/256≈90%)

       篇幅有限,对源码感兴趣的童鞋欢迎回复"图像检索"获取python源码,对其他方案感兴趣的童鞋也欢迎加我个人微信:BuzzLightYeary 交流讨论!      

 

  • 直方图算法

      直方图算法也是一种行之有效的相似判断的方法,通过统计图片不同颜色的分布得到编码(如下图所示,横坐标代表颜色,纵坐标代码该颜色出现的次数),然后计算两张不同图片余弦相似度或是皮尔逊系数即可。

       值得注意的是,相较哈希法,直方图算法有着本质上的区别,哈希法本质是对图片外形轮廓的编码抽象对色彩是弱感知的,而直方图算法则恰好相反它的编码方式是对色彩分布的编码抽象对图片的外形轮廓是弱感知的(如对于风格迁移的数据集,直方图算法会失效)!   

      

   

  • SIFT算法

      SIFT(Scale Invariant Feature Transform,尺度不变特征变换算法),正如其名该算法能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。

算法流程主要有以下三步

1.创建尺度空间,通过对灰度变换的图片进行高斯滤波处理,过滤不重要的“噪音”像素,在对于原图进行不同的尺寸变换的同时,同时对于这些不同尺寸的图片进行多阶的高斯滤波,这样我们可以得到一个"高斯金字塔",如图所示(注意第一行至第四行的Size逐行减半,第一列至第五列分别对于原图,一阶高斯滤波....五阶高斯滤波,这里的五阶就是指对原图连续做5次高斯滤波):

2.图片关键点提取

        通过高斯差分法(DOG, Difference of Gaussian,即对两幅高斯图像做差,如下图所示,一阶高斯滤波的图像直接原图与做差,k阶高斯滤波图与k-1阶高斯滤波图做差)对图像局部空间进行极值检测。

       关键点极值检测,对于任意一个像素我们最多可以检测它周围(8个度)以及上下两张图对应位置的9个像素(如上图第二、三张)的26个像素进行对比,为极大/极小值时则选为关键点。

       对于这些筛选出来的极值点,我们可以轻松算出该极值点的方向与强度,假设要找到红色像素值的大小和方向。为此,通过提取55和46与56和42之间的差值来计算x和y方向上的梯度。得出的分别是Gx = 9和Gy = 14。一旦有了梯度,就可以算对应极点出幅度和方向:

                                                                         Magnitude = √[(Gx)2+(Gy)2] = 16.64

                                                                         Φ = atan(Gy / Gx) = atan(1.55) = 57.17

至此,我们已经找到了图片中的所有关键极点,并得到了这些极点这些大小和方向值(注意这里对角度的大小进行分桶,每45°的分为一个桶)。

3.利用关键点对图片编码

       在这一步中,我们只需将图片划分成4*4的区域,对每个区域里所有极点的8个方向的强度求和,这样我们即可以得到一张图片的128维向量表达(4*4*8),最后直接通过对比欧式距离即可完成相似匹配。

 

 

       目前SIFT由于专利到期,又可以在cv主库中使用,五行代码左右即可轻松搭建SIFT算法,后台回复"图像检索"获取源码。

 

  • 基于深度学习的图片向量表达

      上述的方案,都是图片检索领域非常经典并具有代表性的算法,但是回到开篇提到的🍏检索问题,他们却不能很好解决语义相似的问题。通过深度学习的方案,我们能真正意义的从语义层级来进行图像检索。其原理也非常简单,通过搭建一个有监督的深度神经网络(目前主要还是Finetune一个Pretrained Model)通过卷积核来提取挖掘图片不同维度的特征(比如对于苹果,苹果的皮质纹理、苹果蒂、整体轮廓都是很强的特征),这样的方案能够真正的让我们的模型/向量表达真正的发现🍏的特点。深度学习方案获取图片的向量表达的方法也非常的简单明了,直接将模型倒数第二个隐层(或最后一个卷积层)的结果返回即可直接使用。后台回复"图像检索"获取源码。

 

 

总结与思考

 

      首先,作为一名算法工程师,学习图像领域的技术知识是非常有价值的,很多图片处理的手段都具有很强的通用性,尤其对于涉及多模态相关场景工作时,这方面的技能帮助我们跨越技术的鸿沟找到更多不同的解决方案。

       一点个人的思考,虽然目前CV(计算机视觉)模型越做越大,效果越做越好,但与NLP(自然语言处理)领域相比在语义理解层面上似乎有着较大的差距,基于卷积核的神经网络能把图片的特征做的很好,但是其实本质上还是关于图片表层信息的提取,但它似乎并没有真正的理解物品之间的联系(如能准确的识别🍎与🍌的模型,并不能表达出它们的联系)。当然这只是我的一些个人理解,如果有偏颇还望各位看官指出。

      这是我第一篇CV相关的文章,因为不是本领域的原因,所以开始写本文的时候参考了很多博客文章资料,这里非常感谢那些无私奉献的同行前辈。文章内容如有不对的地方也欢迎各位给出宝贵意见。

 

不能错过!超强大的SIFT图像匹配技术详细指南(附Python代码)

SIFT算法原理

        最后,如果您觉得本文对您有点任何帮助,麻烦点亮“在看”,同时如果您对文章内容有任何疑问或建议也欢迎您添加我的个人微信(BuzzLightYeary)。未经本人允许请勿转载,谢谢。

 

 


 

 

0&1 make the world

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值