以图搜图服务快速搭建

news2024/11/26 18:19:19

以图搜图服务快速搭建

电商公司,管理的商品少则几千,多则上百万。如何帮助用户从多如牛毛的商品中找到类似的商品就成了问题。

以图搜图就可以很好的帮助解决这个问题,通过 Towhee(resnet50 模型) + Milvus 如何实现本地环境搭建以图搜图。

Towhee 负责解析图片的特征向量,Milvus 负责存储特征向量然后进行向量查询。

Milvus Bootcamp 提供了很多解决方案 ,https://milvus.io/bootcamp/
在这里插入图片描述

其中就包含以图搜图的解决方案,根据图片相视度解决方案demo,这里实现了比较时候适合公司前后的分离环境的开箱即用的api实现。

配合前端大致效果如下:
在这里插入图片描述

包含如下接口

API接口

1.创建数据库

不同数据库对应不同的图片数据集合

Request

  • Method: POST
  • URL: /milvus/img/table?table={tablename}
    • 创建test数据集: /milvus/img/table?table=test
  • Headers:

Response

  • Body
{
    "code": 10000,
    "message": "Successfully",
    "data": null
}

2.新增图片

新增图片支持 base64 和url新增

Request

  • Method: POST
  • URL: /milvus/img/add
    • test 数据集新增图片数据: /milvus/img/add
  • Headers: Content-Type:application/json
  • Body:
{
	"tags": "风景|标签",
	"table": "test",
    "brief":"{\"title\":\"hello world\"} 这里存一些属性",
	"image": "base64(和url二选一,image优先级更高) ",
    "url":"http:///xxx.jpp"
}

Response

  • Body
{
    "code": 10000,
    "message": "Successfully",
    "data": "8  返回数据id"
}

3.更新图片

更新图片支持 base64 和url,根据id进行更新

Request

  • Method: POST
  • URL: /milvus/img/update
  • Headers: Content-Type:application/json
  • Body:
{
    "id":"1 必填",
	"tags": "风景|标签",
	"table": "test",
    "brief":"{\"title\":\"hello world\"} 这里存一些属性",
	"image": "base64(和url二选一,image优先级更高) ",
    "url":"http:///xxx.jpp"
}

Response

  • Body
{
    "code": 10000,
    "message": "Successfully",
    "data": "8  返回数据id"
}

4.以图搜图

根据图片搜索相似图片

Request

  • Method: POST
  • URL: /milvus/img/search
  • Headers: Content-Type:application/json
  • Body:
{
	"TOP_K": "2 查询多少个相似图",
	"table": "test",
	"url": "https://img.kakaclo.com/image%2FFSZW09057%2FFSZW09057_R_S_NUB%2F336bd601dfec33925ba1c581908b6c1e.jpg",
    "image": "base64(和url二选一,image优先级更高) ",
}

Response

  • Body
{
    "code": 10000,
    "message": "Successfully",
    "data": [
        {
            "id": 513552,
            "tags": "",
            "brief": "",
            "distance": 0.00015275638725142926
        },
        {
            "id": 93,
            "tags": "",
            "brief": "",
            "distance": 0.0001584545971127227
        }
    ]
}

distance 越小相似度越高。

5.删除图片

根据id删除

Request

  • Method: POST
  • URL: /milvus/img/delete?id={id}&table={table}
    • 删除test表id为6的数据 /milvus/img/delete?id=6&table=test
  • Headers:
  • Body:

Response

  • Body
{
    "code": 10000,
    "message": "Successfully"
}

6.删除整个数据集

删除milvus的和mysql的表,这个接口慎用,mysql和milvus数据会全部清除。

Request

  • Method: POST
  • URL: /milvus/img/drop?table={table}
    • 删除test数据集: /milvus/img/drop?table=test
  • Headers:
  • Body:

Response

  • Body
{
    "code": 10000,
    "message": "Successfully"
}

7.重新加载已经解析出特征的数据到milvus

这个在milvus升级、迁移和milvus数据损坏的情况下使用

可以将数据集对应的mysql表upload_status更新为0进行重新入milvus。

Request

  • Method: POST
  • URL: /milvus/img/load?table={table}
    • 将test mysql笔中upload_status为0的数据重新加载到milvus中: /milvus/img/load??table=test
  • Headers:
  • Body:

Response

  • Body
{
    "code": 10000,
    "message": "Successfully"
}

快速实践

环境安装

首先我们先有如下环境 python3,mysql,Milvus

python3,mysql就不多说了

Milvus 参考 https://milvus.io/docs/v2.1.x/install_standalone-docker.md

源码

https://github.com/AndsGo/reverse_image_search

配置

找到config.py

替换对应的 MILVUS 配置T 和 MYSQL配置

import os

############### Milvus Configuration ###############
MILVUS_HOST = os.getenv("MILVUS_HOST", "127.0.0.1")
MILVUS_PORT = int(os.getenv("MILVUS_PORT", "19530"))
VECTOR_DIMENSION = int(os.getenv("VECTOR_DIMENSION", "2048"))
INDEX_FILE_SIZE = int(os.getenv("INDEX_FILE_SIZE", "1024"))
METRIC_TYPE = os.getenv("METRIC_TYPE", "L2")
DEFAULT_TABLE = os.getenv("DEFAULT_TABLE", "milvus_img_search")
TOP_K = int(os.getenv("TOP_K", "10"))

############### MySQL Configuration ###############
MYSQL_HOST = os.getenv("MYSQL_HOST", "127.0.0.1")
MYSQL_PORT = int(os.getenv("MYSQL_PORT", "3306"))
MYSQL_USER = os.getenv("MYSQL_USER", "root")
MYSQL_PWD = os.getenv("MYSQL_PWD", "123456")
MYSQL_DB = os.getenv("MYSQL_DB", "milvus")
ERP_MYSQL_TABLE = os.getenv("ERP_MYSQL_TABLE", "milvus_img_search")

############### Data Path ###############
UPLOAD_PATH = os.getenv("UPLOAD_PATH", "tmp/search-images")

DATE_FORMAT = os.getenv("DATE_FORMAT", "%Y-%m-%d %H:%M:%S")

############### Number of log files ###############
LOGS_NUM = int(os.getenv("logs_num", "0"))

数据库表结构 ,表是自动生成的

CREATE TABLE `test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `milvus_id` bigint(20) DEFAULT NULL COMMENT 'milvus 数据id',
  `tags` varchar(32) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '标识',
  `brief` varchar(500) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '图片摘要',
  `upload_status` tinyint(2) DEFAULT '0' COMMENT '0 待上传到milvus 1成功上传到milvus',
  `feature` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '图片特征向量',
  `create_date` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
  `modify_date` datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '修改时间',
  PRIMARY KEY (`id`),
  KEY `idx_tags` (`tags`) USING BTREE,
  KEY `idx_milvus_id` (`milvus_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='图片上传记录表';

启动

sh start_server.sh

Attu

https://milvus.io/docs/attu.md

Attu是 Milvus 的高效开源管理工具,提供了GUI显示

img
原文:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常用命令——lsusb命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) lsusb 显示本机的USB设备列表信息 补充说明 lsusb命令用于显示本机的USB设备列表,以及USB设备的详细信息。 lsusb命令是一个学习USB驱动开发,认识USB设备的助手,推荐大家使用…

深信服面经---云计算方向(附问题知识点解析)

深信服面经---云计算高级开发一、一面问题概览二、实操相关三、复盘对问题答案进行整理(查漏补缺)3.1、go语言简单了解3.2、项目中成就感最大或挑战最大的地方3.3、项目问题---协议头引入之后,包的大小增加了多少3.4、如何建立缓存3.5、cache…

STM32定时器的配置,解析预分频系数和重装载值与时钟频率的关系

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…

“一键转换图片:学习如何使用Python调整大小、增强和转换图片!“

目录 简介: 源代码: 代码说明: 效果如图所示: 有关其中用到的Pillow模块: 简介: 在这个世界上,图片处理已经成为了必须掌握的技能之一,无论是为了更好地展示产品,还是…

C++ Primer Plus 第6版 读书笔记(4) 第4章 复合类型

目录 4.1 数组 4.2 字符串 4.3 string 类简介 4.3.4 string 类 I/O 4.4结构简介 4.5 共用体 4.6 枚举 4.7 指针和自由存储空间 4.8 指针、数组和指针算术 4.8.1 程序说明 4.8.2指针小结 4.8.5 自动存储、静态存储和动态存储 4.9 类型组合 4.10 数组的替代…

[算法与数据结构]--贪心算法初识

贪心算法贪心算法的解题过程贪心算法案例1.选择排序2. 平衡字符串3. 买卖股票的最佳时机 II4. 跳跃游戏5 钱币找零6 多机调度问题7.活动选择8. 最多可以参加的会议数目9. 无重叠区间来自算法导论对于这个贪心算法的解释定义贪心算法(又名贪婪算法)故名思意就是一个“贪心”的算…

小程序开发(一)新建/拉取项目,配置远程仓库

一、前期准备工作及工具 1、工具 微信开发者工具、Git 2、准备工作 相关开发工具的安装和配置工作请自行百度 二、新建或拉取远程项目 1、打开微信开发者工具(扫码登录等验证工作自行操作),选择小程序。 2、点击号新建项目,项目名称、目录、模板选…

Git(狂神课堂笔记)

1.首先去git官网下载我们对应的版本Git - Downloading Package (git-scm.com) 2.安装后我们会发现git文件夹里有三个应用程序: Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多 Git CMD:Windows风格的命令行 G…

kafka入门到实战三(单线程实现顺序消费,含demo)

这里需要前面两章的基础,如果没有环境或者看不懂在说什么,就翻一翻前两章。 kafka顺序消费(单线程) 顺序消费 顺序消费:是指消息的产生顺序和消费顺序相同。不管你用的是什么q或者kafka还是sofa,顺序依赖…

启动框架 Anchors接入和分析

参考:https://juejin.cn/post/6844904128443858958https://blog.csdn.net/gqg_guan/article/details/127760207从哪下手整个冷启动过程中,系统方法我们无法进行优化,主要需要优化的是系统暴露出来的一些生命周期方法,从Application的attachBa…

OSCP学习踩过的坑

OSCP终于拿到证,感觉参加考试备考的日子才过去没有多久,想起了那几个月被“虐待”的日子,我想总结下在课程和考试中的犯的错误! 计划 我制定了一个学习计划,计划是学习、练习,然后再学习、练习一些&#…

SpringCloud:服务拆分及远程调用

目录 SpringCloud:服务拆分及远程调用 1、服务拆分 2、远程调用 SpringCloud:服务拆分及远程调用 SpringCloud是目前国内使用最广泛的微服务框架。 官网地址: Spring Cloud SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了…

【10】SCI易中期刊推荐——工程技术-计算机:人工智能(中科院2区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

JAVA开发(Eureka基本原理)

Eureka基本原理。 通过上图我们可以看出,服务提供者在启动的时候需要向注册中心注册自己的信息,而注册中心把向自己注册的服务提供者都保存下来,以便服务消费者获取用来发起请求,而服务消费者需要从注册中心获取服务提供者列表&am…

网络层:IP协议

目录 基本概念 IP报头 IP报文分片 为什么要分片? 如何分片? 分片的报文如何组装? 分片策略如何? 网段划分 IP地址被分成了五类IP: CIDR 特殊的IP地址: 私有IP和公网IP 路由 如何转发数据包&a…

「ABAP」一文带你入门OPEN SQL中的SELECT查询(附超详细案例解析)

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

阿里云服务器价格,阿里云轻量应用服务器最新价格表

阿里云服务器从地域上来区分可分为ECS云服务器和轻量应用服务器,从活动内容来区分又可分为秒杀云服务器和新用户特惠云服务器,下面是截止目前,阿里云服务器最新的秒杀及新用户特惠购买价格,以表格形式形式展示出来以供参考。 阿里…

​ICLR 2023 | 图数据分布外检测:从能量模型出发

©PaperWeekly 原创 作者 | 吴齐天单位 | 上海交通大学博士生研究方向 | 机器学习与图深度学习继续探索 Graph OOD 的相关问题,与以往工作不同的是,这篇工作避开了复杂的数学推导和琐碎的数据生成过程,直接从简单有效的判别模型入手研究…

【Spring】掌握 Spring Validation 数据校验

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Spring Validation 数据校验一、什么是 Spring…

RAN-in-the-Cloud:为 5G RAN 提供云经济性

RAN-in-the-Cloud:为 5G RAN 提供云经济性 5G 部署在全球范围内一直在加速。 许多电信运营商已经推出了5G服务并正在快速扩张。 除了电信运营商之外,企业也对使用 5G 建立私有网络产生了浓厚的兴趣,这些私有网络利用了更高的带宽、更低的延迟…