4. RbCompiler使用与模型部署指南
-
Compiler使用与模型部署指南
通过本教程,用户能够了解或掌握:
- 如何通过
RainBuilder
将模型部署至雨人FPGA加速卡。 - 编译器命令行工具RbCli的使用。
- 编译器Runtime的使用。
Note:
- 本教程中各步骤均通过提前编写好的python文件实现,详细的实现方法请参考对应.py文件。
- Linux用户需要进入docker,并在docker中执行本教程中涉及compiler的所有步骤。docker的进入方法如下:
sudo docker start Rainbuilder sudo docker exec -ti Rainbuilder bash
1. Rainbuilder Compiler介绍与说明
在“CAISA架构与Rainbuilder编译工具介绍”中我们已经介绍了
Compiler
。Compiler
通过命令行工具RbCli
实现对网络模型进行解析和转换。RbCli
命令由五个部分组成:RbCli freeze
、RbCli sg
、RbCli quant
、RbCli opt
、RbCli export
,描述如下:$ RbCli Usage: RbCli [OPTIONS] COMMAND [ARGS]... RbCompiler CLI: a command-line tool for the RainBuilder Compiler. Options: --debug / --no-debug -v, --version --help Show this message and exit. Commands: export Export model coefficient from SG IR freeze Freeze a TensorFlow model from checkpoints opt Optimization SG from given SG IR quant Quant SG from given SG IR sg Generate SG IR from given frozen model
Note:
我们在Hands_on
文件夹下的compiler
文件夹中预置了本教程所需的所有指令脚本,用户可以通过依次运行这些脚本完成模型的编译。本教程的讲解也将基于这些脚本进行。2. 模型预处理
由于模型在训练结束之后仍然保留着训练的状态,比如数据的输入仍然为一个队列,输入的
shape
的batch_size
仍然为一个比较大的值。因此,在使用compiler
进行模型编译之前,我们需要对模型进行一些预处理,使其能够被compiler
正确编译。以
LeNet
为例,以下为LeNet
的模型结构:def mnist_model_fn(inputs, mode): """Model function for LeNet.""" with tf.variable_scope("Lenet"): input_layer = tf.reshape(inputs, [-1, 28, 28, 1]) with tf.variable_scope("conv1"): conv1 = tf.layers.conv2d(inputs=input_layer, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) with tf.variable_scope("pool1"): pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) with tf.variable_scope("conv2"): conv2 = tf.layers.conv2d(inputs=pool1, filters=64, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) with tf.variable_scope("pool2"): pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2) pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 64]) with tf.variable_scope("fc1"): dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu) dropout = tf.layers.dropout(inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN) with tf.variable_scope("fc2"): logits = tf.layers.dense(inputs=dropout, units=10) return logits
之后我们需要将其输入设置为
placeholder
,并且将batch_size
置1。def restore(ckpt_filename, output_path): """ Args: ckpt_filename: Original checkpoint file path, such as ~/tmp/lenet/model.ckpt-2000. output_path: Newly generated checkpoint file path, such as ~/tmp/new_lenet/model.ckpt """ # We use tf.placeholder as input and set the batch size to 1 x = tf.placeholder(tf.float32, shape=[1, 28, 28, 1], name="img") logits = mnist_model_fn(x, False) with tf.Session() as sess: saver = tf.train.Saver() saver.restore(sess, ckpt_filename) saver.save(sess, output_path)
完成了模型预处理后,模型便能被
compiler
正确编译。Note:
在“目标检测模型训练教程”中,我们已经使用./5_run_truncate_model.sh
脚本完成了模型的预处理。对于想要编译自己算法的用户,需要按照以上步骤相关操作。3. RbCli的使用步骤
在“目标检测模型训练教程”中,我们在
/algorithm
路径下得到了一个经过训练的推演模型inference_model
。inference_model
文件中的文件结构如下所示:--inference_model |--ckpt.meta |--ckpt.data-00000-of-00001 |--ckpt.index |--checkpoint
接下来我将以该推演模型为基础,一步步讲解如何通过
compiler
将该模型部署在雨人FPGA加速卡上。3.1 冻结模型
RbCli freeze
3.1.1 使用方式
RbCli freeze
的使用方式如下,其中[Model_dir]
为训练完成的模型的路径。RbCli freeze [Model_dir] -m [Output_path]
3.1.2 命令描述
冻结命令
RbCli freeze
是将TensorFlow checkpoint路径下模型训练完成后的结果转化为冻结模型*.pb
,一个训练完成的神经网络模型在checkpoint
文件夹路径下应该包含以下三个文件:*.meta
: 模型的Meta信息。*.data*
: 训练数据文件。*.index
: 索引文件。
Note:
在模型训练过程中,TensorFlow会保存所有阶段性训练的结果。在进行冻结模型前,需要在checkpoint文件中选择其中一个训练结果的文件路径,不能将所有保存下来的训练路径都存放在checkpoint文件中。以上三个文件为
RbCli freeze
的输入,输出为冻结模型文件*.pb
,它定义了推理图的结构与各层神经网络的参数。3.1.3 命令参数介绍
RbCli freeze
的具体描述如下:$ RbCli freeze --help Usage: RbCli freeze [OPTIONS] MODEL_DIR Freeze a TensorFlow model from checkpoints Options: -m, --model-file PATH Freeze model file path with .pb suffix. If it is not specified, default generated in the current directory, name model.pb -o, --output-node-names TEXT Output node names, comma separated. If it is not specified, the default by RbCli to find and then you choose. --help Show this message and exit.
-
MODEL_DIR
:必需参数,代表模型文件的存放路径。 -
--model-file
: 可选参数, 用于指定输出的*.pb
文件的名称,如果不指定具体名称, 会在当前执行命令的路径下生成一个名称为model.pb
的文件。 -
--output-node-names
: 可选参数,定义指定冻结的节点,如果需要多个输出节点,需要输入输出的节点名称并以逗号分开。如果该参数没有定义,RbCli
会自动分析模型并找出有可能的输出节点并选择他们。
3.1.4 使用实例
本示例的模型checkpoint文件保存在
/algorithm/inference_model
文件夹中。进入
compiler
文件夹,其中1_RbCli_freeze.sh
为冻结模型脚本。通过单击鼠标右键打开终端,输入指令cat 1_RbCli_freeze.sh
命令来观察脚本中具体的指令内容。1_RbCli_freeze.sh
脚本中的命令如下:RbCli freeze ../algorithm/inference_model \ #指定需要进行冻结的模型的路径 --model-file=./model_compilation/ssd.pb #将冻结完成从的模型存放至指定路径下,并将冻结模型取名为ssd.pb
之后运行该脚本,即可进行模型冻结。
./1_RbCli_freeze.sh
运行后,会出现如下信息,用于指定输出节点。
You haven't specified any output node, please select one or many from the following list: [ 0] ssd_KYnet_v2/softmax_4/Reshape_1 [ 1] ssd_KYnet_v2/block8_box/Reshape [ 2] ssd_KYnet_v2/softmax_2/Reshape_1 [ 3] ssd_KYnet_v2/softmax/Reshape_1 [ 4] ssd_KYnet_v2/block7_box/Reshape [ 5] ssd_KYnet_v2/softmax_1/Reshape_1 [ 6] ssd_KYnet_v2/block4_box/Reshape [ 7] ssd_KYnet_v2/block9_box/Reshape [ 8] ssd_KYnet_v2/block10_box/Reshape [ 9] ssd_KYnet_v2/softmax_3/Reshape_1 Please enter the indices of output nodes, separated by ','. If you want to select all, please enter 'all':
如果只有部分节点是输出节点,则可以通过节点序号来选择输出的节点名称(例如:
0,1,2,3
),如果所有节点都是输出节点,则可以直接输入all
来选择所有输出节点。输入
all
之后,运行成功的结果显示如下:Select output node names: ['ssd_KYnet_v2/block9_box/Reshape', 'ssd_KYnet_v2/softmax/Reshape_1', 'ssd_KYnet_v2/block7_box/Reshape', 'ssd_KYnet_v2/block10_box/Reshape', 'ssd_KYnet_v2/block8_box/Reshape', 'ssd_KYnet_v2/softmax_4/Reshape_1', 'ssd_KYnet_v2/softmax_1/Reshape_1', 'ssd_KYnet_v2/softmax_3/Reshape_1', 'ssd_KYnet_v2/block4_box/Reshape', 'ssd_KYnet_v2/softmax_2/Reshape_1'] Freezing /tmp/ssd_ckpt to ssd.pb ...
3.1.5 其他用法
也可以通过在运行
RbCli feeze
命令时,通过指定输出节点名称指定输出节点,命令如下所示:RbCli freeze /tmp/ssd_ckpt \ --model-file=/tmp/ssd_model/ssd.pb \ --output-node-names=ssd_KYnet_v2/softmax_4/Reshape_1,....
输出结果如下所示:
Output node names: ['ssd_KYnet_v2/softmax_3/Reshape_1', 'ssd_KYnet_v2/block7_box/Reshape', 'ssd_KYnet_v2/softmax_4/Reshape_1', 'ssd_KYnet_v2/block4_box/Reshape', 'ssd_KYnet_v2/softmax_2/Reshape_1', 'ssd_KYnet_v2/softmax/Reshape_1', 'ssd_KYnet_v2/block8_box/Reshape', 'ssd_KYnet_v2/block9_box/Reshape', 'ssd_KYnet_v2/block10_box/Reshape', 'ssd_KYnet_v2/softmax_1/Reshape_1'] Freezing /tmp/ssd_ckpt to ssd.pb ...
由于
RbCli
可以自动搜索输出节点,在运行RbCli freeze
时不要指定节点名称或序号,让编译器自动完成输出节点检测。只有当特定的输出节点没有找到,或者某一个节点名称出现错误时,再使用指定节点输出功能。Note:
可以通过使用RbCli freeze --help
查看RbCli freeze
的命令选项。3.2 生成SG
RbCli sg
3.2.1 使用方式
RbCli sg
的使用方式如下:RbCli sg [Model_file]
3.2.2 命令描述
RbCli sg
命令以上一步的冻结模型*.pb
文件作为输入,生成SG IR文件,SG IR是流图的中间表达形式。流图主要由两部分构成:- 模型结构文件:使用
protobuf
协议,保存在以.pbtxt
为后缀的文件中。 - 模型参数文件:使用
h5py
格式保存在以.h5
为后缀的文件中
3.2.3 命令参数介绍
RbCli sg
指令的具体描述如下:$ RbCli sg --help Usage: RbCli sg [OPTIONS] MODEL_FILE Generate SG IR from given frozen model Options: -n, --model-name TEXT Model name. -o, --output-dir PATH Output directory, save generated SG IR. -s, --input-image-shape TEXT A default shape of the input image for the model. -f, --data-format TEXT One of channels_last or channels_first, like 'NCHW' is 0,2,3,1. -c, --custom-layer-config PATH -v, --version TEXT Specify the generated SG IR version, you can choose v1 and v2, default is v2 --with-json BOOLEAN Whether to export the json file of SG IR, default False --with-coeff BOOLEAN Whether to export model coefficients such as weights and bais, default False --help Show this message and exit.
-n
用于修改*.pb
文件的名称。-o
用于指定输出的模型描述文件的存放路径,若不指定,RbCli将会在把输出的文件保存当前目录下。-s
用于指定模型输入图片的形状,如1,256,256,3。如果输入的模型shape是动态变换的,使用该参数设置特定的shape。-f
选择数据的shape的排列方式,可以输入0,1,2,3
,1代表batch size,2代表channel,3代表height,4代表width。-c
用于指定用户模型中自定义层配置文件(json)的路径。-v
用于为*.pbtxt
设置版本号,可以输入V1
或者V2
,默认为V2
。
--with-json
: 导出json文件,默认为false
。--with-coeff
: 设定是否导出模型的参数比如权重weights
和偏置bias
。
3.2.3 使用实例
在上一步使用
RbCli freeze
完成冻结模型的操作后,可以在/compiler/model_compilation
中得到如下文件结构:--model_compilation |--ssd.pb
在
compiler
路径下有脚本2_RbCli_sg.sh
,该脚本用于模型SG的生成,通过运行cat 2_RbCli_sg.sh
命令可以观察脚本中的具体命令内容:RbCli sg ./model_compilation/ssd.pb \ --output-dir ./model_compilation/
该指令的作用是通过冻结模型文件
ssd.pb
生成数据流图SG IR
,并制定输出到/model_compilation
路径下。输入如下命令并回车以执行生SG操作:
./2_RbCli_sg.sh
运行该命令后,运行显示如下
2019-04-23 07:55:00 INFO loading TensorFlow model from model.pb. 2019-04-23 07:55:00 INFO Without specifying an input image shape, find the shape in the model as [1, 256, 256, 3]. 2019-04-23 07:55:00 INFO Rewriting the input TensorFlow Graph for convenient SG generation. 2019-04-23 07:55:00 INFO Running model inference, it may take a while ... 2019-04-23 07:55:00 INFO Extracted 61 sub-graph patterns from the model 2019-04-23 07:55:00 WARNING We cannot find "data_format" in the placeholder. We will try to resolve "data_format" in post-process Generating SG from model.pb to ./ssd_model/model_sg.pbtxt SG written to protobuf file ./ssd_model/model_sg.pbtxt Dumping data to h5 file ./ssd_model/model_sg.h5
得到以下结果:
--model_compilation |--ssd.pb |--ssd_sg.pbtxt ---------------> Model structure file. |--ssd_sg.h5 ---------------> Model data, h5py format
3.3 量化
RbCli quant
3.3.1 使用方式
RbCli quant
命令的使用方法如下:RbCli quant [*.pbtxt] [*.h5] [preprocess_script] \ --preprocess-range -123, 151 \ --img-dir [Database_path] \ --output-dir [Frozen_Model_path] \ --with-coeff True
3.3.2 命令描述
可以使用
RbCli quant
对SG IR进行8-bit量化操作。在执行此操作前,用户需要提前准备一定量的实际数据,数据应尽量与目标场景中的实际数据相似,并且使用python作为数据的处理方式。3.3.3 命令参数介绍
RbCli quant
命令的详细描述如下:$ RbCli quant --help Usage: RbCli quant [OPTIONS] SG_DEF_FILE SG_H5_FILE PREPROCESS_PY Quant SG from given SG IR Options: --float-coeff PATH Folder path for model coefficients. --img-dir PATH Input data set directory path used for SG quantization, default current directory. --preprocess-range TEXT Theoretical input range of the model after pre- processing. the format is 'min,max', defalut is 0,255 --output-dir PATH Output directory, save Quant SG IR. --with-sim BOOLEAN Save the pbtxt used by the runtime sim model. --with-fakequant BOOLEAN Save quantized results. --with-coeff BOOLEAN Whether to export model quant coefficients. --gpu-config PATH GPU configuration file. --help Show this message and exit.
--preprocess-range
在对输入图片进行前处理之后,理论上的模型输入值范围,该参数指定最小值与最大值min,max
, 默认的输入范围是0,255。--img-dir
: 在进行SG IR量化操作所需要输入数据路径。--output-dir
: 量化结果的输出路径。--with-coeff
: 设定是否导出模型的参数比如权重weights
和偏置bias
。--gpu-config
: GPU配置文件,使量化操作在GPU上运行。由RainBuilder Compiler提供配置文件。--with-sim
: 调试参数,实际使用中无需特别指定。--with-fakequant
: 调试参数,实际使用中无需特别指定。
3.3.4 使用实例
在
compiler
下有一个名称为3_RbCli_quant.sh
的脚本,同样地,运行cat 3_RbCli_quant.sh
命令可以观察脚本中的指令内容:RbCli quant ./model_compilation/ssd_sg.pbtxt \ #模型结构文件 ./model_compilation/ssd_sg.h5 \ #模型参数文件 ./preprocess_ssd.py \ #前处理脚本 --preprocess-range -123,151 \ --img-dir ./fddb/ \ --with-coeff True \ --output-dir ./model_compilation/
执行量化操作所需要的3个必要文件/参数:
- ssd_sg.pbtxt: 模型结构文件。
- ssd_sg.h5: 模型参数。
- preprocess_ssd.py: SSD模型的前处理脚本。
通过执行
./3_RbCli_quant.sh
脚本进行量化操作后,运行过程显示如下:2019-04-23 08:22:14 INFO Exporting node ssd_KYnet_v2/block10_box/conv_loc/Conv2D_weights's data 2019-04-23 08:22:14 INFO Exporting node ssd_KYnet_v2/block10_box/conv_loc/Conv2D_bias's data 2019-04-23 08:22:14 INFO Exporting node ssd_KYnet_v2/block10_box/conv_cls/Conv2D_weights's data 2019-04-23 08:22:14 INFO Exporting node ssd_KYnet_v2/block10_box/conv_cls/Conv2D_bias's data 2019-04-23 08:22:14 INFO Export model coeff succeeded. 2019-04-23 08:22:15 INFO Create a quantitative training sg successfully. 231img [00:49, 1.88img/s]
由于fddb数据库中有大概2800张人脸图片,因此在CPU上需要花费较长的时间完成量化。
量化完成之后,得到的结果如下:
--model_compilation |--ssd.pb |--ssd_sg.pbtxt ---------------> Model structure file. |--ssd_sg.h5 ---------------> Model data, h5py format |--ssd_float_coeff ---------------> Unquantized model coefficients |--ssd_quant_sg.pbtxt ---------------> Quantized model structure file |--ssd_quant_coeff ---------------> Quantized model coefficients
3.4 优化命令
RbCli opt
3.4.1 使用方式
RbCli opt
命令的使用方式如下,其中opt_config
为板卡的描述文件,该文件用于分配模型中不同节点的运算执行设备。RbCli opt [*_sg.pbtxt] [*_sg.h5] [opt_config] -o [Output_path]
3.4.2 命令描述
如果需要将神经网络模型部署在雨人FPGA加速卡上执行,则需要生成匹配硬件计算资源的模型文件。所以,本步骤首先根据硬件的计算资源配置,将多个SGNode算子操作融合为一个计算操作,节省IO的时间损耗;另外,由于每个硬件板卡的计算资源和架构各有不同,不是所有SGNode都可以部署FPGA上实现硬件加速,有一些特殊计算操作需要分配到CPU上运行;最后,该步骤还会根据硬件加速板卡的硬件资源配置评估最佳的计算资源和并行度参数。
RbCli opt
命令实现2种针对FPGA硬件的优化:优化策略 功能 Device 为SG节点分配执行设备(FPGA或CPU) Fusion 将多个算子融合为一个以提高资源和计算效率 3.4.3 命令参数介绍
RbCli opt
命令的详细描述如下:$ RbCli opt --help Usage: RbCli opt [OPTIONS] SG_DEF_FILE SG_H5_FILE OPT_CONFIG Optimization SG from given SG IR Options: -o, --output-dir PATH Output directory, save Opt SG IR. If not specified, the default is to the directory where the sg_def_file file is located. --with-json BOOLEAN Export json file, default False --with-coeff BOOLEAN Whether to export model parameters such as weights and bais --help Show this message and exit.
SG_DEF_FILE
: 量化后的模型结构。SG_H5_FILE
: 模型参数。OPT_CONFIG
: 板卡硬件参数定义文件。o
:用于指定输出路径
3.4.4 使用实例
在
compiler
路径下运行cat 4_RbCli_opt.sh
命令可观察脚本中的具体命令:RbCli opt ./model_compilation/ssd_quant_sg.pbtxt \ ./model_compilation/ssd_sg.h5 \ CAISA.pbtxt \ #板卡参数定义文件 --output-dir ./model_compilation/
在板卡参数定义文件
CAISA.pbtxt
中,我们声明了雨人FPGA加速卡V3.1所具有的硬件资源,以及节点融合的规则。运行
./4_RbCli_opt.sh
之后,其过程显示如下:2019-04-23 08:56:29 INFO Load optimize config from file: rainman_board_v3_8bit.pbtxt 2019-04-23 08:56:29 INFO Running optimization pass "Device Optimization" ... 2019-04-23 08:56:29 INFO Running optimization pass "Fold Pad Optimisation" ... 2019-04-23 08:56:29 INFO Running optimization pass "Fusion Optimization" ... 2019-04-23 08:56:29 INFO Running optimization pass "Custom Fusion Optimization" ... 2019-04-23 08:56:29 INFO Running optimization pass "Hardare Fusion Optimisation" ... 2019-04-23 08:56:29 INFO Hardare Fusion Optimisation optimization pass over. 2019-04-23 08:56:29 INFO Running optimization pass "Data Copy Optimisation" ... Optimization SG written to protobuf file /workspace/test/ssd_model/ssd_opt_sg.pbtxt
执行优化命令之后得到
ssd_opt_sg.pbtxt
文件,该文件为根据硬件板卡配置优化后的模型结构文件:--model_compilation |--ssd.pb |--ssd_sg.pbtxt ---------------> Model structure file. |--ssd_sg.h5 ---------------> Model data, h5py format |--ssd_float_coeff ---------------> Unquantized model coefficients |--ssd_quant_sg.pbtxt ---------------> Quantized model structure file |--ssd_quant_coeff ---------------> Quantized model coefficients |--ssd_opt_sg.pbtxt ---------------> Quantized & Optimized model structure file
3.5 导出
RbCli export
3.5.1 使用方式
RbCli export
的使用方式如下:RbCli export [SG_DEF_FILE] [SG_H5_FILE] -o [Output_path]
3.5.2 命令描述
将SG IR模型系数导出,导出的参数数据类型(32bit或8bit)根据
*.pbtxt
模型文件中节点数据类型不同而不同, 导出的系数将以*.bin
文件的形式保存。3.5.3 指令说明
$ RbCli export --help Usage: RbCli export [OPTIONS] SG_DEF_FILE SG_H5_FILE Export model coefficient from SG IR Options: -o, --output-dir PATH The data storage folder path, if not specified, the default is to the directory where the sg_def_file file is located. --with-feature-map BOOLEAN Whether to export the feature map --help Show this message and exit.
3.5.4 使用实例
在
compiler
路径下执行运行如下命令以导出模型及其参数:./5_RbCli_export.sh
该脚本中的具体命令如下:
RbCli export ./model_compilation/ssd_quant_sg.pbtxt \ ./model_compilation/ssd_sg.h5 \ --output-dir ./model_compilation/quant
最后得到:
--model_compilation |--ssd.pb |--ssd_sg.pbtxt ---------------> Model structure file. |--ssd_sg.h5 ---------------> Model data, h5py format |--ssd_float_coeff ---------------> Unquantized model coefficients |--ssd_quant_sg.pbtxt ---------------> Quantized model structure file |--ssd_quant_coeff ---------------> Quantized model coefficients |--ssd_opt_sg.pbtxt ---------------> Quantized & Optimized model structure file |--quant | |--float_little
至此,模型的结构描述文件
ssd_opt_sg.pbtxt
和模型的参数文件quant
生成完毕,通过在FPGA上部署这两个文件,便能够实现对该模型的加速。4. 模型在FPGA上的部署流程
4.1 登录雨人FPGA加速卡
在“板卡架构升级与编译环境安装指南”中,我们已经介绍了如何对虚拟机进行配置并登录板卡。在本教程中,我们已经提前对虚拟机进行了相关配置,用户只需在连接板卡后,在右上角菜单栏中的
控制->设置->网路
中选择对应连接界面,同时在左上角的网络图标中选择board
网络即可。连接成功后,可以通过
ping 192.168.123.8
来测试连接是否正常。确认连接正常后,便可以通过如下命令登录板卡。
ssh root@192.168.123.8 #板卡登录密码:letmein
如下图所示,当出现
#
时说明已经成功登录板卡。4.2 模型部署文件准备
SSD模型在雨人FPGA加速卡上部署需要三个模型相关文件,分别为:
post_param
,后处理文件,该文件在"目标检测模型训练教程"中生成,存放路径为/Hands_on/algorithm/
ssd_opt_sg.pbtxt
,量化并优化后的模型结构文件,存放路径为/Hands_on/compiler/model_compilation/
quant
,量化并优化后的模型参数文件,存放路径与结构文件一致,为/Hands_on/compiler/model_compilation/
我们可以通过简单的
复制+粘贴
将这三个文件拷贝/Hands_on/deployment/object_detection/ssd
下,至此,/depoyment/object_detection/ssd
的文件结构为:--ssd |--ssd_opt_sg.pbtxt |--ssd_config.txt |--post_param |--quant | |--float_little
4.3 模型文件向板卡的拷贝
在
/Hands_on/deployment
路径下打开新终端,通过如下命令将整个object_detection
文件夹拷贝至板卡中:sudo scp -r ./object_detection root@192.168.123.8:/ #密码:letmein
之后,在板卡中进入
deployment
文件夹,通过执行./run.sh
指令运行模型。./run.sh
脚本中的具体指令如下:export LD_LIBRARY_PATH=/cr_lib #导入环境变量 ./image_object_detection \ --sg ./ssd/ssd_opt_sg.pbtxt \ --data ./ssd/quant/float_little/ \ --config_file ./ssd/ssd_config.txt \ #SSD后处理配置文件 --images ./images_ssd/ \ --param_path ./ssd/post_param/ \ --batch 1 \ --num_threads 2 \ --async=True \ --processor ssd
运行过程如下图所示:
4.4 查看运行结果
模型运行的结果保存在板卡
/deployment/images_ssd
中,并以*_result.jpg
结尾。在桌面上打开一个终端,输入如下指令,将结果从板卡中拷贝至桌面上:
sudo scp root@192.168.123.8:/deployment/images_ssd/*_result.jpg ~/Desktop #其中密码为letmein
其中一个结果如下:
4.5 可执行文件
image_object_detection
的说明可以发现,在
./run.sh
脚本中,我们使用了一个名为image_object_detection
的可执行程序,并向其输入了相应的参数以执行模型。image_object_detection
是我们预先编译好的runner程序,该程序基于runtime
开发。我们将会在“RbRuntime使用指南”中详细介绍具体的开发方法。5. 练习: 预训练图像分类算法的部署
我们在
/Hands_on/deployment
中还放置了一个经过训练的ResNet-50模型image_classifier
。用户可以通过同第三节的步骤一般,将整个
image_classifier
拷贝至板卡中,并运行run.sh
脚本进行运算。并将运算结果拷贝出来,观察结果。
- 如何通过
-
@Corerain 是因为他这个图片是黑白的所以影响到量化结果了吗
-
@Corerain 那不是人脸识别,量化部分也不需要修改吗
-
@Corerain 好的十分感谢!
-
@chang 您可以使用典型的标注工具如labelme进行标注,之后可以写一个简单的python脚本来重新编排一下标注文件的顺序即可。
-
@赵晨 您好,如果您确认后处理参数无误的话,那我们就会怀疑是量化精度损失的问题,麻烦您确认一下量化突破的是否达到要求(至少500+以上),preprocess.py所执行的操作是否与训练模型是预处理模块的一致,preprocess range是否正确。
同时,您的训练图像的像素分别过于极端的话也会影响量化效果,由于int8所能表达的数据范围远小于float32,因此建议您在训练模型时,可以对输入图像添加z-score归一化、高斯滤波、随机线性扰动等方法使preprocess之后的图像像素分布更加均匀、图像形态更加多样,从而增加模型的泛化能力。
-
@抚风 不需要额外操作,只要在标注时加上类别信息就可以了
-
@Corerain 量化前的
-
@赵晨 请问您在电脑端运行是使用量化前的模型还是量化后的模型运行的呢?
-
@Corerain 在电脑端跑出来的结果是正确的,不知道后续哪里出错了
-
@Corerain 你好,我想你说的是用脚本4_gen_PostParam.sh生成的后处理参数吧?我已经部署到板卡上了,最后显示的结果是这样的
这应该不是nms的问题..
-
@Corerain 如果需要识别多类物体,需要额外改动吗
-
用你们提供的SSD来检测物体,怎么制作自己的训练集呢??
-
@赵晨 您好,根据您的反馈,我们认为应该是板卡上SSD后处理文件和电脑端生成的后处理文件不匹配的问题,麻烦您确认一下这两个后处理文件是否一致。
-
hi @抚风, 如果您想使用我们提供的SSD进行目标检测,那您只需要更换训练样本即可。
-
你好,我利用自己的数据集和教程中给的ssd_v3网络训练了一个模型,在电脑端的测试结果准确。但经过编译后部署到板子上,检测的效果非常混乱,不知道是哪里出现了问题,量化我也用自己的数据集重新做了,结果还是一样,请问可能是什么地方出现了问题?(ssd_config的类别名我改了,是需要修改image_object_detection里面的代码重新编译嘛?)
-
如果我要修改这个案例来进行其他物品的识别,除了训练集外,需要修改哪些内容呢
-
hi @chong,量化这一过程的主要作用是将模型数据从float32压缩到uint8 ,数据压缩不可避免地会带来精度损失,为了降低精度损失,或者说保持模型精度,我们会通过采集量化图片在模型中每一层的数值范围来重新映射并生成新的模型数据。
原则上来说,为了保持模型精度,我们建议应该使用尽量和实际应用场景相贴近的图片进行量化,同时我们建议量化图片的数量应不少于千这个数量级。
-
@傅翀 先通过
ssh root@192.168.123.8
登录至板卡,检查板卡中是否存在/deployment/images_ssd/
这个文件路径。
出现这个问题可能是因为实例中的路径可实际你所使用的板卡路径不一致导致的
-
请问4.4查看运行结果里面,桌面打开终端 输入sudo scp root@192.168.123.8:/deployment/images_ssd/_result.jpg ~/Desktop,然后一直显示找不到
/deployment/images_ssd/1_result.jpg: No such file or directory??如何解决?我在加速卡的#界面已经用ls查询有很多_result,jpg的图片,但是就是在无法将加速卡的结果复制到桌面上