跳到主要内容

4.1.3 静态图片推理

图像分类算法—Mobilenet v1

本示例主要实现以下功能:

  1. 加载 mobilenet v1 图像分类模型
  2. 读取 zebra_cls.jpg 静态图片作为模型的输入
  3. 解析模型输出,得到图片的分类结果

运行方法

本示例的完整代码和测试数据安装在 /app/pydev_demo/01_basic_sample/ 目录下,调用以下命令运行

cd /app/pydev_demo/01_basic_sample/
sudo python3 ./test_mobilenetv1.py

运行成功后,会输出图像的分类结果,如下所示:

========== Classification result ==========
cls id: 340, Confidence: 0.9915, class_name: zebra

示例代码解析

  • 导入算法推理库hobot_dnn、numpy和opencv模块

    from hobot_dnn import pyeasy_dnn as dnn
    import numpy as np
    import cv2
  • 模型加载 调用 load 接口加载模型文件,并返回hobot_dnn.pyeasy_dnn.Model类的list。

    models = dnn.load('../models/mobilenetv1_224x224_nv12.bin')

    本示例中mobilenetv1 模型的输入是1x3x224x224数据,格式为NCHW。输出是1000个list数据,表示1000个类别的置信度。示例中定义了print_properties函数用来输出模型的输入、输出参数:

    # print properties of input tensor
    print_properties(models[0].inputs[0].properties)
    # print properties of output tensor
    print_properties(models[0].outputs[0].properties)
  • 数据前处理

    示例打开含有斑马的图像文件zebra_cls.jpg,并把图片缩放到符合模型输入的尺寸(244 x 224):

    # open image
    img_file = cv2.imread('./zebra_cls.jpg')
    # get the input tensor size
    h, w = models[0].inputs[0].properties.shape[2], models[0].inputs[0].properties.shape[3]
    print("input tensor size: %d x %d" % (h, w))
    des_dim = (w, h)
    # resize image to inpust size
    resized_data = cv2.resize(img_file, des_dim, interpolation=cv2.INTER_AREA)

    zebra_cls

    然后通过bgr2nv12_opencv函数把bgr格式的图像转换成符合模型输入的NV12格式:

    nv12_data = bgr2nv12_opencv(resized_data)
  • 模型推理

    调用 Model 类的 forward 接口进行算法推理,然后得到一个含有1000个值的list,表示1000个类别的预测概率值。

    outputs = models[0].forward(nv12_data)
  • 算法后处理

    算法模型的输出结果需要通过后处理,得到我们需要的类别、检测框等信息。本示例中模型输出对应1000个类别,需要根据置信度进行过滤,并得到正确结果。

    print(f"cls id: {label}, Confidence: {prob}, class_name: {name}")

    正确运行的结果为:

    ========== Classification result ==========
    cls id: 340, Confidence: 0.9915, class_name: zebra

目标检测算法—YOLOv3

本示例主要实现以下功能:

  1. 加载 yolov3_416x416_nv12 目标检测模型
  2. 读取 kite.jpg 静态图片作为模型的输入
  3. 分析算法结果,渲染检测结果

运行方法

本示例的完整代码和测试数据安装在 /app/pydev_demo/06_yolov3_sample/ 目录下,调用以下命令运行

cd /app/pydev_demo/06_yolov3_sample/
sudo python3 ./test_yolov3.py

运行成功后,会输出目标检测结果,并且输出渲染结果到result.jpg文件中,如下图: image-20220624105321684

目标检测算法—YOLOv5

本示例主要实现以下功能:

  1. 加载 yolov5s_672x672_nv12 目标检测模型
  2. 读取 kite.jpg 静态图片作为模型的输入
  3. 分析算法结果,渲染检测结果

运行方法

本示例的完整代码和测试数据安装在 /app/pydev_demo/07_yolov5_sample/ 目录下,调用以下命令运行

cd /app/pydev_demo/07_yolov5_sample/
sudo python3 ./test_yolov5.py

运行成功后,会输出目标检测结果,并且输出渲染结果到result.jpg文件中,如下图: image-20220624105432872

图像分割算法—unet

本示例主要实现以下功能:

  1. 加载 mobilenet_unet_1024x2048_nv12 图像分割模型(cityscapes预训练的分割模型)
  2. 读取 segmentation.png 静态图片作为模型的输入
  3. 分析算法结果,渲染分割结果

运行方法

本示例的完整代码和测试数据安装在 /app/pydev_demo/04_segment_sample/ 目录下,调用以下命令运行

cd /app/pydev_demo/04_segment_sample/
sudo python3 ./test_mobilenet_unet.py

运行成功后,会输出图像的分割结果,并且输出分割效果图到segment_result.png文件中,如下图: image-20220624105144784