猫狗识别
案例说明
可识别静态猫咪或狗宠物面部图像,基于深度学习构建出的宠物脸深度图像分析模型,并提取出关键点区域的深度特征,利用不同个体间原生体征差异,实现对宠物品种属性的判断和对身份同一性的验证。
准备文件目录
├── conda.yaml <- 环境脚本.
├── model_file <- 模型文件.
├── _load_pyfunc() <- 定义一个 Python 类,该类继承自PythonModel、定义predict()和(可选)load_context().
└── log_model() <- 创建一个MLflow模型目录.
环境脚本
conda.yaml
基于平台所提供的多种基础镜像包,如果模型仍含有基础镜像不涵盖的依赖包,则需要自定义
conda.yaml
。若模型所需的依赖包均在基础镜像包中,则无需自定义
conda.yaml
。以下是自定义的
Conda
环境的示例表示形式:dependencies:
- pip=20.2.4
- pip:
- opencv-python
- tensorflow模型文件
model_file
└── dogs-cats-model <- 模型文件夹.
├── dog-cat.ckpt-9975.meta
├── dog-cat.ckpt-9975.index
├── dog-cat.ckpt-9975.data-00000-of-00001
└── checkpoint定义一个Python类
定义一个 Python 类,该类继承自PythonModel、定义predict()和(可选)load_context().
class model_predict(pyfunc.PythonModel):
def load_context(self, context):
# 引入模型文件地址
self.model_path = context.artifacts["model_path"]
# 加载模型
self.sess = tf.Session()
saver = tf.train.import_meta_graph(self.model_path + '/dog-cat.ckpt-9975.meta')
saver.restore(self.sess, self.model_path + '/dog-cat.ckpt-9975')
def predict(self, context, inputs):
image_size = 64
num_channels = 3
images = []
# 处理模型入参,模型入参格式为图片的base64格式
col = inputs.iloc[0, 0]
img_data = base64.b64decode(col)
img_array = np.fromstring(img_data, np.uint8)
image = cv2.imdecode(img_array, cv2.COLOR_RGB2BGR)
image = cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR)
images.append(image)
images = np.array(images, dtype=np.uint8)
images = images.astype('float32')
images = np.multiply(images, 1.0 / 255.0)
x_batch = images.reshape(1, image_size, image_size, num_channels)
# 模型预测
graph = tf.get_default_graph()
y_pred = graph.get_tensor_by_name("y_pred:0")
x = graph.get_tensor_by_name("x:0")
y_true = graph.get_tensor_by_name("y_true:0")
y_test_images = np.zeros((1, 2))
feed_dict_testing = {x: x_batch, y_true: y_test_images}
result = self.sess.run(y_pred, feed_dict=feed_dict_testing)
tar_index = result.argmax()
res_label = ['dog', 'cat']
# 将模型预测结果转换成 DataFrame 格式
detection_list = []
result = {}
result["confidence"] = 0.99
result["type"] = "rectangle"
result["title"] = res_label[tar_index]
detection_list.append(result)
return detection_listlog_model() 生成一个包含模型数据的目录
运行文件后,在本地默认路径
"./mlruns/0/[自动生成的模型运行id]/artifacts/"
下。生成的目录结构:
示例代码:
model_path = "./dogs-cats-model"
artifacts = {
"model_path": model_path
}
mlflow.pyfunc.log_model(
artifact_path="model",
python_model=model_predict(),
code_path=['prediction.py'],
artifacts=artifacts
)
至此,本地运行模型注册脚本并生成模型文件夹。
本地模型验证
通过读取本地生成的模型文件夹,输出正确的预测结果,即为模型验证通过。
以下为针对已生成的示例模型的模型文件夹的模型验证:
if __name__ == '__main__':
# 本地注册模型生成的模型路径
model_path = "." + "/mlruns/0/7b15128a6a134c56a5c4ae427bfb6999/artifacts/model"
test = mlflow.pyfunc.load_model(model_path)
# 模型入参
img = open('dog.1.jpg', 'rb')
image_info = base64.b64encode(img.read())
# 模型预测
input_x = pd.read_json('{"columns": ["image_info"],"data": [["%s"]]}' % (image_info), orient="split", dtype=False)
predictions = test.predict(input_x)
# 输出预测结果
print("predictions:", predictions)
预测结果输出:
模型线上注册
进行模型注册
进入模型库后,点击右上角的 ”注册“ 按钮,进行模型注册。
(1)注册模式 : 选择自定义模型。
(2)应用 : 选择上边已创建的模型应用。
(3)模型名称 : 自定义的模型名称。
(4)模型文件夹 : 上传之前本地已生成的模型文件,即model文件夹。
填写好模型信息后,点击 ”确定“ 按钮,进行模型注册。
模型启动和校验
点击”校验/发布“按钮,进入模型校验界面。
点击右上角”启动“按钮,进行模型启动。
(1)计算目标 - 添加运行目标主机。
(2)基础镜像 - 选择模型的环境配置,选择 系统镜像库中的tensorflow框架镜像。
填写好信息后,点击 ”确定“ 按钮,进行模型启动。
点击 图片检测,进行模型校验。
即模型校验完成。
模型线上发布
点击右上角的"发布上线"按钮,填写发布模型信息。
计算目标 - 添加运行目标主机。
基础镜像 - 选择模型的环境配置。
发布成功后,点击左侧目录栏中的"发布",进入到模型发布页面,即可查看模型的发布信息。
至此,猫狗模型部署发布完成。