概述
- 当您听到“以图搜图”时,是否首先想到了百度、Google 、阿里等搜索引擎的以图搜图功能呢?事实上,完全可以搭建一个属于自己的以图搜图系统:自己建立图片库;自己选择一张图片到库中进行搜索,并得到与其相似的若干图片。
- 为了让尝试相似图片检索的场景,基于内积距离计算和图片特征提取模型 VGG16 设计了一个以图搜图系统。 正文分为系统概览、 VGG 模型、数据准备、系统部署、总结五个部分。
系统构建
- 开源地址:https://github.com/thirtyonelee/image-retrieval
- 基础环境安装:Python版本:3.6.10
git clone https://github.com/thirtyonelee/image-retrieval.git && cd image-retrieval
pip install -r requirements.txt
- 构建基础索引,默认保存索引至:"<ROOT_DIR>/index/train.h5"
python index.py
- 体验相似检索,默认使用 Numpy 内积计算引擎,默认测试图片:"<ROOT_DIR>/data/test/001_accordion_image_0001.jpg"
python retrieval.py 或 python retrieval.py --engine=numpy --test_data=<ROOT_DIR>/data/test/001_accordion_image_0001.jpg
[{'name': b'001_accordion_image_0002.jpg', 'score': 0.902732}, {'name': b'001_accordion_image_0003.jpg', 'score': 0.872308}, {'name': b'002_anchor_image_0004.jpg', 'score': 0.865453}]
'name' 对应索引库 <ROOT_DIR>/data/train 图片名字
系统架构
- 系统主要由两部分组成,图片特征提取模型VGG和向量检索引擎。 VGG模型负责将图片转换成向量,向量检索引擎负责存储向量并进行相似向量检索。 具体架构如下图所示:
VGG模型
- VGGNet由牛津大学的视觉几何组( Visual Geometry Group )和 Google DeepMind 公司的研究员共同提出,是 ILSVRC-2014 中定位任务第一名和分类任务第二名。其突出贡献在于证明使用很小的卷积( 3*3 ),增加网络深度可以有效提升模型的效果,而且 VGGNet 对其他数据集具有很好的泛化能力。 VGG模型在多个迁移学习任务中的表现要优于 GoogleNet ,从图像中提取 CNN 特征, VGG 模型是首选算法。因此,在本方案中选择 VGG 作为深度学习模型。
- VGGNet 探索了 CNN 的深度及其性能之间的关系,通过反复堆叠 33 的小型卷积核和 22的最大池化层, VGGNet 成功地构筑了 16-19 层深的 CNN 。在本方案中使用了 Keras 的应用模块( keras.applications )提供的 VGG16 模型。
- VGG官方网站:http://www.robots.ox.ac.uk/~vgg/research/very_deep/
- VGG Github:https://github.com/machrisaa/tensorflow-vgg
数据准备
- 这个演示使用 PASCAL VOC 图像集,包含11530张图像,包含20个类别。
- 数据集大小2G,下载地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
注:你可以使用其他图片进行测试,这个系统支持 .jpg 和 .png 图片格式
总结
- 项目支持多种距离计算引擎,如:Numpy、Faiss、ES、Milvus
- 可定制其他距离计算函数,如:欧氏距离 (L2)、汉明距离、杰卡德距离、谷本距离等
附录
参考1:https://github.com/willard-yuan/flask-keras-cnn-image-retrieval
参考2:https://github.com/zilliz-bootcamp/image_search