OpenVINO 公共模型笔记 (二)

OpenVINO 公共模型笔记

  • 找到公共模型
    • 使用案例测试
  • 使用工具包已有模型
    • 模型使用
      • 使用Python API加载模型并应用于真实场景

找到公共模型

  • 找到OpenVINO工具包所在文件夹
linux文件夹根目录位置一般在
 /opt/intel/computer_vision_sdk/

Windows文件夹根目录位置在
 C:\Program Files (x86)\IntelSWTools\openvino\
  • 进入到开发工具包中的模型下载文件夹
cd /opt/intel/computer_vision_sdk/deployment_tools/model_downloader
  • 通过以下命令下载所需要的模型文件
# 查看公共模型列表
python3 downloader.py --print_all

# 根据模型名称下载模型
python3 downloader.py --name googlenet-v2

此处列举一部分模型名
road-segmentation-adas-0001
road-segmentation-adas-0001-fp16
semantic-segmentation-adas-0001
semantic-segmentation-adas-0001-fp16
single-image-super-resolution-0034
single-image-super-resolution-0034-fp16
vehicle-attributes-recognition-barrier-0039
vehicle-attributes-recognition-barrier-0039-fp16
vehicle-detection-adas-0002
vehicle-detection-adas-0002-fp16
  • 其中要注意,fp16表示模型是16位的,只有intel神经棒可以加载运行,如果是使用cpu或gpu运行模型,需要下载不带fp16后缀的,不带fp16的默认都是32位

使用案例测试

  • 拿googlenet-v为例,下载成功后进入到指定目录下
cd ~/intel/computer_vision_sdk/deployment_tools/model_downloader/classification/googlenet/v2/caffe
  • 此时目录下的文件是caffe框架训练出来的模型文件,googlenet-v2.caffemodelgooglenet-v2.prototxt
  • 在OpenVINO工具包中提供了针对各大深度学习库的转化支持,Model Optimizer支持转换Caffe *,TensorFlow *,MXNet *,Kaldi *,ONNX *模型
  • 下方命令用于转化caffe模型示例
# 初始化OpenVINO环境
source ~/intel/computer_vision_sdk/bin/setupvars.sh

# 将caffe模型文件转化位IR文件
mo.py --data_type FP16 --input_model googlenet-v2.caffemodel --input_proto googlenet-v2.prototxt
  • 执行完毕后,来到指定文件夹下,在原有模型中会生成两个文件googlenet-v2.xmlgooglenet-v2.bin
  • 接下来采用工具包中提供的python-sample实例来加载上面的两个文件,查看效果
# 找到工具包中的samples,里面包含各种语言的DEMO
cd /opt/intel/computer_vision_sdk/deployment_tools/inference_engine/samples/python_samples

# 下载一张网络图片用作素材
wget -N https://upload.wikimedia.org/wikipedia/commons/b/b6/Felis_catus-cat_on_snow.jpg

# 初始化OpenVINO环境
source ~/intel/computer_vision_sdk/bin/setupvars.sh

# 运行classification_sample.py分类案例文件
# -i 表示输入 填写一张图的路径
# -d MYRIAD表示神经棒 除此之外还可以填CPU GPU FPGA
python3 classification_sample.py -m ~/intel/computer_vision_sdk/deployment_tools/model_downloader/classification/googlenet/v2/caffe/googlenet-v2.xml -i Felis_catus-cat_on_snow.jpg -d MYRIAD
  • 运行后在控制台中可以看到结果的输出,第一列结果是可信度的百分比,最后一列是类别的编号
0.3881836 label #173
0.3193359 label #54
0.2410889 label #7
0.0361328 label #200
0.0037460 label #84
0.0025158 label #66
0.0021381 label #10
0.0016766 label #473
0.0013685 label #198
0.0007257 label #152

使用工具包已有模型

  • 上方内容主要了解如何使用OpenVINO工具包提供的下载器去下载最新的公开模型,除此之外,在工具包中本身就提供了已经下载并可以直接使用的模型
  • 来到指定文件夹
 cd /opt/intel/computer_vision_sdk_*/deployment_tools/intel_models/
  • 下图是从官网截取的公开模型环境支持表
    OpenVINO 公共模型笔记 (二)_第1张图片

模型使用

使用Python API加载模型并应用于真实场景

  • 学习OpenVINO开发工具包的Python开发,可以通过两种渠道,一个是使用工具包自带的sample了解如何使用,二是通过官网查看API进行使用
sample所在地址
/opt/intel/computer_vision_sdk_2018.5.445/inference_engine/samples/python_samples/
  • 以下简单介绍模型加载步骤
sample_demo.py

# 引入OpenVINO工具包
from openvino.inference_engine import IENetwork, IEPlugin

# 加载intel插件类,device为运行环境
# device 可选内容有 
# CPU(6代以上core处理器或至强系列处理器) 
# GPU(CPU上的核显) FPGA(可编程门阵列板) 
# MYRIAD(intel神经棒)
# plugin_dirs 插件地址 默认填空
plugin = IEPlugin(device='CPU', plugin_dirs=None)

# 如果是cpu运行 需要加载相应的cpu扩展 扩展后续有详细记录
if args.cpu_extension and 'CPU' in args.device:
    plugin.add_cpu_extension('libcpu_extension.so')

# 加载模型 实例化intel网络对象
# model_xml和model_bin都是文件路径,路径指向的是公共的模型地址,model_xml对应IR模型中xml文件,model_bin对象IR模型中的bin文件
net = IENetwork(model=model_xml, weights=model_bin)

# 如果是CPU加载模型,需要验证当前设备是否支持环境
if plugin.device == "CPU":
    supported_layers = plugin.get_supported_layers(net)
    not_supported_layers = [l for l in net.layers.keys() if l not in supported_layers]
    if len(not_supported_layers) != 0:
        log.error("当前设备不支持加载模型")
        log.error("请尝试指定CPU扩展库")
        sys.exit(1)
        
# 获取加载模型后该模型所需要的入参
input_blob = next(iter(net.inputs))
# 获取加载模型后该模型所返回的出参
out_blob = next(iter(net.outputs))
# ps:该案例以图片为例 input_blob和out_blob只是模型运行过程中需要提供的内容,input_blob是出入内容时作为内容的键名存在,out_blob是模型推理出结果后结果字典中结果的键名

# 使用intel插件类加载网络,
exec_net = plugin.load(network=net)

# 获取输入图片的信息 n 数量 c 颜色顺序(BGR) h 高 w 宽
# 不同的模型所需要的图片大小不一样,因此需要获取要求的宽高,用于后期强转
n, c, h, w = net.inputs[input_blob].shape
# 网络加载完毕 删除网络
del net
  • 到这一步为止,模型加载完毕,接下来可以利用模型进行相应识别
  • 接下来分两种模式进行操作,同步识别和异步识别,异步识别适用于视频
  1. 同步方案 - 读取图片进行识别
# 设定一个图片数组用于存放多个输入图像
images = np.ndarray(shape=(n, c, h, w))
    # 根据指定的输入数量进行循环
    for i in range(n):
        # 读取图片
        image = cv2.imread('img-%s.png'%(i,))
        # 如果发现图片的宽高与要求宽高不一致,进行转化
        if image.shape[:-1] != (h, w):
            log.warning("Image {} is resized from {} to {}".format(args.input[i], image.shape[:-1], (h, w)))
            image = cv2.resize(image, (w, h))
        # 将圆原图像的HWC格式转化为CHW格式
        image = image.transpose((2, 0, 1))
        # 将图片放入数组中,此时images数组的shape和input所需要的一致
        images[i] = image

# infer使用网络进行识别,该方法用于同步执行
res = exec_net.infer(inputs={input_blob: images})
# 从结果中取出out_blod,此时结果为识别结果
# 不同模型结果不一样
res = res[out_blob]
  • ps:识别结果格式参考模型概述
  1. 异步方案 - 读取rtsp流进行识别
# 利用opencv连接支持rtsp协议的摄像头获取画面
cap = cv2.VideoCapture(
        "rtsp://admin:[email protected]:554")
# 获取帧 ret表示结果是否图像,frame是每一帧的矩阵
ret, frame = cap.read()
# 如果摄像头已经连接成功
while cap.isOpened():
    # 不断读取下一帧
    ret, frame = cap.read()
    # 如果当前帧丢失则跳过
    if not ret:
        continue
# 获取原始图片的宽高
initial_w = frame.shape[1]
initial_h = frame.shape[0]
# 图片的宽高进行转化
in_frame = cv2.resize(next_frame, (w, h))
in_frame = in_frame.transpose((2, 0, 1))
in_frame = in_frame.reshape((n, c, h, w))
# 开启异步识别
model_net.start_async(request_id=0, inputs={input_blob: in_frame})
# 判断是否有识别结果,如果没有识别结果视频继续
if model_net.requests[cur_request_id].wait(-1) == 0:
    # 如果有结果则获取内容
    res = model_net.requests[0].outputs[output_blob]
  1. 结果处理 - 结果处理分很多种情况,以下介绍其中一种对象框定,用矩形线框框住识别到的物体,以后在其它文章中会记录一些不一样的模型结果处理
# 遍历结果 因为结果可能不止一个 比如识人体 某一帧里面会有多个人体 
for obj in res[0][0]:
    # 按照结果格式,一般结果集的第二个参数是可信度,如果可信度超过0.7,表示有百分之七十以上的可能性是识别的物体
    if obj[2] > 0.7:
        # 根据结果的x和y值结合原图像的宽高,计算出实际在图像中识别到结果的左上角角点位置和右下角角点位置
        xmin = int(obj[3] * initial_w)
        ymin = int(obj[4] * initial_h)
        xmax = int(obj[5] * initial_w)
        ymax = int(obj[6] * initial_h)
        # 依照两个角点的位置在原图中画出矩形
        color = (0, 0, 255)
        cv2.rectangle(frame, (xmin, ymin), (xmax, ymax), color, 2)
  1. 收尾 - 显示识别后的视频
    # 利用opencv显示绘制矩形后的图像
    cv2.namedWindow('video', 0)
    cv2.resizeWindow('video', 600, 400)
    cv2.imshow('video', frame)
    # 监听按键
    key = cv2.waitKey(1)
    # 如果按键为q,则跳出循环
    if key == 27:
        break
# 如果循环结束也就表示视频播放结束
cv2.destroyAllWindows()
# 删除所有加载后的模型 释放内存
del model_net
del trait_net
del plugin

你可能感兴趣的:(人工智能)