IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 基于卷积神经网络的密集人群估计算法【内含教程和踩坑】 -> 正文阅读

[人工智能]基于卷积神经网络的密集人群估计算法【内含教程和踩坑】


前言

毕业季要到了,在此之前最重要的事情就是毕业设计,而我的课题是关于密集人群估计的算法研究。我和各位在坐大部分人一样都是从零开始的,在看论文、修改代码、训练模型、调参数中一点点了解人群估计的全貌。此文力求带领各位初学者进一步了解人群密度估计算法,尽量涵盖前期了解算法的途径到后期自己复现论文代码、训练模型的全过程。本文出现的一些代码和数据集都会在文末给出网盘资源供读者下载。

一、什么是密集人群估计

简而言之,就是给你一张图片,然后你能算出图片中出现的人的数量。基于卷积神经网络的此类算法都离不开生成Ground Truth,高斯核函数生成密度图,然后对密度图进行积分,积分结果即为估计出的人群数量,很明显算法并不是一个个去数人头,而是通过积分的方法来估计。有人问为啥要这么做呢,因为人群估计的重点在于密集,一张图片可能存在成百上千人,就算让算法一个个数这也是不现实的,因此如今最好的办法就是去拟合估计,也算是回归算法的一种做法。
想要大致了解可以阅读以下文章:

基于CNN的人群密度图估计方法简述
人群计数:从MCNN开始谈起~

二、实验前准备

1.Github开源项目——Awesome Crowd Counting

名字带有Awesome的项目永远都不会让你失望,这个项目整理了关于人群估计的论文和论文中模型的代码,当然并不是所有论文都能找得到代码。有个原则就是先找有代码的论文来读,因为论文始终是架空的,只有真正自己运行起了代码才是开始的第一步。
项目地址如下,此处给的是https://hub.fastgit.org这一github镜像网站,这能很好解决连接github时断时续的问题,强烈推荐给读者。

Awesome Crowd Counting

2.数据集下载

人群密度估计的数据集相对较为有限,基本就那么几个常见数据集。
1.ShanghaiTech dataset【最常用】
总共1198张标记图片,数据集分为两部分part_A和part_B,part_B部分的图片相较于part_A部分的图片人群分布更为稀疏。
MCNN中首次建立该数据集,part_A部分300张用于训练,182张用于测试;part_B部分400张用于训练,316张用于测试。
2.WorldExpo’s dataset
总共3980张标记图片,其中3380张用于训练,剩下的图片用于测试。
测试集包括5中不同的场景,每种场景有120张图片。每种场景中都提供了ROI,因此人群计数只在ROI部分进行。
3.UCF_CC_50 dataset
总共50张图片。这一数据集的特点是图片数量少,但是人数变化大。
4.其他
还有监考拍摄的行人数据集UCSDpeds和商场的mall_dataset数据集。

3.环境配置

这一步环境配置没什么好说的,读者自行配置环境,配置环境是做实验的第一步,也算是对个人能力的一种锻炼。毫无疑问是要使用Python语言来开发,版本最好为3.7以上,建议安装anaconda,学习通过虚拟环境管理不同项目,pip或者conda install安装过慢解决方法参照使用国内清华、阿里镜像来提速。深度学习框架我是选择了Pytorch,我在过去的AlexNet那篇文章也有解释理由,因为Pytorch更加Pythonic。最后深度学习训练最好有块显卡,别在自己的笔记本电脑上跑。

三、ShanghaiTech数据集实验

1.论文代码复现

其实这一步以前读者最好先把原论文读一遍,不过问题也不大,看代码其实更好理解。我跑通的论文代码有两个,[CAN] Context-Aware Crowd Counting和[CSR] CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes,这两份代码结构上基本一致,CSRNet早于CAN发表,尽管CAN论文中给出自己超过前面论文模型的实验证明,但我在自己做过实验后更看好CSRNet,尽管CSRNet训练的时间远比CAN长。

2.CAN复现

从github上直接下载的代码运行绝对是会报错的,不过只要修改几个地方就可以正常运行了。
具体请参考文章:[CAN] Context-Aware Crowd Counting 复现过程记录
【踩坑】文章主要针对ShanghaiTech数据集中的partB进行训练,如果是训练partA可能也会报错,问题就在于batch_size,partB部分的训练图片都是统一大小的,而partA则是大小不一,对于图片大小不一致只能将batch_size设置为1。不仅如此,训练partA时你甚至可能遇到训练出现Loss是nan的异常情况,网上说是学习率太高导致,造成了梯度爆炸,只要将学习率减少原来十分之一左右就可以了。

3.CSRNet复现

如CAN复现的那样如法炮制来修改原代码,训练基本不会出啥问题。
【切记】每次训练完后一定要额外备份训练好的参数即pth文件,否则可能你再次训练就会被覆盖,亲身经历血的教训!

4.可视化调参

一般来说partA的效果往往和论文效果相差甚远,我训练的时候CSRNet倒是和论文给的结果很贴近,而CAN就呵呵了。我们接下来可以就CAN对partA的训练过程进行可视化,然后通过图像我们手动调节学习率等参数(我目前是只修改CAN学习率)。
强烈推荐PP飞桨VisualDL只要直接安装就可以很方便使用,再在代码里加几句代码就可以在浏览器轻松看到可视化的训练参数曲线。官方指南VisualDL 使用指南也写的很全面,跟着来就行,我目前只是使用了标量图表这个简单的功能,读者可自行尝试超参数这一功能,据说效果不错。
我训练时图像如下:
1.学习率为1e-5时CAN训练图像:
在这里插入图片描述
2.学习率为1e-6时CAN训练图像:
在这里插入图片描述
3.学习率为1e-7时CAN训练图像:
在这里插入图片描述
Loss值(即MAE)越小效果越好,即1e-5时下限更低,所以训练时我选用e-5这个学习率。

四、UCF_CC_50数据集实验

1.数据集目录结构重构

网上所下载的UCF_CC_50的数据集往往是图片和mat文件都在同个文件夹,而ShanghaiTech里面则是分了train训练集和test测试集。为了更好让我们已复现的代码可以适应UCF数据集,我们要对UCF目录进行重构。按照论文要把50张图分为5组每组10张做交叉验证,4组训练集,1组测试集;如此做不同的5次最后取平均值。我的五组安排如下:

组别test测试集所含图片
part11-10.jpg做测试集
part 211-20做测试集
part 321-30做测试集
part 431-40做测试集
part 541-50做测试集

以part1为例如图,其实就是和ShanghaiTech的文件目录保持一致。
在这里插入图片描述
【踩坑】UCF_CC_50里面的mat文件和SHanghaiTech里面的mat文件坐标所在字典的key是不同的,改成下图所示即可。
在这里插入图片描述

这个训练的时间可不比ShanghaiTech的短,本人训练结果如下图供读者参考:
1.CAN训练结果
在这里插入图片描述
2.CSRNet训练结果
在这里插入图片描述
观察上面图表就可知为什么我说CSRNet更好,网上有的人都质疑CAN中的某个网络模块是无用的,不过本人也没法求证就听一听罢了,要用实验数据说话。学术界确实存在用某刻碰巧的数据来代表整个模型算法的优越,而忽略了鲁棒性这一关键因素,因此流传着AI界论文不可复现这个梗。

五、DIY数据集实验

跑通了实验只能证明读者已具备配置环境和自行运行程序的能力,要进一步理解人群估计算法还得自行制作数据集来训练。

1.数据集采集

这一步读者可根据自身情况而定,手机相机等设备拍摄人群图像亦或是网上采集到的现成图片均可。我采用的是前者,使用手机拍摄校园中的人群。如图:
在这里插入图片描述

【踩坑】在人头标注之前,要关注的一个图片重要参数就是分辨率,因为训练的时候要生成Ground Truth,h5文件的大小直接和分辨率挂钩。好比我手机拍摄出来的图片分辨率是3000x4000=1200万像素,生成h5文件接近100M,训练时GeForce RTX 3060的显卡直接报空间不足,因为ShanghaiTech里面的任一张图片的h5文件也才6K左右。因此如果读者拍摄的图片分辨率太高,就要降低图片分辨率。

2.降低图片分辨率

#resolution_changer.py
import glob
from PIL import Image
import os
img_path = glob.glob("dataset/train/images/*jpg")
path_save = "dataset/train/images/"
for file in img_path:
  name = os.path.join(path_save, file)
  print(name)
  im = Image.open(file)
  im.thumbnail((1080,720)) # 尽量按比例改成1080,720格式,尽管最后图片不会都是找个大小,但是一定比这个规格小
  print(im.format, im.size, im.mode)
  im.save(name,'JPEG')

这是网上直接搜到的代码,读者自行更改img_path和path_save即可,不难发现这两个路径是相同的,只是img_path多了个*.jpg。

3.数据集人头标注

[T-PAMI] NWPU-Crowd: A Large-Scale Benchmark for Crowd Counting and Localization是个不错的网站,值得一看,其实在Awesome-Crowd-Counting里面就能找到。接下来我们要使用其中的Annotation Tools工具CCLabeler-master,读者直接进入链接安装即可,其中有完备的说明,很容易使用。尽管如此我还是多说几句吧。
1.首先把已降低分辨率的图片都放到cclabeler-master\data\images下,并且把图片编好序号。
在这里插入图片描述
2.进入cclabeler-master\users\,会看到test.json文件,打开json文件,password在登录浏览器界面时要用到,data存放你待标注的图片名称(可以自己写个python脚本生成字符串),不用后缀,done和half保持空的状态。
在这里插入图片描述
3.打开cmd,cd到cclabeler-master目录,执行python manage.py runserver 0.0.0.0:8000,出现如果提示后在浏览器输入localhost:8000再登录就OK了。
在这里插入图片描述
4.界面如下,具体操作看项目的HOWTO.pdf
在这里插入图片描述

4.数据集整合

标注打完后,人头的位置坐标就存在cclabeler-master\data\jsons\目录下,里面的json文件相当于市面上数据集里的mat文件。参照ShanghaiTech数据集分成train、test,然后分成ground_truth和images子目录的结构就可以了。

5.DIY数据集训练

毕竟和传统数据集中mat文件不同,DIY的是json文件,所以代码相应位置也要做细微调整。只需将make_dataset.py此处更改即可,其他地方貌似没有什么要改动的,生成了GT的h5文件后,后续操作都一视同仁。
在这里插入图片描述

6.仅供参考的训练结果

CAN学习率=e-5MAE=4.231RMSE=7.334
CSRNet无效更改MAE=5.774RMSE=7.546

我的数据集图片数仅有50张,40张用于训练,10张用于测试,epoch数均为500,看来这次是CAN打败了CSRNet呢。

文末资源

因为某些因素暂时没法上传到网盘,请读者见谅,之后会补上。资源至少包含已重构的UCF_CC_50数据集,修改后可直接运行的论文复现代码。

总结

长路漫漫你并不孤单,你不是一个人面对这困难,曾经有许多人和你面临相同的问题,未来也会有无数人遇到,我们能做的且唯一能做到的就是问心无愧,尽力而为。毕设还未结束,我后期仍将更新此文,请读者关注,欢迎和各路大佬交流学习。
最后感谢本文中引用的链接的作者及组织。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:59:55  更:2022-01-12 00:00:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 22:30:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码