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感觉是一个天上一个地下。
审核编辑:刘清
-
显示器
+关注
关注
21文章
4934浏览量
139765 -
HDMI
+关注
关注
32文章
1647浏览量
151581 -
智能机器人
+关注
关注
17文章
862浏览量
82179 -
USB供电
+关注
关注
0文章
29浏览量
14845
原文标题:Jetson Orin Nano刷机与YOLOv8部署演示
文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论