目錄
一.yolov5的運行環(huán)境配置(Windows系統(tǒng))
1、NVIDIA驅(qū)動安裝與更新
?2、Anaconda 的安裝
3、Pytorch環(huán)境安裝
?4、pycharm安裝
二.yolov5訓(xùn)練數(shù)據(jù)集,得到best.pt(Windows系統(tǒng))
?1.下載YOLO項目代碼
?2.環(huán)境安裝
3. 數(shù)據(jù)集下載:
三.best.pt轉(zhuǎn)為onnx模型(Windows系統(tǒng))
四.best.onnx轉(zhuǎn)為best.rknn模型(Linux系統(tǒng))
?1.環(huán)境準(zhǔn)備和工具包安裝
2.onnx轉(zhuǎn)換為rknn
?五.RK3568板子上運行demo(RK3568)
1.通電,聯(lián)網(wǎng)
2.在RK3568板子上運行yolov5_demo?
六.將自己訓(xùn)練過且轉(zhuǎn)換后的best.rknn傳送到RK3568板子上,并運行(RK3568)
1.通過WinSCP傳輸文件
2.RK3568平臺部署best.rknn
一.yolov5的運行環(huán)境配置(Windows系統(tǒng))
1、NVIDIA驅(qū)動安裝與更新
首先查看電腦的顯卡版本,直接搜索設(shè)備管理器–>顯示適配器。就可以看到電腦顯卡的版本了。如圖,可以看到我的是一塊NVDIA GeForce RTX3060顯卡
顯卡驅(qū)動的下載地址
安裝(更新)好了顯卡驅(qū)動以后。我們按下win+R組合鍵,打開cmd命令窗口。輸入如下的命令。
nvidia-smi
?得到CUDA Version的最高適配版本,為12.0,比它低的版本都可以下載。
?2、Anaconda 的安裝
打開網(wǎng)址,下載,這里選擇對應(yīng)的anaconda版本是支持python3.9的。
雙擊下載好的anaconda安裝包,just me是說只供當(dāng)前用戶使用。all user 是供使用這臺電腦的所有用戶使用,是權(quán)限問題。對空間影響不大。如果你的電腦上只有建了一個用戶,all users和just me 的作用是一樣的。所以點擊just me就好了。
然后點擊next,當(dāng)讓你選擇安裝安裝路徑的時候,一定不要選擇默認安裝位置,因為默認位置是c盤,以后要在anaconda里面創(chuàng)建環(huán)境的時候會很占內(nèi)存,最好在D盤中創(chuàng)建一個文件夾來放anaconda。
和圖中一樣將圖中的√勾上,雖然出現(xiàn)紅色的警告,但是要勾上,將anaconda添加到環(huán)境變量中去。然后點擊完成就好了。
?安裝完成以后,按下開始鍵(win鍵)在左邊就會出現(xiàn)anaconda3這個文件夾,可以發(fā)現(xiàn)anaconda已經(jīng)安裝好了。
3、Pytorch環(huán)境安裝
按下開始鍵(win鍵),打開anaconda的終端。
創(chuàng)建虛擬環(huán)境conda create -n 環(huán)境名字(英文) python=x.x(python版本),如下,我就是創(chuàng)建了一個名字叫pytorch,python是3.8版本的環(huán)境。
conda create -n pytorch python=3.8
?在base環(huán)境中執(zhí)行如上的命令,就會創(chuàng)建一個新的虛擬環(huán)境,這個虛擬環(huán)境會安裝一些基礎(chǔ)的包,如下圖所示。詢問是否安裝的時候,輸入y。就可以創(chuàng)建環(huán)境了。
當(dāng)安裝好了以后,執(zhí)行conda env list這個命令,就可以看到比一開始多了一個pytorch這個環(huán)境。現(xiàn)在我們可以在這個環(huán)境里面安裝深度學(xué)習(xí)框架和一些Python包了。
conda env list
?
?執(zhí)行如下命令,激活這個環(huán)境。conda activate 虛擬環(huán)境名稱。
conda activate pytorch
?安裝pytorch-gup版的環(huán)境,由于pytorch的官網(wǎng)在國外,下載相關(guān)的環(huán)境包是比較慢的,所以我們給環(huán)境換源。在pytorch環(huán)境下執(zhí)行如下的命名給環(huán)境換清華源。
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
?然后打開pytorch的官網(wǎng),由于開頭我們通過驅(qū)動檢測到我的顯卡為 NVDIA GeForce RTX3060,最高支持cuda12.0版本,為了穩(wěn)定,我們選擇cuda11.3版本的cuda,然后將下面紅色框框中的內(nèi)容復(fù)制下來。
conda install pytorch torchvision torchaudio pytorch-cuda=11.3 -c pytorch -c nvidia
?如果由于網(wǎng)絡(luò)原因,conda沒有成功,就試下pip安裝。
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113
還是不行的話,就將torch,torchvision,torchaudio的包分別下載下來。Ctrl+F可以搜索
?
?放到安裝環(huán)境下,執(zhí)行安裝
pip install torch-1.10.1+cu113-cp38-cp38-win_amd64.whl
?在虛擬環(huán)境下,執(zhí)行
conda list
查看安裝的包,主要出現(xiàn) torch 后面跟著的1.10.1+cu113。torchvision,torchaudio也是。
在虛擬環(huán)境下打開python,import torch,后輸入
print(torch.cuda.is_available())
打印True,即為成功。
?4、pycharm安裝
打開這個pycharm網(wǎng)址,可以發(fā)現(xiàn)一共有兩個版本一個是專業(yè)版(Professional),一個是社區(qū)版(Community),專業(yè)版是需要花錢的,好幾百美元一年。而社區(qū)版是免費的,但是也夠用了,所以就下載安裝社區(qū)版就好了。
將下載好的pycharm安裝包,雙擊。安裝的地址最好不要放在C盤。
將所有的√都勾上,
?安裝好了點擊第二個框框,然后點完成就好了
創(chuàng)建一個工程,這時候我們就要選擇我們在anaconda里面安裝的環(huán)境,在界面的右下角
二.yolov5訓(xùn)練數(shù)據(jù)集,得到best.pt(Windows系統(tǒng))
?1.下載YOLO項目代碼
點擊這里下載并解壓YOLO的官方代碼:GitHub - ultralytics/yolov5 at v5.0
?2.環(huán)境安裝
將requirements.txt放到相應(yīng)的環(huán)境文件夾下,在anconda命令窗中輸入
pip install -r requirements.txt
3. 數(shù)據(jù)集下載:
使用百度飛槳提供的3種水果檢測的小數(shù)據(jù)集,百度網(wǎng)盤鏈接:https://pan.baidu.com/s/1XM1xdM6E7JcIm7EU8J0uMw
提取碼:m9h6
下載后解壓好,放入剛剛下載的YOLO項目的文件夾里邊(注意:小白一定要放,跟著走就不會報錯,如果是大神的話那就隨意了)
參考:https://blog.csdn.net/weixin_45941288/article/details/124286924
三.best.pt轉(zhuǎn)為onnx模型(Windows系統(tǒng))
請看官方教程:?
rknn-toolkit/examples/pytorch/yolov5 at master · rockchip-linux/rknn-toolkit · GitHub
需要指出的是,雖然我們后面要使用的是rknn-toolkit2工具進行模型轉(zhuǎn)換,但教程卻在rknn-toolkit工程中,github二者的父目錄如圖:
上面的
def forward(self, x):
z = [] # inference output
for i in range(self.nl):
x[i] = self.m[i](x[i]) # conv
bs, _, ny, nx = x[i].shape # x[i](bs,self.no * self.na,20,20) to x[i](bs,self.na,20,20,self.no)
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
if not self.training: # inference
if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:
self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)
y = x[i].sigmoid() # (tensor): (b, self.na, h, w, self.no)
if self.inplace:
y[..., 0:2] = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xy
y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh
else: # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
xy = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xy
wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh
y = torch.cat((xy, wh, y[..., 4:]), -1)
z.append(y.view(bs, -1, self.no)) # z (list[P3_pred]): Torch.Size(b, n_anchors, self.no)
return x if self.training else (torch.cat(z, 1), x)
v5.5.0的?
def forward(self, x):
# x = x.copy() # for profiling
z = [] # inference output
self.training |= self.export
for i in range(self.nl):
x[i] = self.m[i](x[i]) # conv
bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
if not self.training: # inference
if self.grid[i].shape[2:4] != x[i].shape[2:4]:
self.grid[i] = self._make_grid(nx, ny).to(x[i].device)
y = x[i].sigmoid()
y[..., 0:2] = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i] # xy
y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # wh
z.append(y.view(bs, -1, self.no))
return x if self.training else (torch.cat(z, 1), x)
v5.6的
def forward(self, x):
z = [] # inference output
for i in range(self.nl):
x[i] = self.m[i](x[i]) # conv
bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
if not self.training: # inference
if self.dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:
self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)
if isinstance(self, Segment): # (boxes + masks)
xy, wh, conf, mask = x[i].split((2, 2, self.nc + 1, self.no - self.nc - 5), 4)
xy = (xy.sigmoid() * 2 + self.grid[i]) * self.stride[i] # xy
wh = (wh.sigmoid() * 2) ** 2 * self.anchor_grid[i] # wh
y = torch.cat((xy, wh, conf.sigmoid(), mask), 4)
else: # Detect (boxes only)
xy, wh, conf = x[i].sigmoid().split((2, 2, self.nc + 1), 4)
xy = (xy * 2 + self.grid[i]) * self.stride[i] # xy
wh = (wh * 2) ** 2 * self.anchor_grid[i] # wh
y = torch.cat((xy, wh, conf), 4)
z.append(y.view(bs, self.na * nx * ny, self.no))
return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x)
?改為
def forward(self, x):
z = [] # inference output
for i in range(self.nl):
x[i] = self.m[i](x[i]) # conv
return x
?注意:在訓(xùn)練時不要修改yolo.py的這段代碼,訓(xùn)練完成后使用export.py進行模型導(dǎo)出轉(zhuǎn)換時一定要進行修改,不然會導(dǎo)致后面的rknn模型轉(zhuǎn)換失敗!
在export.py文件的最開始添加以下代碼
import sys
#里面替換為自己項目目錄下的文件路徑
sys.path.insert(0, '/yolov5_ccj_alage/')
修改后將export.py移動至best.pt同一文件夾下,在命令行調(diào)用以下命令:
python export.py --weights best.pt --img 640 --batch 1
我們便可以得到成功轉(zhuǎn)換的模型best.onnx。
四.best.onnx轉(zhuǎn)為best.rknn模型(Linux系統(tǒng))
?1.環(huán)境準(zhǔn)備和工具包安裝
有了以上的best.onnx模型作為基礎(chǔ),現(xiàn)在可以正式開始rknn模型的轉(zhuǎn)換了。此處的轉(zhuǎn)換工具rknn-toolkit2只能在Linux系統(tǒng)上運行,這里我使用的是PC上的Ubuntu虛擬機。首先安裝rknn-toolkit2的環(huán)境, 其環(huán)境要求在./doc/requirements_cp38-1.4.0.txt中,這里我使用的是conda創(chuàng)建的python3.8虛擬環(huán)境,和windows下anaconda使用方法類似,推薦大家在管理python環(huán)境時使用。創(chuàng)建環(huán)境并命名為rknn,使用pip安裝requirements_cp38-1.4.0.txt中的包。
conda activate rknn
pip install -r requirements_cp38-1.4.0.txt
如果因為網(wǎng)絡(luò)原因未安裝成功,可以換源。
pip install xxxxx -i https://pypi.tuna.tsinghua.edu.cn/simple
?環(huán)境滿足需求后便可以安裝rknn-toolkit2工具包了,瀏覽至./packages中,輸入以下命令:
pip install rknn_toolkit2-1.4.0_22dcfef4-cp38-cp38-linux_x86_64.whl
提示安裝完成后我們可以檢查是否安裝成功,在終端中運行python,輸入:
from rknn.api import RKNN
若不報錯說明我們的工具包已經(jīng)安裝成功,之后便可進行rknn模型的轉(zhuǎn)換了
2.onnx轉(zhuǎn)換為rknn
在rknn-toolkit2工程文件夾中瀏覽至./examples/onnx/yolov5,將我們在2.2中轉(zhuǎn)換得到的best.onnx復(fù)制到該文件夾下,修改該文件夾下的test.py中的內(nèi)容為自己模型的名字,要修改的地方如下:
修改模型和待預(yù)測圖片,以及自定義的類別。
?如果板子是RK3568,即換成RK3568,后面用的板子是RK3568的。
?在這個test.py的main函數(shù)中(在第239行附近)可以了解到這個python文件的作用:
? ? ? ?【?配置——加載onnx模型—導(dǎo)出rknn模型——rknn模型推理——后處理——輸出結(jié)果】
?在test.py的最后,取消注釋,添加cv.imwrite。
運行test.py,開始轉(zhuǎn)換
python test.py
?
result.jpg
?五.RK3568板子上運行demo(RK3568)
1.通電,聯(lián)網(wǎng)
綠燈即運行成功
打開桌面的LXTerminal,輸入ifconfig,查看網(wǎng)絡(luò)狀態(tài)和地址,
依次輸入
systemctl status NetworkManager
systemctl enable NetworkManager
systemctl restart NetworkManager
nmcli c add type ethernet con-name conn-eth1 ifname eth1 ipv4.method auto
執(zhí)行下面命令
nmcli c show
?
nmcli c delete xxxxxxxxxxxxxxxxxxxxxxxxxxxx(uuid)
?把所有查出來的uuid都刪除掉,然后就可以去圖形界面編輯,聯(lián)網(wǎng)了。
2.在RK3568板子上運行yolov5_demo?
?下載好rknpu2_1.3.0,放到了/home/data/ 目錄下,安裝好編譯環(huán)境所需要的,如Cmake,gcc,g++等,可以先執(zhí)行.sh文件,看缺什么安什么。打開LXTerminal。
cd /home/data/rknpu2_1.3.0/examples/rknn_yolov5_demo/install/rknn_yolov5_demo_Linux
./rknn_yolov5_demo model/RK356X/yolov5s-640-640.rknn model/bus.jpg
?
?
47.763500 ms
?運行結(jié)果在上一級文件里
?resize_input.jpg是resize后的輸入圖片,像素大小為640*640,out.jpg是輸出的圖片
?可以多用幾張coco數(shù)據(jù)集里面的照片進行測試,像素大小調(diào)整為640*640
例如斑馬,可以通過U盤將文件導(dǎo)入RK3568板子里去
./rknn_yolov5_demo model/RK356X/yolov5s-640-640.rknn model/horse.jpg
?
用時47.656 ms
六.將自己訓(xùn)練過且轉(zhuǎn)換后的best.rknn傳送到RK3568板子上,并運行(RK3568)
1.通過WinSCP傳輸文件
通過插拔U盤比較費時,且有時候接觸不良,rk3568板子不能識別,所以通過WinSCP傳輸,WinSCP :: Official Site :: Free SFTP and FTP client for Windows官網(wǎng)下載,在RK3568的板子,輸入
ifconfig
查詢板子的ip地址,
ip地址為172.25.177.28。打開WinSCP,寫入主機名,端口號改為22,用戶名為root
?
?點擊登錄后,輸入密碼,即可相互傳輸文件。
2.RK3568平臺部署best.rknn
cd /home/data/rknpu2_1.3.0/examples/rknn_yolov5_demo
進入include文件夾,找到頭文件postprocess.h,
?vim操作命令:i 插入,esc退出操作命令,:wq保存并退出。
#define OBJ_CLASS_NUM 3 #這里的數(shù)字修改為數(shù)據(jù)集的類的個數(shù)
?修改rknn_yolov5_demo/model目錄下的coco_80_labels_list.txt文件,?改為自己的類并保存?
apple
banana
orange
并將待檢測的圖片defect_det.jpg放到目錄下
?將轉(zhuǎn)換后的best.rknn文件通過WinSCP放在rknn_yolov5_demo/model/RK356X目錄下
在rknn_yolov5_demo目錄下編譯,運行shell
bash ./build-linux_RK356X.sh
?成功后生成install目錄
cd install/rknn_yolov5_demo_Linux
運行(這里是將Linux系統(tǒng)下生成的best.rknn的名稱改為了best-640-640.rknn,其實是沒變的,所以下面要用best-640-640.rknn)
./rknn_yolov5_demo model/RK356X/best-640-640.rknn model/defect_det.jpg
?在rknn_yolov5_demo_Linux獲取到結(jié)果
用時48607.371000 ms,用時過長,需要改進,且不能退出執(zhí)行命令了?
參考:
(103條消息) 一分鐘教會您使用Yolov5訓(xùn)練自己的數(shù)據(jù)集并測試_yolov5測試_DK數(shù)據(jù)工作室的博客-CSDN博客
(99條消息) yolov5訓(xùn)練pt模型并轉(zhuǎn)換為rknn模型,部署在RK3588開發(fā)板上——從訓(xùn)練到部署全過程_rknn yolov5_Billy_zz的博客-CSDN博客文章來源:http://www.zghlxwxcb.cn/news/detail-641730.html
(104條消息) Yolov5的配置+訓(xùn)練(超級詳細?。。。小學(xué)生玩編程的博客-CSDN博客_yolov5訓(xùn)練文章來源地址http://www.zghlxwxcb.cn/news/detail-641730.html
到了這里,關(guān)于yolov5的運行環(huán)境配置、參數(shù)修改和訓(xùn)練命令,并將訓(xùn)練的pt模型轉(zhuǎn)換為rknn模型,并推理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!