YoloV8 可視化界面 GUI
- 本項(xiàng)目旨在基于 YoloV8 目標(biāo)檢測(cè)算法開發(fā)一個(gè)直觀的可視化界面,使用戶能夠輕松上傳圖像或視頻,并對(duì)其進(jìn)行目標(biāo)檢測(cè)。
- 通過圖形用戶界面,用戶可以方便地調(diào)整檢測(cè)參數(shù)、查看檢測(cè)結(jié)果,并將結(jié)果保存或?qū)С觥M瑫r(shí),該界面還將提供實(shí)時(shí)目標(biāo)檢測(cè)功能,讓用戶能夠在視頻流中實(shí)時(shí)觀察目標(biāo)的檢測(cè)情況。
- 這個(gè)項(xiàng)目將結(jié)合 YoloV8 強(qiáng)大的檢測(cè)能力和直觀的用戶交互,為用戶提供一種全新的目標(biāo)檢測(cè)體驗(yàn)。
如何運(yùn)行
- python>=3.8
- pip install ultralytics==8.0.48
- pip install pyside6==6.4.2
- python main.py
運(yùn)行上述指令,則可以看到介入下界面!
!!必須安裝相應(yīng)版本的庫
!!否則,將出現(xiàn)以下錯(cuò)誤:not enough values to unpack (expected 5, got 4)
注意事項(xiàng)
ultralytics 遵循 GPL-3.0 協(xié)議,如需商業(yè)使用,需獲得其許可。文章來源:http://www.zghlxwxcb.cn/news/detail-828901.html
建議
資源文件為 resources.qrc,如果您修改了默認(rèn)圖標(biāo),需要使用 pyside6-rcc resoures.qrc >
ui/resources_rc.py 命令來重新生成 .py 文件。文章來源地址http://www.zghlxwxcb.cn/news/detail-828901.html
- 如果您希望使用自己的模型,您需要使用 ultralytics 先訓(xùn)練 yolov8/5 模型,然后將訓(xùn)練好的 .pt 文件放入
models 文件夾中。 - 軟件中仍然存在一些 bug,我會(huì)在有時(shí)間的情況下持續(xù)優(yōu)化并增加一些更有趣的功能。
- 如果您勾選保存結(jié)果,結(jié)果將保存在 ./run 路徑下。
- UI 設(shè)計(jì)文件為 home.ui,如果您對(duì)其進(jìn)行修改,需要使用 pyside6-uic home.ui > ui/home.py
命令來重新生成 .py 文件。 - 資源文件為 resources.qrc,如果您修改了默認(rèn)圖標(biāo),需要使用 pyside6-rcc resoures.qrc >
ui/resources_rc.py 命令來重新生成 .py 文件。
更改自己想要的界面,你可以按照以下步驟進(jìn)行操作:
- 修改 UI 設(shè)計(jì)文件: 打開 UI 設(shè)計(jì)文件(如 .ui 文件),使用 PySide6 的 pyside6-uic 工具將其轉(zhuǎn)換為
Python 代碼。然后在生成的 Python 代碼中進(jìn)行修改,包括布局、組件樣式、交互邏輯等。 - 修改資源文件: 如果界面中使用了自定義圖標(biāo)、圖片等資源,你需要編輯資源文件(如 .qrc 文件),將新的資源添加進(jìn)去,并使用
pyside6-rcc 工具將其編譯成 Python 代碼。 - 重新編譯界面: 保存所有修改后的文件,并重新編譯生成的 Python 代碼。確保所有文件路徑和引用都正確。
- 運(yùn)行程序: 運(yùn)行程序,查看界面效果,并進(jìn)行調(diào)試和優(yōu)化。
主要代碼
class YoloPredictor(BasePredictor, QObject):
yolo2main_pre_img = Signal(np.ndarray) # raw image signal
yolo2main_res_img = Signal(np.ndarray) # test result signal
yolo2main_status_msg = Signal(str) # Detecting/pausing/stopping/testing complete/error reporting signal
yolo2main_fps = Signal(str) # fps
yolo2main_labels = Signal(dict) # Detected target results (number of each category)
yolo2main_progress = Signal(int) # Completeness
yolo2main_class_num = Signal(int) # Number of categories detected
yolo2main_target_num = Signal(int) # Targets detected
def __init__(self, cfg=DEFAULT_CFG, overrides=None):
super(YoloPredictor, self).__init__()
QObject.__init__(self)
self.args = get_cfg(cfg, overrides)
project = self.args.project or Path(SETTINGS['runs_dir']) / self.args.task
name = f'{self.args.mode}'
self.save_dir = increment_path(Path(project) / name, exist_ok=self.args.exist_ok)
self.done_warmup = False
if self.args.show:
self.args.show = check_imshow(warn=True)
# GUI args
self.used_model_name = None # The detection model name to use
self.new_model_name = None # Models that change in real time
self.source = '' # input source
self.stop_dtc = False # Termination detection
self.continue_dtc = True # pause
self.save_res = False # Save test results
self.save_txt = False # save label(txt) file
self.iou_thres = 0.45 # iou
self.conf_thres = 0.25 # conf
self.speed_thres = 10 # delay, ms
self.labels_dict = {} # return a dictionary of results
self.progress_value = 0 # progress bar
# Usable if setup is done
self.model = None
self.data = self.args.data # data_dict
self.imgsz = None
self.device = None
self.dataset = None
self.vid_path, self.vid_writer = None, None
self.annotator = None
self.data_path = None
self.source_type = None
self.batch = None
self.callbacks = defaultdict(list, callbacks.default_callbacks) # add callbacks
callbacks.add_integration_callbacks(self)
# main for detect
@smart_inference_mode()
def run(self):
try:
if self.args.verbose:
LOGGER.info('')
# set model
self.yolo2main_status_msg.emit('Loding Model...')
if not self.model:
self.setup_model(self.new_model_name)
self.used_model_name = self.new_model_name
# set source
self.setup_source(self.source if self.source is not None else self.args.source)
# Check save path/label
if self.save_res or self.save_txt:
(self.save_dir / 'labels' if self.save_txt else self.save_dir).mkdir(parents=True, exist_ok=True)
# warmup model
if not self.done_warmup:
self.model.warmup(imgsz=(1 if self.model.pt or self.model.triton else self.dataset.bs, 3, *self.imgsz))
self.done_warmup = True
self.seen, self.windows, self.dt, self.batch = 0, [], (ops.Profile(), ops.Profile(), ops.Profile()), None
# start detection
# for batch in self.dataset:
count = 0 # run location frame
start_time = time.time() # used to calculate the frame rate
batch = iter(self.dataset)
while True:
# Termination detection
if self.stop_dtc:
if isinstance(self.vid_writer[-1], cv2.VideoWriter):
self.vid_writer[-1].release() # release final video writer
self.yolo2main_status_msg.emit('Detection terminated!')
break
# Change the model midway
if self.used_model_name != self.new_model_name:
# self.yolo2main_status_msg.emit('Change Model...')
self.setup_model(self.new_model_name)
self.used_model_name = self.new_model_name
# pause switch
if self.continue_dtc:
# time.sleep(0.001)
self.yolo2main_status_msg.emit('Detecting...')
batch = next(self.dataset) # next data
self.batch = batch
path, im, im0s, vid_cap, s = batch
visualize = increment_path(self.save_dir / Path(path).stem, mkdir=True) if self.args.visualize else False
# Calculation completion and frame rate (to be optimized)
count += 1 # frame count +1
if vid_cap:
all_count = vid_cap.get(cv2.CAP_PROP_FRAME_COUNT) # total frames
else:
all_count = 1
self.progress_value = int(count/all_count*1000) # progress bar(0~1000)
if count % 5 == 0 and count >= 5: # Calculate the frame rate every 5 frames
最后,看下方的推廣,可聯(lián)系本人。計(jì)算機(jī)視覺、圖像處理、畢業(yè)輔導(dǎo)、作業(yè)幫助、代碼獲取,私聊會(huì)回復(fù)!
到了這里,關(guān)于YoloV8 +可視化界面+GUI+交互式界面目標(biāo)檢測(cè)與跟蹤的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!