以图识图实现(附带测试代码)

前言

此篇文章建立于你看过作者的《Tensorflow第一篇(安装环境) 》和《Milvus介绍》。最后公司经过讨论需求的呈现为以图识图来进行数据的提取展示(提测中)。

实现方式

前提条件

首先我们需要有提取特征的方法(使用Tensorflow进行图片特征的提取),其次我们需要有一个图片特征的数据库(使用Milvus进行图片特征存储)。有了这两个前提条件我们就可以实现以图识图的功能。

流程图呈现

测试代码展示

提取特征向量

ini 复制代码
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.preprocessing.image import load_img
from tensorflow.keras.applications.resnet50 import preprocess_input

def tengetEIFeatures(path='', imageName=''):
    """
    使用ResNet50提取图像的特征向量
    :param path: 图像路径
    :param imageName: 图像名称
    :return:
    """
    # 创建ResNet50模型,并使用"imagenet"作为权重初始化
    model = ResNet50(weights="imagenet")
    # 拼接文件路径和图像名称,得到图像文件的完整路径
    image = os.path.join(path, imageName)
    # 加载图像,并将其调整为224x224的尺寸
    image = load_img(image, target_size=(224, 224))
    # 将图像转换为numpy数组
    image = np.asarray(image)
    # 增加一个维度,使图像数组成为3D数组
    image = np.expand_dims(image, axis=0)
    # 对图像进行预处理
    image = preprocess_input(image)
    # 使用模型提取图像特征
    feature = model(image)
    # 将特征转换为numpy数组
    feature = feature.numpy()
    # 将特征数组扁平化为1D数组
    feature = feature.reshape([-1])
    # 将特征向量重塑为形状为 (1, 特征数量) 的 2D 数组,为了与下游任务的兼容性而进行的。
    feature = np.array(feature).reshape((1, len(feature)))
    # 返回特征
    return feature

保存特征向量(第一次跑包含创建字段)

ini 复制代码
from pymilvus import (
    connections,
    FieldSchema, CollectionSchema, DataType,
    Collection,
)
connections.connect("default", host="localhost", port="19530")

fields = [
            FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=True),
            FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR,  dim=1000)
        ]

schema = CollectionSchema(fields, "test")

# 第一次运行代码
test = Collection("test", schema, consistency_level="Strong")

# 第二次运行代码
# test = Collection("test") 

data = [
    [
        'test'
    ],
    tengetEIFeatures("D:\\ML\\ClassifyJade\\case\\images\\train\\jade\\burner\", 'test.jpg')
]

insert_result = test.insert(data)

查询特征向量

ini 复制代码
from pymilvus import (
    connections,
    Collection,
)
connections.connect("default", host="localhost", port="19530")

con = Collection("test")

param = {"metric_type": "L2", "params": {"nprobe": 10}}

res = con.search(EIFeatures.tengetEIFeatures("D:\ML\ClassifyJade\case\images\train\jade\burner\", 'test.jpg'), "embeddings",
           limit=10, param={"metric_type": "L2", "params": {"nprobe": 10}})
print(res)

结尾的碎碎念

1、由于项目属于公司不能给出太多示例代码,但跑通流程是完全够用的。

2、机器学习的重点是模型的选择和数据量的大小,后续的调参完全可以慢慢来。

3、小数据量用预加载模型其实效果也不咋样。

4、对于图像处理可以使用预处理图像增加机器学习的准确率。

相关推荐
miofly1 分钟前
Sebastian Raschka 11 小时视频课:用 PyTorch 从零构建推理模型
人工智能
LiuPig刘皮哥3 分钟前
小可爱xiaokeai3D陪玩视觉设计方案
人工智能·3d·虚拟陪伴·虚拟偶像·xiaokeai
第404号工位7 分钟前
浏览器的“无痕模式”是当代最大安慰剂?我用 30 行 JS 提取硬件指纹,跨网络换代理照样精准锁定你
linux·人工智能·python
刘胡子大叔11 分钟前
用 system_prompt 控制智能体说话风格
人工智能·prompt
Agent世界11 分钟前
千问Go上线我的应用:一句话生成可部署 AI 软件的技术拆解
开发语言·人工智能·golang·ai智能体
xiejava101814 分钟前
【一个人的SOC】(12) AI 安全报告与主动推送——五种场景的自动化闭环
人工智能·安全·自动化·开源软件·安全运营·ai soc
AI前端工程狮16 分钟前
从 Function Calling 到 MCP(四):把 Server 部署上线前,先处理好这五件事
人工智能·程序员
虎鲸不是鱼16 分钟前
AI 自动化逆向(十七)解码器、反汇编器、反编译器:能力边界表
人工智能·自动化·大模型·逆向·ai逆向
天燹24 分钟前
本地部署大模型ollama
人工智能·llama
疯狂学习GIS24 分钟前
将谷歌地球引擎账号升级为Contributor与Partner层级的方法
java·数据库·人工智能