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文章
4944瀏覽量
139818 -
HDMI
+關注
關注
32文章
1662瀏覽量
151650 -
智能機器人
+關注
關注
17文章
863瀏覽量
82207 -
USB供電
+關注
關注
0文章
29瀏覽量
14855
原文標題:Jetson Orin Nano刷機與YOLOv8部署演示
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學堂】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論