前言
接着上文,我们知道了Int8量化的操作过程是:
- 转换数据集获得Annotations文件。
- (可选的)评估低精度模型性能。
- 校验模型。
- 评估结果模型。
可以看到在用Calibaration Tool进行Int8量化之前需要先解决如何将我们的原始数据集转为Annotations文件以及我们如何用精度检查工具(Accuracy Checker Tool)去评估我们的量化后模型的表现。其中将原始数据集转换为Annotations文件的时候用命令是比较方便,如果懒得写配置文件的话。而要使用精度检查工具,则必须写配置文件了,具体见本文后面的详细介绍。
精度检查器
精度检查实例
在这个例子中,我们来浏览一下要评估一个深度学习模型需要哪些步骤,我们以SampLeNet作为例子。
1. 下载和解压数据集
在这个示例中,我们将使用玩具数据集,我们称之为示例数据集,它包含10个不同类别的总共10k
个图像(分类问题),实际上是CIFAR10数据集转换为png
(图像转换将在评估过程中自动完成)。你可以从官网下载CIFAR10数据集。然后解压下载下来的CIFAR10数据集到sample文件夹:
tar xvf cifar-10-python.tar.gz -C sample
2. 评估示例拓扑
通常需要编写配置文件,描述拓扑的评估过程。已经有了使用OpenVINO框架评估SampLeNet的配置文件,请仔细阅读。你需要安装Caffe的模型优化器来运行Caffe模型。如果你不想使用Caffe,请直接将Caffe模型转换成:
model: SampleNet.xml
weights: SampleNet.bin
accuracy_check -c sample/sample_config.yml -m data/test_models -s sample
使用参数:-c
评估配置文件的路径,-m
模型被存储的路径,-s
数据集的路径。
如果一切正常,你应该能得到75.02%
的准确率。
现在尝试编辑配置文件,在其他设备或框架(如Caffe、MxNet或OpenCV)上运行SampLeNet,或者直接转到你的拓扑!
注意,拓扑就是指的网络,因为我们知道网络实际上就是一个有向无环图(DAG)。
如何配置Caffe启动程序
要使用Caffe启动器,你需要在你的配置文件下的lunchers
段添加caffe
字段然后提供下面的参数:
device
- 指定要用于推断的设备(cpu、gpu_0
等)。model
- Caffe的prototxt文件的路径。weights
-Caffe的weights文件的路径。adapter
- 解决将原始输出转换为数据集表示的问题,一些适配器是特定于框架的。后面会详细介绍adapter
的详细使用说明。
你还可以使用batch
为模型指定批处理大小,并允许使用特定参数将输入层reshape
为数据形状:allow_reshape_input
(默认值为False
),这个应该是Faster-RCNN的ROI Pooling之类的层会使用。
在配置中指定模型输入
如果你的模型有几个输入,你应该在你配置文件的启动器子段用一个inputs
参数提供一个输入列表。每个输入说明应包含以下信息:
name
- 网络的输入层名字。type
- 输入值的类型,它对填充策略有影响。可选:CONST_INPUT
- 常量填充,需要提供一个常量值。IMAGE_INFO
- 用于将有关输入形状的信息设置到网络层的特定值(用于基于Faster RCNN的拓扑中)。 你不需要提供值,因为它将在运行时计算。 格式值为Nx [H,W,S]
,其中N
是批处理大小,H
-原始图像高度,W
-原始图像宽度,S
-原始图像通道数(默认为1
)。INPUT
- 网络输入的数据流(例如图像)。 如果你有多个数据输入,则应提供标识符的正则表达式作为值,以指定应在特定输入中提供哪个数据。 (可选)你可以确定输入的形状(实际上不使用,Caffe启动器使用网络提供的信息)和数据排布方式,以防你的模型使用非标准数据排布方式进行训练(对于Caffe,默认布局为NCHW)。
Caffe的启动配置文件例子:
launchers:
- framework: caffe
device: CPU
model: path_to_model/alexnet.prototxt
weights: path_to_weights/alexnet.caffemodel
adapter: classification
batch: 4
如何配置OpenVINO启动程序
要使用OpenVINO启动器,你需要在你的配置文件的lunchers
子段添加dlsdk
字段然后提供下面的参数:
devices
:指定用于推理的设备列表。支持:CPU, GPU, FPGA, MYRIAD
。异构插件:HETERO:target_device,fallback_device
。多设备插件:MULTI:target_device1,target_device2
。你可以使用-td,--target
来指定多个设备。这将从命令行中选择目标设备(依次提供多个设备时,将对所有指定设备逐一运行评估)。model
:你的网络xml文件的路径。weights
:你的网络bin文件的路径。
启动器可以选择以源框架格式提供模型参数,这些参数将使用Model Optimizer转换为Inference Engine IR。
如果要使用Model Optimizer进行模型转换,请查看https://docs.openvinotoolkit.org/latest/_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html
。你可以提供:
- 对于Caffe框架:
caffe_model
和caffe_weights
- 对于Tensorflow框架:
*.pb, *.pb.frozen, *.pbtxt
。 - 对于Tensorflow MetaGraph:
*.meta
。 - 对于MxNet框架:
*.params
。 - 对于ONNX框架:
*.onnx
。 - 对于kaldi_model:
*.nnet
。
如果要确定其它用于模型转换的参数(data_type,input_shape
等),则可以用mo_params
参数来指定,并将mo_flags
用于位置参数(例如legacy_mxnet_model
)。 您可以在《模型优化器开发人员指南》中找到支持参数的完整列表。
模型将在每次评估之前进行转换。 您可以提供converted_model_dir
来将转换后的模型保存在特定的文件夹中,否则,转换后的模型将保存在通过-C
命令行参数指定的文件夹或原模型目录提供的路径中。
adapter
- 解决将原始输出转换为数据集表示的问题,一些适配器是特定于框架的。待会会详细介绍adapter
的详细使用说明。
启动器从中间模型表示(IR)获得要使用的批次大小。 如果要使用批处理进行推断,请提供所需批处理的模型或使用mo_params
中的特定参数进行转换。
allow_reshape_input
- 允许Reshape输入层以适应数据(如Faster-RCNN中的ROI Pooling)。
另外,您可以提供设备特定的参数:
cpu_extensions
:扩展网络层的路径,比如YOLOV3的YOLO层,SSD的Pribox层都在这里。 你还可以使用特殊的AUTO
来自动搜索命令行参数-e,--extensions
提供的目录下的cpu扩展库。gpu_extensions
:OPenCL内核描述的xml
文件。bitstream
:FPGA专用参数。
你还可以用async_mode
以异步方式启动模型,同时提供推断请求的数量(num_requests
)。
如果你的模型有几个输入,你应该在启动器的配置部分用一个inputs
参数提供一个输入列表。每个输入说明应包含以下信息:
name
- 网络的输入层名字。type
- 输入值的类型,它对填充策略有影响。可选:CONST_INPUT
- 常量填充,需要提供一个常量值。IMAGE_INFO
- 用于将有关输入形状的信息设置到图层的特定值(用于基于Faster RCNN的拓扑中)。 你不需要提供值,因为它将在运行时计算。 格式值为Nx [H,W,S]
,其中N
是批处理大小,H
-原始图像高度,W
-原始图像宽度,S
-原始图像通道数(默认为1
)。INPUT
- 网络输入的数据流(例如图像)。 如果你有多个数据输入,则应提供标识符的正则表达式作为值,以指定应在特定输入中提供哪个数据。 (可选)你可以确定输入的形状(实际上不使用,Caffe启动器使用网络提供的信息)和数据排布方式,以防你的模型使用非标准数据排布方式进行训练(对于Caffe,默认布局为NCHW)。
OpenVINO启动器配置示例:
launchers:
- framework: dlsdk
device: HETERO:FPGA,CPU
caffe_model: path_to_model/alexnet.prototxt
caffe_weights: path_to_weights/alexnet.caffemodel
adapter: classification
mo_params:
batch: 4
mo_flags:
- reverse_input_channels
cpu_extensions: cpu_extentions_avx512.so
其它的框架如Tensorflow/MxNet/Onnx启动器的步骤和上面基本一致,这里就不继续介绍其它的启动器配置文件的设置了,如果你需要的话可以自己查看。地址:http://docs.openvinotoolkit.org/2019_R3.1/_tools_accuracy_checker_accuracy_checker_launcher_dlsdk_launcher_readme.html
。
Adapters
适配器是拥有将网络推理结果转换为特定于评价标准格式的功能的函数。 你可以使用两种方法来设置网络适配器:
- 定义适配器为一个string。
adapter: classification
- 将适配器定义为一个字典,使用type: 适配器的名字。如果需要,这种方法可以为适配器设置其他参数。
adapter:
type: reid
grn_workaround: False
精度检查器支持下面适配器集合:
-
classification
- 将分类模型的输出转换为ClassificationPrediction
表示形式。 -
segmentation
- 将语义分割模型的输出转换为SegmentationPrediction
表示。make_argmax
- 允许使用argmax操作获得输出。
-
tiny_yolo_v1
:将Tiny YOLO v1模型的输出转换为DetectionPrediction
表示形式。 -
reid
:将重识别模型的输出转换为重识别预测表示。
grn_workaround
enabling processing output with adding Global Region Normalization layer。(我不了解重识别,所以不翻译) -
yolo_v2
:将YOLO v2家族的模型转换为DetectionPrediction
表示形式。classes
: 检测的物体类别数(默认20)。anchors
:以逗号分割的Anchor列表:yolo_v2
:[1.3221, 1.73145, 3.19275, 4.00944, 5.05587, 8.09892, 9.47112, 4.84053, 11.2364, 10.0071]
tiny_yolo_v2
:[1.08, 1.19, 3.42, 4.41, 6.63, 11.38, 9.42, 5.11, 16.62, 10.52]
coords
:bbox的坐标值个数,默认为4。num
:来自DarkNet配置文件的num参数(默认值5)。
-
yolo_v3
:将YOLOV3家族的模型转换为DetectionPrediction
表示形式。classes
: 检测的物体类别数(默认80)。anchors
:以逗号分割的Anchor列表:yolo_v3
:[10.0, 13.0, 16.0, 30.0, 33.0, 23.0, 30.0, 61.0, 62.0, 45.0, 59.0, 119.0, 116.0, 90.0, 156.0, 198.0, 373.0, 326.0]
tiny_yolo_v3
:[10.0, 14.0, 23.0, 27.0, 37.0, 58.0, 81.0, 82.0, 135.0, 169.0, 344.0, 319.0]`
coords
:bbox的坐标值个数,默认为4。num
:来自DarkNet配置文件的num参数(默认值3)。threshold
:目标置信度分数阈值(默认为0.001)。input_width
和input_height
:网络的输入长宽(默认416)。outputs
:输出层名称列表,可选参数。
-
lpr
:将车牌识别模型的输出转换为CharacterRecognitionPrediction
表示。 -
ssd
:将SSD模型的输出转换为DetectionPrediction
表示。 -
ssd_mxnet
:将MxNet框架下的SSD模型转换为DetectionPrediction
表示。 -
pytorch_ssd_decoder
:转换Pytorch框架下的无嵌入式解码器的SSD模型的输出:
-score_out
:带边框分数的输出层名称。
-boxes_out
:带边框坐标的输出层名称。
-confidence_threshold
:有效框的分数阈值默认为0.05。
-nms_threshold
:NMS算法的阈值。
-keep_top_k
:最多保留的目标框个数。
其它支持的一些特定数据集格式和上面的都类似,就不接着翻译了,如果你需要跑其它的算法可以去文档自行查看。地址为:http://docs.openvinotoolkit.org/2019_R3.1/_tools_accuracy_checker_accuracy_checker_adapters_README.html
。
Annotation Converters
注释转换器是将注释文件转换为适合计算评价指标的函数。每个注释转换器都需要特定的注释文件格式或数据结构,这依赖于原始数据集。如果精度检查器不支持数据格式的转换器,则可以提供自己的注释转换器。每个注释转换器都有可用于配置的参数。
转换过程可以通过两种方式实现:
- 通过配置文件。
- 通过命令行。
在配置文件中描述转换关系
每个转换配置文件都应包含填入了转换器名称的转换器子段,并提供转换器的特定参数(有关更多的详细信息,请参阅支持的转换器部分。所有路径都可以通过命令行加-s
,-source
参数来增加前缀路径。
你还可以使用可选参数:
subsample_size
:数据集子集大小。可以指定真实目标的个数或者占整个数据集的比例。请谨慎使用这个选项,一些数据集不支持子采样。 如果你还想使用一个固定的随机数种子采样,你可以设置subsample_seed
参数。annotation
:存储转换的注释pickle文件的路径。如果需要重用转换后的注释文件以避免后续转换,则可以使用此参数。dataset_meta
:存储有关已转换的注释信息(如果提供)的meta
信息的路径。analyze_dataset
:允许获取有关已转换数据集的统计信息的标志。支持的注释:ClassificationAnnotation、DetectionAnnotation、MultiLabelRecognitionAnnotation、RegressionAnnotation
。默认值为False
。
一个使用的示例:
annotation_conversion:
# Converter name which will be called for conversion.
converter: sample
# Converter specific parameters, can be different depend on converter realization.
data_dir: sample/sample_dataset
# (Optional) subsample generation. Can be also used with prepared annotation file.
subsample_size: 1000
# (Optional) paths to store annotation files for following usage. In the next evaluation these files will be directly used instead running conversion.
annotation: sample_dataset.pickle
dataset_meta: sample_dataset.json
通过命令行转换
我最喜欢这种方式,简单直接。
标注信息转换的命令行长这样:
convert_annotation <converter_name> <converter_specific parameters>
所有特定的转换参数都应该有--<parameter_name> <parameter_value>
这种形式,你可以用-h,--help
来列出全部命令行参数。一些可选的参数:
-o, --output_dir
:保存转换后的注释文件的路径。-a,--annotation_name
:注释文件名。-m,--meta_name
:meta
信息文件名。
支持的转换
精度检查器支持以下注释转换器及其特定参数:
cifar10
:将CIFAR10分类数据集转换为ClassificationAnnotation
表示。
-data_batch_file
:包含数据集批处理的pickle文件的路径(例如test_batch)
-has_background
:允许将背景标签添加到原始标签并转换11个类的数据集,而不是10个类(默认值为False)。
-convert_images
:允许将图像从pickle文件转换到用户指定的目录(默认值为False)。
-converted_images_dir
:转换图像位置的路径。
其它各种数据集就和这个类似了,也就不翻译了,稍微列一下还支持哪些数据集格式转换器。
minst_csv
。imagenet
。voc_detection
。voc_segmentation
。mscoco_detection
。mscoco_segmentation
。mscoco_mask_rcnn
。mscoco_keypoints
。wider
。detection_opencv_storage
。cityscapes
。vgg_face
。lfw
。mars
。market1501_reid
。super_resolution
。icdar_detection
。icdar13_recognition
。brats
。movie_lens_converter
。brats_numpy
。wmt
。common_semantic_segmentation
。camvid
。- …
大家可以在这个链接上了解更多的信息。链接如下:http://docs.openvinotoolkit.org/2019_R3.1/_tools_accuracy_checker_accuracy_checker_annotation_converters_README.html
/。
后记
今天讲完了OpenVINO在Int8量化之前如何将我们的原始数据集转为Annotations文件以及明确精度检查工具(Accuracy Checker Tool)需要的配置文件中启动器的设置细节,相信配合昨天的文档,使用OpenVINO做Int8量化流程就很清晰了,笔者刚刚成功Int8量化一个分类模型,有问题可以互相交流。
推荐阅读
- 深度学习算法优化系列四 | 如何使用OpenVINO部署以Mobilenet做Backbone的YOLOv3模型?
- YOLOv3-tiny在VS2015上使用Openvino部署
- 深度学习算法优化系列十四 | OpenVINO Int8量化文档翻译(Calibaration Tool)
欢迎关注GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。( • ̀ω•́ )✧
有对文章相关的问题,或者想要加入交流群,欢迎添加BBuf微信: