目录
- 一,开发环境
- 二,论文代码
- 三,导入项目
- 四,数据准备
- 五,训练模型
- 六,预测结果
- 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放入其中
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