YOLOv8實(shí)戰(zhàn):針對(duì)螞蟻樣本的檢測(cè)、跟蹤與計(jì)數(shù) 原創(chuàng)
本文使用YOLOv8模型,并借助開(kāi)源Ultralytics框架和BoT-SORT跟蹤器,實(shí)現(xiàn)了對(duì)樹(shù)上漫步的螞蟻進(jìn)行計(jì)數(shù)。
簡(jiǎn)介
計(jì)算視頻中的物體是一項(xiàng)具有挑戰(zhàn)性的計(jì)算機(jī)視覺(jué)任務(wù)。與靜態(tài)圖像中的物體計(jì)數(shù)不同,視頻信息涉及額外的復(fù)雜性,因?yàn)槲矬w可能在不同的時(shí)間移動(dòng)、被遮擋或出現(xiàn)和消失,這使得計(jì)數(shù)過(guò)程變得更為復(fù)雜。
在本教程中,我們將演示如何使用對(duì)象檢測(cè)和跟蹤技術(shù)來(lái)計(jì)數(shù)沿著樹(shù)移動(dòng)的螞蟻。具體地說(shuō),我們將利用開(kāi)源的Ultralytics平臺(tái),并集成用于檢測(cè)任務(wù)的YOLOv8模型、用于跟蹤任務(wù)的BoT-SORT跟蹤器和用于對(duì)螞蟻數(shù)量進(jìn)行計(jì)數(shù)的行計(jì)數(shù)器。
流程概述
在典型的視頻對(duì)象計(jì)數(shù)流程中,每一幀都要經(jīng)歷一系列的過(guò)程,包括檢測(cè)、跟蹤和計(jì)數(shù)。以下給出的是針對(duì)每個(gè)步驟的簡(jiǎn)述:
- 檢測(cè):對(duì)象檢測(cè)器識(shí)別并定位每個(gè)幀中的對(duì)象,并在其周圍生成邊界框。
- 跟蹤:跟蹤器跨幀跟蹤這些對(duì)象,為每個(gè)對(duì)象指定唯一的ID,以確保它們只計(jì)數(shù)一次。
- 計(jì)數(shù):計(jì)數(shù)模塊聚合這些信息并添加每個(gè)新對(duì)象以提供準(zhǔn)確的結(jié)果。
總體流程示意圖如下:
連接對(duì)象檢測(cè)器、跟蹤器和計(jì)數(shù)器可能需要大量編碼。幸運(yùn)的是,開(kāi)源的Ultralytics庫(kù)(參考文獻(xiàn)1)提供了無(wú)縫集成這些組件的方案,從而簡(jiǎn)化了這一過(guò)程。
1.使用YOLOv8檢測(cè)對(duì)象
第一步是檢測(cè)每一幀中的螞蟻,在它們周圍產(chǎn)生邊界框。在本教程中,我們將使用我預(yù)先訓(xùn)練的YOLOv8檢測(cè)器來(lái)檢測(cè)螞蟻。我使用Grounding DINO模型(引文2:https://towardsdatascience.com/automatic-labeling-of-object-detection-datasets-using-groundingdino-b66c486656fe?sk=7c98df89b60ea49a6de9efd5278f645e)來(lái)標(biāo)注數(shù)據(jù),然后使用標(biāo)注數(shù)據(jù)來(lái)訓(xùn)練YOLOv8模型。如果你想了解更多關(guān)于訓(xùn)練YOLO模型的信息,請(qǐng)參閱我之前關(guān)于訓(xùn)練YOLOv5(https://towardsdatascience.com/the-practical-guide-for-object-detection-with-yolov5-algorithm-74c04aac4843?sk=00d2a9d6dd84d6ac4de153cab3dba7c0)的文章,因?yàn)檫@些概念是相似的。對(duì)于您的應(yīng)用程序,您可以使用預(yù)先訓(xùn)練的模型或訓(xùn)練自己的自定義模型。
首先,我們需要使用預(yù)先訓(xùn)練的權(quán)重值來(lái)初始化檢測(cè)器:
from ultralytics import YOLO
# 使用預(yù)先訓(xùn)練的權(quán)重值來(lái)初始化YOLOv8模型
model = YOLO("/path/to/your/yolo_model.pt")
稍后,我們將使用檢測(cè)器檢測(cè)視頻循環(huán)中每幀中的螞蟻,將檢測(cè)與跟蹤過(guò)程相結(jié)合。
2.使用BoT-SORT跟蹤器跟蹤對(duì)象
由于螞蟻在視頻幀中多次出現(xiàn),因此必須跟蹤每只螞蟻并為其分配一個(gè)唯一的ID,以確保每只螞蟻只被計(jì)數(shù)一次。Ultralytics框架同時(shí)支持BoT-SORT跟蹤器(見(jiàn)引文3)和ByteTrack跟蹤器(見(jiàn)引文4)進(jìn)行跟蹤。
- ByteTrack跟蹤器:提供準(zhǔn)確性和速度之間的平衡,降低計(jì)算復(fù)雜度。它可能無(wú)法像BoT-SORT跟蹤器那樣處理遮擋和相機(jī)運(yùn)動(dòng)。
- BoT-SORT跟蹤器:與ByteTrack跟蹤器相比,提供了更好的跟蹤準(zhǔn)確性和穩(wěn)健性,尤其是在具有遮擋和相機(jī)運(yùn)動(dòng)的挑戰(zhàn)性場(chǎng)景中。它是以更高的計(jì)算復(fù)雜度和更低的幀速率為代價(jià)的。
當(dāng)然,在這些算法之間的選擇取決于應(yīng)用程序的特定要求。
BoT-SORT的工作原理是:BoT-SORT是一個(gè)多對(duì)象跟蹤器,可以同時(shí)跟蹤多個(gè)對(duì)象。它將運(yùn)動(dòng)和外觀信息與相機(jī)運(yùn)動(dòng)補(bǔ)償相結(jié)合。物體的位置是使用卡爾曼濾波器預(yù)測(cè)的,與現(xiàn)有軌跡的匹配是基于它們的位置和視覺(jué)特征。這種方法允許BoT-SORT跟蹤器即使在存在遮擋或相機(jī)移動(dòng)的情況下也能保持準(zhǔn)確的軌跡。
配置良好的跟蹤器可以補(bǔ)償探測(cè)器的輕微故障。例如,如果對(duì)象檢測(cè)器暫時(shí)無(wú)法檢測(cè)到螞蟻,跟蹤器可以使用運(yùn)動(dòng)和外觀線索來(lái)維持螞蟻的軌跡。
檢測(cè)器和跟蹤器在視頻循環(huán)內(nèi)的每個(gè)幀上迭代使用以產(chǎn)生軌跡。以下是將其集成到視頻處理循環(huán)中的方法:
tracks = model.track(frame, persist=True, tracker=’botsort.yaml’, iou=0.2)
跟蹤器配置是在“botsort.yaml”文件中定義。您可以調(diào)整這些參數(shù)以最適合您的需求。要將tracker更改為ByteTrack,只需將“bytrack.yaml”傳遞給tracker參數(shù)即可。
注意,請(qǐng)確保并集上的交集(IoU)值符合您的應(yīng)用程序要求;IoU閾值(用于非最大值抑制)確定將多接近的檢測(cè)視為同一對(duì)象。persistent=True參數(shù)告訴跟蹤器當(dāng)前幀是序列的一部分,并期望前一幀中的軌跡持續(xù)到當(dāng)前幀中。
3.計(jì)數(shù)對(duì)象
現(xiàn)在,我們已經(jīng)檢測(cè)到并跟蹤了螞蟻,最后一步是統(tǒng)計(jì)視頻中穿過(guò)指定線的唯一螞蟻。Ultralytics庫(kù)中的ObjectCounter類允許我們定義計(jì)數(shù)區(qū)域,該區(qū)域可以是直線或多邊形。在本教程中,我們將使用一條簡(jiǎn)單的線作為計(jì)數(shù)區(qū)域。這種方法通過(guò)確保螞蟻過(guò)線時(shí)只被計(jì)數(shù)一次來(lái)減少錯(cuò)誤,即使它的唯一ID因跟蹤錯(cuò)誤而改變也沒(méi)有問(wèn)題。
首先,我們?cè)谝曨l循環(huán)之前初始化ObjectCounter類:
counter = solutions.ObjectCounter(
view_img=True, # 處理過(guò)程中顯示圖像
reg_pts=[(512, 320), (512, 1850)], # 興趣點(diǎn)區(qū)域
classes_names=model.names, # YOLO模型的類名
draw_tracks=True, # 為對(duì)象繪制跟蹤線
line_thickness=2, # 繪制的線的厚度
)
在視頻循環(huán)中,ObjectCounter將對(duì)跟蹤器生成的軌跡進(jìn)行計(jì)數(shù)。線的點(diǎn)以[(x1,y1),(x2,y2)]格式傳遞給reg_pts參數(shù)處的計(jì)數(shù)器。當(dāng)螞蟻邊界框的中心點(diǎn)第一次與線相交時(shí),它會(huì)根據(jù)其軌跡方向添加到計(jì)數(shù)中。在某個(gè)方向上移動(dòng)的對(duì)象被計(jì)數(shù)為“in”,而在另一個(gè)方向上運(yùn)動(dòng)的對(duì)象被計(jì)算為“Out”。
# 使用對(duì)象計(jì)數(shù)器對(duì)新對(duì)象進(jìn)行計(jì)數(shù)
frame = counter.start_counting(frame, tracks)
完整的代碼
現(xiàn)在,我們已經(jīng)實(shí)現(xiàn)了計(jì)數(shù)組件。接下來(lái),讓我們將代碼與視頻循環(huán)集成到一起,并保存生成的視頻。
#安裝和導(dǎo)入所需庫(kù)
%pip install ultralytics
import cv2
from ultralytics import YOLO, solutions
# 定義路徑
path_input_video = '/path/to/your/input_video.mp4'
path_output_video = "/path/to/your/output_video.avi"
path_model = "/path/to/your/yolo_model.pt"
#初始化YOLOv8檢測(cè)模型
model = YOLO(path_model)
#初始化對(duì)象計(jì)數(shù)器
counter = solutions.ObjectCounter(
view_img=True, #處理過(guò)程中顯示圖像
reg_pts=[(512, 320), (512, 1850)], # 興趣點(diǎn)區(qū)域
classes_names=model.names, # YOLO模型的類名
draw_tracks=True, # 為對(duì)象繪制跟蹤線
line_thickness=2, # 繪制的線的厚度
)
#打開(kāi)視頻文件
cap = cv2.VideoCapture(path_input_video)
assert cap.isOpened(), "Error reading video file"
#初始化視頻寫入程序以保存生成的視頻
video_writer = cv2.VideoWriter(path_output_video, cv2.VideoWriter_fourcc(*"mp4v"), 30, (1080, 1920))
# 迭代視頻幀
frame_count = 0
while cap.isOpened():
success, frame = cap.read()
if not success:
print("Video frame is empty or video processing has been successfully completed.")
break
# 對(duì)當(dāng)前幀執(zhí)行對(duì)象跟蹤
tracks = model.track(frame, persist=True, tracker='botsort.yaml', iou=0.2)
# 使用對(duì)象計(jì)數(shù)器對(duì)幀中的對(duì)象進(jìn)行計(jì)數(shù),并獲得標(biāo)注圖像
frame = counter.start_counting(frame, tracks)
# 將帶標(biāo)注的幀寫入輸出視頻
video_writer.write(frame)
frame_count += 1
#釋放所有資源
cap.release()
video_writer.release()
cv2.destroyAllWindows()
# 打印計(jì)數(shù)結(jié)果
print(f'In: {counter.in_counts}\nOut: {counter.out_counts}\nTotal: {counter.in_counts + counter.out_counts}')
print(f'Saves output video to {path_output_video}')
上面的代碼將對(duì)象檢測(cè)和跟蹤集成到視頻處理循環(huán)中,以保存標(biāo)注的視頻。通過(guò)使用開(kāi)源視頻庫(kù)OpenCV,我們打開(kāi)輸入視頻,并為輸出設(shè)置一個(gè)視頻編寫器。在每一幀中,我們使用BoT-SORT執(zhí)行對(duì)象跟蹤,對(duì)對(duì)象進(jìn)行計(jì)數(shù),并對(duì)幀進(jìn)行標(biāo)注。帶標(biāo)注的幀,包括邊界框、唯一ID、軌跡以及“入”和“出”計(jì)數(shù),都將保存到輸出視頻中?!癷n”和“out”計(jì)數(shù)可以分別從counter.in_counts和counter.out_counts中檢索,也可以打印在輸出視頻中。
上圖展示了本實(shí)驗(yàn)中一個(gè)帶標(biāo)注的框架。圖中,每只螞蟻都被分配了一個(gè)邊界框和一個(gè)唯一的ID。螞蟻穿過(guò)粉線時(shí)會(huì)被計(jì)數(shù)。圖像的一角顯示了螞蟻“進(jìn)”和“出”的數(shù)量。
結(jié)束語(yǔ)
在上面帶標(biāo)注的視頻中,我們正確地統(tǒng)計(jì)了總共85只螞蟻,其中34只進(jìn)入,51只退出。對(duì)于精確計(jì)數(shù),至關(guān)重要的是檢測(cè)器性能良好,跟蹤器配置良好。配置良好的跟蹤器可以補(bǔ)償探測(cè)器的失誤,確保跟蹤的連續(xù)性。
在帶標(biāo)注的視頻中,我們可以看到跟蹤器很好地處理了丟失的檢測(cè),螞蟻周圍的邊界框消失了,并在隨后的幀中返回了正確的ID。此外,為同一對(duì)象分配不同ID的跟蹤錯(cuò)誤(例如,螞蟻#42變成#48)不會(huì)影響計(jì)數(shù),因?yàn)橹挥性竭^(guò)線的螞蟻才會(huì)被計(jì)數(shù)。
總之,在本教程中,我們探討了如何使用先進(jìn)的對(duì)象檢測(cè)和跟蹤技術(shù)對(duì)視頻中的對(duì)象進(jìn)行計(jì)數(shù)。我們使用YOLOv8模型檢測(cè)螞蟻數(shù)據(jù),并使用BoT-SORT跟蹤器進(jìn)行穩(wěn)健跟蹤,所有這些部分都與開(kāi)源Ultralytics庫(kù)無(wú)縫地集成在一起。
參考文獻(xiàn)
[1]Ultralytics GitHub(Ultralytics開(kāi)源框架的代碼倉(cāng)庫(kù)):https://github.com/ultralytics/ultralytics。
[2]Grounding DINO:Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection(將DINO與接地預(yù)訓(xùn)練結(jié)合起來(lái)進(jìn)行開(kāi)放式物體檢測(cè)):https://arxiv.org/pdf/2303.05499。
[3]BoT-SORT: Robust Associations Multi-Pedestrian Tracking(BoT-SORT:魯棒關(guān)聯(lián)多行人跟蹤):https://arxiv.org/pdf/2206.14651。
[4]ByteTrack: Multi-Object Tracking by Associating Every Detection Box(ByteTrack:逐個(gè)檢測(cè)框關(guān)聯(lián)法進(jìn)行多目標(biāo)跟蹤):https://arxiv.org/pdf/2110.06864。
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。
原文標(biāo)題:Mastering Object Counting in Videos,作者:Lihi Gur Arie
鏈接:
https://towardsdatascience.com/mastering-object-counting-in-videos-3d49a9230bd2?。
