国外课栈 - 国外电子信息技术视角栈

聚焦Python和OpenCV检测和跟踪物体

 二维码 12
Python      OpenCV

准备

您需要安装OpenCV,SciPy和NumPy。

使用Docker运行应用程序时,Docker容器应具有对X11服务器的适当访问权限。 此应用无法以无头模式运行。 与Docker一起运行应用程序的最佳环境是Linux桌面环境。 在macOS上,您可以使用xQuartz(请参阅https://www.xquartz.org/)以便创建一个可访问的X11服务器。

您也可以使用存储库中的可用Docker文件之一来运行应用程序。

构思App

最终的应用程序将能够检测,跟踪和计算场景中的对象。 这将需要以下组件:

  • main.py:这是用于实时检测,跟踪和计数对象的主要脚本。
  • sort.py:这是实现跟踪算法的模块。

我们将首先准备主脚本。 在准备过程中,您将学习如何使用检测网络,以及它们的工作方式和训练方法。 在同一脚本中,我们将使用跟踪器来跟踪和计数对象。

在准备好主脚本之后,我们将准备跟踪算法并能够运行该应用程序。 现在让我们开始准备主脚本。

主脚本

主脚本将负责应用程序的完整逻辑。 它将处理视频流,并使用目标检测深度卷积神经网络与跟踪算法相结合。

该算法用于逐帧跟踪对象。 它还将负责说明结果。 该脚本将接受参数并具有一些固有常量,这些常量在脚本的以下初始化步骤中定义:

  1. 与其他脚本一样,我们首先导入所有必需的模块:
    import argparse
    import cv2
    import numpy as np
    from classes import CLASSES_90
    from sort import Sort

    我们将使用argparse,因为我们希望脚本接受参数。 我们将对象类存储在单独的文件中,以免污染脚本。 最后,我们导入排序跟踪器。

  1. 接下来,我们创建并解析参数:
    parser = argparse.ArgumentParser()
    parser.add_argument("-i", "--input",
     help="Video path, stream URI, or camera ID ",
    default="demo.mkv")
    parser.add_argument("-t", "--threshold", type=float, default=0.3,
     help="Minimum score to consider")
    parser.add_argument("-m", "--mode", choices=['detection',
    'tracking'], default="tracking",
     help="Either detection or tracking mode")
    args = parser.parse_args()

    我们的第一个参数是输入,它可以是视频的路径,摄像机的ID(默认摄像机为0)或视频流通用资源标识符(URI)。 例如,您将能够使用实时传输控制协议(RTCP)将应用程序连接到远程IP摄像机。

    我们将使用的网络将预测对象的边界框。 每个边界框都有一个分数,它将指定边界框包含某个类型的对象的可能性。

    下一个参数是阈值,它指定分数的最小值。 如果分数低于阈值,那么我们将不考虑检测。 最后一个参数是mode,我们要在其中运行脚本。 如果我们以检测模式运行它,则算法流程将在检测到对象后停止,并且不会进一步进行跟踪。 物体检测的结果将在框架中说明。

  1. OpenCV接受摄像机的ID作为整数。 如果我们指定摄像机的ID,则输入参数将是字符串而不是整数。 因此,如果需要,我们需要将其转换为整数:
    if args.input.isdigit():
     args.input = int(args.input)
  1. 接下来,我们定义所需的常量:
    TRACKED_CLASSES = ["car", "person"]
    BOX_COLOR = (23, 230, 210)
    TEXT_COLOR = (255, 255, 255)
    INPUT_SIZE = (300,300)

在这个应用程序中,我们将跟踪汽车和人。 我们将以黄色显示边界框,并以白色书写文本。 我们还将定义用于检测的Single Shot Detector(SSD)模型的标准输入大小。

使用SSD检测物体

OpenCV具有导入使用深度学习框架构建的模型的方法。 我们按以下方式加载TensorFlow SSD模型:

config = "./ssd_mobilenet_v1_coco_2017_11_17.pbtxt.txt"
model = "frozen_inference_graph.pb"
detector = cv2.dnn.readNetFromTensorflow(model,config)

使用其他检测器

了解对象检测器

训练类似SSD和YOLO的网络

跟踪检测到的物体

实现筛选跟踪器

卡尔曼滤波器

使用框跟踪器和卡尔曼滤波器

将检测与跟踪器关联

定义跟踪器的主要类别


文章分类: 编程碎语PythonOpenCV