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