找到公共模型
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.caffemodel
和googlenet-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.xml
和googlenet-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/
- 下图是从官网截取的公开模型环境支持表
模型使用
使用Python API加载模型并应用于真实场景
- 学习OpenVINO开发工具包的Python开发,可以通过两种渠道,一个是使用工具包自带的sample了解如何使用,二是通过官网查看API进行使用
sample所在地址
/opt/intel/computer_vision_sdk_2018.5.445/inference_engine/samples/python_samples/
sample_demo.py
from openvino.inference_engine import IENetwork, IEPlugin
plugin = IEPlugin(device='CPU', plugin_dirs=None)
if args.cpu_extension and 'CPU' in args.device:
plugin.add_cpu_extension('libcpu_extension.so')
net = IENetwork(model=model_xml, weights=model_bin)
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))
exec_net = plugin.load(network=net)
n, c, h, w = net.inputs[input_blob].shape
del net
- 到这一步为止,模型加载完毕,接下来可以利用模型进行相应识别
- 接下来分两种模式进行操作,同步识别和异步识别,异步识别适用于视频
- 同步方案 - 读取图片进行识别
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))
image = image.transpose((2, 0, 1))
images[i] = image
res = exec_net.infer(inputs={input_blob: images})
res = res[out_blob]
- 异步方案 - 读取rtsp流进行识别
cap = cv2.VideoCapture(
"rtsp://admin:[email protected]:554")
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]
- 结果处理 - 结果处理分很多种情况,以下介绍其中一种对象框定,用矩形线框框住识别到的物体,以后在其它文章中会记录一些不一样的模型结果处理
for obj in res[0][0]:
if obj[2] > 0.7:
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)
- 收尾 - 显示识别后的视频
cv2.namedWindow('video', 0)
cv2.resizeWindow('video', 600, 400)
cv2.imshow('video', frame)
key = cv2.waitKey(1)
if key == 27:
break
cv2.destroyAllWindows()
del model_net
del trait_net
del plugin