# 4.7 实例演示

我们在${BMNNSDK}/examples下为用户提供了C/C++/Python三种编程语言覆盖预处理推理接口用例。&#x20;

示例目录命名规则：编程语言+解码模块+预处理模块+推理接口模块

| ssd300示例目录              | 软件流程                                                            | 编程接口语言  | 运行环境     |
| ----------------------- | --------------------------------------------------------------- | ------- | -------- |
| cpp\_cv\_cv\_bmrt       | opencv解码 （BGR输出）+ opencv预处理 + inference + 后处理                   | C / C++ | soc/pcie |
| cpp\_cv\_bmcv\_bmrt     | opencv解码（yuv i420输出）+ bmcv预处理 +   inference + 后处理               | C / C++ | soc      |
| cpp\_cv\_cv+bmcv\_bmrt  | opencv解码（yuv i420输出）+   cv::bmcv预处理 + bmcv预处理 + inference + 后处理 | C / C++ | soc      |
| cpp\_ffmpeg\_bmcv\_bmrt | ffmpeg解码 （yuv压缩输出）+   bmcv预处理 + inference + 后处理                 | C / C++ | soc/pcie |
| cpp\_multi\_bmcv\_bmrt  | 多线程性能测试用例   ffmpeg/opencv解码+cv+bmcv+inference+后处理+jpg编码         | C / C++ | soc      |
| cpp\_cv\_cv+bmcv\_sail  | opencv解码（yuv i420输出）+ cv::bmcv预处理 +   bmcv预处理 + inference + 后处理 | C++     | soc      |
| cpp\_cv\_bmcv\_sail     | opencv解码（yuv i420输出）+   bmcv预处理 + inference + 后处理               | C++     | soc      |
| cpp\_ffmpeg\_bmcv\_sail | ffmpeg解码 （yuv压缩输出）+   bmcv预处理 + inference + 后处理                 | C++     | soc/pcie |
| py\_ffmpeg\_bmcv\_sail  | ffmpeg解码 （yuv压缩输出）+   bmcv预处理 + inference + 后处理                 | python  | soc/pcie |

本章主要用cpp\_cv\_bmcv\_bmrt、cpp\_ffmpeg\_bmcv\_bmrt用例来做以下两种模式下的编译运行演示。以下示例演示默认用户已经按照第三章内容进行了bmodel的转换。

* PCIE模式用例演示
* SoC模式用例演示

本示例需要使用到的测试视频（下载后，请保存到${BMNNSDK}/res/video/ 目录）：

{% file src="<https://2782358289-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsTrToIfjXO6dEufUX44h%2Fuploads%2Fg6WElN0jsdW7ZsK26daI%2Ftest_car_person.mp4?alt=media&token=2b38ff64-1d25-4432-a770-2318df120a2e>" %}

## **4.7.1 PCIE模式用例演示**

1. **在x86 Linux开发主机上解压sdk开发包并运行docker开发环境，本示例都基于此docker环境，Docker环境的按照请参考** [**1.5.1环境配置**](https://sophgo-doc.gitbook.io/bmnnsdk2-bm1684/bmnnsdk2/setup/on-linux)

   ```
   # 在宿主机上解压缩SDK软件包
   tar –zxf  bmnnsdk2-bm1684_v<x.x.x>.tar.gz
   cd bmnnsdk2-bm1684_v<x.x.x>/scripts
   # 在宿主机上安装驱动
   sudo ./install_driver_pcie.sh && cd ..
   # 运行docker开发容器
   ./docker_run_bmnnsdk.sh
   ```

   ```
   # 在docker开发容器中
   cd /workspace/scritps
   # 安装软件包
   ./install_lib.sh nntc
   # 设置环境变量
   source envsetup_pcie.sh
   # 安装SAIL包，测试py_ffmpeg_bmcv_sail时需要
   cd /workspace/lib/sail/python3/pcie/py35 && pip3 install sophon-<x.x.x>-py3-none-any.whl
   # 下载测试视频
   mkdir /workspace/res/video
   wget -O /workspace/res/video/test_car_person.mp4 https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsTrToIfjXO6dEufUX44h%2Fuploads%2Fg6WElN0jsdW7ZsK26daI%2Ftest_car_person.mp4?alt=media&token=2b38ff64-1d25-4432-a770-2318df120a2e
   ```
2. **在x86 Linux开发主机上编译及运行实例代码**

   ```
   cd /workspace/examples/SSD_object/cpp_ffmpeg_bmcv_bmrt/
   make -f Makefile.pcie clean && make -f Makefile.pcie
   # 编译后会在目录下生成
   # USAGE:
   #  ./ssd300_ffmpeg_bmcv_bmrt.pcie <video url> <bmodel path> <frames> <dev id>
   # 下载
   # float32模型测试
   ./ssd300_ffmpeg_bmcv_bmrt.pcie /workspace/res/video/test_car_person.mp4 ../model/out/fp32_ssd300.bmodel 10 0
   # int8模型测试
   #./ssd300_ffmpeg_bmcv_bmrt.pcie /workspace/res/video/test_car_person.mp4 ../model/out/int8_ssd300.bmodel 10 0
   ```

   程序运行过程中，可能会出现以下丢弃音频包或者视频帧数据包错误的字样，属正常现象：

   ```
   packet contain audio data ,drop this packet
   ** error!! decode_packet error
   ```

   终端会打印模型检测结果：

   ```
   [0]frame 1 - need to draw 2 bbox
   encoded image size is 36952
   [0]frame 2 - need to draw 2 bbox
   encoded image size is 35696
   [0]frame 3 - need to draw 2 bbox
   encoded image size is 36288
   [0]frame 4 - need to draw 2 bbox
   encoded image size is 36280
   ```

   最后也会在results目录下生成检测结果图片，可查看结果图片验证模型检测结果。
3. **pcie状态监控**

   ```
   $ bm-smi   #此命令用于检测pcie工作状态，tpu，mem使用率, 板卡温度等
   ```

## 4.7.2 SOC模式用例演示

1. **在x86 Linux开发主机上解压sdk开发包并运行docker开发环境，本实例都基于此docker环境，Docker环境的按照请参考** [**1.5.1环境配置**](https://sophgo-doc.gitbook.io/bmnnsdk2-bm1684/bmnnsdk2/setup/on-linux)

   ```
   # 以下命令在宿主机上执行
   # <xx.xx.xx>为SDK压缩包的版本号，需根据实际情况替换为相应的版本号
   tar –zxf bmnnsdk2-bm1684_v<xx.xx.xx>.tar.gz
   cd bmnnsdk2-bm1684_v<xx.xx.xx>
   ./docker_run_bmnnsdk.sh
   ```

   ```
   # 以下命令在容器内执行
   # 安装软件包
   cd /workspace/scripts
   ./install_lib.sh nntc
   # 设置环境变量
   source envsetup_cmodel.sh
   ```
2. **在x86 Linux开发主机上生成 SSD\_object/model/out/int8\_ssd300.bmodel 后，执行下面的指令，编译实例代码：**

   ```
   cd ../examples/SSD_object/cpp_cv_bmcv_bmrt/
   make -f Makefile.arm clean && make -f Makefile.arm
   make -f Makefile.arm install
   ```
3. **在x86 Linux开发主机上将交叉编译生成的程序install目录拷贝到soc单板**

   ```
   # 使用第三章转换的bmodel进行测试
   # <SOC_BOARD_IP>应当替换为实际的SOC单板IP地址
   # 以下命令在宿主机上执行，SOC设备默认用户名和密码均为linaro
   scp -r /workspace/install linaro@<SOC_BOARD_IP>:/data/
   ```
4. **在Soc单板上运行程序进行测试：**

   在x86 Linux开发主机上操作

   ```
   # 登录到Soc单板中
   ssh linaro@SOC_BOARD_IP
   ```

   在Soc单板终端中操作

   ```
   # 以下命令在SOC设备中执行
   # 设置环境变量：参考1.5.3
   cd /data/install
   # 下载测试视频
   mkdir res/video
   wget -O res/video/test_car_person.mp4 https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsTrToIfjXO6dEufUX44h%2Fuploads%2Fg6WElN0jsdW7ZsK26daI%2Ftest_car_person.mp4?alt=media&token=2b38ff64-1d25-4432-a770-2318df120a2e
   # float32模型测试
   ./bin/ssd300_cv_bmcv_bmrt.arm video res/video/test_car_person.mp4 model/ssd300/fp32_ssd300.bmodel 10 0
   # int8模型测试
   ./bin/ssd300_cv_bmcv_bmrt.arm video res/video/test_car_person.mp4 model/ssd300/int8_ssd300.bmodel 10 0
   ```

和PCIE模式一样，程序运行后终端会打印模型检测结果，并在results目录下生成图片结果out\_\*.jpg的检测结果图片，可查看结果图片验证模型检测结果。
