基于Python的智能视频分析之人数统计的多种实现

Posted biyezuopinvip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Python的智能视频分析之人数统计的多种实现相关的知识,希望对你有一定的参考价值。

目 录
摘 要 1
1 理论基础 2
1.1 传统的人群计数算法[1] 3
1.1.1 基于检测的方法 3
1.1.2 基于轨迹聚类的方法 3
1.1.3 基于回归的方法 3
1.2 基于深度学习的人群计数算法 4
1.2.1 YOLO v3 目标检测算法[2] 4
1.2.2 MCNN 人群计数算法[3] 5
1.2.3 LSC-CNN 人群计数算法[4] 5
1.2.4 视觉语言联合预训练的 12-in-1 模型[5] 6
2 实验结果及分析 8
2.1 YOLO v3 目标检测算法 9
2.1.1 低密度人群 9
2.1.2 高密度人群 9
2.2 MCNN 人群计数算法 9
2.2.1 低密度人群 9
2.2.2 高密度人群 10
2.3 LSC-CNN 人群计数算法 10
2.3.1 低密度人群 10
2.3.2 高密度人群 11
2.4 视觉语言联合预训练的 12-in-1 模型 11
2.4.1 低密度人群 11
2.4.2 高密度人群 10
3 实验总结 11
参考文献 13
3实验总结

本次实验中,我选用了基于目标检测的 YOLO v3 模型,基于多列卷积神经网络的
MCNN 模型,利用检测方法进行人群计数的 LSC-CNN 模型,以及多任务的视觉语言联合预训练的 12-in-1 模型,分别对低密度人群和高密度人群两段监测视频进行了人数统计实验。
从实现效果来看,YOLO v3 由于是目标检测的算法,所以在目标不是很多的低密度人群的计数任务中表现效果很好,但是在高密度人群计数中表现不佳,仅能检测出30-50 个目标,和实际相差太多。而 MCNN 模型作为较早的基于深度学习的人群计数算法,尽管在低密度人群计数中表现不如 YOLO v3,但是在高密度人群计数中效果要明显优于前者,不过却存在计数过多的问题。之后我还使用了较新的 LSC-CNN 模型进行了实验,该模型利用检测方法进行人群计数,在低密度人群计数中表现效果同样不好,但是在高密度人群计数中相较于 MCNN 模型有了一定的提高,不过检测效果受参数 NMS threshold 影响较大。本文转载自http://www.biyezuopin.vip/onews.asp?id=15259最后,我还使用了一个视觉语言联合预训练的 12-in-1 模型,将人群计数视为视觉问答 (VQA) 任务,输入监测视频的帧图像和问题“How many people are there in the picture?”来获得图像中的人数,该模型在低密度人群计数中表现不错,但是由于训练集和模型本身的限制无法处理高密度人群计数问题。
总的来说,通过这次实验,无论是从理论还是实践上都加深了我对视频人群计数的理解,帮助我对智能视频分析这门课程有了更深一步的了解。

import cv2
import os
import argparse

def video_to_images(input_video, save_dir):
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)
    vidcap = cv2.VideoCapture(input_video)
    success,image = vidcap.read()
    cv2.imwrite(save_dir + '/IMG_1.jpg', image)
    count = 2
    success = True
    while success:
      success,image = vidcap.read()
      if image is None:
          break
      path = save_dir + '/IMG_' + str(count) + ".jpg"
      print(path)
      cv2.imwrite(path, image)     # save frame as JPEG file
      if cv2.waitKey(10) == 27:                     
          break
      count += 1  




def images_to_video(args,frame_dir,output_video):
    fps = 30  # 帧率
    img_array = []
    img_width = args.frame_width # 根据帧图像的大小进行修改
    img_height = args.frame_height # 根据帧图像的大小进行修改
    imdir = sorted(os.listdir(frame_dir))
    imdir.sort(key=lambda x: int(x.split('.')[0][4:]))
    print(len(imdir))
    for idx in range(len(imdir)):
        imgname = frame_dir + '/' + imdir[idx]
        #print(imgname)
        img = cv2.imread(imgname)
        #cv2.imshow('img', img)
        #cv2.waitKey(0)
        img_array.append(img)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    print(fourcc)
    out = cv2.VideoWriter(output_video, fourcc, fps,(img_width,img_height))
 
    for i in range(len(img_array)):
        out.write(img_array[i])
    out.release()
    cv2.destroyAllWindows()
 
 
def main():
    parser = argparse.ArgumentParser()

    ## Required parameters
    parser.add_argument("--frame_dir", default=None, type=str, 
                        help="The dir which saves frames")
    parser.add_argument("--input_video", default=None, type=str, 
                        help="The path of the input video")
    parser.add_argument("--output_video", default=None, type=str,
                        help="The path of the output video")
    parser.add_argument("--frame_width", type=int, default=720,
                        help="The width of frames")
    parser.add_argument("--frame_height", type=int, default=576,
                        help="The height of frames")
    parser.add_argument("--v2i", default=False, type=bool, 
                        help="video_to_images:True")
    parser.add_argument("--i2v", default=False, type=bool, 
                        help="images_to_video:True")

    args = parser.parse_args()
    if args.v2i:
        video_to_images(input_video=args.input_video, save_dir=args.frame_dir)
    if args.i2v:
        images_to_video(args, frame_dir=args.frame_dir, output_video=args.output_video)
 
 
if __name__ == "__main__":
    main()
    # python SplitCombine.py --frame_dir F:/SJTU_VideoAnalysis/frames --input_video F:/SJTU_VideoAnalysis/input_video/demo.avi --v2i True
    # python SplitCombine.py --frame_dir F:/SJTU_VideoAnalysis/output_frames --output_video F:/SJTU_VideoAnalysis/output_video/demo_output.avi --i2v True
















AI云边端算力调度智能分析网关算法模块细节优化介绍

AI智能分析网关内置多种AI算法,并且可支持将多种AI算法在算法仓中进行管理调度,实现数据按需汇聚、AI算力资源的灵活与精细化调度能力。基于智能分析网关+EasyCVR视频融合平台的AI视频智能分析能力,可对监控场景中的视频图像进行智能识别与分析,并提供人脸、人体、车辆、烟火、物体、行为等识别、抓拍、比对、告警等服务。

近期,我们对平台的算法分析模块进行了多个细节的优化,包括修复了AI算法删除未能生效的问题。今天来和大家分享一下实现过程。

1)将“编辑”文字改为操作,更加有利于用户理解该功能;

2)算法删除未生效的问题,经排查发现是接口并未实现:

3)添加删除接口的调用,成功后并刷新表格,完美解决以上问题。

基于智能分析网关+EasyCVR视频融合平台的云边端协同架构,能提供基于全局数据的云服务,通过汇集、融合所有的数据,并提供相关的计算、网络、存储、安全资源等,实现对全业务链的智能调度、资源整合与运维、AI算力分发、辅助决策等能力。

该方案能满足基于视频服务的数据感知、智能检测、智能分析、智能告警等需求,可广泛应用在智能安防、社区、校园、景区、园区、加油站、化工厂、工地、厂区、电力等场景中。我们的AI项目也支持小批量试错,欢迎大家进行了解。

以上是关于基于Python的智能视频分析之人数统计的多种实现的主要内容,如果未能解决你的问题,请参考以下文章

AI云边端算力调度智能分析网关算法模块细节优化介绍

AI云边端算力调度智能分析网关算法模块细节优化介绍

如何基于AI智能视频技术实现公园景区的人流量实时统计?

解决方案TSINGSEE客流统计系统技术架构与使用场景解析

寒假学习进度

智能分析网关新增算法分析结果展示列表,支持多方式检索