# Nvidia Jetson开发板Docker部署 本文档介绍了如何用Docker在Jetson开发板上部署PaddleX模型,通过Docker的方式部署,用户可以有效的避免可能因为系统环境导致编译或者运行的错误 提供了在Jeston上用于编译或者运行PaddleX部署代码的Docker,主要有如下功能: - 编译PaddleX部署代码:用户可以通过Docker编译PaddleX部署代码 - 部署PaddleX模型:通过Docker使用编译好的可执行文件部署 **注意**:NVIDIA JetPack在v4.2.1版本以上(含v4.2.1)才能支持通过Docker部署 ## 准备工作 在编译与运行之前的准备工作,主要是下载Docker与创建容器 ### Step1: 下载Jetson开发板Docker 运行如下命令下载Docker ``` sudo docker pull paddlex/jetson:1.0 ``` 下载成功后,通过如下命令查看docker的镜像 ``` sudo docker images ``` 可以看到,存在一个REPOSITORY为`paddlex/jetson`、TAG为`1.0`的docker镜像 ![](../images/images.png) ### Step2: 容器创建 创建容器之前,需要先准备好需要编译的部署代码与训练好的PaddleX部署模型 建议用户在HOME目录下创建infer文件夹,将需要部署的代码与模型拷贝到该目录下用于挂载到容器内 本文档以PaddleX提供的jetson部署代码为示例: ``` #通过如下命令下载代码,Jetson部署代码在 `PaddleX/deploy/cpp` 目录下面 git clone https://github.com/PaddlePaddle/PaddleX.git #在HOME目录下创建infer文件夹,将cpp文件夹拷贝到infer目录下面 mkdir ~/infer cp -r PaddleX/deploy/cpp ~/infer/ ``` **创建容器**:通过如下命令创建容器,同时将HOME目录下包含部署代码的infer文件夹挂载到容器内 ``` sudo docker create -it -v ~/infer/:/infer -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY --net=host --name paddlex --runtime nvidia paddlex/jetson:1.0 /bin/bash ``` 查看创建的容器 ``` sudo docker ps -a ``` ![](../images/container.png) 创建好容器后需要运行容器 ``` sudo docker start paddlex ``` ## 编译 通过如下命令可以编译infer文件夹内的部署代码 ``` sudo docker exec -it paddlex /bin/bash -c 'cd /infer/cpp && sh scripts/jetson_build.sh' ``` **注意**: - `cd /infer/cpp`表示进入到部署代码目录,用户需要根据实际情况自己修改 ## 部署 对于图片预测,编译的可执行文件在`/infer/cpp/build/demo/detector`,`/infer/cpp/build/demo/classifier`,`/infer/cpp/build/demo/segmenter`,其主要命令参数说明如下: | 参数 | 说明 | | ---- | ---- | | model_dir | 导出的预测模型所在路径 | | image | 要预测的图片文件路径 | | image_list | 按行存储图片路径的.txt文件 | | use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0) | | use_trt | 是否使用 TensorRT 预测, 支持值为0或1(默认值为0) | | gpu_id | GPU 设备ID, 默认值为0 | | save_dir | 保存可视化结果的路径, 默认值为"output",**classfier无该参数** | | batch_size | 预测的批量大小,默认为1 | | thread_num | 预测的线程数,默认为cpu处理器个数 | 对于视频预测,编译的可执行文件在`/infer/cpp/build/demo/video_detector`,`/infer/cpp/build/demo/video_classifier`,`/infer/cpp/build/demo/video_segmenter`,其主要命令参数说明如下: | 参数 | 说明 | | ---- | ---- | | model_dir | 导出的预测模型所在路径 | | use_camera | 是否使用摄像头预测,支持值为0或1(默认值为0) | | camera_id | 摄像头设备ID,默认值为0 | | video_path | 视频文件的路径 | | use_gpu | 是否使用 GPU 预测, 支持值为0或1(默认值为0) | | use_trt | 是否使用 TensorRT 预测, 支持值为0或1(默认值为0) | | gpu_id | GPU 设备ID, 默认值为0 | | show_result | 对视频文件做预测时,是否在屏幕上实时显示预测可视化结果(因加入了延迟处理,故显示结果不能反映真实的帧率),支持值为0或1(默认值为0) | | save_result | 是否将每帧的预测可视结果保存为视频文件,支持值为0或1(默认值为1) | | save_dir | 保存可视化结果的路径, 默认值为"output" | **设置show_result为1之前请执行如下命令确保容器有显示权限** ``` sudo xhost + ``` **注意:若系统无GUI,则不要将show_result设置为1。当使用摄像头预测时,按`ESC`键可关闭摄像头并推出预测程序。** **对于使用用户编译的可执行文件进行部署的命令如下:** ``` sudo docker exec -it paddlex /bin/bash -c 'cd [部署代码目录] && .build/demo/[可执行文件名] [命令参数]' ``` ### 样例 在用户编译完部署代码后,可按如下流程运行测试模型样例 - 1)下载PaddleX预训练模型及测试图片[下载地址](https://paddlex.readthedocs.io/zh_CN/develop/train/prediction.html),本文档下载了YOLOv3-MobileNetV1模型与测试图片 - 2)将模型导出为部署模型格式 [导出部署模型步骤](https://paddlex.readthedocs.io/zh_CN/develop/deploy/export_model.html) - 3)将部署模型和测试图片copy到`~/infer`文件夹 - 4)使用如下命令,通过容器进行预测 ``` sudo docker exec -it paddlex /bin/bash -c 'cd /infer/cpp && ./build/demo/detector --model_dir /infer/yolov3_mobilenetv1_coco --image /infer/yolov3_mobilenetv1_coco/test.jpg --use_gpu 1' ```