Skip to main content
Version: 2.17.1

猫狗识别

案例说明

猫狗识别案例demo

可识别静态猫咪或狗宠物面部图像,基于深度学习构建出的宠物脸深度图像分析模型,并提取出关键点区域的深度特征,利用不同个体间原生体征差异,实现对宠物品种属性的判断和对身份同一性的验证。

准备文件目录

    ├── conda.yaml                     <- 环境脚本.
├── model_file <- 模型文件.
├── _load_pyfunc() <- 定义一个 Python 类,该类继承自PythonModel、定义predict()和(可选)load_context().
└── log_model() <- 创建一个MLflow模型目录.
  1. 环境脚本 conda.yaml

    基于平台所提供的多种基础镜像包,如果模型仍含有基础镜像不涵盖的依赖包,则需要自定义 conda.yaml

    若模型所需的依赖包均在基础镜像包中,则无需自定义 conda.yaml

    以下是自定义的Conda环境的示例表示形式:

    dependencies:
    - pip=20.2.4
    - pip:
    - opencv-python
    - tensorflow
  2. 模型文件 model_file

       └── dogs-cats-model                    <- 模型文件夹.
    ├── dog-cat.ckpt-9975.meta
    ├── dog-cat.ckpt-9975.index
    ├── dog-cat.ckpt-9975.data-00000-of-00001
    └── checkpoint
  3. 定义一个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_list
  4. log_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. 进行模型注册

    进入模型库后,点击右上角的 ”注册“ 按钮,进行模型注册。

    (1)注册模式 : 选择自定义模型。

    (2)应用 : 选择上边已创建的模型应用。

    (3)模型名称 : 自定义的模型名称。

    (4)模型文件夹 : 上传之前本地已生成的模型文件,即model文件夹。

    填写好模型信息后,点击 ”确定“ 按钮,进行模型注册。

    注册

  2. 模型启动和校验

    点击”校验/发布“按钮,进入模型校验界面。

    点击右上角”启动“按钮,进行模型启动。

    (1)计算目标 - 添加运行目标主机。

    (2)基础镜像 - 选择模型的环境配置,选择 系统镜像库中的tensorflow框架镜像。

    填写好信息后,点击 ”确定“ 按钮,进行模型启动。

    点击 图片检测,进行模型校验。

    注册

    即模型校验完成。

模型线上发布

点击右上角的"发布上线"按钮,填写发布模型信息。

计算目标 - 添加运行目标主机。

基础镜像 - 选择模型的环境配置。

发布成功后,点击左侧目录栏中的"发布",进入到模型发布页面,即可查看模型的发布信息。

发布

至此,猫狗模型部署发布完成。