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

前言

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

相关推荐
深瞳智检4 分钟前
lesson-02 NLP 基础-文本表示与词向量
人工智能·自然语言处理·llm·大语言模型
twc8291 小时前
大模型生成 QA Pairs 提升 RAG 应用测试效率的实践
服务器·数据库·人工智能·windows·rag·大模型测试
宇擎智脑科技1 小时前
A2A Python SDK 源码架构解读:一个请求是如何被处理的
人工智能·python·架构·a2a
IT_陈寒1 小时前
Redis缓存击穿:3个鲜为人知的防御策略,90%开发者都忽略了!
前端·人工智能·后端
电商API&Tina1 小时前
【电商API接口】开发者一站式电商API接入说明
大数据·数据库·人工智能·云计算·json
湘美书院--湘美谈教育2 小时前
湘美谈教育湘美书院网文研究:人工智能与微型小说选集
人工智能·深度学习·神经网络·机器学习·ai写作
uzong2 小时前
Harness Engineering 是什么?一场新的 AI 范式已经开始
人工智能·后端·架构
墨有6662 小时前
FieldFormer:基于物理场论的极简AI大模型底层架构,附带源码
人工智能·架构·电磁场算法映射
Mountain and sea2 小时前
从零搭建工业机器人激光切割+焊接产线:KUKA七轴协同+节卡AGV+视觉检测实战复盘
人工智能·机器人·视觉检测
K姐研究社2 小时前
阿里JVS Claw实测 – 手机一键部署 OpenClaw,开箱即用
人工智能·智能手机·aigc·飞书