0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用命令行界面和Python对实时网络摄像头中的物体进行检测

新机器视觉 来源:小白玩转Python 2023-05-15 09:15 次阅读

介绍

目标检测计算机视觉的一个子领域,主要涉及在图像或视频中以一定的置信度识别和定位物体。识别出的物体通常带有一个边界框,提供了关于物体在场景中的性质和位置的信息

自2015年YOLO(You Only Look Once)问世以来,它的系统以惊人的准确性和速度实现了实时目标检测,震惊了计算机视觉领域。自那时以来,YOLO已经进行了多次改进,提高了预测准确性和效率,最终推出了最新的成员:Ultralytics的YOLOv8。

YOLOv8有五个版本:nano(n)、small(s)、medium(m)、large(l)和extra large(x)。它们的改进分别可以通过它们在COCO val2017数据集上的平均精度(mAP)和延迟进行评估。

b7d3a29e-f2b5-11ed-90ce-dac502259ad0.png

与以前的版本相比,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 的中等版本处理此文件后,我们得到了以下结果。

b90570ac-f2b5-11ed-90ce-dac502259ad0.png

同样,我们可以看到 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 在实时网络摄像头源上的示例图。

ba85079e-f2b5-11ed-90ce-dac502259ad0.png

太棒了!尽管视频质量较低,光照条件不佳,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

    文章

    1600

    浏览量

    45623
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476
  • CLI
    CLI
    +关注

    关注

    1

    文章

    79

    浏览量

    8407

原文标题:目标检测:如何有效实现YOLOv8

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在STM32实现命令行

    工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行工具,有几个不错的开源 cmd 交互工具,主要看了 finsh
    发表于 12-09 11:32 1630次阅读

    如何从摄像头中获取图像并保存和实时显示

    开发环境,包括相关源的更新,库的安装,按照上次blog中的介绍,安装好Python-opencv和导入cv2库后,就可以进行接下来我们今天的学习了,今天将叫大家进一步实现如何从摄像头中获取图像,同时
    发表于 09-25 15:15

    为什么需要使用命令行调试程序?

    为什么需要使用命令行调试程序?通过嵌入式开发中通过命令行调试程序的过程是怎样的?
    发表于 12-24 06:44

    labview 调用命令行烧录时如何实时显示过程和进度?

    例如使用命令行进行自动烧录时,利用系统命令VI可以实现控制烧录器自动烧录,但是命令行运行后会跳出命令提示符但是不会显示烧录的过程和进度,只有当烧录结束后才会在输出端子出输出整个烧录的过
    发表于 08-29 11:54

    cmd网络经典命令行

    cmd网络经典命令行:
    发表于 06-11 15:17 36次下载
    cmd<b class='flag-5'>网络</b>经典<b class='flag-5'>命令行</b>

    用命令行管理IIS的FTP站点

    用命令行管理IIS的FTP站点   为了实现在Internet中快速共享网络资源的目的,很多用户使用IIS服务器内置的FTP组件架设FTP服务器。
    发表于 01-30 17:25 879次阅读

    维基链的命令行是如何高效快速的对维基链节点进行操作的

    命令行,是一种面向开发者的工具。 众所周知,在Linux系统中,Linux本身也提供了一系列的命令行工具,比如ls、cd、ps等等开发者常用命令,方便开发者轻松地与Linux系统进行
    发表于 06-24 11:15 877次阅读

    如何使用命令行在Linux中查找文件?

    对于Linux新用户来说,在Linux中查找文件可能有点困难。但是,在适当的指导下,任何人都可以创建文件快捷方式或找到其Linux系统中有多少文件。 我们必须使用命令行来查找文件或特定文件名。也称为
    的头像 发表于 03-23 14:55 2457次阅读

    如何在Linux命令行中运行Python脚本

    Python 是一种高级编程语言,被广泛应用于数据科学、机器学习、Web 开发等领域。在 Linux 操作系统中,Python 是一个默认安装的解释器,用户可以通过命令行界面(CLI)
    的头像 发表于 05-12 14:49 1373次阅读

    用命令行工具ADB(Android Debug Bridge)常见的ADB命令

    ADB(Android Debug Bridge)是一种通用命令行工具,可以让您通过计算机与设备通信。
    的头像 发表于 11-05 11:26 407次阅读

    linux虚拟机怎么调出命令行

    快捷键组合Ctrl+Alt+F1 6来切换到命令行界面。如果系统在虚拟机中,则可以使用Ctrl+Alt+shift+F1 6组合键来切换到命令行界面。在
    的头像 发表于 11-08 11:28 1654次阅读

    linux虚拟机命令行界面如何操作

    Linux虚拟机是一种运行在虚拟化环境下的操作系统,与物理机器相似,它也有一个命令行界面,也称为终端或控制台。通过命令行界面,您可以使用命令
    的头像 发表于 11-17 09:57 961次阅读

    pycharm命令行终端运行代码

    Python是一种非常流行的编程语言,许多开发者使用它来编写各种应用程序和脚本。为了方便开发者编写和测试代码,PyCharm是一种集成开发环境(IDE),它提供了许多功能和工具,其中包括命令行终端
    的头像 发表于 11-22 11:20 1358次阅读

    eclipse怎么使用命令行

    命令行中使用Eclipse来完成一些特定的任务。本文将详细介绍如何在命令行中使用Eclipse。 首先,我们需要确保已经正确安装了JDK(Java Development Kit)和Eclipse
    的头像 发表于 12-06 11:26 963次阅读

    HarmonyOS开发:【基于命令行(安装库和工具集)】

    使用命令行进行设备开发时,可以通过以下步骤安装编译OpenHarmony需要的库和工具。
    的头像 发表于 04-25 21:03 36次阅读
    HarmonyOS开发:【基于<b class='flag-5'>命令行</b>(安装库和工具集)】