介紹
目標檢測是計算機視覺的一個子領域,主要涉及在圖像或視頻中以一定的置信度識別和定位物體。識別出的物體通常帶有一個邊界框,提供了關于物體在場景中的性質和位置的信息。
自2015年YOLO(You Only Look Once)問世以來,它的系統以驚人的準確性和速度實現了實時目標檢測,震驚了計算機視覺領域。自那時以來,YOLO已經進行了多次改進,提高了預測準確性和效率,最終推出了最新的成員:Ultralytics的YOLOv8。
YOLOv8有五個版本:nano(n)、small(s)、medium(m)、large(l)和extra large(x)。它們的改進分別可以通過它們在COCO val2017數據集上的平均精度(mAP)和延遲進行評估。
與以前的版本相比,YOLOv8不僅更快、更準確,而且實現這一性能所需的參數更少,而且還配備了直觀易用的命令行界面(CLI)和Python軟件包,為用戶和開發人員提供更無縫的體驗。
在本文中,我將演示如何使用CLI和Python來應用YOLOv8來檢測靜態圖像、視頻和實時網絡攝像頭中的物體。
安裝
要開始使用YOLOv8,您只需要在終端中運行以下命令即可:
pip install ultralytics
這將通過ultralytics pip包安裝YOLOv8。
圖像檢測
靜態圖像中的目標檢測在各種領域(如監控、醫學成像或零售分析)中已被證明是有用的。無論您選擇在哪個領域應用您的檢測系統,YOLOv8都使您可以輕松實現。下面是我們要對其進行目標檢測的原始圖像:一張擁擠城市中的交通照片。
為了運行YOLOv8,我們將研究CLI和Python兩種實現方式。雖然在這種特定情況下我們將使用jpg圖像,但YOLOv8支持各種不同的圖像格式。
CLI
假設我們想在一張圖片上運行超大型的YOLOv8x(我們將其命名為img.jpg),則可以在CLI中輸入以下命令:
yolo detect predict model=yolov8x.pt source="img.jpg" save=True
在這里,我們指定以下參數:detect用于物體檢測,predict用于執行預測任務,model用于選擇模型版本,source用于提供我們圖片的文件路徑,save用于保存處理過的圖片及其對象的邊界框以及它們的預測類別和類別概率。
Python
在Python中,可以使用以下直觀且低代碼的解決方案實現完全相同的任務:
from ultralytics import YOLO model = YOLO('yolov8x.pt') results = model('img.jpg', save=True)
無論是使用CLI還是Python,
我們可以清楚地看到它檢測到的每個對象周圍的邊界框,以及它們對應的類標簽和概率。
視頻檢測
在視頻文件上執行對象檢測與圖像文件幾乎相同,唯一的區別是源文件格式。與圖像一樣,YOLOv8支持各種不同的視頻格式,可以作為模型的輸入進行處理。在我們的情況下,我們將使用mp4文件。
讓我們再次看一下CLI和Python實現。為了更快的計算,我們現在將使用YOLOv8m模型,而不是特別大的版本。
CLI
yolo detect predict model=yolov8m.pt source="vid.mp4" save=True
python
from ultralytics import YOLO model = YOLO('yolov8m.pt') results = model('vid.mp4', save=True)
首先,在進行物體檢測之前,讓我們檢查一下我們的原始 vid.mp4 文件:
視頻顯示了一個繁忙的城市場景,包括汽車、公交車、卡車和騎自行車的人,以及右側的一些人顯然在等公交車。在使用 YOLOv8 的中等版本處理此文件后,我們得到了以下結果。
同樣,我們可以看到 YOLOv8m 在準確捕捉場景中的對象方面做得非常好。它甚至可以檢測到作為較大整體的一部分的較小的物體,例如騎自行車的人佩戴的背包。
實時檢測
最后,讓我們看一下在實時網絡攝像頭視頻中檢測對象所需的內容。為此,我將使用我的個人網絡攝像頭,就像之前一樣,既有 CLI 方法,也有 Python 方法。為了減少延遲并減少視頻中的滯后,我將使用輕量級的 YOLOv8 的納米版本。
CLI
yolo detect predict model=yolov8n.pt source=0 show=True
這些參數大部分與我們上面看到的用于圖像和視頻文件的參數相同,唯一不同的是source參數,它允許我們指定要使用哪個視頻源。在我的情況下,它是內置網絡攝像頭(0)。
python
from ultralytics import YOLO model = YOLO('yolov8n.pt') model.predict(source="0", show=True)
同樣,我們可以使用超低代碼的Python解決方案執行相同的任務。
這里有一張 YOLOv8n 在實時網絡攝像頭源上的示例圖。
太棒了!盡管視頻質量較低,光照條件不佳,YOLOv8仍然能夠很好地捕捉到對象,甚至還能檢測到背景中的一些物體,例如左側的橄欖油和醋瓶以及右側的水槽。
值得注意的是,盡管這些直觀的CLI命令和低代碼Python解決方案是快速開始對象檢測任務的好方法,但它們在進行自定義配置時存在一定的局限性。例如,如果我們想要配置邊界框的美學效果或執行簡單的任務,例如計算和顯示在任何給定時間檢測到的對象數量,我們將不得不使用諸如cv2或supervision等包來編寫自己的自定義實現。
實際上,上面的網絡攝像頭錄像是使用以下Python代碼記錄的,以調整網絡攝像頭的分辨率和自定義定義邊界框及其注釋。(注:這主要是為了使上面的GIF更具表現力。上面顯示的CLI和Python實現足以產生類似的結果。)
import cv2 import supervision as sv from ultralytics import YOLO def main(): # to save the video writer= cv2.VideoWriter('webcam_yolo.mp4', cv2.VideoWriter_fourcc(*'DIVX'), 7, (1280, 720)) # define resolution cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # specify the model model = YOLO("yolov8n.pt") # customize the bounding box box_annotator = sv.BoxAnnotator( thickness=2, text_thickness=2, text_scale=1 ) while True: ret, frame = cap.read() result = model(frame, agnostic_nms=True)[0] detections = sv.Detections.from_yolov8(result) labels = [ f"{model.model.names[class_id]} {confidence:0.2f}" for _, confidence, class_id, _ in detections ] frame = box_annotator.annotate( scene=frame, detections=detections, labels=labels ) writer.write(frame) cv2.imshow("yolov8", frame) if (cv2.waitKey(30) == 27): # break with escape key break cap.release() writer.release() cv2.destroyAllWindows() if __name__ == "__main__": main()
結論
YOLOv8不僅在準確性和速度方面優于其前身,而且還通過極易使用的CLI和低代碼Python解決方案大大提高了用戶體驗。它還提供五種不同的模型版本,使用戶有機會根據其個人需求和對延遲和準確性的容忍度進行選擇。
無論您的目標是在靜態圖像、視頻或現場網絡攝像頭上執行對象檢測,YOLOv8都能夠以無縫的方式完成。但是,如果您的應用程序需要自定義配置,則可能需要使用其他計算機視覺包,例如cv2和supervision。
審核編輯:劉清
-
計算機視覺
+關注
關注
8文章
1696瀏覽量
45928 -
python
+關注
關注
56文章
4782瀏覽量
84460 -
CLI
+關注
關注
1文章
79瀏覽量
8530
原文標題:目標檢測:如何有效實現YOLOv8
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論