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

前言

此篇文章建立于你看过作者的《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、对于图像处理可以使用预处理图像增加机器学习的准确率。

相关推荐
飞哥数智坊6 小时前
GPT-5-Codex 发布,Codex 正在取代 Claude
人工智能·ai编程
倔强青铜三6 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
虫无涯7 小时前
Dify Agent + AntV 实战:从 0 到 1 打造数据可视化解决方案
人工智能
Dm_dotnet9 小时前
公益站Agent Router注册送200刀额度竟然是真的
人工智能
算家计算9 小时前
7B参数拿下30个世界第一!Hunyuan-MT-7B本地部署教程:腾讯混元开源业界首个翻译集成模型
人工智能·开源
机器之心9 小时前
LLM开源2.0大洗牌:60个出局,39个上桌,AI Coding疯魔,TensorFlow已死
人工智能·openai
Juchecar10 小时前
交叉熵:深度学习中最常用的损失函数
人工智能
林木森ai10 小时前
爆款AI动物运动会视频,用Coze(扣子)一键搞定全流程(附保姆级拆解)
人工智能·aigc
聚客AI11 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
BeerBear12 小时前
【保姆级教程-从0开始开发MCP服务器】一、MCP学习压根没有你想象得那么难!.md
人工智能·mcp