时间:2023-04-01 09:55
人气:
作者:admin
Jetson Orin Nano 介绍
NVIDIA Jetson Orin Nano 系列模组以最小的 Jetson 外形提供高达 40 TOPS 的 AI 算力,功耗在 7W 至 15W 之间,算力相当于是 NVIDIA Jetson Nano 的 80 倍。Jetson Orin Nano 提供 8GB 和 4GB两个版本,其中开发套件是8GB版本。
可以广泛应用于智能机器人开发、智能无人机开发、智能相机开发。从Jetson Orin Nano 到最高性能的 Jetson AGX Orin,有六个基于相同架构的不同模块,是端侧与边缘智能的理想开发载板。
显示器接口是DP的,必须买个DP转HDMI转接头才可以接到HDMI支持的显示器,最重要的这款支持WIFI了。以前的Jetson Nano是USB供电就可以了,这个是配有专门的电源线,19V电源输入,没办法算力强悍肯定得多耗电,相对来说还是低功耗。
JetPack5.1镜像制作
安装JetPack5.1之前先准备好一个microSD卡,最少是64G,推荐买128G的,因为Jetpack5.1安装程序烧录完成已经是20G,再安装一些其它第三方库比如pytorch、torchvision、pyqt5或者QT什么的,就没有多少应用程序开发与部署可用空间了。准备好microSD卡之后,就先下载镜像文件
必须NVIDIA的账号登录之后才可以下载。JetPack5.1已经预安装好了
- CUDA11.4.19 - cuDNN8.6.0 - TensorRT8.5.2 - OpenCV4.5.4还有其他的一些支持工具软件。下载好Jetpack5.1镜像包之后,先下载SD卡格式化软件,格式化SD卡。截图如下:

然后下载镜像制作软件
安装好之后选择镜像文件与SD卡,然后开始制作,显示如下:


烧录完成以后插到Jetson Orin Nano开发板的风扇下方的卡槽中
安装pytorch与torchvision
安装好了Jetpack5.1之后,我才发现英伟达官方还没有正式发布适配的pytorch版本跟torchvision版本,
意思是用pytorch1.14版本,以此类推torchvision选择0.15.1版本。然后从这里直接下载1.14适配jetpack的版本文件,
下载好之后,别着急安装pytroch,先通过下面的命令行安装好依赖:
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相关依赖之后,安装pytorch就很简单:
pip3 install torch-1.14.0a0+44dac51c.nv23.02-cp38-cp38-linux_aarch64.whl安装好pytorch之后,使用下面的命令行从源码安装torchvision 0.15.1版本,先安装依赖,然后下载安装包,最后从源码编译安装,大概十分钟左右就好,相关命令行如下:
sudo apt install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev pip3 install --upgrade pillow wget https://github.com/pytorch/vision/archive/refs/tags/v0.15.1.zip unzip v0.15.1.zip cd vision-0.15.1 export BUILD_VERSION=0.15.1 python3 setup.py install --user同样不行就执行几次,肯定会成功安装的,我安装与运行的截图如下:

都安装好了用pip3 list查一下,然后我发现pip list显示没有TensorRT,但是我查一下已经有了,只是缺少python包支持,我记得jetpack4.x刷机之后就自动有了,这个怎么没有了,我晕!不过没关系,执行下面的命令行安装python TensorRT支持,执行完之后肯定有了!

最终验证测试如下:

说明一切准备工作就绪了。
说明一下,安装过程中要求输入提示的都输入 y
ONNX2ENGINE
我发现我在TensorRT8.4上面转换的engine文件无法在TensorRT8.5上面成功加载,所以我直接把YOLOv8n的ONNX格式模型文件直接拷贝到Jetson Orin Nano上,然后通过命令行重新生成engine文件:
cd /usr/src/tensorrt/bin ./trtexec --onnx= --saveEngine=相关截图如下:



这个时间大概在五分钟左右,需要等一下才可以转换好。
YOLOv8对象检测演示
在此之前,我已经写好了YOLOv8 + TensorRT的测试程序,所以我直接把程序拷贝过来,然后用新生成的yolov8n.engine开启YOLOv8对象检测推理,测试视频运行如下:


这里程序中FPS计算包含了前后处理,因为两个视频的分辨率不同,导致前后处理的耗时不同,对象我之前在Jetson Nano上的推理速度,我只能说太厉害了,因为我之前Python版本tensorRT的推理这个程序在Jetson Nano一跑过一会就要卡死的感觉,特别慢!相关的测试源码如下:
1importtensorrtastrt
2fromtorchvisionimporttransforms
3importtorchast
4fromcollectionsimportOrderedDict,namedtuple
5importcv2ascv
6importtime
7importnumpyasnp
8
9img_transform=transforms.Compose([transforms.ToTensor(),
10transforms.Resize((640,640))
11])
12
13defload_classes():
14withopen("classes.txt","r")asf:
15class_list=[cname.strip()forcnameinf.readlines()]
16returnclass_list
17
18
19defformat_yolov8(frame):
20row,col,_=frame.shape
21_max=max(col,row)
22result=np.zeros((_max,_max,3),np.uint8)
23result[0:row,0:col]=frame
24result=cv.cvtColor(result,cv.COLOR_BGR2RGB)
25returnresult
26
27defwrap_detection(input_image,output_data):
28class_ids=[]
29confidences=[]
30boxes=[]
31out_data=output_data.T
32rows=out_data.shape[0]
33
34image_width,image_height,_=input_image.shape
35
36x_factor=image_width/640.0
37y_factor=image_height/640.0
38
39forrinrange(rows):
40row=out_data[r]
41classes_scores=row[4:]
42class_id=np.argmax(classes_scores)
43if(classes_scores[class_id]>.25):
44class_ids.append(class_id)
45confidences.append(classes_scores[class_id])
46x,y,w,h=row[0].item(),row[1].item(),row[2].item(),row[3].item()
47left=int((x-0.5*w)*x_factor)
48top=int((y-0.5*h)*y_factor)
49width=int(w*x_factor)
50height=int(h*y_factor)
51box=np.array([left,top,width,height])
52boxes.append(box)
53
54indexes=cv.dnn.NMSBoxes(boxes,confidences,0.25,0.25)
55
56result_class_ids=[]
57result_confidences=[]
58result_boxes=[]
59
60foriinindexes:
61result_confidences.append(confidences[i])
62result_class_ids.append(class_ids[i])
63result_boxes.append(boxes[i])
64
65returnresult_class_ids,result_confidences,result_boxes
66defgpu_trt_demo():
67class_list=load_classes()
68device=t.device('cuda:0')
69Binding=namedtuple('Binding',('name','dtype','shape','data','ptr'))
70logger=trt.Logger(trt.Logger.INFO)
71withopen("yolov8n.engine",'rb')asf,trt.Runtime(logger)asruntime:
72model=runtime.deserialize_cuda_engine(f.read())
73bindings=OrderedDict()
74forindexinrange(model.num_bindings):
75name=model.get_binding_name(index)
76dtype=trt.nptype(model.get_binding_dtype(index))
77shape=model.get_binding_shape(index)
78data=t.from_numpy(np.empty(shape,dtype=np.dtype(dtype))).to(device)
79bindings[name]=Binding(name,dtype,shape,data,int(data.data_ptr()))
80binding_addrs=OrderedDict((n,d.ptr)forn,dinbindings.items())
81context=model.create_execution_context()
82
83capture=cv.VideoCapture("test.mp4")
84colors=[(255,255,0),(0,255,0),(0,255,255),(255,0,0)]
85whileTrue:
86_,frame=capture.read()
87ifframeisNone:
88print("Endofstream")
89break
90fh,fw,fc=frame.shape
91start=time.time()
92image=format_yolov8(frame)
93x_input=img_transform(image).view(1,3,640,640).to(device)
94binding_addrs['images']=int(x_input.data_ptr())
95context.execute_v2(list(binding_addrs.values()))
96out_prob=bindings['output0'].data.cpu().numpy()
97end=time.time()
98
99class_ids,confidences,boxes=wrap_detection(image,np.squeeze(out_prob,0))
100for(classid,confidence,box)inzip(class_ids,confidences,boxes):
101ifbox[2]>fw*0.67:
102continue
103color=colors[int(classid)%len(colors)]
104cv.rectangle(frame,box,color,2)
105cv.rectangle(frame,(box[0],box[1]-20),(box[0]+box[2],box[1]),color,-1)
106cv.putText(frame,class_list[classid]+""+("%.2f"%confidence),(box[0],box[1]-10),cv.FONT_HERSHEY_SIMPLEX,.5,(0,0,0))
107
108inf_end=end-start
109fps=1/inf_end
110fps_label="FPS:%.2f"%fps
111cv.putText(frame,fps_label,(10,25),cv.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
112cv.imshow("YOLOv8+TensorRT8.5.xObjectDetection",frame)
113cc=cv.waitKey(1)
114ifcc==27:
115break
116cv.waitKey(0)
117cv.destroyAllWindows()
118
119
120if__name__=="__main__":
121gpu_trt_demo()
总结:
Jetson Orin Nano从系统烧录到安装好pytorch、torchvision、部署运行YOLOv8推理演示程序基本没有什么坑,唯一需要注意的是numpy别用1.24的最新版本。Jetson Orin Nano算力相比Jetson Nano感觉是一个天上一个地下。
审核编辑:刘清
上一篇:USB带宽和传输速率科普
下一篇:差分晶振与普通晶振的区别在哪
从profibusDP转ModbusTCP,一网打尽转换技巧!