[CAN] Context-Aware Crowd Counting 复现过程记录

本文记录了使用PyTorch复现Context-Aware Crowd Counting的过程,包括开发环境配置、数据准备、模型训练及预测。在训练过程中解决了VGG16权重加载、CUDA内存不足等问题,最终得到接近论文结果的模型。
摘要由CSDN通过智能技术生成

目录

  • 一,开发环境
  • 二,论文代码
  • 三,导入项目
  • 四,数据准备
  • 五,训练模型
  • 六,预测结果
  • tips:

一,开发环境

windows10+Anaconda3+Python3.7+CUDA10.2+Pytorch1.5+Pycharm

二,论文代码

论文链接
代码链接

三,导入项目

1.通过git下载或者zip网页下载,二选一
通过网页下载
2.导入pycharm的目录结构
目录结构

四,数据准备

1.数据集
该demo使用的是ShanghaiTech Part B数据集
百度网盘: http://pan.baidu.com/s/1nuAYslz
2.导入数据集到目录
在项目的根目录创建一个文件夹data,将part_B_final放入其中
part_B_final
3.通过make_dataset.py创建hdf5文件(target文件)

  • 这一步的操作是让image和mat文件经过高斯核的计算,产生target文件。

  • make_dataset.py脚本需要做一些适当修改。

  • 数据集的路径(照抄下面就完事),注意:路径尽量避免使用绝对路径
    在这里插入图片描述

  • print函数加上小括号
    在这里插入图片描述

4.运行make_dataset.py脚本后,hdf5文件(后缀.h5)会产生在数据集的ground_truth文件夹中

  • 运行完脚本后,回到目录data\part_B_final\train_data\ground_truth下检查是否有生成.h5文件
    在这里插入图片描述

5.使用create_json.py产生json文件,这些文件内容是训练、测试图片的路径

  • 首先把脚本修改成以下形式,运行脚本,产生train.json,包含训练集图片路径
    在这里插入图片描述
  • 接着修改脚本,产生val.json,包含测试数据集图片路径
    在这里插入图片描述
  • 运行无误,在同级目录下会出现两个json文件
    在这里插入图片描述

五,训练模型

1.接下来打开train.py
调整一些空格,缩进,我们打开终端,输入命令python train.py train.json val.json
在这里插入图片描述
运行查看结果(每解决一个问题,就重新在端口运行一遍命令

  • 报错0:远程主机强迫关闭了一个现有的连接。该问题是冉同学反馈上来的。
  • 解决0:这个模型用到了迁移学习,使用到的backbone是VGG16,所以,我们需要用到离线的方式加载权重文件。具体步骤是:
    – 下载VGG16放在根目录下
    – https://pan.baidu.com/s/1G94yL6pWWYUQZfAWHt16ZA 提取码:619a
    在这里插入图片描述
    – 在model.py中添加一行路径代码。
    在这里插入图片描述
    – model.py修改部分代码如下:括号中参数改成False,下面再添上加载权重文件的语句。
    在这里插入图片描述
  • 报错1:NameError:name ‘xrange’ is not defined
    在这里插入图片描述
  • 解决1:定位到model.py的45行,修改成如下
    在这里插入图片描述
  • 报错2:TypeError: ‘odict_items’ object is not subscriptable
    在这里插入图片描述
  • 解决2:定位到model.py的46行。这里需要把self.frontend.state_dict().items(),mod.state_dict().items(),转成list类型,才能支持切片操作。
    在这里插入图片描述
  • 报错3:TypeError:integer argument expected, got float
    在这里插入图片描述
  • 解决3:定位到image.py的36行,单斜杠改成双斜杠,使除法结果为整数
    在这里插入图片描述
  • 报错4:RuntimeError: CUDA out of memory .
    在这里插入图片描述
  • 解决4:这个是显存不足,需要修改batch_size的大小。定位到train.py的32行。
    在这里插入图片描述
  • 我们可以看到作者给的batch_size是26。
  • 我的电脑配置显存6G,经过测试能承受的最大batch_size是9。
  • 各位根据电脑配置来设置即可,batchsize一般是2的倍数。
    在这里插入图片描述
  • 警告5:重新运行命令之后,我们可以看到一系列警告信息,并且成功运行第一个epoch。
    在这里插入图片描述
  • 放松5:这个不影响程序的运行,大多是一些老版本方法的一些警告。
  • 报错6:虽然成功运行训练阶段的代码,但是在测试的阶段出现了报错:TypeError:slice indices must be integers or None or have an index…
    在这里插入图片描述
  • 解决6:我们定位到train.py的139行。发现是整除这个老问题。单杠变双杠,139就不会出现报错。
    在这里插入图片描述

2.调通了训练代码
在这里插入图片描述3.当结束模型的训练之后,会保存一个效果最好的模型model_best.pth.tar
在这里插入图片描述

六,预测结果

1.打开test.py,首先解决一些明显的已经解决过的错误。

  • 40行修改成如下
    在这里插入图片描述
  • 65,66行修改成如下
    在这里插入图片描述
  • 修改测试图片路径,修改模型文件名为model_best.pth.tar
    在这里插入图片描述
    在这里插入图片描述

2.运行test.py代码(每解决一个问题,就重新在端口运行一遍命令)
该脚本会通过加载之前效果最好的模型文件(model_best.pth.tar)来预测test中的图片密度图

  • 报错1:TypeError: slice indices must be integers or None or have an index method
  • 解决1:单杠变双杠
    在这里插入图片描述

3.使用自己训练的模型成功预测!撒花✿✿
在这里插入图片描述
4.使用作者训练好的模型来预测

  • 论文作者提供在SHHB训练好的模型,性能达到了MAE7.5
  • 链接:https://pan.baidu.com/s/1UB7SnIcxheYJB4rDhtxlGQ 提取码:glz5

tips:

  • 在train.py中,epoch可以适当调整,毕竟越大,所需要时间就越多,当然效果可能会越好。
  • 原文的epoch=2000,我修改成了epoch=100,batch_size=9,训练大概需要接近3个小时,最后测试的结果和论文中差两个点左右,如下图所示。
    在这里插入图片描述
  • 还有一个就是GPU利用率
    在这里插入图片描述
  • ok各位,以上就是这篇文章的全部内容了,非常感谢你能看到这里。如果你觉得这篇文章对你有所帮助求赞求收藏求评论求转发,别忘了点一个大大的关注,各位的支持就是我最大的动力,再见!邮箱:734140820@qq.com
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wpw5499

若有帮助,不妨请博主一杯奶茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值