【YOLO】基于Pytorch实现视频中的各种类型的车流量检测(利用GPU加速)
文章目录
- 车流量检测
- 导言
- 环境要求
- Anaconda
- CUDA
- cudnn
- YOLO
- Pytorch
- Pycharm
- 步骤
- 1.训练模型得到权重文件
- 数据集
- 2.视频处理
- 3.目标跟踪方法
- 4.虚拟线圈算法
- 流程图
- 核心代码
- 结果展示
车流量检测
导言
环境要求
Anaconda
安装见:https://blog.csdn.net/qq_43529415/article/details/100847887
CUDA
cudnn
CUDA 和cudnn的安装见:https://blog.csdn.net/qq_44824148/article/details/120875736
YOLO
Pytorch
Pycharm
步骤
1.训练模型得到权重文件
数据集
BITVehicle_Dataset
链接:https://pan.baidu.com/s/1TiY-T9NKFrgSiDqLIkvMbw
提取码:h09m
2.视频处理
使用yoloV3模型进行目标检测
3.目标跟踪方法
使用sort算法,其中使用卡尔曼滤波器对目标位置进行估计,利用匈牙利算法进行目标关联。
4.虚拟线圈算法
利用虚拟线圈的思想实现车辆目标的计数,完成车流量的统计。
流程图
核心代码
进行目标对象的选框,以及目标对象中心坐标的存取
def cls_draw_bbox(self, output, orig_img):"""1. predict vehicle's attributes based on bbox of vehicle2. draw bbox to orig_img"""print("3.2")labels = []pt_1s = []pt_2s = []types=[]directions=[]centers = [] #当前帧的检测框中心点center_ys=[]classID = [] #当前帧的种类ID# 1for det in output:# rectangle pointspt_1 = tuple(det[1:3].int()) # the left-up pointpt_2 = tuple(det[3:5].int()) # the right down point# print("p1", pt_1)# print(type(pt_1))# print("p2", pt_2)p1_1 = pt_1[0].item()p1_2 = pt_1[1].item()p2_1 = pt_2[0].item()p2_2 = pt_2[1].item()(center_x,center_y)=(int((p1_1+p2_1)/2),int((p1_2+p2_2)/2))centers.append((center_x,center_y))# classID.append()print(centers)pt_1s.append(pt_1)pt_2s.append(pt_2)# print("det:", det)# turn BGR back to RGB# print(type(orig_img[pt_1[1]: pt_2[1], pt_1[0]: pt_2[0]][:, :, ::-1]))# print(orig_img[pt_1[1]: pt_2[1],pt_1[0]: pt_2[0]][:, :, ::-1])orig_list = orig_img[pt_1[1]: pt_2[1], pt_1[0]: pt_2[0]][:, :, ::-1]if (orig_list.size == 0):return 1ROI = Image.fromarray(orig_img[pt_1[1]: pt_2[1], pt_1[0]: pt_2[0]][:, :, ::-1])# print("ROI:",ROI)# ROI.show()# call classifier to predictcar_color, car_direction, car_type = self.classifier.predict(ROI)label = str(car_color + ' ' + car_direction + ' ' + car_type)labels.append(label)types.append(car_type)center_ys.append(center_y)directions.append(car_direction)print('=> predicted label: ', label)print("center_ys:",center_ys)# print("directions:",directions)# print("types:",types)# print("labels:",labels)# print("centers:",centers)# 2color = (0, 215, 255)for i, det in enumerate(output ):pt_1 = pt_1s[i]pt_2 = pt_2s[i]# draw bounding boxcv2.rectangle(orig_img, pt_1, pt_2, color, thickness=2)print("pt_1:", pt_1)print("pt_2:", pt_2)# get str text sizetxt_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_PLAIN, 2, 2)[0]# pt_2 = pt_1[0] + txt_size[0] + 3, pt_1[1] + txt_size[1] + 5pt_2 = pt_1[0] + txt_size[0] + 3, pt_1[1] - txt_size[1] - 5# draw text background rectcv2.rectangle(orig_img, pt_1, pt_2, color, thickness=-1) # text# draw textcv2.putText(orig_img, labels[i], (pt_1[0], pt_1[1]), # pt_1[1] + txt_size[1] + 4cv2.FONT_HERSHEY_PLAIN, 2, [225, 255, 255], 2)# center_ys=list(center_ys)# directions=list(directions)# types=list(types)# print("type",type(center_ys))# print("type", type(directions))# print("type", type(types))if isinstance(center_ys, list) and isinstance(directions,list) and isinstance(types,list):return center_ys,directions,typeselse:center_ys.append(1000)directions.append('front')types.append('sss')return center_ys, directions, types
当前帧目标的跟踪框集合
def update(self, dets):self.frame_count += 1# 在当前帧逐个预测轨迹位置,记录状态异常的跟踪器索引# 根据当前所有的卡尔曼跟踪器个数(即上一帧中跟踪的目标个数)创建二维数组:行号为卡尔曼滤波器的标识索引,列向量为跟踪框的位置和IDtrks = np.zeros((len(self.trackers), 5)) # 存储跟踪器的预测to_del = [] # 存储要删除的目标框ret = [] # 存储要返回的追踪目标框# 循环遍历卡尔曼跟踪器列表for t, trk in enumerate(trks):# 使用卡尔曼跟踪器t产生对应目标的跟踪框pos = self.trackers[t].predict()[0]# 遍历完成后,trk中存储了上一帧中跟踪的目标的预测跟踪框trk[:] = [pos[0], pos[1], pos[2], pos[3], 0]# 如果跟踪框中包含空值则将该跟踪框添加到要删除的列表中if np.any(np.isnan(pos)):to_del.append(t)# numpy.ma.masked_invalid 屏蔽出现无效值的数组(NaN 或 inf)# numpy.ma.compress_rows 压缩包含掩码值的2-D 数组的整行,将包含掩码值的整行去除# trks中存储了上一帧中跟踪的目标并且在当前帧中的预测跟踪框trks = np.ma.compress_rows(np.ma.masked_invalid(trks))# 逆向删除异常的跟踪器,防止破坏索引for t in reversed(to_del):self.trackers.pop(t)# 将目标检测框与卡尔曼滤波器预测的跟踪框关联获取跟踪成功的目标,新增的目标,离开画面的目标matched, unmatched_dets, unmatched_trks = associate_detections_to_trackers(dets, trks)# 将跟踪成功的目标框更新到对应的卡尔曼滤波器for t, trk in enumerate(self.trackers):if t not in unmatched_trks:d = matched[np.where(matched[:, 1] == t)[0], 0]# 使用观测的边界框更新状态向量trk.update(dets[d, :][0])# 为新增的目标创建新的卡尔曼滤波器对象进行跟踪for i in unmatched_dets:trk = KalmanBoxTracker(dets[i, :])self.trackers.append(trk)# 自后向前遍历,仅返回在当前帧出现且命中周期大于self.min_hits(除非跟踪刚开始)的跟踪结果;如果未命中时间大于self.max_age则删除跟踪器。# hit_streak忽略目标初始的若干帧i = len(self.trackers)for trk in reversed(self.trackers):# 返回当前边界框的估计值d = trk.get_state()[0]# 跟踪成功目标的box与id放入ret列表中if (trk.time_since_update < 1) and (trk.hit_streak >= self.min_hits or self.frame_count <= self.min_hits):ret.append(np.concatenate((d, [trk.id + 1])).reshape(1, -1)) # +1 as MOT benchmark requires positivei -= 1# 跟踪失败或离开画面的目标从卡尔曼跟踪器中删除if trk.time_since_update > self.max_age:self.trackers.pop(i)# 返回当前画面中所有目标的box与id,以二维矩阵形式返回if len(ret) > 0:print("321a:", np.concatenate(ret))return np.concatenate(ret)print("123a:", np.empty((0, 5)))return np.empty((0, 5))
结果展示
【YOLO】基于Pytorch实现视频中的各种类型的车流量检测(利用GPU加速)相关推荐
- 轻量高效!清华智能计算实验室开源基于PyTorch的视频 (图片) 去模糊框架SimDeblur
作者丨科技猛兽 编辑丨极市平台 清华大学自动化系智能计算实验室团队开源基于 PyTorch 的视频 (图片) 去模糊框架 SimDeblur. 基于 PyTorch 的视频 (图片) 去模糊框架 Si ...
- 基于Python的视频中的人脸识别系统设计与实现
目录 一:问题描述 2 二:实现思路 2 2.1 切换点 2 2.1.2 镜头切换点 3 2.1.2 音频切换点. 3 2.2 嘉宾识别 = 人脸识别 & 声纹识别 4 2.2.1 人脸识别 ...
- 针对无人机航拍视频中动态背景下的目标检测
目录 目录 传统目标检测技术 传统目标检测技术 1. 帧间差分 通过连续两帧相同位置像素点间的灰度差来确定目标移动.但只适用于静态背景和目标单一条件的目标检测.仅适用于无人机悬停状态下的目标检测. 2 ...
- 基于PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像问题深度学习优化
我国高分辨率对地观测系统重大专项已全面启动,高空间.高光谱.高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源.未来10年全球每天获取的观测 ...
- 基于PyTorch深度学习无人机遥感影像目标检测、地物分类及语义分割
随着无人机自动化能力的逐步升级,它被广泛的应用于多种领域,如航拍.农业.植保.灾难评估.救援.测绘.电力巡检等.但同时由于无人机飞行高度低.获取目标类型多.以及环境复杂等因素使得对无人机获取的数据处理 ...
- 基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类
我国高分辨率对地观测系统重大专项已全面启动,高空间.高光谱.高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源.随着小卫星星座的普及,对地观 ...
- 光流 | 视频中物体检测的研究现状
===================================================== github:https://github.com/MichaelBeechan CSDN: ...
- 采用FFmpeg从视频中提取音频(声音)保存为mp3文件
采用FFmpeg从视频中提取音频(声音)保存为mp3文件 作者:雨水,日期:2016年1月9日 CSDN博客:http://blog.csdn.net/gobitan 摘要:看到好的视频文件,如果想把 ...
- FFmpeg从视频中提取音频保存为mp3文件
如何把视频文件中的音频数据提取出来,网络上有不少音频提取工具,但作为技术人员提到音视频处理,肯定会想到FFmpeg.本文介绍了如何基于FFmpeg从视频中提取音频,然后将音频保存为mp3格式的音频文件 ...
最新文章
- mysql8.0.28忘记密码
- Kaggle八项大奖斩获其6:用于筛选和分析文献的paperai
- iOS之富文本(二)
- CserialPort类的简单用法
- java之jsp页面语法
- 4.1 简单方程的解
- Android开发之高斯模糊效果三行代码搞定附带CSDN源码请导入module
- vrep中thread scirpt以及simRemoteApi.start()的一点点微小的认识
- Zabbix官方文件Zabbix图形树
- pythonttf字体下载_python 58 字体反爬
- C++程序设计语言(特别版)pdf
- java jvm理解_【java】之深入理解JVM
- hash素数表(备用)
- android黑科技系列——手机端破解神器MT的内购VIP功能破解教程
- Hadoop(一) Centos7 下Hdoop 安装及伪分布式集群部署
- 我的世界刷猪人塔java版_我的世界猪人塔怎么做 5款猪人塔详解教程
- #Paper Reading# Pre-trained Language Model based Ranking in Baidu Search
- 基于javaweb的房屋租赁系统(前端+后端)
- 使用普通打印机打印条码标签
- Xcode14 正式版编译报错‘ does not contain bitcode.解决方案
热门文章
- 广东海洋大学微型计算机控制技术,电容式液位传感器的设计.pdf
- 5.3 常见的电感式和电容式感测原理及应用
- 二叉树_斜月沉沉藏海雾,碣石潇湘无限路
- scipy csr_matrix和csc_matrix函数详解
- 2023华中师范大学新传考研经验
- 库乐队历史版本怎么下载_库乐队电脑版下载|GarageBand电脑版 V2.4.4 官方最新版 下载_当下软件园_软件下载...
- 在网页地址栏中显示小图标
- TensorFlow提供Python语言的四个不同版本tensorflow,tensorflow-gpu,tf-nightly、tf-nightly-gpu
- C语言的二维码识别驱动
- ffmpeg混音(将多个声音合成一个)命令