当前位置: 首页 > 后端技术 > Node.js

又拍图片管家亿级图像之搜图系统的两代演进及底层原理

时间:2023-04-04 00:31:36 Node.js

亿图图片管家图片搜索系统二代演进及底层原理User管理百亿图片底层原理。当用户的图库越来越大时,业务迫切需要一种能够快速定位图片的解决方案,即直接输入图片,然后根据输入的图片内容在图库中查找原图和相似图片。搜索地图服务就是为了解决这个问题。本人有幸独立负责并实施了图像搜索系统从技术研究、设计验证、最终工程实现的全过程。整个图片搜索服务也经历了两次整体演进:从2019年初开始第一次技术攻关,春节假期后,第一代系统在2019年3月和4月整体上线;2020年初,升级方案研究启动。春节和疫情过后,二代系统将于2020年4月全面升级。本文将简要介绍两代图片搜索系统背后的技术选型和基本原理。基本资料图片是什么?处理图像首先要知道:什么是图像?答案:像素的集合。例如:左图中红圈内的部分,其实是右图中的一系列像素点。再举个例子:假设上图中红色圈出的部分是一幅图像,其中每个独立的小方块是一个像素(简称像素),像素是最基本的信息单位,其大小此图像为11x11像素。图像的数学表示每幅图像都可以很自然地用一个矩阵来表示,每个像素对应矩阵中的一个元素。二值图像二值图像的像素只有黑色和白色,因此每个像素可以用0和1来表示。例如一个4*4的二值图像:0101100011100010RGB图像红(Red)、绿(Green)、蓝(Blue)为三原色,可以调和成任意颜色,对于RGB图像,每个像素包含RGB三个通道的基本信息,同理,如果每个通道用8位表示,即256个灰度级,那么一个像素可以表示为:([0...255],[0...255],[0...255])例如4*4RGB图像:(156,22,45)(255,0,0)(0,156,32)(14,2,90)(12,251,88)(78,12,3)(94,90,87)(134,0,2)(240,33,44)(5,66,77)(1,28,167)(11,11,11)(0,0,0)(4,4,4)(50,50,50)(100,10,10)图像处理的本质其实就是计算这些像素矩阵。如果图片搜索的技术问题是找到原图,即像素点完全相同的图片,那么直接比较它们的MD5值。但是图片在网络上的传输过程中,经常会遇到压缩、加水印等情况,而MD5算法的特点就是即使一小部分内容发生变化,最终的结果也大相径庭,也就是说,只要图片中有一个像素点不一致,最终就无法比对。对于图片搜索系统来说,我们要搜索的本质上是内容相似的图片。为此,我们需要解决两个基本问题:将图像表示或抽象成计算机数据。对比计算方面,直接专业:图像特征提取特征计算(相似度计算)第一代图像搜索系统的特征提取-图像抽象第一代图像搜索系统使用Perceptualhash或pHash进行特征提取算法,什么这个算法的基本原理是什么?如上图所示,pHash算法是对整幅图像进行一系列的变换,最终构造出哈希值,变换过程可以理解为对图像的不断抽象。这时候,如果对另外一张内容相似的图片进行同样的整体抽象,那么结果一定非常接近。特征计算-相似度计算对于两张图片的pHash值,如何计算它们的相似度?答案是汉明距离,汉明距离越小,图像内容越相似。什么是汉明距离?是位置对应的不同位的个数。例如:第一个值:01010第二个值:00011上面两个值对应的位置有2位不一样,所以他们的汉明距离为2。OK,我们知道了相似度计算的原理,那么接下来的问题是:如何计算亿级图片对应的亿级数据的汉明距离?简而言之,如何搜索?在项目初期,我其实并没有找到一个比较满意的可以快速计算汉明距离的工具(或者计算引擎),所以我对我的计划进行了修改。灵活的思路是:如果两个pHash值的汉明距离很近,那么对pHash值进行裁剪后,裁剪后的每一小部分大概率是相等的。例如:第一个值:8a0303f6第二个值:8a0303d8我们将以上两个值分成8块,6块的值正好是相同,所以可以推断他们的汉明距离很近,所以图像内容也很相似。变换之后,其实可以发现海明距离的计算变成了一个等价匹配的问题。我把每个pHash值分成了8段,只要??有5段以上的值是完全一样的,那么我就认为它们是相似的。如何解决等价匹配?这个很简单,用传统数据库的条件过滤器就可以了。当然,我这里使用的是ElasticSearch(ES的原理本文不做介绍,读者可以单独了解),ES中的具体操作是匹配多个term,然后minimum_should_match指定匹配度。为什么选择ElasticSearch进行搜索?第一点是可以实现上述的搜索功能;第二点是ImageManager项目本身就是使用ES来提供全文搜索功能,利用现有资源的成本非常低。第一代系统总结第一代图片搜索系统在技术上选择了pHash+ElasticSearch的方案,具有以下特点:pHash算法计算简单,能抵抗一定程度的压缩、水印、噪声等影响。ElasticSearch直接使用项目已有的资源,不增加额外的搜索成本。当然,这个系统的局限性也很明显:由于pHash算法是对图像整体的抽象表示,一旦我们破坏了完整性,比如在原图上加了黑边,就几乎不可能恢复了。判断相似度。为了突破这一局限,底层技术完全不同的第二代地图搜索系统应运而生。第二代图像搜索系统的特征提取在计算机视觉领域,人工智能相关技术的使用基本成为主流。同样,我们第二代图像搜索系统的特征提取使用CNN卷积神经网络作为底层技术。.CNN卷积神经网络这个术语很难理解。重点是回答两个问题:CNN能做什么?为什么CNN可以用于图像搜索?AI领域有很多比赛,图像分类是重要的比赛内容之一,而图像分类就是判断图片的内容是猫,狗,苹果,梨,还是其他对象类别。CNN能做什么?提取特征,再识别物体,这个过程我简单理解为从多个不同的维度提取特征,衡量一张图片的内容或特征与猫的特征有多接近,与狗的特征有多接近。等等,等等,选择最接近的作为我们的识别结果,也就是判断这张图片的内容是猫,狗,还是别的什么。CNN与查找相似图像有什么关系?我们要的不是最终的识别结果,而是从多个维度提取的特征向量。具有相似内容的两幅图像的特征向量必须接近。具体使用哪个CNN模型?我正在使用VGG16,为什么选择它?首先,VGG16具有很好的泛化能力,即非常通用;其次,VGG16提取的特征向量为512维,维数适中。如果尺寸太少,可能会影响精度。如果维度太多,存储和计算这些特征向量的成本会比较高。向量搜索引擎从图像中提取特征向量的问题已经解决了,那么剩下的问题就是:如何存储特征向量?特征向量如何计算相似度,即它们如何搜索?对于这两个问题,直接使用开源向量搜索引擎Milvus就可以很好的解决。到目前为止,Milvus在我们的生产环境中运行良好。二代系统总结二代图片搜索系统在技术上选择了CNN+Milvus的方案,这种基于特征向量的搜索在业务上也提供了更好的支持。相关文章之前写过两篇相关文章:SystemOverviewofImageSearchSystem图片搜索系统工程实践