1、前言
上一章,UI的可視化界面已經(jīng)創(chuàng)建好了。并且通過(guò)UI文件編譯成了python可以處理的py文件,為了方便使用,我們新建了qt_inference 對(duì)ui的py腳本進(jìn)行調(diào)用,效果如下
UI可視化的生成:YOLOV5 部署:QT的可視化界面推理(創(chuàng)建UI,并編譯成py文件)-CSDN博客
本章將接著上面操作,完成一個(gè)可以實(shí)時(shí)檢測(cè)的YOLOV5可視化推理界面
下面將根據(jù)項(xiàng)目一步一步實(shí)現(xiàn)函數(shù),可能會(huì)看得有點(diǎn)頭昏,或者害怕代碼缺失的問(wèn)題。不用擔(dān)心,文末會(huì)有腳本的全部代碼,可以拷貝下面跟著博文一起實(shí)現(xiàn)就行了
2、簡(jiǎn)單的圖片、視頻檢測(cè)函數(shù)
下面對(duì)ui的每一個(gè)按鈕綁定一個(gè)事件,達(dá)到理想的效果
run 方法的detect_image 就是上一章中,按鈕的重新命名,當(dāng)然在編譯生成ui_main_window腳本里也可以看到按鈕的名稱
如下:點(diǎn)擊按鈕,就能出現(xiàn)信息啦
3、torch.hub 檢測(cè)
因?yàn)閥olov5的檢測(cè)參數(shù)太多,不方便可視化的部署,所以這里介紹一個(gè)簡(jiǎn)單的推理方法
代碼如下:
前面的pathlib是為了解決path報(bào)錯(cuò)的問(wèn)題,如果沒(méi)有報(bào)錯(cuò)的話,可以刪除這三行
torch.hub.load 參數(shù):當(dāng)前文件夾、自定義模型、權(quán)重路徑、本地項(xiàng)目
import torch
'''
解決下面的問(wèn)題
Exception: cannot instantiate 'PosixPath' on your system. Cache may be out of date,
try `force_reload=True` or see https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading for help.
'''
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
model = torch.hub.load('./','custom',path='runs/train/exp/weights/best.pt',source='local')
img = './datasets/images/train/180.jpg'
result = model(img)
result.show()
運(yùn)行:其實(shí)pycharm控制臺(tái)也可以看見(jiàn)解釋器的位置
結(jié)果:
result.render()[0]? 添加這個(gè),可以將推理結(jié)果的圖片數(shù)組提出來(lái),而非show
4、圖片檢測(cè)事件
既然按鈕已經(jīng)和我們的代碼綁定在一起了,只要在代碼里實(shí)現(xiàn)想要的操作就易如反掌了,這也是我們擅長(zhǎng)的
4.1 讀取文件夾、圖片
因?yàn)辄c(diǎn)擊圖片檢測(cè)按鈕的時(shí)候,應(yīng)該會(huì)彈出一個(gè)窗口,讓我們?cè)诒镜氐哪夸浵逻M(jìn)行查找待推理的圖片,這里需要導(dǎo)入下面的庫(kù)函數(shù)
這里的dir 是默認(rèn)打開的文件路徑,filter 是指定打開的文件格式,這里是圖片格式
效果如下:
如果什么都不選,點(diǎn)擊取消的話,也會(huì)返回兩個(gè)元組,只不過(guò)都是空的。而我們只需要第一個(gè)元組,因?yàn)檫@個(gè)是圖片的路徑?。?/p>
4.2 在UI界面中顯示圖片
需要導(dǎo)入函數(shù),用于QT的顯示圖片
然后把路徑傳入input窗口即可(還記得嗎,input是我們定義的顯示圖片的組件名稱)
4.3 推理部分
那么根據(jù)第三節(jié)的hub檢測(cè),推理的代碼就很好寫了
首先導(dǎo)入庫(kù)
然后導(dǎo)入模型,并且推理即可
4.4 顯示推理結(jié)果
因?yàn)閕mage 是個(gè)數(shù)組形式,雖然也是個(gè)圖片,但是QT不支持,所以需要轉(zhuǎn)成QT的格式
將數(shù)組轉(zhuǎn)入QT格式的數(shù)據(jù)
調(diào)用推理函數(shù),并且輸出即可
4.5 可視化圖片檢測(cè)的完整代碼
代碼:
import sys
from PySide6.QtWidgets import QMainWindow,QApplication,QFileDialog # 打開文件夾的函數(shù)
from ui_main_window import Ui_MainWindow
from PySide6.QtGui import QPixmap,QImage # 顯示圖片庫(kù),qt的圖片格式
import torch
'''
解決下面的問(wèn)題
Exception: cannot instantiate 'PosixPath' on your system. Cache may be out of date,
try `force_reload=True` or see https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading for help.
'''
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
# 圖片轉(zhuǎn)換
def convert2QImage(img):
h,w,c = img.shape
return QImage(img,w,h,w*c,QImage.Format_RGB888)
class MainWindow(QMainWindow,Ui_MainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.setupUi(self) # 根據(jù)ui文件編譯成的 py類
self.model = torch.hub.load('./','custom',path='runs/train/exp/weights/best.pt',source='local') # 加載模型
self.run() # 將按鈕和事件綁定,通過(guò)鼠標(biāo)點(diǎn)擊觸發(fā)
def image_pred(self,file_path):
results = self.model(file_path)
image = results.render()[0] # 推理結(jié)果,是個(gè)數(shù)組
image = convert2QImage(image) # 轉(zhuǎn)成QT支持的數(shù)據(jù)
return image
def open_image(self): # 打開圖片
print('image detect')
file_path = QFileDialog.getOpenFileName(self,dir='datasets/images/val',filter='*.jpg;*.png;*.jpeg')
if file_path[0]: # 如果有圖片的話
file_path = file_path[0]
self.input.setPixmap(QPixmap(file_path)) # 將圖片顯示到可視化窗口的輸入部分
qimage = self.image_pred(file_path)
self.output.setPixmap(QPixmap.fromImage(qimage)) # # 將圖片顯示到可視化窗口的輸出部分
def open_video(self): # 打開視頻
print('video detect')
def run(self): # 鼠標(biāo)觸發(fā)的事件
self.detect_image.clicked.connect(self.open_image)
self.detect_video.clicked.connect(self.open_video)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
控制臺(tái)輸出:
可視化結(jié)果展示:
5、視頻檢測(cè)事件
視頻檢測(cè)的部分可圖片檢測(cè)一樣,抽取每幀然后推理、輸出,這里只做簡(jiǎn)單介紹
傳統(tǒng)的while 循環(huán)在QT里面可能會(huì)有較大延遲,為了方便,這里使用計(jì)時(shí)器來(lái)實(shí)現(xiàn)視頻檢測(cè)
代碼的邏輯很簡(jiǎn)單,通過(guò)計(jì)時(shí)器計(jì)數(shù),達(dá)到一定時(shí)間自動(dòng)抽取一幀進(jìn)行預(yù)測(cè)
視頻檢測(cè):
6、完整代碼
項(xiàng)目的邏輯很簡(jiǎn)單,首先可視化窗口,檢測(cè)鼠標(biāo)是否點(diǎn)擊了檢測(cè)的按鈕(run函數(shù))
如果檢測(cè)了圖片,將根據(jù)路徑找到圖片進(jìn)行推理,并且展示在窗口中
如果檢測(cè)了視頻,則計(jì)時(shí)器開始計(jì)時(shí),每到一個(gè)間隔,自動(dòng)運(yùn)行video_pred 函數(shù),也就是視頻檢測(cè),自動(dòng)讀取一幀
?代碼:
import sys
import cv2
from PySide6.QtWidgets import QMainWindow,QApplication,QFileDialog # 打開文件夾的函數(shù)
from ui_main_window import Ui_MainWindow
from PySide6.QtGui import QPixmap,QImage # 顯示圖片庫(kù),qt的圖片格式
from PySide6.QtCore import QTimer # 顯示視頻的計(jì)時(shí)器
import torch
'''
解決下面的問(wèn)題
Exception: cannot instantiate 'PosixPath' on your system. Cache may be out of date,
try `force_reload=True` or see https://docs.ultralytics.com/yolov5/tutorials/pytorch_hub_model_loading for help.
'''
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
# 圖片轉(zhuǎn)換
def convert2QImage(img):
h,w,c = img.shape
return QImage(img,w,h,w*c,QImage.Format_RGB888)
class MainWindow(QMainWindow,Ui_MainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.setupUi(self) # 根據(jù)ui文件編譯成的 py類
self.model = torch.hub.load('./','custom',path='runs/train/exp/weights/best.pt',source='local') # 加載模型
self.timer = QTimer() # 創(chuàng)建計(jì)時(shí)器
self.timer.setInterval(1) # 計(jì)時(shí)器的間隔,ms
self.video = None
self.run() # 將按鈕和事件綁定,通過(guò)鼠標(biāo)點(diǎn)擊觸發(fā)
def image_pred(self,file_path):
results = self.model(file_path)
image = results.render()[0] # 推理結(jié)果,是個(gè)數(shù)組
image = convert2QImage(image) # 轉(zhuǎn)成QT支持的數(shù)據(jù)
return image
def open_image(self): # 打開圖片
self.timer.stop()
print('image detect')
file_path = QFileDialog.getOpenFileName(self,dir='datasets/images/val',filter='*.jpg;*.png;*.jpeg')
if file_path[0]: # 如果有圖片的話
file_path = file_path[0]
self.input.setPixmap(QPixmap(file_path)) # 將圖片顯示到可視化窗口的輸入部分
qimage = self.image_pred(file_path)
self.output.setPixmap(QPixmap.fromImage(qimage)) # 將圖片顯示到可視化窗口的輸出部分
def video_pred(self):
ret, frame = self.video.read()
if not ret:
self.timer.stop() # 沒(méi)有檢測(cè)到視頻,計(jì)時(shí)器停止
else:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame))) # 將圖片顯示到可視化窗口的輸入部分
results = self.model(frame)
image = results.render()[0] # 推理結(jié)果,是個(gè)數(shù)組
self.output.setPixmap(QPixmap.fromImage(convert2QImage(image))) # 將圖片顯示到可視化窗口的輸出部分
def open_video(self): # 打開視頻
print('video detect')
file_path = QFileDialog.getOpenFileName(self, dir='datasets', filter='*.mp4')
if file_path[0]: # 如果有視頻的話
file_path = file_path[0]
self.video = cv2.VideoCapture(file_path) # 打開視頻
self.timer.start()
def run(self): # 鼠標(biāo)觸發(fā)的事件
self.detect_image.clicked.connect(self.open_image)
self.detect_video.clicked.connect(self.open_video)
self.timer.timeout.connect(self.video_pred) # 計(jì)時(shí)器時(shí)間到就預(yù)測(cè)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
項(xiàng)目完整下載:YOLOV5部署,利用QT部署可視化的圖片、視頻推理界面資源-CSDN文庫(kù)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-844679.html
訂閱本專欄,根據(jù)文章自動(dòng)生成即可,不需要下載文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-844679.html
到了這里,關(guān)于YOLOV5 部署:QT的可視化界面推理(根據(jù)UI窗口編寫內(nèi)部函數(shù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!