# RKNN C API 动态形状输入Demo
这是一个使用RKNN C API进行动态形状输入推理的演示应用。您可以在这个应用中看到如何使用RKNN 动态形状 C API对图像进行分类。

# 如何使用
1. 克隆或下载此代码库ssh://git@10.10.10.59:8001/hpc/rknpu2.git。
2. 在终端中进入动态形状推理Demo目录。
```
cd examples/rknn_dynamic_shape_input_demo
```
3. 根据芯片平台,运行shell脚本编译应用程序,以RK3562 Android系统为例,命令如下:
```
./build-android_RK3562.sh
```
4. 将Demo程序目录通过adb命令推送到开发板系统中,命令如下:
```
adb push ./install/rknn_dynshape_demo_Android/ /data
注意:如果是安卓系统,需要adb root & adb remount
```
5. 设置runtime库链接路径
```
export LD_LIBRARY_PATH=./lib
```
6. 运行程序,以rk3562平台为例,./rknn_dynshape_inference model/RK3562/mobilenet_v2.rknn images/dog_224x224.jpg 命令对图像进行分类,其中 mobilenet_v2.rknn 是神经网络模型文件的名称,dog_224x224.jpg 是要分类的图像文件的名称。


# 编译说明
## Arm Linux系统
为特定的芯片平台指定交叉编译器路径,修改`build-linux_.sh`中的`GCC_COMPILER`,其中TARGET_PLATFORM为芯片名,然后执行
```
./build-linux_.sh
```
## Android系统
指定Android NDK的路径,修改`build-android_.sh`中的`ANDROID_NDK_PATH`,其中TARGET_PLATFORM为芯片名,然后执行
```
./build-android_.sh
```

# 包含的功能
此演示应用程序包含以下功能:

- 创建一个包含动态形状的神经网络模型。
参考https://github.com/rockchip-linux/rknn-toolkit2仓库下的examples/functions/dynamic_input

- 从文件中读取一张图像,并使用神经网络模型对其进行分类。程序步骤如下:
1. 使用 rknn_init() 函数初始化 RKNN 上下文。
2. 使用 rknn_set_input_shapes() 函数设置模型所有的输入的形状信息,包括形状、布局等。
3. 使用 rknn_query() 函数查询当前设置的模型输入和输出的信息,包括形状、数据类型和大小等。
4. 使用 rknn_inputs_set() 函数设置模型输入的数据,包括数据指针和数据大小等。
5. 使用 rknn_run() 函数运行模型。
6. 使用 rknn_outputs_get() 函数设置是否需要float类型结果并获取输出数据。
7. 处理输出数据,得到分类结果和概率。
8. 使用 rknn_release() 函数释放RKNN上下文。