Opencv与python实现多目标跟踪 (一) - PaddleDetection目标检测

简介: Opencv与python实现多目标跟踪 (一) - PaddleDetection目标检测

前主流的Tracking By Detecting方式的多目标追踪(Multi-Object Tracking, MOT)算法主要由两部分组成:Detection+Embedding。Detection部分即针对视频,检测出每一帧中的潜在目标。Embedding部分则将检出的目标分配和更新到已有的对应轨迹上(即ReID重识别任务)。根据这两部分实现的不同,又可以划分为SDE系列和JDE系列算法。


对于传统的多目标跟踪,使用到的数据集是MOT16,MOT17这样的数据集格式,种类有如下这几种:


dataset/mot
  |——————image_lists
            |——————caltech.10k.val  
            |——————caltech.all  
            |——————caltech.train  
            |——————caltech.val  
            |——————citypersons.train  
            |——————citypersons.val  
            |——————cuhksysu.train  
            |——————cuhksysu.val  
            |——————eth.train  
            |——————mot16.train  
            |——————mot17.train  
            |——————prw.train  
            |——————prw.val
  |——————Caltech
  |——————Cityscapes
  |——————CUHKSYSU
  |——————ETHZ
  |——————MOT16
  |——————MOT17
  |——————PRW


其中数据格式如下:


MOT17
   |——————images
   |        └——————train
   |        └——————test
   └——————labels_with_ids
            └——————train


所有数据集的标注是以统一数据格式提供的。各个数据集中每张图片都有相应的标注文本。给定一个图像路径,可以通过将字符串images替换为labels_with_ids并将.jpg替换为.txt来生成标注文本路径。在标注文本中,每行都描述一个边界框,格式如下:


[class] [identity] [x_center] [y_center] [width] [height]
• 1

注意:


class为类别id,支持单类别和多类别,从0开始计,单类别即为0。

identity是从1到num_identities的整数(num_identities是数据集中所有视频或图片序列的不同物体实例的总数),如果此框没有identity标注,则为-1。

[x_center] [y_center] [width] [height]是中心点坐标和宽高,注意他们的值是由图片的宽度/高度标准化的,因此它们是从0到1的浮点数。

这种数据从格式来看,似乎与目标检测yolov格式相似,但其中的图像,不是单一的场景下的一张图片,而是一段连续视频帧下,截取连续几帧的图片。

相对自定义数据集来说,做目标跟踪的数据标注成本要大很多,因此本文介绍一种分二阶段实现多目标跟踪的方法,


分为目标检测和目标跟踪二步完成


PaddleDetection 快速使用介绍


完成多目标跟踪,首先就是训练一个目标检测的模型,基于单帧检测的目标,使用算法,来判断其他帧检测的对象是否为同一物体,进而实现持续的视频跟踪。


目标检测模型使用cv2.dnn来加载这个模型,cv2.dnn可以加载多个类型的模型(格式),具体cv2.dnn模块说明参考下面这个链接:

Opencv.dnn加载模型


这里以PaddleDetection的模型为列,将模型转为onnx

1.首先是下载必要的文件和框架


git clone https://github.com.cnpmjs.org/PaddlePaddle/PaddleDetection --depth 1
cd PaddleDetection
python setup.py install
pip install pycocotools paddle2onnx onnxruntime onnx

快速目标检测,主要用到这几个文件:

2ee8a25e8a98428f8c7e801c29bad7a5.png


configs:保存的是各种模型所有包含的配置参数(包含优化器配置参数,数据的格式参数,模型参数等)

dataset:对应不同目标检测数据类型的文件夹,我们的数据集都放到这里

deploy:有一个文件deploy/python/infer.py 可以推导视频类的数据做目标检测

tools:这个文件就对应这模型的训练,评估,推导和导出模型


训练


以yolov3_mobilenet_v3_large_270e_voc为例:

首先到configs找到

8e2068fe56a74a149be3e3167356c5a6.png

只需要修改红色框这个数据参数:


fb65cf2c6e5a45fa9bdae5711ce1f3f5.png


voc.yml参数需要修改的部分如下;

b6cb9e82ee6240059558a0de2e025c7e.png


自己的分类类别数,以及数据集路径,需要将自己定义的数据集转换成合适的格式,比如这里的voc格式。


训练


python tools/train.py -c configs/yolov3/yolov3_mobilenet_v3_large_270e_voc.yml --eval -o use_gpu=true --use_vdl=True --vdl_log_dir=vdl_dir/scalar

use_gpu:是否使用GPU

vdl_log_dir:训练loss可视化配置

如果需要切换GPU,在tools/train.py增加二行代码:

97fd98645428405494c768a012fbdd52.png


可视化


输入下面这个命令就可以查看自己训练可视化结果了


visualdl --logdir ./log --port 8080



得到模型参数与优化器参数在PaddleDetection/output里,前缀model_final为最好的模型结果


评估(验证)


python tools/eval.py -c configs/yolov3/yolov3_mobilenet_v3_large_270e_voc.yml -o use_gpu=true weights=output/yolov3_mobilenet_v3_large_270e_voc/model_final.pdparams


推导(预测)


python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v3_large_270e_voc.yml -o w


导出模型


python tools/export_model.py -c configs/yolov3/yolov3_mobilenet_v3_large_270e_voc.yml -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams


导出的模型在PaddleDetection/output_inference里


91733a4803ea48db93dbc4dec9acd63b.png


PaddleDetection模型转ONNX


首先就是训练一个目标检测的模型

用cv2.dnn加载这个模型,要知道cv2.dnn可以加载那些类型的模型(格式)


这里以PaddleDetection模型为列,将模型转为onnx


Detection注意:因为现在升级到2.0后,使用export.py导出的也会是叫model.pdmodel和model.pdiparams,


只有使用export.py导出的模型才是预测模型(只包含前向计算),可以被paddle2onnx导出。使用训练生成的model.pdmodel和


model.pdiparams是不可以被paddle2onnx导出的。


paddle2onnx --model_dir saved_inference_model \
            --model_filename model.pdmodel \
            --params_filename model.pdiparams \
            --save_file model.onnx \
            --enable_dev_version True

cec1a5e9348d4b28b182a2e5a0ea0f38.png


  • saved_inference_model:就是导出模型到output_inference文件下的模型文件夹

ONNX模型的验证


ONNX官方工具包提供了API可验证模型的正确性,主要包括两个方面,一是算子是否符合对应版本的协议,二是网络结构是否完整。


# check by ONNX
import onnx
# onnx_file = save_path +  '.onnx'
# onnx_file ='onnx-model/detectionmodel.onnx'
save_path = 'onnx-model/'
onnx_file = save_path +  'detectionmodel.onnx'
onnx_model = onnx.load(onnx_file)
onnx.checker.check_model(onnx_model)
print('The model is checked!')

加载onnx模型


def loadcv2dnnNetONNX(onnx_path):
    net = cv2.dnn.readNetFromONNX(onnx_path)
    net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
    net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
    print('load successful')
    return net
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
3月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
334 1
|
4月前
|
机器学习/深度学习 人工智能 算法
Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。
【7月更文挑战第5天】Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。CV涉及图像处理、模式识别和机器学习,用于图像理解和生成。Python的跨平台特性和活跃社区使其成为CV的理想工具。基本流程包括图像获取、预处理、特征提取、分类识别及图像生成。例如,面部识别通过预处理图像,使用如`cv2.CascadeClassifier`进行检测;物体检测类似,但需适应不同目标;图像生成则利用GAN创造新图像。
68 4
|
1月前
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
64 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
1月前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
102 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
1月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
69 2
|
2月前
|
机器学习/深度学习 计算机视觉 Python
opencv环境搭建-python
本文介绍了如何在Python环境中安装OpenCV库及其相关扩展库,包括numpy和matplotlib,并提供了基础的图像读取和显示代码示例,同时强调了使用Python虚拟环境的重要性和基本操作。
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
3月前
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
249 1
|
3月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
515 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
3月前
|
机器学习/深度学习 人工智能 监控
利用Python和OpenCV实现实时人脸识别系统
【8月更文挑战第31天】本文将引导您了解如何使用Python结合OpenCV库构建一个简易的实时人脸识别系统。通过分步讲解和示例代码,我们将探索如何从摄像头捕获视频流、进行人脸检测以及识别特定个体。本教程旨在为初学者提供一条明晰的学习路径,帮助他们快速入门并实践人脸识别技术。