作者|李秋键

出品|AI科技大本营(ID:rgznai100)

人群密度计数是指估计图像或视频中人群的数量、密度或分布,它是智能视频监控分析领域的关键问题和研究热点,也是后续行为分析、拥塞分析、异常检测和事件检测等高级视频处理任务的基础。随着城市化进程的快速推进,城市人口数量急剧增长,导致各种人员高度聚集的社会活动频繁发生,如果管控不当,极易发生拥挤踩踏事故。

例如上海“12.31”外滩踩踏事故中,由于现场管理和应对措施不当,引发了人群拥挤和摔倒,最终造成了重大人员伤亡的严重后果。如果有精度良好的人群计数系统实时统计相关场所的人群数量、分布或密度等信息,及时发现人群拥挤和异常行为并进行预警,以便采取措施进行疏导,就可以避免悲剧的发生。性能良好的人群计数算法也可以迁移到其他目标计数领域,如显微图片中的细菌与细胞计数、拥挤道路上的汽车计数等,拓展人群计数算法的应用范围.因此,人群计数方法的研究有着重要的现实意义和应用价值。

显然的是传统的人群计数方法具有一定局限性,无法从图像中提取更抽象的有助于完成人群计数任务的语义特征,使得面对背景复杂、人群密集、遮挡严重的场景时,计数精度无法满足实际需求。近年来,深度学习技术发展迅猛,在许多计算机视觉任务中得到成功应用,促使研究人员开始探索基于卷积神经网络的人群计数办法相比于传统方法,基于CNN的人群计数方法在处理场景适应性、尺度多样性等问题时表现更优。而且由于特征是自学习的,不需要人工选取,可以显著提升计数效果,因此已经成为当前人群计数领域的研究热点。使用CNN的人群计数方法主要分为直接回归计数法和密度图估计法2类。直接回归法只需向CNN送入人群图片,就可以直接输出人群数量,适用于人群稀疏场景。在密度图法中,CNN输出的是人群密度图,再以数学积分求和的方式计算出人数.这类方法性能的好坏一定程度上依赖于密度图的质量。为了提升密度图质量,会引入新的损失函数来提高密度图的清晰度和准确度

故本项目通过采用深度学习方法获取人群密度图已估计人群数量,使用python语言搭建MSCNN网络实现实时生成人群密度图以达到估计人群数量的目的。其最终实现效果如下图可见:

基本介绍

1.1 环境要求

本次环境使用的是python3.6.5+windows平台。主要用的库有:

opencv模块。在计算机视觉项目的开发中,opencv作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。

numpy模块。numpy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效得多(该结构也可以用来表示矩阵。

pillow模块。PIL是理想的图像存档和批处理应用程序。您可以使用库创建缩略图,在文件格式、打印图像等之间进行转换。它提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。核心图像库是为快速访问以几种基本像素格式存储的数据而设计的。为通用图像处理工具提供了坚实的基础。

keras模块。Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。

1.2 MSCNN网络介绍

MSCNN作为多尺度卷积神经网络与传统机器学习算法相比,深度学习模型能更有效地从高维复杂输入中自动提取特征。卷积神经网络是应用最广泛的深度学习模型之一,通过卷积、池化等操作提取原始数据的特征,并通过权连接层输出模型的计算结果。其中,卷积核的大小在一定程度上影响着特征提取的效果和模型的故障识别能力。MSCNN是一种改进的卷积神经网络,通过不同大小的卷积核从多尺度挖掘特征信息,有效解决了传统CNN模型卷积核的自适应选择问题。其网络流程如下可见:

模型搭建

2.1 MSCNN网络搭建

在CNN网络的基础上搭建多尺度技术,其实现过程为将某一中间层或某几层中间层的输出特征与最后一层的输出特征连接、展平,作为 CNN 的输出,结合高低层次的输出可以对设备退化过程进行更全面地学习。

def MSCNN(input_shape):inputs = Input(shape=input_shape)x = Conv2D(64, 9, activation='relu', padding='same')(inputs)x = MSB(4 * 16)(x)x = MaxPooling2D()(x)x = MSB(4 * 32)(x)x = MSB(4 * 32)(x)x = MaxPooling2D()(x)x = MSB(3 * 64)(x)x = MSB(3 * 64)(x)x = Conv2D(1000, 1, activation='relu', kernel_regularizer=l2(5e-4))(x)x = Conv2D(1, 1, activation='relu')(x)model = Model(inputs=inputs, outputs=x)return model

2.2 MSB结构创建

通过使用multi-scale blob模块(类Inception结构)可以实现对相关特征的提取,搭建Multi-Scale Blob (MSB) 结构,可以用来增强特征的多样性。

def MSB(filters):params = {'activation': 'relu', 'padding': 'same','kernel_regularizer': l2(5e-4)}def f(x):x1 = Conv2D(filters, 9, **params)(x)x2 = Conv2D(filters, 7, **params)(x)x3 = Conv2D(filters, 5, **params)(x)x4 = Conv2D(filters, 3, **params)(x)x = concatenate([x1, x2, x3, x4])x = BatchNormalization()(x)x = Activation('relu')(x)return xreturn f

密度图可视化

3.1 密度图的建立

人群密度图的生成需要使用高斯滤波处理,原因在于在空间中计数时,每个人只占一个像素点导致最终得到的密度分布图特别稀疏,会导致模型收敛到全0状态。因此通过高斯处理后,密度图呈现出热力图的形式,一定程度上解决了稀疏问题。而且高斯处理后的密度图,总计数是不变的。

其中生成密度图代码如下:

model = MSCNN((224, 224, 3))
model.load_weights('model\\final_weights.h5')
cap=cv2.VideoCapture("test.mp4")
while True:ret,frame=cap.read()img = frameori_img=img.copy()img = cv2.resize(img, (224, 224))img = img / 255.img = np.expand_dims(img, axis=0)dmap = model.predict(img)[0][:, :, 0]dmap = cv2.GaussianBlur(dmap, (15, 15), 0)height, width = dmap.shapefig, ax = plt.subplots()plt.figure(figsize=(10, 10))fig.set_size_inches(width / 100.0 / 3.0, height / 100.0 / 3.0)plt.gca().xaxis.set_major_locator(plt.NullLocator())plt.gca().yaxis.set_major_locator(plt.NullLocator())plt.subplots_adjust(top=1, bottom=0, left=0, right=1, hspace=0, wspace=0)plt.margins(0, 0)plt.imshow(dmap)plt.savefig("result.jpg")re_img=cv2.imread("result.jpg")ori_img=cv2.resize(ori_img,(400,400))re_img = cv2.resize(re_img, (400, 400))cv2.imshow("mg0",ori_img)cv2.imshow("img1", re_img)cv2.waitKey(1)#visualization(img[0], dmap)print('count:', int(np.sum(dmap)))

完整代码:

链接

https://pan.baidu.com/s/1rzMZirbcH6CxpwyssEi7Kg

提取码0w78

李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

深度学习上的又一重点发现——利用MSCNN实现人群密度监测相关推荐

  1. 利用深度学习对象检测器从信息素陷阱图像中自动计数松球菌监测

    Simple Summary 松球菌(Matsucoccus thunbergianae)是一种对黑松造成广泛损害的森林害虫;因此,监测这种害虫是必要的,以尽量减少环境和经济损失的森林.然而,利用信息 ...

  2. 详解深度学习之经典网络:AlexNet(2012) 并利用该网络架构实现人脸识别

    @[TOC](详解深度学习之经典网络:AlexNet(2012) 并利用该网络架构实现人脸识别**) 近来闲来无事,翻出了搁置已久的轻薄版电脑,望着积满灰尘的显示屏,觉得有愧于老师的尊尊教导,心中叹息 ...

  3. 深度学习上采样下采样概念以及实现

    #pic_center =400x 系列文章: 文章目录 参考博客 概念 上采样 下采样 实现 上采样 下采样 参考博客 [深度学习]上采样,下采样,卷积 torch.nn.functional.in ...

  4. optuna在深度学习上自动调参

    文章目录 1.背景 2.安装 3.在tensorflow上使用 direction sampler 4.实例 4.1 定义模型.训练过程 Trainer train_step val_step tra ...

  5. 深度学习练手项目(二)-----利用PyTorch进行线性回归

    前言 深度学习并没有想象的那么难,甚至比有些传统的机器学习更简单.所用到的数学知识也不需要特别的高深.这篇文章将利用PyTorch来实现线性回归这个经典的模型. 一.线性回归理论 线性回归时利用数理统 ...

  6. 深度学习-07(图像分类、常用数据集、利用CNN实现图像分类、图像分类优化)

    文章目录 深度学习-07(PaddlePaddle图像分类) 图像分类概述 概述 什么是图像分类 图像分类粒度 图像分类发展历程 图像分类问题的挑战 常用数据集介绍 MNIST数据集 CIFAR10数 ...

  7. 深度学习练手项目(一)-----利用PyTorch实现MNIST手写数字识别

    一.前言 MNIST手写数字识别程序就不过多赘述了,这个程序在深度学习中的地位跟C语言中的Hello World地位并驾齐驱,虽然很基础,但很重要,是深度学习入门必备的程序之一. 二.MNIST数据集 ...

  8. 史上最萌最认真的机器学习/深度学习/模式识别入门指导手册(三)

    能够坚持走到阶段三的喵一定是很有毅力的喵!也是很合格的机器学习/人工智能研究者啦~但是走到这里,也意味着您不满足于使用看似孤立的机器学习模型来生硬的完成一些任务,那么,大一统的理论体系就在这一阶段建立 ...

  9. 史上最萌最认真的机器学习/深度学习/模式识别入门指导手册(二)

    谢谢你们.小夕昨晚又熬夜被发现了,谢谢对小夕的关心... 有你们陪着,小夕很幸运. 路人乙:"小夕,别人都说上完coursera上的那门机器学习课就已经入门机器学习了,可你又不这样认为.那你 ...

最新文章

  1. 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)
  2. 《大数据实践课》开创实践教学新模式:清华大数据能力提升项目特色课程系列报道之一
  3. linux 内核编译错误 undefined reference to '__mutex_lock_slowpath'
  4. php 类加载其它类,php 类自动载入的方法
  5. [国嵌攻略][080][无名管道通讯]
  6. web安全101之如何理解XXE?
  7. Xamarin.Forms弹出对话框插件
  8. if语句写阶跃函数C语言,C语言第四章分支语句.ppt
  9. 【Flink】Flink 报错 ResourceManager leader changed to new address null
  10. 计算机等级一考通2021,2021驾校一考通题库
  11. Android apk快速定位、灰色按钮克星--DroidSword
  12. 计算机组成原理:超标量,让CPU的吞吐率超过1
  13. 800份h5游戏源码
  14. 微信小程序加载图片失败展示默认图片
  15. 两个分数化简比怎么化_化简比的六种方法
  16. 小程序 获取地理位置
  17. iOS企业ipa(299)证书制作、打包发布全流程(亲测,成功)
  18. 【列表解析式】Python的单行操作秀
  19. mysql聚簇和非聚簇索引
  20. IDEA最新安装插件方法,最简单

热门文章

  1. 数据结构(队列实现篇)
  2. 刷前端面经笔记(七)
  3. PI校正环节的程序实现推导过程
  4. Python实战之网络编程socket学习笔记及简单练习
  5. java 基础知识八 正则表达式
  6. NPOI读写Excel
  7. 更新ADT到Android L的方法
  8. 正则表达式测试工具 Regex Tester 的使用方法
  9. H3C 交换机命名规则
  10. 有关GetPrivateProfileString的使用方法