位置: IT常识 - 正文

视频实时行为检测——基于yolov5+deepsort+slowfast算法(实时视频功能)

编辑:rootadmin
视频实时行为检测——基于yolov5+deepsort+slowfast算法 文章目录前言一、核心功能设计二、核心实现步骤1.yolov5实现目标检测2.deepsort实现目标跟踪3.slowfast动作识别三、核心代码解析1.参数2.主函数3.将结果保存成视频总结前言

推荐整理分享视频实时行为检测——基于yolov5+deepsort+slowfast算法(实时视频功能),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:视频异常行为检测,视频异常行为检测,视频行为检测,视频事件监测,视频事件监测,视频实时检测,视频实时检测,视频实时检测,内容如对您有帮助,希望把文章链接给更多的朋友!

前段时间打算做一个目标行为检测的项目,翻阅了大量资料,也借鉴了不少项目,于是打算通过yolov5实现目标检测,deepsort实现目标跟踪以及slowfast实现动作识别,最终实现端到端的目标行为检测模型。

一、核心功能设计

总的来说,我们需要能够实现实时检测视频中的人物,并且能够识别目标的动作,所以我们拆解需求后,整理核心功能如下所示:

yolov5实现目标检测,确定目标坐标deepsort实现目标跟踪,持续标注目标坐标slowfast实现动作识别,并给出置信率用框持续框住目标,并将动作类别以及置信度显示在框上

最终效果如下所示:

视频AI行为检测

二、核心实现步骤1.yolov5实现目标检测

“YOLO”是一种运行速度很快的目标检测AI模型,YOLO将对象检测重新定义为一个回归问题。它将单个卷积神经网络(CNN)应用于整个图像,将图像分成网格,并预测每个网格的类概率和边界框。YOLO非常快,它比“R-CNN”快1000倍,比“Fast R-CNN”快100倍。YOLOv5是YOLO比较新的一个版本。 所以我们把视频分解成多幅图像,并利用yolov5算法进行目标检测并逐帧执行时,可以看到目标跟踪框随目标移动。

效果如下所示:

2.deepsort实现目标跟踪

但是,如果视频帧中有多个目标,如何知道一帧中的目标和上一帧是同一个对象?这就是目标跟踪的工作,应用多个检测来识别特定目标随时间的变化,实现目标跟踪。 Deepsort是实现目标跟踪的算法,从sort(simple online and realtime tracking)演变而来,其使用卡尔曼滤波器预测所检测对象的运动轨迹,匈牙利算法将它们与新的检测目标相匹配。Deepsort易于使用且运行速度快,成为AI目标检测跟踪之热门算法。

视频实时行为检测——基于yolov5+deepsort+slowfast算法(实时视频功能)

首先来看一下DeepSORT的核心流程: 预测(track)——>观测(detection+数据关联)——>更新

预测:预测下一帧的目标的bbox,即后文中的tracks观测:对当前帧进行目标检测,仅仅检测出目标并不能与上一帧的目标对应起来,所以还要进行数据关联更新:预测Bbox和检测Bbox都会有误差,所以进行更新,更新后的跟踪结果通常比单纯预测或者单纯检测的误差小很多。 3.slowfast动作识别

我们将视频序列和检测框信息输入行为分类模型,输出每个检测框的行为类别,达到行为检测的目的。 而行为分类模型我们采用的是slowfast算法,其包括一个Slow路径,以低帧速率操作,以捕捉空间语义,以及一个Fast路径,以高帧速率操作,以精细的时间分辨率捕捉运动。快速路径可以通过减少信道容量而变得非常轻量级,同时还可以学习有用的时间信息用于视频识别。

三、核心代码解析1.参数if __name__=="__main__": parser = argparse.ArgumentParser() parser.add_argument('--input', type=str, default="test/test1.mp4", help='test imgs folder or video or camera') parser.add_argument('--output', type=str, default="output/out1.mp4", help='folder to save result imgs, can not use input folder') # object detect config parser.add_argument('--imsize', type=int, default=640, help='inference size (pixels)') parser.add_argument('--conf', type=float, default=0.4, help='object confidence threshold') parser.add_argument('--iou', type=float, default=0.4, help='IOU threshold for NMS') parser.add_argument('--device', default=0, help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--classes', default=0,nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3') config = parser.parse_args() print(config) main(config)

从__main__开始分析,设置了输入输出参数以及目标检测的一些参数,包括输入路径、输出路径、尺寸大小、置信度、iou值、以及目标检测的类别,其中0是人。

2.主函数

对输入的config参数解析并使用,模型使用yolov5l6,权重下载到本地

model = torch.hub.load('ultralytics/yolov5', 'yolov5l6') #加载yolov5模型 model.conf = config.conf model.iou = config.iou model.max_det = 200 model.classes = config.classes device = config.device imsize = config.imsize video_model = slowfast_r50_detection(True).eval().to(device) #加载slowfast_r50_detection模型 # video_model = slowfast_r50_detection(False).eval().to(device) # video_model.load_state_dict(torch.load("SLOWFAST_8x8_R50_DETECTION.pyth")['model_state'])

加载Slowfast、Deepsort模型,使用的Slowfast是在AVA2.2上训练的,通过AvaLabeledVideoFramePaths函数获得id到动作的mapping

deepsort_tracker = DeepSort("deep_sort/deep_sort/deep/checkpoint/ckpt.t7") #加载DeepSort模型 ava_labelnames,_ = AvaLabeledVideoFramePaths.read_label_map("selfutils/temp.pbtxt") #加载类别标签 ava_labelnames_abnormal,_ = AvaLabeledVideoFramePaths.read_label_map("selfutils/ava_action_abnormal.pbtxt") #加载类别标签 coco_color_map = [[random.randint(0, 255) for _ in range(3)] for _ in range(80)]

读取视频和载入视频

vide_save_path = config.output video=cv2.VideoCapture(config.input) #读取视频 width,height = int(video.get(3)),int(video.get(4)) video.release() #释放资源 outputvideo = cv2.VideoWriter(vide_save_path,cv2.VideoWriter_fourcc(*'mp4v'), 25, (width,height)) print("processing...") video = pytorchvideo.data.encoded_video.EncodedVideo.from_path(config.input) # 载入视频

首先对视频进行抽帧处理,通过get_clip()对一秒内的视频进行抽帧,只保留视频图片,将tensor转numpy数组,BGR格式

a=time.time() for i in range(0,math.ceil(video.duration),1): #截视频 video_clips=video.get_clip(i, i+1-0.04) video_clips=video_clips['video'] if video_clips is None: continue img_num=video_clips.shape[1] imgs=[] for j in range(img_num): imgs.append(tensor_to_numpy(video_clips[:,j,:,:])) # "video": A tensor of the clip's RGB frames with shape: (channel, time, height, width). # 将tensor转为numpy数组,BGR格式

通过yolov5网络进行目标检测

yolo_preds=model(imgs, size=imsize) # 每25帧后插入1帧作为预测图像 yolo_preds.files=[f"img_{i*25+k}.jpg" for k in range(img_num)] print(i,video_clips.shape,img_num)

使用预训练的Deepsort权重,以yolo预测结果作为输入,用Deepsort的结果代替yolo预测的结果,这里Deepsort是用来给相同id的目标分配动作label的。

deepsort_outputs=[] for j in range(len(yolo_preds.pred)): temp=deepsort_update(deepsort_tracker,yolo_preds.pred[j].cpu(),yolo_preds.xywh[j][:,0:4].cpu(),yolo_preds.imgs[j]) if len(temp)==0: temp=np.ones((0,8)) deepsort_outputs.append(temp.astype(np.float32)) yolo_preds.pred=deepsort_outputs

通过ava_inference_transform()函数对预测输入进行预处理,然后通过调用Slowfast模型进行预测,最后为每个id分配动作类别

id_to_ava_labels={} if yolo_preds.pred[img_num//2].shape[0]: inputs,inp_boxes,_=ava_inference_transform(video_clips,yolo_preds.pred[img_num//2][:,0:4],crop_size=imsize) inp_boxes = torch.cat([torch.zeros(inp_boxes.shape[0],1), inp_boxes], dim=1) if isinstance(inputs, list): #判断类型 inputs = [inp.unsqueeze(0).to(device) for inp in inputs] else: inputs = inputs.unsqueeze(0).to(device) with torch.no_grad(): slowfaster_preds = video_model(inputs, inp_boxes.to(device)) #预测动作 slowfaster_preds = slowfaster_preds.cpu() for tid,avalabel,avapred in zip(yolo_preds.pred[img_num//2][:,5].tolist(),np.argmax(slowfaster_preds,axis=1).tolist(),torch.max(slowfaster_preds,axis=1).values.tolist()): # if(avalabel in ava_labelnames_abnormal): # id_to_ava_labels[tid]=ava_labelnames[avalabel+1]+'_abnormal' id_to_ava_labels[tid]=[ava_labelnames[avalabel+1],avapred] # print(avalabel) # print(avalabel) # print(ava_labelnames[avalabel+1]) if((avalabel+1) in ava_labelnames_abnormal): isnormal=False else: isnormal=True save_yolopreds_tovideo(yolo_preds,id_to_ava_labels,coco_color_map,outputvideo,isnormal) print("total cost: {:.3f}s, video clips length: {}s".format(time.time()-a,video.duration)) outputvideo.release() print('saved video to:', vide_save_path)3.将结果保存成视频def save_yolopreds_tovideo(yolo_preds,id_to_ava_labels,color_map,output_video,isnormal): for i, (im, pred) in enumerate(zip(yolo_preds.imgs, yolo_preds.pred)): im=cv2.cvtColor(im,cv2.COLOR_BGR2RGB) if pred.shape[0]: for j, (*box, cls, trackid, vx, vy) in enumerate(pred): if int(cls) != 0: ava_label = '' ava_pred=0.0 elif trackid in id_to_ava_labels.keys(): ava_label = id_to_ava_labels[trackid][0].split(' ')[0] ava_pred=id_to_ava_labels[trackid][1] else: ava_label = 'Unknow' ava_pred=0.0 if(isnormal): text = '{:.4f} {} {}'.format(ava_pred,yolo_preds.names[int(cls)],ava_label) color = [40,113,62] else: text = '{:.4f} {} {} {}'.format(ava_pred,yolo_preds.names[int(cls)],ava_label,'abnormal') color = [43,44,124] # print(cls) im = plot_one_box(box,im,color,text) output_video.write(im.astype(np.uint8))总结

基于yolov5+deepsort+slowfast算法的视频实时行为检测就介绍到这里了!!! 如果该文章对您有所帮助,麻烦点赞,关注,收藏三连支持下! 创作不易,白嫖不好,各位的支持和认可,是我创作的最大动力! 如果本篇博客有任何错误,请批评指教,不胜感激 !!!

参考 Yolov5+SlowFast: 基于PytorchVideo的实时行为检测算法 YOLOv5算法详解 pytorch yolo5+Deepsort实现目标检测和跟踪 Yolov5+Deepsort+Slowfast实现实时动作检测

本文链接地址:https://www.jiuchutong.com/zhishi/297573.html 转载请保留说明!

上一篇:airpods怎么注销 airpods解除绑定教程(airpods怎么注销主人)

下一篇:网站都变成灰色了,它是怎么实现的?(网站变成灰色什么时候恢复)

  • 9008模式是什么(9008模式原理)

    9008模式是什么(9008模式原理)

  • 手机的歌曲怎么下载到u盘(手机的歌曲怎么传到电脑)

    手机的歌曲怎么下载到u盘(手机的歌曲怎么传到电脑)

  • 腾讯视频微信登录没有二维码(腾讯视频微信登录别人的会员账号)

    腾讯视频微信登录没有二维码(腾讯视频微信登录别人的会员账号)

  • 苹果电脑的摄像头在哪里打开(苹果电脑的摄像头打不开是怎么回事)

    苹果电脑的摄像头在哪里打开(苹果电脑的摄像头打不开是怎么回事)

  • mov文件有些能播放有些不能(mov文件怎么播放不了)

    mov文件有些能播放有些不能(mov文件怎么播放不了)

  • 磁盘0磁盘分区1是什么意思(磁盘管理磁盘0磁盘分区1)

    磁盘0磁盘分区1是什么意思(磁盘管理磁盘0磁盘分区1)

  • 电话号码是空号怎么回事(电话号码是空号是啥意思)

    电话号码是空号怎么回事(电话号码是空号是啥意思)

  • 表格中怎么复制一竖列(表格中怎么复制同样的内容到一列)

    表格中怎么复制一竖列(表格中怎么复制同样的内容到一列)

  • 12123显示网络拥堵是怎么回事(12123显示网络拥堵是过户了吗)

    12123显示网络拥堵是怎么回事(12123显示网络拥堵是过户了吗)

  • 手提电脑可以连接不知道密码的无线吗(手提电脑可以连接手机热点吗)

    手提电脑可以连接不知道密码的无线吗(手提电脑可以连接手机热点吗)

  • 淘宝店可以自己亲自装修吗(淘宝店可以自己买自己的东西吗)

    淘宝店可以自己亲自装修吗(淘宝店可以自己买自己的东西吗)

  • 手机上的圆点在哪里设置的(手机上圆点怎么消除)

    手机上的圆点在哪里设置的(手机上圆点怎么消除)

  • 荣耀20青春版有陀螺仪功能吗(荣耀20青春版有多重)

    荣耀20青春版有陀螺仪功能吗(荣耀20青春版有多重)

  • 哔哩哔哩的游戏中心去哪了(哔哩哔哩的游戏账号怎么卖)

    哔哩哔哩的游戏中心去哪了(哔哩哔哩的游戏账号怎么卖)

  • 什么是抖音作品内容垂直(什么是抖音作品标签)

    什么是抖音作品内容垂直(什么是抖音作品标签)

  • 普通群员怎么解除禁言(如何解群聊)

    普通群员怎么解除禁言(如何解群聊)

  • ios退款有什么弊端(ios退款会不会影响什么)

    ios退款有什么弊端(ios退款会不会影响什么)

  • 华为鸿蒙发布会时间(华为鸿蒙发布会图文)

    华为鸿蒙发布会时间(华为鸿蒙发布会图文)

  • 苹果时间设置24小时制(苹果时间设置24小时怎么设置)

    苹果时间设置24小时制(苹果时间设置24小时怎么设置)

  • 荣耀20如何设置后台运行(荣耀20如何设置桌面时间)

    荣耀20如何设置后台运行(荣耀20如何设置桌面时间)

  • 支付宝人脸识别怎么关闭(支付宝人脸识别怎么切换摄像头)

    支付宝人脸识别怎么关闭(支付宝人脸识别怎么切换摄像头)

  • 新版抖音怎么恢复自动定位(新版抖音怎么恢复粉丝)

    新版抖音怎么恢复自动定位(新版抖音怎么恢复粉丝)

  • ios12相册人物怎么添加(iphone12相簿 增加人物)

    ios12相册人物怎么添加(iphone12相簿 增加人物)

  • 苹果xsmax有128g的吗

    苹果xsmax有128g的吗

  • Windows11播放视频怎么节能? win11节省电池的五种方法(windows11播放视频不清晰)

    Windows11播放视频怎么节能? win11节省电池的五种方法(windows11播放视频不清晰)

  • 汇算清缴企业所得税弥补亏损明细表怎么填
  • 税控盘抵减增值税需要结转吗
  • 电汇凭证的日期为什么必须是当天
  • 发票开成了下属机构的可以报销吗
  • 道路货物运输服务可以加计扣除吗
  • 企业所得税税率有几个档次
  • 服务行业印花税税率
  • 销售使用过的固定资产3%减按2%
  • 收到单位预交卖材料款如何做会计分录?
  • 进项税发票认证流程
  • 河道工程维护费按什么标准计提
  • 金税盘非征期汇总资料未报送
  • 小规模纳税人3%减按1%的账务处理
  • 一般纳税人取得小规模纳税人的专票可以抵扣吗
  • 增值税需要计提吗
  • 小规模纳税人出售不动产征收率
  • 资金与费用
  • 价值多少可以确认收入
  • 职工报销子女医药费
  • 企业结算备付金怎么做账
  • 上个月暂估这个月成本怎么调整
  • 财政拨付专项资金进什么会计科目
  • 怎样结转销售成本会计分录
  • 往年多交的税能退吗
  • 如何在win7系统中查看电脑基本信息
  • win11系统关闭防火墙怎么关
  • 个税手续费会计分录
  • 工人工资怎么算
  • 基于Python的flask百战电商流程图
  • 怎么做委托银行业务
  • 固定资产清理如何结转
  • 生产企业免抵退税实例
  • 库存股属于什么
  • 前端作业做一个网站
  • 去年的普票可以开红字吗
  • 利润表年报本期金额填什么
  • 挂靠的公司替我们交的税款如何记账?
  • 一次性计提和一次性支付的区别
  • 扣非净利润为什么比净利润高
  • SqlServer 2005 T-SQL Query 学习笔记(1)
  • db2使用教程
  • 本月开发票下月收款
  • 成本法的处置
  • 收到工会经费如何处理
  • 只有销项没有进项怎么交税
  • 计提附加税金额
  • 公司为员工异地缴纳五险一金
  • 公司员工垫付款项
  • 补开以前年度发票
  • 免费样品要交税么
  • 购买材料预付定金填什么凭证
  • 哪些收入属于免增值税
  • 待摊费用年底能够有余额么
  • 质保金可以先不开票吗
  • 计提风险准备金是什么意思
  • 流言:Win9或终止32位系统 加速64位平台
  • xp系统如何清除所有盘的东西
  • centos7安装过程报错
  • linux系统怎么安装
  • 在windowsxp中设置控制计算机硬件设备
  • 怎么在mac上查找iphone
  • win8的应用商店
  • linux重启shell
  • linux怎么安装sh
  • win7系统出现蓝屏怎么解决
  • win8.1隐藏文件夹
  • win8磁盘占用率100%如何解决
  • 安卓微博评论界面图片
  • js中递归是什么意思
  • threejs入门教程
  • nodejs 入门
  • 刮刮奖软件下载
  • jquery实现图片横向移动
  • 大学的python选修课好学吗
  • listview报错
  • 税控盘税务数字证书密码忘记怎么办
  • 税控发票开票系统对电脑配置有要求吗?
  • 志愿者补贴如何领取
  • 深圳国税税发票在哪里开
  • 江苏国税局官网登录
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设