当前位置: 首页 > 编程日记 > 正文

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

图片

作者|李秋键

出品|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竞赛获奖等。

相关文章:

nginx和squid配合搭建的web服务器前端系统

两种前端架构: lvs -> nginx前端代理 -> squid缓存lvs -> squid前端缓存 -> nginx中层代理squid在前面的优点: Squid作纯代理比较稳当前端少一级代理,响应速度会快,出问题的可能性要小功能有限,不会常被调…

聊聊jesque的几个dao

为什么80%的码农都做不了架构师?>>> 序 本文主要聊一下jesque的几个dao dao列表 FailureDAOKeysDAOQueueInfoDAOWorkerInfoDAOFailureDAO jesque-2.1.0-sources.jar!/net/greghaines/jesque/meta/dao/FailureDAO.java /*** FailureDAO provides access …

Proxy与NAT有什么区别

在internet共享上网技术上,一般有两种方式,一种是proxy代理型,一种是NAT网关型,关于两者的区别与原理,身边很多人都不是很明白,下面我来讲讲我的理解,如有不对的,欢迎指正.1.先说应用例子:服务器端,用wingate就是Proxy,用sygate就是NAT客户端,需要在IE中设置代理服务器的就是用…

【转】ubuntu 12.04 下 Vim 插件 YouCompleteMe 的安装

原文网址:http://www.cnblogs.com/jostree/p/4137402.html 作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4137402.html 1.需要保证vim的版本大于7.3.584,否则的话需要更新vim 可以通过第三方源更新: 在终端输入…

「倒计时」2021年移动云 API 应用创新开发大赛,你居然还没报名?!

移动云API应用创新开发大赛自成立举办以来,因赛事覆盖广、规模大、奖励高等、吸引了移动、企业、高校各赛道选手踊跃报名。目前活动火爆呈现白热化状态,截至目前为止,累计报名600人。现距离大赛报名截止仅剩5天!!&…

snort源码的详细分析

前段时间由于工作关系,对snort入侵检测系统进行了仔细的研究,起初基本都是通过网上找的资料,对于snort系统的应用,原理,架构,配置,源码机构网上都可以找到比较详细的资料,我自己用vs…

TCP/IP四层模型和OSI七层模型

TCP/IP四层模型和OSI七层模型对应表。我们把OSI七层网络模型和Linux TCP/IP四层概念模型对应,然后将各种网络协议归类。 表1-1 TCP/IP四层模型和OSI七层模型对应表 OSI七层网络模型 Linux TCP/IP四层概念模型 对应网络协议 应用层(Application&am…

强化学习环境库 Gym 发布首个社区发布版,全面兼容 Python 3.9

作者:肖智清 来源:AI科技大本营 强化学习环境库Gym于2021年8月中旬迎来了首个社区志愿者维护的发布版Gym 0.19。该版本全面兼容Python 3.9,增加了多个新特性。 强化学习环境库的事实标准Gym迎来首个社区发布版 Gym库在强化学习领域可以说是…

SCOM电子书

SCOM电子书介绍转载于:https://blog.51cto.com/286722/1599625

京东二面的几个问题

1. tcp 连接的最大数量,tcp 用什么来标识 2. 多线程时如何避免互斥 3. protected 关键字 4. 动态库和静态库 5. 线程池 6.多继承时的虚表 网络编程需要加强转载于:https://www.cnblogs.com/simplepaul/p/7865777.html

服务器集群负载均衡(F5,LVS,DNS,CDN)区别以及选型

服务器集群负载均衡(F5,LVS,DNS,CDN)区别以及选型 下面是“黑夜路人”的《大型网站架构优化(PHP)与相关开源软件使用建议》 F5全称: F5-BIG-IP-GTM 全球流量管理器. 是一家叫F5 Networks的公司开发的四~七层交换机,软硬件捆绑. 据说最初用BSD系统,现在是…

linux下SVN不允许空白日志提交

在svn服务端通过hooks在提交时强制要求写日志。1. 在hooks目录里,复制文件pre-commit.tmpl到pre-commit2. 修改pre-commit文件,如下。#!/bin/shREPOS"$1"TXN"$2"SVNLOOK/usr/bin/svnlook #根据你的SVN目录而定LOGMSG$SVNLOOK log -t…

没有熙熙攘攘,百度VR在世界大会的一场奇妙之旅

你可听过玄奘西行的故事?没有猴子和女儿国,也没有鬼怪和妖魔,在那个故事里有的只是人心的善恶和风雨的折磨。相传,在玄奘走到楼兰时,曾被官兵追捕,他机缘巧合才悄悄逃出大狱。那茫茫大漠里,为避…

Ubuntu下搭建postgresql主从服务器(方法1)

Ubuntu下搭建postgresql主从服务器(方法1) 安装略 postgresql主服务器: $ vi /etc/postgresql/9.1/main/postgresql.conf 按a或i进入编辑模式 listen_addresses ‘*’ (默认为注释的,此处不改从postgresql同步时会报…

利用集群技术实现Web服务器的负载均衡

集群(Cluster)所谓集群是指一组独立的计算机系统构成的一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算机。 负载均衡(Load Balance)网络的负载均衡是一种动态均衡技术&#xf…

AI EARTH再立功,达摩院包揽遥感AI领域三项冠军

人类赖以生存的地球表面积大约为5.1亿平方公里,而陆地面积仅占29.2%,这些土地历经数十亿年的演变及人类生活的改造,又被分割成耕地、森林、草地、水域及建筑等等,现在,AI正在成为管理陆地资源的新途径。 8月27日&#…

node.js写一个json服务

待续转载于:https://www.cnblogs.com/progfun/p/4212099.html

试过不用循环语句撸代码吗?

译者按: 通过使用数组的reduce、filter以及map方法来避免循环语句。 原文: Coding Tip: Try to Code Without Loops 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。 在前一篇博…

Linux 命令 top 学习总结

本文简介 概要: 学习总结 Linux 下的 top 命令 版本: Debian 5(Lenny), top: procps version 3.2.7 日期: 2010-11-17 永久链接: http://sleepycat.org/linux/linuxcommand/top.html I. 概述 学习总结 top 命令。主要学习自 man 手册。 Linux 下 top 命令:# toptop…

android 中改变按钮按下时的颜色

原文出处:http://blog.csdn.net/nmsoftklb/article/details/9087233 a、在开发中大家都会遇到这样情况,在一个xxx.xml文件中如果有两个以上的组件有一样的属性功能时,可以把它们共同的内容抽取出来 放在styles.xml文件来声明。 然后在相应的组…

实战:使用 Mask-RCNN 的停车位检测

作者:小白来源:小白学视觉Q如何使用Mask-RCNN检测停车位可用性?我最近做了一个项目,根据安全摄像头的照片来检测停车位是否可用或被占用。我的工作有局限性,我将进一步详细介绍这些局限性,但一旦这些问题得到解决&…

Microsoft Office Communications Server 2007 R2 RTM 简体中文企业版部署速成篇之二

写文章真是件累人的事情.\(^o^)/~.OCS2007R2中的CWA有很多新特性.今天我们来看看,接着昨天的开始.本篇基于速成篇之一.Go!在一中的环境中多了,一台WIN2008的服务器,并加入域.首先在DNS里面建两条别名,指向CWA服务器!完成后,记得重新启动DNS.然后,子啊功能和角色里面添加必要的组…

F5负载均衡会话保持技术及原理技术白皮书

1.什么是会话保持?在大多数电子商务的应用系统或者需要进行用户身份认证的在线系统中,一个客户与服务器经常经过好几次的交互过程才能完成一笔交易或者是一个请求的完成。由于这几次交互过程是密切相关的,服务器在进行这些交互过程…

一文全览机器学习建模流程(Python代码)

作者:泳鱼 来源:算法进阶引言随着人工智能时代的到来,机器学习已成为解决问题的关键工具,如识别交易是否欺诈、预测降雨量、新闻分类、产品营销推荐。我们接下来会详细介绍机器学习如何应用到实际问题,并概括机器学习应…

CSS Selector 3

转载于:https://www.cnblogs.com/dmdj/p/4213159.html

GSM中时隙、信道、突发序列、帧的解释

刚从论坛中看到有人问GSM中时隙、信道、突发序列、帧知识。今天我们数字通信正好上到这一块,我就根据我知道的和网上搜索的回答! 1、时分多路复用技术 FDMA:频分多址 TDMA:时分多址 CDMA:码分多址 为了提高通信道的利用率,使若干彼此独立信号…

网页效率之DNS查找和并行下载

首先,一个页面所需要访问的域名数量为n,那么就需要n次DNS查找,而DNS查找通常是blocking call,就是说在得到结果之后才能继续,所以越多的DNS查找,反应速度就越慢; 雅虎的YSlow插件的规则之一&…

赛门铁克开启“容灾即服务”时代

从本地备份到异地复制再到云容灾,随着云计算技术的快速发展,以及云服务这种模式逐渐被广大企业用户所接受,将数据备份到云已经是一种可行的数据保护解决方案。12 月 16日,赛门铁克公司推出了一款全新的灾难恢复解决方案Symantec D…

再谈“去虚拟化”对深度学习系统的必要性

作者 | 袁进辉上周写了一篇《浅谈GPU虚拟化与分布式深度学习框架的异同》,想不到引起很多关注和讨论。和朋友们讨论之后,觉得这个话题值得再发散一下:首先,文章只讨论了GPU“一分多”这种“狭义”的虚拟化,还存在另外的…

Enable PowerShell script execution policy

Open Windows PowerShell with administrator Run “Set-ExecutionPolicy UnRestricted –Force” 本文转自学海无涯博客51CTO博客,原文链接http://blog.51cto.com/549687/1918870如需转载请自行联系原作者520feng2007