Jetson Orin Nano 运行 NanoSAM

最近有个项目需要在Jetson Nano 上部署NanoSAM模型,在环境搭建上面遇到了不少问题,搞了好几天,终于搞完了,现在浅浅的记录一下。
这里需要注意,因为训练需要,我在Jetson上和本地Linux都进行了安装及部署,所以可能会在架构上搞错了,jetson一般是aarch64架构,而Linux是X86_64架构

创建并激活新环境(可选)

conda create -n myenv python=3.8
conda activate myenv

myenv 是你搭建的环境名字,可以更改,如果觉得下载太慢,可以配置清华大学镜像源

配置清华大学镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/conda config --dd channeconda config --set show_channel_urls yes

NanoSAM 模型

1. 安装环境配置

image.png

● 安装Pytorch、torchvision
安装Pytorch

安装依赖库

sudo apt-get -y update
sudo apt-get -y install autoconf bc build-essential g++-8 gcc-8 clang-8 lld-8 gettext-base gfortran-8 iputils-ping libbz2-dev libc++-dev libcgal-dev libffi-dev libfreetype6-dev libhdf5-dev libjpeg-dev liblzma-dev libncurses5-dev libncursesw5-dev libpng-dev libreadline-dev libssl-dev libsqlite3-dev libxml2-dev libxslt-dev locales moreutils openssl python-openssl rsync scons python3-pip libopenblas-dev

进入网址PyTorch for Jetson,根据Jetpack系统版本选择合适的whl文件,whl文件名称开头代表Pytorch版本,cp38代表Python版本是3.8
image.png
具体可参考Jeston Orin Nnao 安装pytorch与torchvision环境

安装torchvision 0.15.1

根据Pytorch版本选择适配的torchvision版本,我选择的Pytorch版本是2.0.0,对应的torchvision是0.15.1,进入GitHub - pytorch/vision at v0.15.1 ,在Tags选择合适的版本,下载zip文件
image.png

考虑到Github网络不稳定,我是先下到自己的电脑上,然后再将文件拷到Linux系统的

# 解压
unzip vision-v0.15.1.zip
# 进入解压文件
cd vision-0.15.1
# 安装
python3 setup.py install --user
● 安装Tensor RT
环境要求

这是TensorRT的GitHub仓库GitHub - NVIDIA/TensorRT
image.png
这里说明Tensor RT安装需要的环境要求,其中比较重要的就是cuda和cuDNN,这里推荐cuda11.8 + cuDNN 8.9.0

查看是否安装cuda 以及 cuDNN

查看cuda版本

# 查看cuda版本
nvcc --version
# 查看cuda安装路径
which nvcc
whereis nvcc

image.png
这里的cuda版本是11.8
查看cuDNN版本

cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

image.png
如果执行上面的指令后没有显示,说明没有安装或环境未配置正确,这里以没安装为例

查看当前Ubuntu版本

lsb_release -a

image.png

安装cuda(可选)

安装依赖包

sudo apt-get update
sudo apt-get install gcc g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev

进入官方下载网址选择合适的cuda版本
jetson一般是aarch64架构,而Linux是X86_64架构
image.png
这里有三种方式可以安装,一般选择deb网上下载或本地下载,不要选runfile安装!!!(如果后面安装Tensor RT使用的也是deb包安装的话,否则会出现依赖问题无法成功安装,这个问题搞了我整整一天!!!)
下面会有一个安装指引,可以直接复制上面的指令,这里使用的deb的本地安装

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda-repo-ubuntu2004-11-8-local_11.8.0-520.61.05-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-8-local_11.8.0-520.61.05-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-11-8-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

配置环境变量

echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

再次执行 查看cuda版本,如果没有显示,查看环境变量是否配置正确

nvcc --version
安装cuDNN(可选)

进入网址 cuDNN Archive | NVIDIA Developer选择合适的cuDNN版本进行安装
jetson一般是aarch64架构,而Linux是X86_64架构
image.png
下载好后,进入下载文件夹,执行安装deb、导入GPG密钥、更新包列表

sudo dpkg -i cudnn-local-repo-ubuntu2004-8.9.0.26_1.0-1_amd64.deb
# 导入GPG密钥 这个安装完后系统会自动提醒的,直接复制建议的指令就行
sudo cp /var/cudnn-local-repo-ubuntu2004-8.9.0.26/cudnn-local-repo-ubuntu2004-8.9.0.26-keyring.gpg /usr/share/keyrings/
# 更新包列表
sudo apt-get update

安装运行库、开发人员库以及代码示例

sudo apt-get install libcudnn8
sudo apt-get install libcudnn8-dev
sudo apt-get install libcudnn8-samples

验证安装

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
安装Tensor RT

进入网址下载对应的TensorRT版本,注意Tensor RT、cuda、cuDNN的版本必须适配,否则无法正常工作,以及需要确定自己的系统架构-我现在的是X86_64架构
jetson一般是aarch64架构,而Linux是X86_64架构
image.png
下载完成后,进入下载文件夹,执行以下指令,将 -i后面的文件名替换成下载的文件名即可

sudo dpkg -i nv-tensorrt-local-repo-ubuntu2004-8.x.x-cuda-11.8_1.0-1_amd64.deb
sudo cp /var/nv-tensorrt-local-repo-ubuntu2004-8.x.x-cuda-11.8/*-keyring.gpg /usr/share/keyrings/
sudo apt-get update

安装Tensor RT包

sudo apt-get install tensorrt

配置环境变量,将bin、lib加入环境变量

echo 'export LD_LIBRARY_PATH=/usr/src/tensorrt/bin:$LD_LIBRARY_PATH' >> ~/.bashrc
echo 'export PATH=$PATH:/usr/src/tensorrt/bin' >> ~/.bashrc
source ~/.bashrc

验证安装

dpkg -l | grep tensorrt

image.png

安装Python包(需要与系统安装的TensorRT版本一致)

pip install tensorrt=8.5.3
# 安装依赖
sudo apt-get install python3-libnvinfer-dev

验证安装

python3 -c "import tensorrt; print(tensorrt.__version__)"

image.png

● 安装tensor2trt

Github仓库下载压缩包或者用git clone指令下载,下载完成后进入文件夹,执行setup.py

git clone https://github.com/NVIDIA-AI-IOT/torch2trt
cd torch2trt
python setup.py install

2. 安装NanoSAM Python包

下载NanoSAM Python包,执行以下指令,下载压缩包或者用git clone指令下载

# 下载NanaSAM Python 至本地
git clone https://github.com/NVIDIA-AI-IOT/nanosam
cd nanosam
python3 setup.py develop --user

3. 为掩码解码器构建TensorRT引擎

进入解压文件夹nanosam-main
image.png

● 导出MobileSAM掩码解码器ONNX文件
python3 -m nanosam.tools.export_sam_mask_decoder_onnx \    --model-type=vit_t \    --checkpoint=assets/mobile_sam.pt \    --output=data/mobile_sam_mask_decoder.onnx 

执行过程中报错了,经查询是urllib版本太高了,降级即可
image.png

降级 urllib3(可选)
# 卸载当前版本
pip uninstall urllib3
# 安装兼容版本
pip install urllib3==1.26.15
● 构建TensorRT引擎
trtexec \    --onnx=data/mobile_sam_mask_decoder.onnx \    --saveEngine=data/mobile_sam_mask_decoder.engine \    --minShapes=point_coords:1x1x2,point_labels:1x1 \    --optShapes=point_coords:1x1x2,point_labels:1x1 \    --maxShapes=point_coords:1x10x2,point_labels:1x10

image.png

4. 为NanoSAM图像编码器构建TensorRT引擎

i. 下载图像编码器:resnet18_image_encoder.onnx

我在目录中发现有这个文件,所以就没下载了;不清楚是不是无意中下到中,没有的话下载就行了
image.png

ii. 构建TensorRT引擎
trtexec \    --onnx=data/resnet18_image_encoder.onnx \    --saveEngine=data/resnet18_image_encoder.engine \    --fp16

5. 运行基本用法示例

python3 examples/basic_usage.py \    --image_encoder=data/resnet18_image_encoder.engine \    --mask_decoder=data/mobile_sam_mask_decoder.engine

运行完后会在data文件夹输出一个分割图片
image.png
image.png

训练

● 下载并提取COCO 2017列车图像
# mkdir -p data/coco  # uncomment if it doesn't existmkdir -p data/cococd data/cocowget http://images.cocodataset.org/zips/train2017.zipunzip train2017.zipcd ../..
● 构建MobileSAM图像编码器(用作教师模型)
1.导出到ONNX

不同的batch_size
batch_size =16

python3 -m nanosam.tools.export_sam_image_encoder_onnx \    --checkpoint="assets/mobile_sam.pt" \    --output="data/mobile_sam_image_encoder_bs16.onnx" \    --model_type=vit_t \    --batch_size=16

batch_size =8

python3 -m nanosam.tools.export_sam_image_encoder_onnx \    --checkpoint="assets/mobile_sam.pt" \    --output="data/mobile_sam_image_encoder_bs8.onnx" \    --model_type=vit_t \    --batch_size=8

batch_size =4

python3 -m nanosam.tools.export_sam_image_encoder_onnx \    --checkpoint="assets/mobile_sam.pt" \    --output="data/mobile_sam_image_encoder_bs4.onnx" \    --model_type=vit_t \    --batch_size=4

batch_size =1

python3 -m nanosam.tools.export_sam_image_encoder_onnx \    --checkpoint="assets/mobile_sam.pt" \    --output="data/mobile_sam_image_encoder_bs1.onnx" \    --model_type=vit_t \    --batch_size=1
2.构建批量大小为16的TensorRT引擎

不同的batch_size

trtexec \    --onnx=data/mobile_sam_image_encoder_bs16.onnx \    --shapes=image:16x3x1024x1024 \    --saveEngine=data/mobile_sam_image_encoder_bs16.engine
trtexec \    --onnx=data/mobile_sam_image_encoder_bs8.onnx \    --shapes=image:8x3x1024x1024 \    --saveEngine=data/mobile_sam_image_encoder_bs8.engine
trtexec \    --onnx=data/mobile_sam_image_encoder_bs4.onnx \    --shapes=image:4x3x1024x1024 \    --saveEngine=data/mobile_sam_image_encoder_bs4.engine
trtexec \    --onnx=data/mobile_sam_image_encoder_bs1.onnx \    --shapes=image:1x3x1024x1024 \    --saveEngine=data/mobile_sam_image_encoder_bs1.engine
3.通过提取MobileSAM训练NanoSAM图像编码器

不同的batch_size

python3 -m nanosam.tools.train \    --images=data/coco/train2017 \    --output_dir=data/models/resnet18 \    --model_name=resnet18 \    --teacher_image_encoder_engine=data/mobile_sam_image_encoder_bs16.engine \    --batch_size=16
python3 -m nanosam.tools.train \    --images=data/coco/train2017 \    --output_dir=data/models/resnet18 \    --model_name=resnet18 \    --teacher_image_encoder_engine=data/mobile_sam_image_encoder_bs8.engine \    --batch_size=8
python3 -m nanosam.tools.train \    --images=data/coco/train2017 \    --output_dir=data/models/resnet18 \    --model_name=resnet18 \    --teacher_image_encoder_engine=data/mobile_sam_image_encoder_bs4.engine \    --batch_size=4
python3 -m nanosam.tools.train \    --images=data/coco/train2017 \    --output_dir=data/models/resnet18 \    --model_name=resnet18 \    --teacher_image_encoder_engine=data/mobile_sam_image_encoder_bs1.engine \    --batch_size=1
4.将训练好的NanoSAM图像编码器导出到ONNX
python3 -m nanosam.tools.export_image_encoder_onnx \    --model_name=resnet18 \    --checkpoint="data/models/resnet18/checkpoint.pth" \    --output="data/resnet18_image_encoder.onnx"
python3 -m nanosam.tools.export_image_encoder_onnx \    --model_name=resnet18 \    --checkpoint="data/models/resnet18/checkpoint.pth" \    --output="data/resnet18_image_encoder_new.onnx"

过程中因为网络问题无法获取到训练模型,这是因为默认网站需要魔法上网,只需换成镜像网站就行
临时导入环境变量

export HF_ENDPOINT=https://hf-mirror.com

一些有用的指令

环境变量
查看当前环境变量
echo $LD_LIBRARY_PATH
删除重复的路径

如果 LD_LIBRARY_PATH 中有重复的路径,可以使用以下命令删除重复的路径并只保留一个:

export LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | tr ':' '\n' | sort -u | tr '\n' ':' | sed 's/:$//')
删除指定环境变量

如果要删除 /path/to/TensorRT-8.6.1/lib,可以使用以下命令:

export LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | tr ':' '\n' | grep -v '/path/to/TensorRT-8.6.1/lib' | tr '\n' ':' | sed 's/:$//')
添加环境变量

为了使添加的环境变量永久生效,可以将上述命令添加到 ~/.bashrc 文件中:

echo 'export LD_LIBRARY_PATH="/home/gdc434/anaconda3/envs/NanoSAM/lib/python3.8/site-packages/tensorrt:$LD_LIBRARY_PATH"' >> ~/.bashrcecho 'export LD_LIBRARY_PATH="/usr/src/tensorrt/bin:$LD_LIBRARY_PATH"' >> ~/.bashrcsource ~/.bashrc
使用 gedit(图形界面编辑器)查看环境变量配置文件
gedit ~/.bashrc
加载配置环境
source ~/.bashrc
查找文件

相当于搜索文件,而且效率会高很多

sudo find / -name "cudnn_version.h" 2>/dev/null

image.png

打开文件夹(图形界面)

这个可以结合查找文件一起用,效果杠杠滴

xdg-open 文件路径

image.png

### 如何在 Jetson Orin Nano运行预装的示例程序或进行开发设置 #### 安装和配置环境 为了确保Jetson Orin Nano能够顺利执行预装的示例程序,首先需要完成基本的操作系统安装以及必要的软件包更新。当插入电源线之后,Jetson Orin Nano将会自动启动,并显示Linux初始化界面[^4]。 对于新用户来说,在首次开机时应当遵循屏幕上的指示来建立个人账户并接入无线网络。这一步骤至关重要,因为后续的人脸识别或其他高级功能依赖于互联网下载所需的库文件和其他资源。 #### 更新系统与安装工具链 一旦完成了初步设定,建议通过终端窗口执行`sudo apt-get update`命令以获取最新的软件列表信息。接着可以考虑安装一些常用的开发工具,比如用于图像处理的OpenCV库,这对于许多计算机视觉应用而言不可或缺[^5]。 ```bash sudo apt-get install python3-opencv ``` #### 查看预装示例程序 Jetson Orin Nano出厂即带有多种针对不同应用场景优化过的示范代码样例。这些例子通常位于特定目录下,例如: - `/usr/src/jetson_multimedia_api/samples`: 包含多媒体API相关的测试案例。 - `/opt/nvidia/deep_learning_examples`: 提供了深度学习框架下的实例模型训练脚本。 可以通过浏览上述路径找到感兴趣的项目,并参照官方文档中的说明尝试编译运行它们。 #### 编写自定义应用程序 如果打算基于此平台开展新的研究工作,则可以从简单的“Hello World”开始熟悉编程流程。下面给出了一段利用Python调用摄像头捕捉画面的小型演示片段作为入门指南: ```python import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() if not ret: break gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('Video', gray_frame) key = cv2.waitKey(1) & 0xFF if key == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 这段代码实现了开启默认摄像装置读取视频流并将每一帧转换成灰度模式展示的功能。按下键盘上的'Q'键即可退出循环停止录制过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值