我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

文章目录


前言

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

一、核心功能设计

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

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

最终效果如下所示:

视频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目标检测跟踪之热门算法。

首先来看一下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://blog.csdn.net/kobepaul123/article/details/126942095

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录