点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文转自:AI 算法与图像处理
概述
以图搜图技术是日常生活中常用的功能,当你看到某张图片某件衣服甚至是某个明星,可能都无须舔着脸问你身边的小伙伴了,因为目前的搜图技术能基本满足你的日常需求。那么这么有趣又实用的技术,到底如何去实现它呢?
预期目标
之前分享的相对比较麻烦,需要多个操作步骤,最终的显示效果也并不是非常美观。因此今天,我们膨胀了,希望一步到位并让结果更加漂亮哦~
定个小目标:
希望输出下面的结果,最上面一行是query图片(需要查询图片),下面一行输出五个与查询图片最接近的结果。
实施方案
给定一组查询图片和数据库图片。我们对数据库图片执行以图搜图操作,在image embeddings(将图片数据转换为固定大小的特征表示——矢量)上以余弦相似度作为距离度量使用kNN获取前k个最相似的数据库中的图片。
在接下来的例子中,我们提供了36个食物数据库中的图片(每种食物有6张图:牛排、土豆、炸薯条、沙拉、汉堡、芦笋),通过查询3张并未在数据库中出现的测试图片执行图片搜索功能。
链接中的代码已提供爬Google图片的代码以及对图片进行预处理的相关操作
将采用以下两种方法执行以图搜图功能:
1)Transfer learning
2)Training Autoencoders、
Trainsfer learning
通过使用例如预训练模型VGG19生成 image embeddings(可以理解为图片的特征向量) 。这是通过移除VGG199模型最后的基层,并对我们的图片进行维度变换,压缩成一维向量。整个过程无需训练,只需利用预训练模型的权重即可。
下图为整个过程的原理图:
Training Autoencoders
我们在数据库图片上同时训练simple autoencoder 和 convolutional autoencoder ,并使的reconstruction loss 最小。经过充分训练后,我们提取autoencoder的编码器部分,并在推理过程中使用它生成 flattened embeddings。
看了下面这张图也许,能明白一些东西
可视化结果
Transfer Learning
Convolutional Autoencoder
Simple Autoencoder
使用方法
项目结构:再次放一下链接:https://github.com/ankonzoid/artificio/tree/master/image_retrieval
运行程序 image_retrieval.py即可实现我们的上图效果,最终的结果会保存到 新建的output文件中。
我们通过对 image_retrieval.py 中的modelName进行调整,以选择你需要的方法:
这里提供了三种可选模型
modelName = "convAE" # try: "simpleAE", "convAE", "vgg19"
三种模型的含义:
"simpleAE"
= simple fully-connected autoencoder"convAE"
= multi-layer convolutional autoencoder"vgg19"
= pre-trained VGG19 for transfer learning
原文代码中注释的非常清晰了这里就过多解释了
最后注意一下需要的库:
tensorflow, skimage, sklearn, multiprocessing, numpy, matplotlib
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~