

准备
您需要安装OpenCV,SciPy和NumPy。
您也可以使用存储库中的可用Docker文件之一来运行应用程序。
构思App
最终的应用程序将能够检测,跟踪和计算场景中的对象。 这将需要以下组件:
- main.py:这是用于实时检测,跟踪和计数对象的主要脚本。
- sort.py:这是实现跟踪算法的模块。
我们将首先准备主脚本。 在准备过程中,您将学习如何使用检测网络,以及它们的工作方式和训练方法。 在同一脚本中,我们将使用跟踪器来跟踪和计数对象。
在准备好主脚本之后,我们将准备跟踪算法并能够运行该应用程序。 现在让我们开始准备主脚本。
主脚本
主脚本将负责应用程序的完整逻辑。 它将处理视频流,并使用目标检测深度卷积神经网络与跟踪算法相结合。
该算法用于逐帧跟踪对象。 它还将负责说明结果。 该脚本将接受参数并具有一些固有常量,这些常量在脚本的以下初始化步骤中定义:
- 与其他脚本一样,我们首先导入所有必需的模块:
import argparse import cv2 import numpy as np from classes import CLASSES_90 from sort import Sort
我们将使用argparse,因为我们希望脚本接受参数。 我们将对象类存储在单独的文件中,以免污染脚本。 最后,我们导入排序跟踪器。
- 接下来,我们创建并解析参数:
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,我们要在其中运行脚本。 如果我们以检测模式运行它,则算法流程将在检测到对象后停止,并且不会进一步进行跟踪。 物体检测的结果将在框架中说明。
- OpenCV接受摄像机的ID作为整数。 如果我们指定摄像机的ID,则输入参数将是字符串而不是整数。 因此,如果需要,我们需要将其转换为整数:
if args.input.isdigit(): args.input = int(args.input)
- 接下来,我们定义所需的常量:
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)