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

前言

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

相关推荐
倔强青铜三17 分钟前
苦练Python第23天:元组秘籍与妙用
人工智能·python·面试
AndrewHZ1 小时前
【图像处理基石】如何入门色彩评估?
图像处理·人工智能·深度学习·色彩科学·hvs·色彩评估·颜色工程
TomatoSCI1 小时前
聚类的可视化选择:PCA / t-SNE丨TomatoSCI分析日记
人工智能·机器学习
大咖分享课1 小时前
深度剖析:最新发布的ChatGPT Agent 技术架构与应用场景
人工智能·openai·智能助手·ai代理·chatgpt agent·自主任务执行
lucky_lyovo1 小时前
卷积神经网络--网络性能提升
人工智能·神经网络·cnn
liliangcsdn1 小时前
smolagents - 如何在mac用agents做简单算术题
人工智能·macos·prompt
nju_spy1 小时前
周志华《机器学习导论》第8章 集成学习 Ensemble Learning
人工智能·随机森林·机器学习·集成学习·boosting·bagging·南京大学
静心问道2 小时前
TrOCR: 基于Transformer的光学字符识别方法,使用预训练模型
人工智能·深度学习·transformer·多模态
说私域2 小时前
基于开源AI大模型、AI智能名片与S2B2C商城小程序源码的用户价值引导与核心用户沉淀策略研究
人工智能·开源
亲持红叶2 小时前
GLU 变种:ReGLU 、 GEGLU 、 SwiGLU
人工智能·深度学习·神经网络·激活函数