搭建本地以图搜图服务
一、前言
项目地址:https://github.com/xjhqre/sis
该服务是基于开源项目matsui528/sis搭建,在原项目的基础上做了一些修改。
原项目只能够检索jpg格式的图片。现在支持jpg、png、gif、和png格式的图片搜索。
也可以自己添加需要的图片格式,只需要修改offline.py
文件中的types
数组即可,实际是否支持取决于库函数。
注:
gif图片只会提取第一帧的特征,检索时也只会检索第一帧
二、快速开始
-
首先在电脑上安装好Python环境,版本推荐3.7,其他版本没有试过
-
下载项目到本地,使用git命令或者直接到github下载
-
安装Python包,打开命令行,进入sis目录,确保目录下有requirements.txt文件,执行
pip install -r requirements.txt
命令。若有还是有版本冲突请百度解决 -
将图片库放到项目的static/img目录下
-
运行offline.py文件,在命令行执行命令:
python offline.py
。该命令是提取static/img目录下所有图片的特征,每一个图片生成对应的==.npy保存到static/feature==目录下。
-
执行命令:
python server.py
。生成web服务,打开地址http://localhost:5000/即可开始以图搜图
三、效果展示
这张图是matsui528/sis项目里的演示图,搜索结果图下面显示的是相似度距离,也可以自己修改页面显示图片的名字或者路径
四、云服务器部署
腾讯云服务器配置:
- 系统:Ubuntu18.04
- CPU: 2核 内存: 2GB
- 40GB SSD云硬盘
云服务器先装好Python环境,并下载好项目。
由于我的服务器内存较小,只有2GB,在执行python offline.py
命令时会报内存不足。所以我先在本地提取好特征再上传到服务器上。(后来发现内存不足的警告好像可以忽略)
将特征文件和图片文件都上传服务器之后,
执行nohup python -u server.py > server.log 2>&1 &
后台启动web服务程序,输出日志到server.log
文件中
若需要添加新的图片,需要在本地提取好特征,将特征文件和图片文件上传服务器
五、OSS存储图片库
我的图片库有一万多张图片,一共有13个G,如果上传到服务器上需要花上十几个小时,速度实在是太慢了。于是我把图片文件都上传到了OSS存储,上传时间之花了十几分钟。
而一万多个特征文件只有100多mb,上传到服务器的速度是可以接受的。web服务程序启动时会把所有特征文件加载到内存,本地磁盘的IO速度肯定是比网络IO要快的。缩短服务程序的启动时间。
实现方法:
1、创建好OSS存储,创建img一个文件夹即可
2、把提取好特征的图片上传OSS,特征文件上传云服务器
3、修改server_oss.py图片路径,把它改为自己的路径
4、输入命令nohup python -u server_oss.py > server_oss.log 2>&1 &
启动服务,查看log日志,若出现端口信息则表示启动完成(可能要花十几分钟)。
5、注意打开服务器的5000端口
六、待实现功能
现在还有一个痛点,就是每次添加图片到图片库里时,需要手动执行offline.py
生成对应的特征文件,然后重启server.py
服务。
最好可以在前端页面加一个添加图片库按钮,可以批量添加图片文件,然后将请求转发给后端接口进行特征提取以及保存图片信息,最后将提取好的特征文件路径和新增的图片路径加入各自的数组即可,不需要重启程序。