0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何實(shí)現(xiàn)YOLOv8 + ONNRUNTIME推理界面化與多線程支持

OpenCV學(xué)堂 ? 來源:OpenCV學(xué)堂 ? 2023-05-22 09:26 ? 次閱讀

2023年一月份跟二月份創(chuàng)建了一個(gè)PyQT5人工智能軟件開發(fā)系列的文章系列,過去的兩個(gè)月都沒怎么更新,心里一直想有時(shí)間繼續(xù)更新下去,今天又更新了一篇,基于PyQT5實(shí)現(xiàn)多線程、界面化、YOLOv8對(duì)象檢測(cè)、實(shí)例分割、姿態(tài)評(píng)估的推理。

基本設(shè)計(jì)思路

這個(gè)系列我好久沒有更新了,今天更新一篇PyQT5中如何實(shí)現(xiàn)YOLOv8 + ONNRUNTIME推理界面化與多線程支持。首先需要實(shí)現(xiàn)三個(gè)類分別完成YOLOv8的對(duì)象檢測(cè)、實(shí)例分割、姿態(tài)評(píng)估模型推理。然后在實(shí)現(xiàn)界面類,構(gòu)建如圖:

3477fe08-f815-11ed-90ce-dac502259ad0.png

推理類型通過單選按鈕實(shí)現(xiàn)選擇,支持對(duì)象檢測(cè)、實(shí)例分割、姿態(tài)評(píng)估。參數(shù)設(shè)置選擇模型文件與標(biāo)簽文件地址作為輸入,同時(shí)選擇置信度,置信度之在0~1之間。 推理按鈕開發(fā)推理演示,支持視頻與圖像文件,開始推理會(huì)單獨(dú)開啟一個(gè)推理線程實(shí)現(xiàn)推理,推理結(jié)果通過信號(hào)發(fā)送到指定的槽函數(shù)處理之后更新界面,通過信號(hào)與槽機(jī)制實(shí)現(xiàn)界面線程跟推理線程相互獨(dú)立與數(shù)據(jù)共享。

界面代碼實(shí)現(xiàn)

界面部分通過一個(gè)QWidget實(shí)現(xiàn)一個(gè)面板,通過垂直與水平布局實(shí)現(xiàn)界面組件的布局管理,相關(guān)的代碼實(shí)現(xiàn)如下:

classYOLOv8InferPanel(QtWidgets.QWidget):
def__init__(self,parent=None):
super().__init__(parent)

#文本標(biāo)簽
self.rbtn0=QtWidgets.QRadioButton("對(duì)象檢測(cè)")
self.rbtn1=QtWidgets.QRadioButton("實(shí)例分割")
self.rbtn3=QtWidgets.QRadioButton("姿態(tài)評(píng)估")
self.rbtn0.setChecked(True)

hbox_layout1=QtWidgets.QHBoxLayout()
hbox_layout1.addWidget(self.rbtn0)
hbox_layout1.addWidget(self.rbtn1)
hbox_layout1.addWidget(self.rbtn3)

panel3=QtWidgets.QGroupBox("推理類型")
panel3.setLayout(hbox_layout1)

#輸入文本框
self.image_file_edit=QtWidgets.QLineEdit()
self.image_file_edit.setMinimumWidth(100)
self.image_file_edit.setEnabled(False)
fileBtn=QtWidgets.QPushButton("圖像文件")
self.weight_file_path=QtWidgets.QLineEdit()
self.weight_file_path.setMinimumWidth(100)
self.weight_file_path.setEnabled(False)
modelBtn=QtWidgets.QPushButton("模型文件")

self.label_file_path=QtWidgets.QLineEdit()
self.label_file_path.setMinimumWidth(100)
self.label_file_path.setEnabled(False)
labelBtn=QtWidgets.QPushButton("標(biāo)簽文件")

self.conf_spinbox=QtWidgets.QDoubleSpinBox()
self.conf_spinbox.setRange(0,1)
self.conf_spinbox.setSingleStep(0.01)
self.conf_spinbox.setValue(0.25)

grid_layout2=QtWidgets.QGridLayout()
grid_layout2.addWidget(fileBtn,0,0)
grid_layout2.addWidget(self.image_file_edit,0,1)
grid_layout2.addWidget(modelBtn,0,2)
grid_layout2.addWidget(self.weight_file_path,0,3)

grid_layout2.addWidget(labelBtn,1,0)
grid_layout2.addWidget(self.label_file_path,1,1)
grid_layout2.addWidget(QtWidgets.QLabel("置信:"),1,2)
grid_layout2.addWidget(self.conf_spinbox,1,3)

panel2=QtWidgets.QGroupBox("參數(shù)設(shè)置")
panel2.setLayout(grid_layout2)

#輸入文本框
self.label=QtWidgets.QLabel()
self.label.setMinimumSize(1280,720)
pixmap=QtGui.QPixmap("images/wp.jpg")
pix=pixmap.scaled(QtCore.QSize(1280,720),QtCore.Qt.KeepAspectRatio)
self.label.setPixmap(pix)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setStyleSheet("background-color:black;color:green")

self.startBtn=QtWidgets.QPushButton("開始推理")
self.stopBtn=QtWidgets.QPushButton("停止")
self.startBtn.setStyleSheet("background-color:cyan;color:black")
self.stopBtn.setStyleSheet("background-color:gray;color:white")
self.stopBtn.setEnabled(False)
hbox_layout=QtWidgets.QHBoxLayout()
hbox_layout.addStretch(1)
hbox_layout.addWidget(self.startBtn)
hbox_layout.addWidget(self.stopBtn)
panel1=QtWidgets.QWidget()
panel1.setLayout(hbox_layout)

#添加到布局管理器中
vbox_layout=QtWidgets.QVBoxLayout()
vbox_layout.addWidget(panel3)
vbox_layout.addWidget(panel2)
vbox_layout.addWidget(panel1)
vbox_layout.addWidget(self.label)
vbox_layout.addStretch(1)

#面板容器
self.setLayout(vbox_layout)

#setuplistener
modelBtn.clicked.connect(self.on_weight_select)
fileBtn.clicked.connect(self.on_update_image)
labelBtn.clicked.connect(self.on_label_select)
self.startBtn.clicked.connect(self.on_yolov8_infer)
self.work_thread=None

推理線程

基于QThread繼承實(shí)現(xiàn)run方法,完成推理線程構(gòu)建,根據(jù)傳入的參數(shù)不同,初始化不同的推理類型(對(duì)象檢測(cè)、實(shí)例分割、姿態(tài)評(píng)估),推理線程實(shí)現(xiàn)代碼如下:

classInferenceThread(QtCore.QThread):
fire_stats_signal=QtCore.pyqtSignal(dict)

def__init__(self,settings):
super(InferenceThread,self).__init__()
self.settings=settings
self.detector=None
ifself.settings.model_type==0:
self.detector=YOLOv8ORTDetector(settings)
ifself.settings.model_type==1:
self.detector=YOLOv8ORTSegment(settings)
ifself.settings.model_type==2:
self.detector=YOLOv8ORTPose(settings)
self.input_image=settings.input_image

defrun(self):
ifself.detectorisNone:
return
ifself.input_image.endswith(".mp4"):
cap=cv.VideoCapture(self.input_image)
whileTrue:
ret,frame=cap.read()
ifretisTrue:
self.detector.infer_image(frame)
self.fire_stats_signal.emit({"result":frame})
else:
break
else:
frame=cv.imread(self.input_image)
self.detector.infer_image(frame)
self.fire_stats_signal.emit({"result":frame})
self.fire_stats_signal.emit({"done":"done"})
return

351560e4-f815-11ed-90ce-dac502259ad0.png

354f9ef8-f815-11ed-90ce-dac502259ad0.png

356fb436-f815-11ed-90ce-dac502259ad0.png

應(yīng)用程序演示

最終調(diào)用應(yīng)用程序代碼,實(shí)現(xiàn)啟動(dòng)與運(yùn)行的界面如下:

#初始化APP實(shí)例
importplatform
app=QtWidgets.QApplication(sys.argv)
if'Windows'==platform.system():
app.setStyle('Windows')
#初始化桌面容器
main_win=QtWidgets.QMainWindow()
#設(shè)置APP窗口名稱
main_win.setWindowTitle("YOLOv8多線程推理應(yīng)用演示-2號(hào)高手")
#初始化內(nèi)容面板
content_panel=YOLOv8InferPanel()
#設(shè)置窗口大小
main_win.setMinimumSize(1340,960)
main_win.setCentralWidget(content_panel)

#請(qǐng)求顯示
main_win.show()
#加載窗口并啟動(dòng)App
app.exec()
審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    4945

    瀏覽量

    87509
  • 人工智能
    +關(guān)注

    關(guān)注

    1791

    文章

    47282

    瀏覽量

    238534
  • pyqt5
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    3402

原文標(biāo)題:多線程界面化、ONNXRUNTIME + YOLOv8推理演示

文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于YOLOv8實(shí)現(xiàn)自定義姿態(tài)評(píng)估模型訓(xùn)練

    Hello大家好,今天給大家分享一下如何基于YOLOv8姿態(tài)評(píng)估模型,實(shí)現(xiàn)在自定義數(shù)據(jù)集上,完成自定義姿態(tài)評(píng)估模型的訓(xùn)練與推理。
    的頭像 發(fā)表于 12-25 11:29 ?2853次閱讀
    基于<b class='flag-5'>YOLOv8</b><b class='flag-5'>實(shí)現(xiàn)</b>自定義姿態(tài)評(píng)估模型訓(xùn)練

    使用YOLOv8做目標(biāo)檢測(cè)和實(shí)例分割的演示

    YOLOv8是來自Ultralytics的最新的基于YOLO的對(duì)象檢測(cè)模型系列,提供最先進(jìn)的性能。
    的頭像 發(fā)表于 02-06 10:11 ?7501次閱讀

    YOLOv8自定義數(shù)據(jù)集訓(xùn)練到模型部署推理簡(jiǎn)析

    如果你只是想使用而不是開發(fā),強(qiáng)烈推薦通過pip安裝方式獲取YOLOv8包!YOLOv8安裝命令行
    的頭像 發(fā)表于 03-24 09:27 ?4668次閱讀

    TensorRT 8.6 C++開發(fā)環(huán)境配置與YOLOv8實(shí)例分割推理演示

    對(duì)YOLOv8實(shí)例分割TensorRT 推理代碼已經(jīng)完成C++類封裝,三行代碼即可實(shí)現(xiàn)YOLOv8對(duì)象檢測(cè)與實(shí)例分割模型推理,不需要改任何代
    的頭像 發(fā)表于 04-25 10:49 ?5814次閱讀
    TensorRT 8.6 C++開發(fā)環(huán)境配置與<b class='flag-5'>YOLOv8</b>實(shí)例分割<b class='flag-5'>推理</b>演示

    YOLOv8版本升級(jí)支持小目標(biāo)檢測(cè)與高分辨率圖像輸入

    YOLOv8版本最近版本又更新了,除了支持姿態(tài)評(píng)估以外,通過模型結(jié)構(gòu)的修改還支持了小目標(biāo)檢測(cè)與高分辨率圖像檢測(cè)。原始的YOLOv8模型結(jié)構(gòu)如下。
    的頭像 發(fā)表于 05-16 11:14 ?1.2w次閱讀
    <b class='flag-5'>YOLOv8</b>版本升級(jí)<b class='flag-5'>支持</b>小目標(biāo)檢測(cè)與高分辨率圖像輸入

    教你如何用兩行代碼搞定YOLOv8各種模型推理

    大家好,YOLOv8 框架本身提供的API函數(shù)是可以兩行代碼實(shí)現(xiàn) YOLOv8 模型推理,這次我把這段代碼封裝成了一個(gè)類,只有40行代碼左右,可以同時(shí)
    的頭像 發(fā)表于 06-18 11:50 ?3069次閱讀
    教你如何用兩行代碼搞定<b class='flag-5'>YOLOv8</b>各種模型<b class='flag-5'>推理</b>

    目標(biāo)檢測(cè)算法再升級(jí)!YOLOv8保姆級(jí)教程一鍵體驗(yàn)

    YOLO作為一種基于圖像全局信息進(jìn)行預(yù)測(cè)的目標(biāo)檢測(cè)系統(tǒng),始終保持著極高的迭代更新率,從YOLOv5到YOLOv8,本次升級(jí)主要包括結(jié)構(gòu)算法、命令行界面、PythonAPI等。具體到YOLOv8
    的頭像 發(fā)表于 02-28 11:16 ?2693次閱讀
    目標(biāo)檢測(cè)算法再升級(jí)!<b class='flag-5'>YOLOv8</b>保姆級(jí)教程一鍵體驗(yàn)

    三種主流模型部署框架YOLOv8推理演示

    深度學(xué)習(xí)模型部署有OpenVINO、ONNXRUNTIME、TensorRT三個(gè)主流框架,均支持Python與C++的SDK使用。對(duì)YOLOv5~YOLOv8的系列模型,均可以通過C++推理
    的頭像 發(fā)表于 08-06 11:39 ?2752次閱讀

    解鎖YOLOv8修改+注意力模塊訓(xùn)練與部署流程

    很多人也想跟修改YOLOv5源碼一樣的方式去修改YOLOv8的源碼,但是在github上面卻發(fā)現(xiàn)找到的YOLOv8項(xiàng)目下面TAG分支是空的
    的頭像 發(fā)表于 08-11 14:14 ?4365次閱讀
    解鎖<b class='flag-5'>YOLOv8</b>修改+注意力模塊訓(xùn)練與部署流程

    如何修改YOLOv8的源碼

    很多人也想跟修改YOLOv5源碼一樣的方式去修改YOLOv8的源碼,但是在github上面卻發(fā)現(xiàn)找到的YOLOv8項(xiàng)目下面TAG分支是空的,然后就直接從master/main下面把源碼克隆出來一通
    的頭像 發(fā)表于 09-04 10:02 ?2007次閱讀
    如何修改<b class='flag-5'>YOLOv8</b>的源碼

    YOLOv8實(shí)現(xiàn)任意目錄下命令行訓(xùn)練

    當(dāng)你使用YOLOv8命令行訓(xùn)練模型的時(shí)候,如果當(dāng)前執(zhí)行的目錄下沒有相關(guān)的預(yù)訓(xùn)練模型文件,YOLOv8就會(huì)自動(dòng)下載模型權(quán)重文件。這個(gè)是一個(gè)正常操作,但是你還會(huì)發(fā)現(xiàn),當(dāng)你在參數(shù)model中指定已有
    的頭像 發(fā)表于 09-04 10:50 ?1115次閱讀
    <b class='flag-5'>YOLOv8</b><b class='flag-5'>實(shí)現(xiàn)</b>任意目錄下命令行訓(xùn)練

    OpenCV4.8+YOLOv8對(duì)象檢測(cè)C++推理演示

    自從YOLOv5更新成7.0版本,YOLOv8推出以后,OpenCV4.6以前的版本都無法再加載導(dǎo)出ONNX格式模型了,只有OpenCV4.7以上版本才可以支持最新版本YOLOv5與
    的頭像 發(fā)表于 09-27 11:07 ?1550次閱讀
    OpenCV4.8+<b class='flag-5'>YOLOv8</b>對(duì)象檢測(cè)C++<b class='flag-5'>推理</b>演示

    基于YOLOv8的自定義醫(yī)學(xué)圖像分割

    YOLOv8是一種令人驚嘆的分割模型;它易于訓(xùn)練、測(cè)試和部署。在本教程中,我們將學(xué)習(xí)如何在自定義數(shù)據(jù)集上使用YOLOv8。但在此之前,我想告訴你為什么在存在其他優(yōu)秀的分割模型時(shí)應(yīng)該使用YOLOv8呢?
    的頭像 發(fā)表于 12-20 10:51 ?782次閱讀
    基于<b class='flag-5'>YOLOv8</b>的自定義醫(yī)學(xué)圖像分割

    YOLOv8實(shí)現(xiàn)旋轉(zhuǎn)對(duì)象檢測(cè)

    YOLOv8框架在在支持分類、對(duì)象檢測(cè)、實(shí)例分割、姿態(tài)評(píng)估的基礎(chǔ)上更近一步,現(xiàn)已經(jīng)支持旋轉(zhuǎn)對(duì)象檢測(cè)(OBB),基于DOTA數(shù)據(jù)集,支持航拍圖像的15個(gè)類別對(duì)象檢測(cè),包括車輛、船只、典型
    的頭像 發(fā)表于 01-11 10:43 ?1832次閱讀
    <b class='flag-5'>YOLOv8</b><b class='flag-5'>實(shí)現(xiàn)</b>旋轉(zhuǎn)對(duì)象檢測(cè)

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8的模型部署與推理演示

    基于OpenCV DNN實(shí)現(xiàn)YOLOv8推理的好處就是一套代碼就可以部署在Windows10系統(tǒng)、烏班圖系統(tǒng)、Jetson的Jetpack系統(tǒng)
    的頭像 發(fā)表于 03-01 15:52 ?1636次閱讀
    基于OpenCV DNN<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>YOLOv8</b>的模型部署與<b class='flag-5'>推理</b>演示