# 演示DEMO

## ​1. DEMO概述

当前SDK内有关于模型转换的一些演示demo:

| 示例目录                       | 功能                                    | 网络模型            | 输入              | 输出          |
| -------------------------- | ------------------------------------- | --------------- | --------------- | ----------- |
| create\_lmdb\_demo         | 基于imageset创建lmdb文件                    | 无               | image set       | lmdb        |
| classify\_demo             | 分类网络模型转换以及推理流程                        | resnet18        | fp32umodel      | int8 umodel |
| detect\_demo               | 人脸检测网络模型转换以及推理流程                      | squeezenet\_21k | fp32umodel      | int8 umodel |
| googlenet\_bmodel\_convert | googlenet转换为int8 bmodel完整流程           | googlenet       | fp32 caffemodel | int8 bmodel |
| resnet50\_bmodel\_convert  | resnet50　caffemodel转换为int8 bmodel完成流程 | resnet50        | fp32 caffemodel | int8 bmodel |

## 2. create\_lmdb\_demo

create\_lmdb\_demo文件路径为： /workspace/examples/calibration/create\_lmdb\_demo demo主要描述了如何使用convert\_imageset来生成量化所使用的lmdb数据集合：

```
  function convert_imageset_to_lmdb_demo()
  {
    rm $IMG_DIR/img_lmdb -rif

    cali_gen_imagelist; ret=$?;
    if [ $ret -ne 0 ]; then echo "#ERROR: cali_gen_imagelist"; return $ret; fi

    # argv[1] : image dir
    # argv[2] : image list
    convert_imageset --shuffle --resize_height=256 --resize_width=256 \
      $IMG_DIR/  $IMG_DIR/ImgList.txt  $IMG_DIR/img_lmdb
    ret=$?; if [ $ret -ne 0 ]; then echo "#ERROR: convt imgage to lmdb"; fi
    echo "#INFO: Convert Images to lmdb done"
    return $ret;
  }
```

其中resize\_width需要根据网络模型的实际输入大小来确定 在此路径下，直接执行启动脚本，可以生成对应的lmdb:

```
  root@cai-thinkpad-t470p:/workspace/examples/calibration/create_lmdb_demo# ./create_lmdb_demo.sh 
  /workspace/examples/calibration/create_lmdb_demo/images /workspace/examples/calibration/create_lmdb_demo
  #INFO: Create Imageset Done
  /workspace/examples/calibration/create_lmdb_demo
  I1008 14:43:46.345486   232 convert_imageset.cpp:86] Shuffling data
  I1008 14:43:46.345930   232 convert_imageset.cpp:89] A total of 2 images.
  I1008 14:43:46.346113   232 db_lmdb.cpp:35] Opened lmdb ./images//img_lmdb
  I1008 14:43:46.370638   232 convert_imageset.cpp:153] Processed 2 files.
  #INFO: Convert Images to lmdb done
  root@cai-thinkpad-t470p:/workspace/examples/calibration/create_lmdb_demo# tree
  .
  |-- create_lmdb_demo.sh
  `-- images
      |-- ImgList.txt
      |-- cat\ gray.jpg
      |-- cat.jpg
      |-- cat_gray.jpg
      |-- fish-bike.jpg
      `-- img_lmdb
          |-- data.mdb
          `-- lock.mdb
```

其中的images/img\_lmdb就是生成的lmdb数据集。用户可以参考此示例生成模型对应的数据集合。

## 3. classify\_demo

主要是使用resnet18.caffemodel如何生成对应的int8 umodel，并验证int8下的精度。 其中自带lmdb文件，并且校准迭代次数简化为10次，方便快速执行：

```
   root@cai-thinkpad-t470p:/workspace/examples/calibration/classify_demo# ./classify_demo.sh 
   FLAGS_iterations = 10
   FLAGS_BITWITH = TO_INT8
   I1008 14:50:15.044811   242 common.cpp:345] use_GPU have not be set !
   I1008 14:50:15.045114   242 calibration_use_pb.cpp:499] Use CPU.
   I1008 14:50:15.056399   242 net.cpp:1420] Initializing net from parameters: 
   name: "ResNet-18"
   state {
     phase: TEST
   }
   layer {
     name: "data"
     type: "Data"
     top: "data"
     top: "label"
     include {
       phase: TEST
     }
     transform_param {
       mirror: false
       crop_size: 224
       mean_value: 103.939
       mean_value: 116.779
       mean_value: 123.68
     }
     data_param {
       source: "./lmdb/imagenet_s/ilsvrc12_val_lmdb"
       batch_size: 1
       backend: LMDB
     }
   }
   ...
   I1008 14:50:34.734228   245 accuracy_layer.cpp:101] use un-unique top_k
   I1008 14:50:34.734349   245 ufw.cpp:297] Batch 9, acc/top-1 = 0
   I1008 14:50:34.734374   245 ufw.cpp:297] Batch 9, acc/top-5 = 1
   I1008 14:50:34.734385   245 ufw.cpp:302] Batch 9 Finished 
   I1008 14:50:34.734391   245 ufw.cpp:305] Loss: 0
   I1008 14:50:34.734407   245 ufw.cpp:313] acc/top-5 = 0.9
   I1008 14:50:34.734426   245 ufw.cpp:313] acc/top-1 = 0.6
   #INFO: Test Resnet-INT8 Done
```

执行后打印上述top\_k的置信度。同时生成了对应的umodel:

```
   root@cai-thinkpad-t470p:/workspace/examples/calibration/classify_demo# tree
   .
   |-- classify_demo.sh
   |-- lmdb
   |   `-- imagenet_s
   |       `-- ilsvrc12_val_lmdb
   |           |-- data.mdb
   |           `-- lock.mdb
   |-- models
   |   |-- resnet18.fp32umodel
   |   |-- resnet18.int8umodel
   |   |-- resnet18.prototxt
   |   |-- resnet18_deploy_fp32_unique_top.prototxt
   |   |-- resnet18_deploy_int8_unique_top.prototxt
   |   |-- resnet18_test_fp32_unique_top.prototxt
   |   `-- resnet18_test_int8_unique_top.prototxt
   `-- resnet18_test_int8_unique_top_accuracy_int8.md
```

## 4. detect\_demo

主要使用squeezenet网络来做detect演示，主要包括：&#x20;

1. 检测程序编译。&#x20;
2. squeezennet int8模型的量化生成。&#x20;
3. 利用int8模型进行人脸检测。 用户可以根据需要参考face\_demo.sh文件的最后几行执行命令。

```
   root@cai-thinkpad-t470p:/workspace/examples/calibration/detect_demo# ./face_demo.sh 
   FLAGS_iterations = 100
   FLAGS_BITWITH = TO_INT8
   I1008 14:59:36.823330   257 common.cpp:345] use_GPU have not be set !
   I1008 14:59:36.823693   257 calibration_use_pb.cpp:499] Use CPU.
   I1008 14:59:36.831105   257 upgrade_proto.cpp:69] Attempting to upgrade input file specified using deprecated input fields: models/squeezenet/squeezenet_21k_test.prototxt
   I1008 14:59:36.831171   257 upgrade_proto.cpp:72] Successfully upgraded file specified using deprecated input fields.
   W1008 14:59:36.831178   257 upgrade_proto.cpp:74] Note that future Ufw releases will only support input layers and not input fields.
   I1008 14:59:36.839711   257 net.cpp:1420] Initializing net from parameters: 
   name: "SqueezeNet"
   state {
     phase: TEST
   }
   layer {
     name: "data"
     type: "Data"
     top: "data"
     top: "label"
     include {
       phase: TEST
     }
     transform_param {
       mean_value: 104
       mean_value: 117
       mean_value: 123
     }
     data_param {
       source: "./lmdb/100_pics_squeezenet_711_400_lmdb"
       batch_size: 1
       backend: LMDB
     }
   }
   ...
   I1008 15:07:12.407119   284 layer.hpp:481] UFW INT8_NEURON MODEL
   final predict 19 bboxes
   ...
```

大约10分钟后，执行完毕，使用in8umodel最终检测出19个目标框，可以查看生成的图片确认。另外可以修改face\_demo.sh中的执行命令，测试fp32网络的检测结果，二者可以比对。

## 5. googlenet\_bmodel\_convert

此示例包含下载作者版模型，并且脚本一键转换模型，用户可以直接基于此demo框架添加私有模型，并修改脚本内对应参数，既可以从caffemodel转成部署使用的bmodel:

```
root@cai-thinkpad-t470p:/workspace/examples/calibration/googlenet_bmodel_convert# ./download_resnet50_model.sh
root@cai-thinkpad-t470p:/workspace/examples/calibration/googlenet_bmodel_convert# ./generate_int8_bmodel.sh

function convert_to_int8_umodel()
{
  calibration_use_pb release \
    -model=./models/googlenet-quantize.prototxt   \
    -weights=./models/bvlc-googlenet.caffemodel \
    -iterations=${CALI_NUM} \
    -bitwidth=TO_INT8

  ret=$?; if [ $ret -ne 0 ]; then echo "#ERROR: googlenet Fp32ToInt8"; popd; return $ret;fi

  echo "#INFO: Run Example (googlenet Fp32ToInt8) Done"
  return $ret;
}

function convert_to_bmodel()
{
  mkdir -p int8model
  bmnetu -model ./models/bvlc-googlenet_deploy_int8_unique_top.prototxt \
       -weight ./models/bvlc-googlenet.int8umodel \
       -max_n 1 \
       -prec=INT8 \
       -dyn=0 \
       -cmp=1 \
       -target=BM1684 \
       -outdir=./int8model
}
```

最终会生成所需bmodel:

```
|-- int8model
|   |-- compilation.bmodel
|   |-- compiler_profile_0.dat
|   |-- input_ref_data.dat
|   `-- output_ref_data.dat
```

并且会验证生成的bmodel的精度是否与原caffemodel一致(bmrt\_test)：

```
******do bmodel test******
[BMRT][deal_with_options:901] INFO : Loop num: 1
begin to cmodel init...
mult engine c_model init
l2_fill complete
npu num = 64
eu num = 32
global mem size = 4294967296
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init 
[BMRT][load_bmodel:660] INFO : Loading bmodel from [./int8model/compilation.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:642] INFO : pre net num: 0, load net num: 1
[BMRT][bmrt_test:503] INFO : ==> running network #0, name: ResNet-50, loop: 0
[BMRT][bmrt_test:614] INFO : net[ResNet-50] stage[0], launch total time is 5297646 us (npu 0 us, cpu 5297646 us)
[BMRT][bmrt_test:650] INFO : +++ The network[ResNet-50] stage[0] cmp success +++
[BMRT][bmrt_test:674] INFO : load input time(s): 0.000130
[BMRT][bmrt_test:675] INFO : calculate  time(s): 5.297647
[BMRT][bmrt_test:676] INFO : get output time(s): 0.000015
[BMRT][bmrt_test:677] INFO : compare    time(s): 0.000044
BMLIB Send Quit Message
```

为方便演示，自带lmdb文件，为Imagenet.

## 6. resnet50\_bmodel\_convert

此demo与googlenet的量化类似，用户可以直接基于此demo框架添加私有模型，并修改脚本内对应参数，既可以从caffemodel转成部署使用的bmodel:

```
function convert_to_int8_umodel()
{
  calibration_use_pb release \
    -model=./models/ResNet-50-quantize.prototxt   \
    -weights=./models/ResNet-50-model.caffemodel \
    -iterations=${CALI_NUM} \
    -bitwidth=TO_INT8

  ret=$?; if [ $ret -ne 0 ]; then echo "#ERROR: Resnet50 Fp32ToInt8"; popd; return $ret;fi

  echo "#INFO: Run Example (Resnet18 Fp32ToInt8) Done"
  return $ret;
}

function convert_to_bmodel()
{
  mkdir -p int8model
  bmnetu -model ./models/ResNet-50-model_test_int8_unique_top.prototxt \
       -weight ./models/ResNet-50-model.int8umodel \
       -max_n 1 \
       -prec=INT8 \
       -dyn=0 \
       -cmp=1 \
       -target=BM1684 \
       -outdir=./int8model
}
```

并且会验证生成的bmodel的精度是否与原caffemodel一致(bmrt\_test)：

```
******do bmodel test******
[BMRT][deal_with_options:901] INFO : Loop num: 1
begin to cmodel init...
mult engine c_model init
l2_fill complete
npu num = 64
eu num = 32
global mem size = 4294967296
bmcpu init: skip cpu_user_defined
open usercpu.so, init user_cpu_init 
[BMRT][load_bmodel:660] INFO : Loading bmodel from [./int8model/compilation.bmodel]. Thanks for your patience...
[BMRT][load_bmodel:642] INFO : pre net num: 0, load net num: 1
[BMRT][bmrt_test:503] INFO : ==> running network #0, name: googlenet, loop: 0
[BMRT][bmrt_test:614] INFO : net[googlenet] stage[0], launch total time is 8462144 us (npu 0 us, cpu 8462144 us)
[BMRT][bmrt_test:650] INFO : +++ The network[googlenet] stage[0] cmp success +++
[BMRT][bmrt_test:674] INFO : load input time(s): 0.000133
[BMRT][bmrt_test:675] INFO : calculate  time(s): 8.462144
[BMRT][bmrt_test:676] INFO : get output time(s): 0.000016
[BMRT][bmrt_test:677] INFO : compare    time(s): 0.000045
BMLIB Send Quit Message
```

为方便演示，自带lmdb文件，为Imagenet.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://1684.gitbook.io/bmnnsdk2-1684-2-0-1/yan-shi-demo.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
