创作背景
为何我会创作这篇文章,我认为这和我的前几篇铺垫文章有关,如果你是一位程序员,你在实际开发应用时这段代码现在已经实现了可以用摄像头检测到物体并且实时返回物体数据的功能,但是我们在实际运用这个软件时它并不是一个优秀的软件,因为我们在实际运用时,我举一个例子,我现在有两把钥匙,可是我的软件只返回最后一帧的钥匙的数据,它返回得到的并不能真实反映数据的真实值,它得到的只是一个钥匙的最后一帧的数据,并不能返回存在多个钥匙时,多个钥匙的数据。我想这样的程序并不是一个优秀的程序。
经过翻阅了大量的资料,找到了sort算法,我们需要实施一种方法来持续追踪每个检测到的物体。这通常涉及到物体跟踪技术,可以使用跟踪器如SORT或DeepSORT与YOLO检测器结合使用,从而能够在多帧中追踪同一个物体。
SORT (Simple Online and Realtime Tracking) 是一种实时的多目标跟踪算法,它通过预测目标的移动来追踪。与YOLOv5集成时,YOLOv5负责检测目标,而SORT负责跟踪这些目标。
安装sort
库
可以使用pip
来安装sort
。打开您的命令行工具(如CMD、Terminal或Anaconda Prompt),然后输入以下命令
pip install filterpy
sort
算法本身不是一个独立的包,而是一种算法实现,通常可以在GitHub等地找到源代码。如果您没有找到名为sort
的直接可用包,您可能需要从GitHub克隆并使用相关的sort
算法。一个流行的实现是Sort,这是一个简单在线实时跟踪算法的实现。
使用Sort库
如果您是从GitHub克隆的sort
库,您可能需要将克隆的代码目录添加到Python的路径中,或者直接在该目录下工作。如果是这样,安装过程可能如下:
克隆仓库:
git clone https://github.com/abewley/sort.git
在您的Python脚本中引用Sort库:
from sort import Sort
确保您的工作目录是克隆的sort
目录或者您已经将该目录添加到了Python的路径中。
配置步骤
1.集成物体跟踪算法
首先,您需要在YOLO检测基础上添加一个跟踪器。这可以通过使用已有的跟踪库如sort
完成:
from sort import Sort
tracker = Sort() # 初始化跟踪器
在您的YOLOv5Detector
的predict
方法中,将检测到的框(detections)传递给跟踪器:
tracked_objects = tracker.update(detections.numpy())
2.修改数据保存逻辑
根据跟踪结果修改save_results_to_file
函数,以便记录每个跟踪对象的累积数据而不是每帧的输出。可以创建一个字典来存储每个物体的统计数据,并在视频处理结束后写入文件。
tracking_data = {}
def update_tracking_data(tracked_objects):
for obj in tracked_objects:
track_id = int(obj[4]) # 获取跟踪ID
if track_id not in tracking_data:
tracking_data[track_id] = {
'Goal_A': [],
'Goal_B': [],
'Goal_C': 0 # 假设这是某种计数或者其他统计值
}
# 更新统计数据
tracking_data[track_id]['Goal_A'].append(obj[0]) # X 中心坐标
tracking_data[track_id]['Goal_B'].append(obj[1]) # Y 中心坐标
tracking_data[track_id]['Goal_C'] += 1 # 计数器,每次见到该对象时增加
def save_results_to_file():
with open(filepath, 'w') as file:
file.write("START\n")
for track_id, data in tracking_data.items():
line = f"Goal_ID={track_id};Goal_A={np.mean(data['Goal_A']):.2f};Goal_B={np.mean(data['Goal_B']):.2f};Goal_C={data['Goal_C']}\n"
file.write(line)
file.write("END\n")
3.在视频处理结束后保存数据
在视频流处理完毕后调用save_results_to_file
,以确保所有跟踪数据被写入文件。
# 在适当的时机调用
save_results_to_file()
4.处理性能和多线程问题
跟踪和检测都是计算密集型的任务,您可能需要优化代码或使用更强大的硬件来处理视频流,或者通过多线程/多进程来平衡负载。
通过这种方式,您可以累积每个跟踪对象在视频中的统计数据,而不是仅仅记录每一帧的数据。这将更符合您描述的需求,为每个物体提供全面的统计信息。
最终示例
以下是一个简化的示例,展示如何将YOLOv5和SORT算法结合,并使用多线程处理视频帧:
import cv2
from concurrent.futures import ThreadPoolExecutor
from yolov5 import YOLOv5
from sort import Sort
# 初始化YOLOv5和SORT
yolo = YOLOv5(weights="path_to_yolov5_weights")
sort_tracker = Sort()
def process_frame(frame):
detections = yolo.detect(frame)
tracked_objects = sort_tracker.update(detections)
return tracked_objects
def save_data(tracked_data):
# 保存追踪数据逻辑
pass
# 读取视频
cap = cv2.VideoCapture('path_to_video')
frames = []
while True:
ret, frame = cap.read()
if not ret:
break
frames.append(frame)
# 使用线程池处理帧
with ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(process_frame, frames))
# 保存数据
save_data(results)
cap.release()
这个例子假设你已经有了YOLOv5
和Sort
类的实现。在实际应用中,你需要调整路径、参数和具体的保存逻辑以适应你的项目需求。点个关注,可以和作者私聊,作者看到都会回复。
以上观点仅仅代表个人观点,作者水平有限有不足之处望批评。
"转载请务必注明文章来源,未经授权禁止复制或使用。"
初入前端小白原创内容