在交通分析和制造过程自动化等领域,计算机视觉技术扮演着越来越重要的角色。对于任何计算机视觉工程师来说,掌握这些技术至关重要。通过本教程,将能够构建一个可复用的脚本,并成功地将其应用于项目中。还将通过两个看似不同的例子来测试它在实际应用中的表现。
在开始之前,让为应用程序创建一个蓝图。有几个关键步骤需要完成——目标检测、跟踪和注释。对于这些步骤,将使用最先进的工具——YOLOv8、ByteTrack和Supervision。
正如前面提到的,工作从目标检测开始。有许多库可用于目标检测或图像分割;原则上,可以使用其中的任何一个。然而,对于这个项目,将使用YOLOv8。它的原生pip包支持将大大简化生活。
pip install ultralytics
YOLOv8提供了一个SDK,允许在几行Python代码中进行训练或预测。最近发表了一篇文章,详细描述了新的API,如果有兴趣深入了解,可以查看。这篇文章将只关注这个项目需要的部分。
from ultralytics import YOLO
model = YOLO(MODEL_PATH)
model.fuse()
detections = model(frame)
将使用两个基本功能——模型加载和对单个图像的推理。在上面的例子中,MODEL_PATH是指向模型的路径。对于预训练模型,可以简单地定义想要使用的模型版本,例如yolov8x.pt。而frame是一个代表加载的照片或视频帧的numpy数组。
为了计算有多少独立的目标穿过了一条线,需要一个跟踪器。与检测器一样,有许多可用的选项——SORT、DeepSort、FairMOT等。那些记得足球运动员跟踪项目的人会知道ByteTrack是最爱,这次也将使用它。
pip install bytetracker
将检测器与跟踪器集成的过程相当复杂。有关详细步骤,请参考准备的笔记本,已经在其中详细解释了所有步骤。
想象一下,在Twitter或LinkedIn上滚动时,看到了一个演示如何计算道路上行驶的汽车数量的演示。然而,尽管如此,没有可复用的开源工具可以简化这一过程。
在Roboflow,希望使使用计算机视觉构建应用程序变得更加容易,分享开源工具是使命的重要组成部分。这就是创建Supervision——一个Python库,用于解决在任何计算机视觉项目中遇到的常见问题的原因之一。
pip install supervision==0.1.0
Supervision不仅仅是计算穿过线的检测次数。如果想了解更多关于Supervision API的信息,请查看Github或文档。
from supervision.video.dataclasses import VideoInfo
from supervision.video.sink import VideoSink
from supervision.video.source import get_video_frames_generator
video_info = VideoInfo.from_video_path(SOURCE_VIDEO_PATH)
generator = get_video_frames_generator(SOURCE_VIDEO_PATH)
with VideoSink(TARGET_VIDEO_PATH, video_info) as sink:
for frame in tqdm(generator, total=video_info.total_frames):
frame = ...
sink.write_frame(frame)
不能忘记主要关键组件——LineCounter,它计算有多少独立的目标穿过了一条虚拟线。
from supervision.tools.line_counter import LineCounter
from supervision.geometry.dataclasses import Point
LINE_START = Point(50, 1500)
LINE_END = Point(3790, 1500)
line_counter = LineCounter(start=LINE_START, end=LINE_END)
for frame in frames:
detections = ...
line_counter.update(detections=detections)
正如承诺的,在完全不同的用例上测试了应用程序:计算传送带上移动的糖果数量。下面可以看到结果,代码几乎不需要任何更改。唯一调整的是模型的路径和线条的位置。
现在已经知道如何使用Supervision来启动项目,并通过跟踪和计数感兴趣的目标来释放创造力。下一步,使用开源的Roboflow Inference Server在本地或设备上部署训练的模型。