1. 引言
随着计算机视觉领域的发展,图像识别已经被广泛应用在各个领域,比如在疫情期间各个住宅、办公场所出入口位置广泛使用的人脸识别系统等等。
那么,如何快速入门图像识别领域,怎么快速搭建一套自己的图像识别引擎呢?
lfaidata 提供了一套非常简单易用的开源框架,实现了图像识别引擎的快速搭建,本文我们就基于这套框架来搭建一套图像识别平台的 demo。
2. 图像识别的基本流程
简单的来说,图像识别就是一个这样的过程:
- 构建被搜索的图像数据库:
- 输入一系列图像用来作为被搜索的基础数据;
- 对这些图像分别进行特征向量抽取,将图像转化为可处理的矩阵向量;
- 存储上述计算后的矩阵向量。
- 执行图像识别与搜索:
- 输入用于查询的图像数据;
- 对输入的图像进行特征向量抽取,将图像转化为矩阵向量;
- 通过某个匹配算法,将这个输入的矩阵向量与图像数据库中已有的矩阵向量进行匹配;
- 输出匹配结果。
3. 所需的组件
3.1 如何抽取特征向量
图像的特征提取就是从原始像素点中提取更高级的特征,从而用来代表和区分不同的图像。
目前来说,卷积神经网络算法在特征提取上的表现是最佳的,比如流行的 AlexNet、VGG、Inception 和 ResNet 算法等等。相比传统的算法,卷积神经网络可以识别出图像中的关键区域进行提取,从而让效果更好。
下面的 demo 中,我们就使用 ResNet50 来实现图像特征向量的提取,它表示有 50 层深度的 ResNet 神经网络算法。
3.2 如何构建向量查询数据库
经过特征提取,实现了从图像到向量的转化,我们的图像检索的核心就进入到了向量数据库的构建环节,只要有了向量数据库,就可以实现向量的存储和搜索功能了。
lfaidata 就提供了这样一个开源的向量查询数据库 – milvus。它是一个基于 K 近邻算法实现的向量查询库。K 近邻算法虽然具有实现简单、结果准确性高等方面的优点,但 K 近邻算法最为人诟病的就是它的性能相对较差。为了优化这一点,milvus 对原始向量构建了索引,来优化性能,实际使用来看,性能相对还是不错的。
milvus 提供了一整套 grpc 封装的接口,我们可以十分方便地用各种语言来进行调用。
4. 运行官方 demo
4.1 demo 简介
如图所示,官方使用 ResNet50 提取特征向量,结合 milvus 向量查询数据库提供了一个基于 python uvicorn web 框架的可视化 demo。
有了这个 demo,我们不仅可以快速实现一个可视化的图片搜索引擎的搭建,通过阅读 demo 的代码,我们也可以学习特征提取、图像搜索等的代码实现。
4.2 demo server
官方 demo 通过 python 编写了一个 http 协议的 web server,封装了图片的上传、特征抽取、查询以及图像数量查询、图像的硬盘 path 查询、清空等操作。
4.3 docker 启动 demo server
官方已经打好了这个 demo server 的 docker 镜像,只需要拉取并且启动即可。
首先拉取 demo 工程:
$ git clone https://github.com/milvus-io/bootcamp.git
在 solutions/reverse_image_search/quick_deploy 目录下,有 docker-compose.yaml 文件,执行下面的命令启动即可:
$ docker-compose up -d
你可以看到:
Creating network “quick_deploy_app_net” with driver “bridge” Creating milvus-etcd … done Creating milvus-minio … done Creating img-search-mysql … done Creating img-search-webclient … done Creating milvus-standalone … done Creating img-search-webserver … done
通过 docker ps 命令,可以看到启动了以下几个 docker:
- milvusdb/milvus – milvus 核心服务
- minio/minio – milvus 的输入输出服务
- quay.io/coreos/etcd – milvus 配置服务
- milvusbootcamp/img-search-server – demo 的查询 server
- milvusbootcamp/img-search-client – demo 的查询 client
- mysql
4.4 源码启动 demo server
当然,我们也可以通过源码来启动这个 demo 的 server 程序。
4.4.1 环境搭建
最基础的环境,我们需要 python3 和 docker 运行环境,这里就不赘述了。
除此以外,我们需要拉取 demo 源码:
$ git clone https://github.com/milvus-io/bootcamp.git
进入 solutions/reverse_image_search/quick_deploy/server 目录,执行下面的命令安装必须的 python 依赖:
$ pip install -r requirements.txt
4.4.2 启动 milvus 服务
首先,我们先启动上述的三个 milvus 的 docker:
$ wget https://github.com/milvus-io/milvus/releases/download/v2.0.1/milvus-standalone-docker-compose.yml -O docker-compose.yml $ sudo docker-compose up -d
这样就会启动下面三个 docker:
- milvus-etcd
- milvus-minio
- milvus-standalone
4.4.3 启动 mysql
由于 milvus 对于每个向量的 id 都只支持数值类型,所以我们需要一个从数值型的向量 id 到图片在硬盘上的 path 之间的映射存储,这个 demo 将这个映射关系存储在了 mysql 中,所以我们需要启动一个 mysql 镜像,当然了,如果你本地就有 mysql 的 server 的话,直接启动就可以,如果没有的话,可以通过 docker 启动:
$ docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d --name qa_mysql mysql:5.7
4.4.4 配置和启动 demo
在 solutions/reverse_image_search/quick_deploy/server/src 目录下,有一个 config.py 文件,你可以通过它配置以下信息:
参数 | 说明 | 默认值 |
---|---|---|
MILVUS_HOST | milvus 服务 ip 地址 | 127.0.0.1 |
MILVUS_PORT | milvus 服务端口 | 19530 |
VECTOR_DIMENSION | 向量维度数 | 1000 |
MYSQL_HOST | mysql ip | 127.0.0.1 |
MYSQL_PORT | mysql 端口 | 3306 |
DEFAULT_TABLE | mysql 表名 | milvus_img_search |
而 server 启动的 ip 和端口则在 src/main.py 中,可以编辑修改。
一切配置妥当以后,执行下面命令启动即可运行:
$ python src/main.py
运行起来以后,通过浏览器访问 http://127.0.0.1:5000/docs 即可访问接口的说明页面。
4. 5 启动 demo client
demo 的 client 通过调用上述 server 的 http 接口并且渲染可视化 GUI 界面,提供了简单方便的操作界面。
官方已经打好 docker,直接执行下面的命令启动即可:
$ docker run -d -p 8001:80 -e "API_URL=http://${API_HOST}:${API_PORT}" milvusbootcamp/img-search-client:1.0
5. 运行结果
通过浏览器访问 http://127.0.0.1:8001 就可以打开如下页面:
在输入框中输入硬盘上的图库文件夹路劲,点击 号,server 端就开始了图片的特征向量提取与存储等操作,可以通过 server 端日志来查看进度。
等待一段时间,server 端完成你所需的图库录入工作后,你就可以上传图片进行搜索了:
在搜索结果中,每幅图还附带有偏离度数字,数字越小表示与原图越接近。
附录 – 参考资料
https://github.com/milvus-io/bootcamp/tree/master/solutions/reverse_image_search/quick_deploy