如何使能AIPP
通过在模型转换过程中开启AIPP功能,可以在推理之前就完成所有的数据处理;由于用的是专门的加速模块实现并保证性能,从而可以不让图像处理成为推理阶段的瓶颈,图像处理方式比较灵活。本章节给出如何在模型转换阶段开启AIPP功能。
本章节以TensorFlow框架ResNet50网络模型为例,演示如何通过模型转换使能静态AIPP功能,使能AIPP功能后,若实际提供给模型推理的测试图片不满足要求(包括图片格式,图片尺寸等),经过模型转换后,会输出满足模型要求的图片,并将该信息固化到转换后的离线模型中(模型转换后AIPP功能会以aipp算子形式插入离线模型中)。
ResNet50网络模型要求的图片格式为RGB,图片尺寸为224*224,另外,假设提供给模型推理的测试图片尺寸为250*250,图片格式为YUV420SP,有效数据区域从左上角(0, 0)像素开始,使能AIPP过程中所需操作如表1分析所示。
分类 |
ResNet50网络模型要求 |
实际提供给模型推理的测试图片 |
所需操作 |
---|---|---|---|
图片格式 |
RGB |
YUV420SP |
该场景下需要开启AIPP的色域转换功能,将YUV420SP格式转成模型要求的RGB格式,关于色域转换功能详细说明请参见色域转换配置说明。 |
图片尺寸 |
224*224 |
250*250 |
提供的测试图片尺寸250*250大于224*224,该场景下需要开启AIPP抠图功能,并且抠图起始位置水平、垂直方向坐标load_start_pos_h、load_start_pos_w为0,执行推理时,将从(0, 0)点开始选取224*224区域的数据。 |
详细实现步骤如下:
- 获取TensorFlow网络模型。
- 构造AIPP配置文件insert_op.cfg。
静态AIPP配置模板主要由如下几部分组成:AIPP配置模式(静态AIPP或者动态AIPP),原始图片信息(包括图片格式,以及图片尺寸),改变图片尺寸(抠图,补边)、色域转换功能等,如下分别介绍如何进行配置。
- AIPP配置模式由aipp_mode参数决定,静态场景下的配置示例如下:
aipp_mode : static #static表示配置为静态AIPP
- 配置原始图片信息。
input_format : YUV420SP_U8 #输入给AIPP的原始图片格式 src_image_size_w : 250 #输入给AIPP的原始图片宽高 src_image_size_h : 250
- 改变图片尺寸。
改变图片尺寸由抠图和补边等功能完成,本示例需要配置抠图起始位置,抠图后的图片大小等信息,若抠图后图片尺寸仍旧不满足模型要求,还需要配置补边功能。
而AIPP提供了更为方便的配置方式,就是若开启抠图功能,并且不配置补边功能,抠图大小可以取值为0或者不配置,此时抠图大小的宽和高来自模型--input_shape中的宽和高。本示例中我们不配置抠图大小,配置示例如下:crop: true #抠图开关,用于改变图片尺寸 load_start_pos_h: 0 #抠图起始位置水平、垂直方向坐标 load_start_pos_w: 0
- 色域转换功能。色域转换功能由csc_switch参数控制,并通过色域转换系数matrix_r*c*、通道交换rbuv_swap_switch等参数配合使用。AIPP提供了一个比较方便的功能,就是一旦确认了AIPP处理前与AIPP处理后的图片格式,即可确定色域转换相关的参数值,用户无需修改,即上述参数都可以直接从模板中进行复制,模板示例以及更多配置模板请参见色域转换配置说明。如下为该场景下的配置示例:
csc_switch : true #色域转换开关,true表示开启色域转换 rbuv_swap_switch : false #通道交换开关(R通道与B通道交换开关/U通道与V通道交换),本例中不涉及两个通道的交换,故设置为false,默认为false matrix_r0c0 : 256 #色域转换系数 matrix_r0c1 : 0 matrix_r0c2 : 359 matrix_r1c0 : 256 matrix_r1c1 : -88 matrix_r1c2 : -183 matrix_r2c0 : 256 matrix_r2c1 : 454 matrix_r2c2 : 0 input_bias_0 : 0 input_bias_1 : 128 input_bias_2 : 128
将上述所有的参数组合到insert_op.cfg文件中,即为我们需要构造的AIPP配置文件,完整示例如下:
aipp_op { aipp_mode : static #AIPP配置模式 input_format : YUV420SP_U8 #输入给AIPP的原始图片格式 src_image_size_w : 250 #输入给AIPP的原始图片宽高 src_image_size_h : 250 crop: true #抠图开关,用于改变图片尺寸 load_start_pos_h: 0 #抠图起始位置水平、垂直方向坐标 load_start_pos_w: 0 csc_switch : true #色域转换开关,true表示开启色域转换 rbuv_swap_switch : false #通道交换开关 matrix_r0c0 : 256 #色域转换系数,用户无需修改 matrix_r0c1 : 0 matrix_r0c2 : 359 matrix_r1c0 : 256 matrix_r1c1 : -88 matrix_r1c2 : -183 matrix_r2c0 : 256 matrix_r2c1 : 454 matrix_r2c2 : 0 input_bias_0 : 0 input_bias_1 : 128 input_bias_2 : 128 }
您可以根据AIPP配置示例或典型场景样例参考章节获取更多场景AIPP配置示例,如果上述示例仍旧无法满足要求,则需要参见配置文件模板自行构造配置文件。将上述insert_op.cfg文件上传到ATC工具所在Linux服务器。
- AIPP配置模式由aipp_mode参数决定,静态场景下的配置示例如下:
- atc命令中加入--insert_op_conf参数,用于插入aipp预处理算子,执行如下命令生成离线模型。(如下命令中使用的目录以及文件均为样例,请以实际为准)
atc --model=$HOME/module/resnet50_tensorflow*.pb --framework=3 --output=$HOME/module/out/tf_resnet50 --soc_version=<soc_version> --insert_op_conf=$HOME/module/insert_op.cfg
关于参数的详细解释以及使用方法请参见参数说明。若提示如下信息,则说明模型转换成功。
1
ATC run success, welcome to the next use.
成功执行命令后,在--output参数指定的路径下,可查看离线模型(如:tf_resnet50.om)。
- (可选)如果用户想查看转换后离线模型中aipp算子的相关信息,则可以将上述离线模型转成json文件查看,命令如下:
atc --mode=1 --om=$HOME/module/out/tf_resnet50.om --json=$HOME/module/out/tf_resnet50.json
如下为json文件中带有aipp信息的样例(如下样例中所有aipp属性值都为样例,请以用户实际构造的配置文件为准):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
{ "key": "aipp", "value": { "func": { "attr": [ { "key": "mean_chn_0", "value": { "i": 0 } }, { "key": "mean_chn_1", "value": { "i": 0 } }, { "key": "mean_chn_2", "value": { "i": 0 } }, { "key": "mean_chn_3", "value": { "i": 0 } }, { "key": "csc_switch", "value": { "b": true } }, { "key": "input_format", "value": { "i": 1 } }, { "key": "input_bias_0", "value": { "i": 0 } }, { "key": "input_bias_1", "value": { "i": 128 } }, { "key": "input_bias_2", "value": { "i": 128 } }, { "key": "aipp_mode", "value": { "i": 1 } }, { "key": "src_image_size_h", "value": { "i": 250 } }, { "key": "crop_size_h", "value": { "i": 0 } }, { "key": "matrix_r0c0", "value": { "i": 256 } }, { "key": "matrix_r0c1", "value": { "i": 0 } }, { "key": "matrix_r0c2", "value": { "i": 359 } }, { "key": "src_image_size_w", "value": { "i": 250 } }, { "key": "crop_size_w", "value": { "i": 0 } }, { "key": "rbuv_swap_switch", "value": { "b": false } }, { "key": "padding", "value": { "b": false } }, { "key": "ax_swap_switch", "value": { "b": false } }, { "key": "top_padding_size", "value": { "i": 0 } }, { "key": "matrix_r1c0", "value": { "i": 256 } }, { "key": "matrix_r1c1", "value": { "i": -88 } }, { "key": "matrix_r1c2", "value": { "i": -183 } }, { "key": "resize", "value": { "b": false } }, { "key": "resize_output_h", "value": { "i": 0 } }, { "key": "related_input_rank", "value": { "i": 0 } }, { "key": "load_start_pos_h", "value": { "i": 0 } }, { "key": "matrix_r2c0", "value": { "i": 256 } }, { "key": "matrix_r2c1", "value": { "i": 454 } }, { "key": "matrix_r2c2", "value": { "i": 0 } }, { "key": "resize_output_w", "value": { "i": 0 } }, { "key": "var_reci_chn_0", "value": { "f": "1" } }, { "key": "var_reci_chn_1", "value": { "f": "1" } }, { "key": "var_reci_chn_2", "value": { "f": "1" } }, { "key": "load_start_pos_w", "value": { "i": 0 } }, { "key": "var_reci_chn_3", "value": { "f": "1" } }, { "key": "single_line_mode", "value": { "b": false } }, { "key": "output_bias_0", "value": { "i": 16 } }, { "key": "output_bias_1", "value": { "i": 128 } }, { "key": "output_bias_2", "value": { "i": 128 } }, { "key": "right_padding_size", "value": { "i": 0 } }, { "key": "bottom_padding_size", "value": { "i": 0 } }, { "key": "min_chn_0", "value": { "f": "0" } }, { "key": "min_chn_1", "value": { "f": "0" } }, { "key": "min_chn_2", "value": { "f": "0" } }, { "key": "min_chn_3", "value": { "f": "0" } }, { "key": "crop", "value": { "b": false } }, { "key": "cpadding_value", "value": { "f": "0" } }, { "key": "left_padding_size", "value": { "i": 0 } } ] } } }