位置: 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怎么注销主人)

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

  • iqoo8怎么截长图(iqoo手机怎么截长图)

    iqoo8怎么截长图(iqoo手机怎么截长图)

  • wps十几个文档怎么一起打印(wps怎么把多个文档在一个窗口)

    wps十几个文档怎么一起打印(wps怎么把多个文档在一个窗口)

  • 抖音群怎么建(抖音群怎么建500人)

    抖音群怎么建(抖音群怎么建500人)

  • 共享相簿 别人可以看到我的相册吗(共享相簿别人能看见我里面的照片吗)

    共享相簿 别人可以看到我的相册吗(共享相簿别人能看见我里面的照片吗)

  • 红米10xpro屏幕的尺寸是多少英寸(redmi10x的屏幕)

    红米10xpro屏幕的尺寸是多少英寸(redmi10x的屏幕)

  • 苹果11pro和11promax区别(iphone11 和 11pro)

    苹果11pro和11promax区别(iphone11 和 11pro)

  • iphone4s打不开机(iphone4打不开机怎么办)

    iphone4s打不开机(iphone4打不开机怎么办)

  • 智行抢不到票会退款吗(智行抢不到票会退专人抢吗)

    智行抢不到票会退款吗(智行抢不到票会退专人抢吗)

  • 三星s20微信消息不提醒(三星s20微信消息弹出)

    三星s20微信消息不提醒(三星s20微信消息弹出)

  • ctrl+f是什么快捷键(ctrl+f12什么快捷键)

    ctrl+f是什么快捷键(ctrl+f12什么快捷键)

  • 为啥开微信视频手电筒打不开(为啥开微信视频会黑屏)

    为啥开微信视频手电筒打不开(为啥开微信视频会黑屏)

  • 40w快充是什么意思(40w快充是多少v)

    40w快充是什么意思(40w快充是多少v)

  • 微信信息可以定时自动发送出去吗(微信信息可以定时发送吗苹果)

    微信信息可以定时自动发送出去吗(微信信息可以定时发送吗苹果)

  • 建网站必须要服务器吗(建立网站一定要服务器吗)

    建网站必须要服务器吗(建立网站一定要服务器吗)

  • 显示无法搜索基站信息(无法搜索到无线网络列表)

    显示无法搜索基站信息(无法搜索到无线网络列表)

  • qq上怎么举报人(qq怎样举报人最有效)

    qq上怎么举报人(qq怎样举报人最有效)

  • a1822是ipad哪一款air(a1822是ipad哪一款几寸)

    a1822是ipad哪一款air(a1822是ipad哪一款几寸)

  • 系统界面演示模式是什么(系统界面设计模板)

    系统界面演示模式是什么(系统界面设计模板)

  • 浏览器的兼容模式在哪(浏览器的兼容模式和极速模式有什么区别)

    浏览器的兼容模式在哪(浏览器的兼容模式和极速模式有什么区别)

  • soul注销后必须要等七天吗(soul注销后必须要等七天,然后还要上线确认注销是吗)

    soul注销后必须要等七天吗(soul注销后必须要等七天,然后还要上线确认注销是吗)

  • 京东退货卖家不审核怎么办(京东退货卖家不同意怎么办)

    京东退货卖家不审核怎么办(京东退货卖家不同意怎么办)

  • 为什么我的siri别人叫也会出来(为什么我的siri叫不出来了)

    为什么我的siri别人叫也会出来(为什么我的siri叫不出来了)

  • 嗨来电怎么设置不了(嗨来电怎么设置来电闪光灯)

    嗨来电怎么设置不了(嗨来电怎么设置来电闪光灯)

  • ps身份证大小尺寸多少(ps身份证大小尺寸多少像素)

    ps身份证大小尺寸多少(ps身份证大小尺寸多少像素)

  • 捡到oppor17怎么解锁(捡到oppor17怎么解锁,刷机还要账户密码)

    捡到oppor17怎么解锁(捡到oppor17怎么解锁,刷机还要账户密码)

  • 手机需要3c认证吗(手机需要3c认证么)

    手机需要3c认证吗(手机需要3c认证么)

  • iphone拍夜景相机设置(苹果拍夜景相机)

    iphone拍夜景相机设置(苹果拍夜景相机)

  • 如何确定我的Mac或Linux是否易受到Shellshock攻击?(如何确定我的世界的区块)

    如何确定我的Mac或Linux是否易受到Shellshock攻击?(如何确定我的世界的区块)

  • Web系统常见安全漏洞介绍及解决方案-CSRF攻击(web系统的安全现状)

    Web系统常见安全漏洞介绍及解决方案-CSRF攻击(web系统的安全现状)

  • 印花税的缴纳方法包括哪几种
  • 组成计税价格包括什么
  • 增值税有哪几类
  • 提取法定盈余公积是什么意思
  • 一般纳税人劳务公司可以开3%的发票吗
  • 红字发票冲红需要收回原发票吗
  • 审核通过的红字发票信息表可以撤销吗
  • 资本公积转增股本什么意思
  • 行政单位会议纪要范文3篇
  • 卖自用轿车要缴什么税
  • 咨询费发票入账风险
  • 其他业务收入的核算内容
  • 预收账款多了好还是少了好
  • 更换金税盘后数据能恢复么
  • 工程发票没写经办人没写可以吗
  • 申报清单怎么写
  • 租赁发票交税交多少
  • 营销策划费用计算公式
  • 上期金额为上年同期报表的本期金额
  • rtx3090 rtx titan
  • 境外代扣代缴企业所得税的计税依据包含企业所得税嘛
  • linix unix
  • 利润表里的所得税费用怎么算出来的
  • 发现新大陆的是麦哲伦还是哥伦布
  • c++图像二值化
  • find命令详解查找文件
  • 建筑业如何开票
  • 银行汇票和银行承兑汇票的区别
  • 现金流量表现金等价物有哪些
  • 其他应收款借贷方表示什么意思
  • 待处理财产损溢借方是增还是减
  • mongodb的索引种类
  • 基于sqlite特殊字符转义的实现方法
  • 稽查查补的税款由谁追征
  • 企业向个人借款协议范本
  • 结转应交税金的分录
  • 劳务公司包工包料工程如何账务处理
  • 房屋租赁如何入账
  • 普通发票验旧后怎么作废
  • 贴现法付息的实际利息
  • sql server 2005 数据库还原
  • 应付账款账务处理中的错弊
  • 收到失业保险稳岗补贴怎么做会计分录
  • 劳务派遣公司经营情况说明怎么写
  • 生产成本核算的步骤
  • 无票利息支出可抵税吗
  • 现在勾选认证是可以下月初认证?
  • 代建项目谁付款
  • 上级补助收入科目
  • 多交税款账务怎么处理
  • 车贷管理费合理吗
  • 教育费附加免征额
  • 一般纳税人会计分录
  • 明细账示例图
  • 收款收据可以入账吗
  • 固定资产怎么折旧有几种方法
  • mysql数据库如何使用
  • sql server安全设置
  • windows任务管理器打不开
  • centos7添加ip地址
  • rhel7.4安装
  • 怎么进入win7系统
  • win8如何添加启动项
  • ubuntu20.04怎么用
  • win7如何录制电脑屏幕
  • 微软2021年新系统
  • linux cpan
  • 举例说明什么是判断
  • Extjs4 GridPanel的主要配置参数详细介绍
  • 腙基是什么
  • EGL简介
  • vue中的组件通信
  • pyinstaller指定python2
  • python错误代码
  • javascript 作用
  • python3.6安装pil
  • 湖南电子税务局app
  • 天津税务局发票查询
  • 特价机票包含燃油费和机场建设费吗
  • 成都网上税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设