装不了 pytorch=0.4.0? ubuntu下 基于 cuda=92 和 pytorch=1.2 配置环境跑通 CornerNet 训练和测试流程 步骤详解(包括GPU限制问题详解)
ubuntu下跑通CornerNet的流程步骤
- 环境配置
- 写这篇博客原因?
- 更改conda_packagelist.txt
- conda下基于conda_packagelist.txt创建新环境
- 安装pytorch 1.2 和torchvision
- 编译Corner Pooling-(用pytorch=1.x的这里是个大坑,请注意!)
- 按照原始代码直接编译,error
- 初次修改,测试阶段OK,训练阶段不OK
- 最终修改,训练和测试阶段均OK
- 编译nms(非极大值抑制)
- 安装MS COCO API
- 下载MS COCO数据集
- MSCOCO数据集存放位置(大坑)
- 问题描述:
- 问题解决
- CornerNet模型训练
- GPU数量和显存限制代码修改
- 成功训练结果,没有训练完成,时间太久了呀
- Cornernet模型测试
- 生成可视化检测照片代码修改
- 输出结果
- 随便放几张效果不错的。
- 不好的结果
- 使用新的配置文件说明
CornerNet 官方github链接
CornerNet 论文地址
环境配置
写这篇博客原因?
为什么要写这样一篇博客?
一是记录自己的学习过程,二是因为CornerNet是基于pytorch 0.4.0写的,其中的某些C++和Cuda API在1.0之后已经变化,所以在编译corner pooling的时候会遇到问题,真让人头大,不过没关系,这篇博客将教你如何解决该问题。
下载下来官方github代码后,根目录下有这样一个文件:
里面含有跑通CornerNet所需要的的第三方库,但是你仔细看其中的关于cuda和pytorch的第三方库,你会发现,其安装的是基于cuda8.0和pytorch 0.4.0的第三方库,万一你不幸装的是cuda 9.0及以上,难道你为了跑通个CornerNet再去重装cuda吗?虽然这样也可以,但是就有点太麻烦了。
更改conda_packagelist.txt
不过,如果不想重装的话,接着往下看。
打开conda_packagelist.txt,删除如下四个第三方库链接,然后你可以自己去装最重要的pytroch和torchvision。
https://conda.anaconda.org/caffe2/linux-64/caffe2-cuda8.0-cudnn7-0.8.dev-py36_2018.05.14.tar.bz2
https://repo.continuum.io/pkgs/free/linux-64/cudatoolkit-8.0-3.tar.bz2
https://conda.anaconda.org/pytorch/linux-64/pytorch-0.4.0-py36_cuda8.0.61_cudnn7.1.2_1.tar.bz2
https://conda.anaconda.org/pytorch/linux-64/torchvision-0.2.1-py36_1.tar.bz2
conda下基于conda_packagelist.txt创建新环境
cd进入下载后的cornernet文件夹下:
打开terminal,执行:
conda create --name CornerNet --file conda_packagelist.txt
至此,cornernet所需要的大部分的第三库已经安装成功。
安装pytorch 1.2 和torchvision
这方面我们要参考pytorch官网:
不知道为什么,在我创建的虚拟环境cornernet中使用pip安装时,虽然是python3环境,但是需要将pip3改为pip,暂时不知道什么原因。
执行如下命令即可:
pip install torch==1.2.0+cu92 torchvision==0.4.0+cu92 -f https://download.pytorch.org/whl/torch_stable.html
这个装的话,比较快,毕竟是从pytorch官网直接获取安装包。
编译Corner Pooling-(用pytorch=1.x的这里是个大坑,请注意!)
这一步确实遇到了问题,毕竟官方代码是基于pytorch 0.4.0写的,我装的是pytorch 1.2.0,有问题也在意料之中。
按照原始代码直接编译,error
执行:
cd <CornerNet dir>/models/py_utils/_cpools/
python setup.py install --user
问题如下:
src/top_pool.cpp: In function ‘std::vectorat::Tensor top_pool_backward(at::Tensor, at::Tensor)’:
src/top_pool.cpp:44:41: error: could not convert ‘at::CUDA((c10::ScalarType)6)’ from ‘at::DeprecatedTypeProperties’ to ‘c10::IntArrayRef {aka c10::ArrayRef}’
auto max_val = at::zeros(torch::CUDA(at::kFloat), {batch, channel, width});
^
src/top_pool.cpp:45:41: error: could not convert ‘at::CUDA((c10::ScalarType)4)’ from ‘at::DeprecatedTypeProperties’ to ‘c10::IntArrayRef {aka c10::ArrayRef}’
auto max_ind = at::zeros(torch::CUDA(at::kLong), {batch, channel, width});
^
src/top_pool.cpp:57:44: error: could not convert ‘at::CUDA((c10::ScalarType)0)’ from ‘at::DeprecatedTypeProperties’ to ‘c10::IntArrayRef {aka c10::ArrayRef}’
auto gt_mask = at::zeros(torch::CUDA(at::kByte), {batch, channel, width
^
src/top_pool.cpp:58:44: error: could not convert ‘at::CUDA((c10::ScalarType)6)’ from ‘at::DeprecatedTypeProperties’ to ‘c10::IntArrayRef {aka c10::ArrayRef}’
auto max_temp = at::zeros(torch::CUDA(at::kFloat), {batch, channel, width
初次修改,测试阶段OK,训练阶段不OK
好像是cuda接口的问题,应该是由于pytorch版本的改变,导致了cuda接口的变化,但是怎么改呢?接着看。。
终于让我在github上官方代码的issues上找到了,
只需要在 **/models/py_utils/_cpools/src/**目录下,将src下bottom_pool.cpp、left_pool.cpp、top_pool.cpp以及right_pool.cpp四个文件中四行代码改变一下即可,四个文件的更改都是一样的。
即将
at::zeros(torch::CUDA(at::kFloat), {batch, channel, height})
改为:
at::zeros({batch, channel, height}, torch::CUDA(at::kFloat))
即可。
- 需要改动的有以下四处:
44、45行代码处:
auto max_val = at::zeros(torch::CUDA(at::kFloat), {batch, channel, height});auto max_ind = at::zeros(torch::CUDA(at::kLong), {batch, channel, height});
57、58行代码处:
auto gt_mask = at::zeros(torch::CUDA(at::kByte), {batch, channel, height});auto max_temp = at::zeros(torch::CUDA(at::kFloat), {batch, channel, height});
如此可以编译成功,但是前期因为显卡和数据集问题,我只是对官方训练了500000次的模型进行了测试,在此情况修改下的xxx_pool.cpp确实可以使用,但是进行从0开始训练MS COCO数据集的时候就出现了问题。
output = right_pool.backward(input, grad_output)[0]
RuntimeError: Expected object of type Variable but found type CUDAByteType for argument #0 ‘out’ (checked_cast_variable at /pytorch/torch/csrc/autograd/VariableTypeManual.cpp:48)
最终修改,训练和测试阶段均OK
所以还是编译corner pooling时由于pytorch版本不同导致出现了问题,我在查找了资料之后,发现了最终的解决方案。
其可以正常进行训练。
方案如下:
下载CornerNet-Lite CornerNet-Lite Github 链接 源代码,将其代码包中的CornerNet-Lite/core/models/py_utils/_cpools文件夹复制替换CornerNet源代码下的CornerNet/models/py_utils/_cpools/,然后运行命令进行重新编译:
python setup.py install --user
按照此方法编译后,至少在corner pooling这里的环境配置是没有问题的。
我在查找资料时,还遇到另外一种修改corner pooling下cpp文件代码的方法,不过经过我试用,这种修改至少对我的系统无效,依然会蹦出上述问题。
修改方法贴在了下面,读者看到的话也可以试试,看看行不行。
编译nms(非极大值抑制)
这个没什么可说的,只要装了cmake即可,我装的是3.4版本的好像,版本不要太低应该都没事。
cd <CornerNet dir>/external
make
安装MS COCO API
应该需要创建一个data文件夹:
cd <CornerNet dir>/data
git clone git@github.com:cocodataset/cocoapi.git coco
cd <CornerNet dir>/data/coco/PythonAPI
make
如果,第一次是第一次git,那么需要安装git:
sudo apt-get install git
以及设置github上的ssh,否则无法git,具体过程请参考我另一篇博文:
git安装和使用
下载MS COCO数据集
我之前下载过train2017、val2017、test2017,但是好像cornernet自己split了一个2014trainval的标签,因为还没看源代码,我先下载数据。
这个链接是google的,不翻墙有可能进不去,有需要的可以评论邮箱,我看到会发的。
annotations文件下载链接
MS COCO 数据集下载地址
下载红框标记的即可。
MSCOCO数据集存放位置(大坑)
我在看github英文说明的时候,其实官方对于数据集的使用说的模棱两可,我于是就按照字面的意思将下载的train2014直接重命名为trainval2014,val2014重命名为minival2014,test2017重命名为testdev2017,并放置在dir>/data/coco/images/下(如果没有,新建即可)。
问题描述:
结果出现了以下问题:
print("image.shape", image.shape[:]) AttributeError: 'NoneType' object has no attribute 'shape'
但从图中也可以看出,图片路径名是可以打印出来的,那么为什么还会出现NoneType这种错误呢?最可能的答案就是路径下的图片缺少了,即annotation里定义的标签图片在路径下有的找不到,所以才会出现这种问题。那么缺少了哪些问题呢?
问题解决
最终我发现,其实官方是将train2014和val2014合在一起作为trainval2014的,minival2014时从其中split的,具体怎么split我不知道,因为空间足够,所以我直接复制了一份,并重命名为了minival2014。
经过后续的训练测试,证明我这样做可以的,不会再出现这种NoneType的问题了。
但是实际训练的时候,还是会出现因为GPU数量太少和GPU显存太小的问题。不过我都一一解决了,解决方案在训练和测试章节。
CornerNet模型训练
To train and evaluate a network, you will need to create a configuration file, which defines the hyperparameters, and a model file, which defines the network architecture. The configuration file should be in JSON format and placed in config/. Each configuration file should have a corresponding model file in models/. i.e. If there is a .json in config/, there should be a .py in models/. There is only one exception which we will mention later.
- 训练CornerNet模型:
为了训练和评价一个网络,你需要创建一个定义了超参数和模型文件的配置文件,这将定义网络的基本架构。配置文件应该是json格式,并且被放在config/文件夹下。每个配置文件都应该有一个相对应的在models/文件夹下的模型文件。就是说,如果config/下有一个json文件,那么models/需要有一个.py文件
官方提供了配置文件CornerNet.json和模型文件CornerNet.py。
GPU数量和显存限制代码修改
如果你不考虑自己的GPU数量和GPU显存直接执行该命令的话,估计还是可能会抛出类似于corner pooling没有编译正确时的错误,即这种。
output = right_pool.backward(input, grad_output)[0]
RuntimeError: Expected object of type Variable but found type CUDAByteType for argument #0 ‘out’ (checked_cast_variable at /pytorch/torch/csrc/autograd/VariableTypeManual.cpp:48)
笔者本人的电脑是一个1060ti显卡 6G显存,所以很惭愧,算力太紧张。所以官方是用的10块GPU训练的,对于我来说显然不成立,直接执行命令确然会报错。
- 因此GPU数量和显存紧张的情况下请这样修改:
如果你只有一块GPU,请将batch_size改为1,如果你的显存大于12G请将chunk_sizes改为[4 ],如果跟我一样只是6G的,请改为[1],改为[2]我试过了,还是会out of memory。chunk_sizes代表向GPU分配多少张图片。
同时,train.py代码中的命令行参数thread,请由默认参数4改为1。这个我不知道具体是做什么用的目前,但是应该和GPU的数量有关。
改到这一步,还是不能直接运行命令,否则会如下错误:
dist = tag_mean.unsqueeze(1) - tag_mean.unsqueeze(2) IndexError: Dimension out of range (expected to be in range of [-2, 1], but got 2)
如果出现这种错误,按照图示进行修改:
在kp_utils.py中加入红框中的代码即可。
成功训练结果,没有训练完成,时间太久了呀
最后执行这个命令:
python train.py CornerNet
结果:
可以正常进行迭代,迭代输出的上下还是因为pytorch版本不同出现的一些警告,不过应该问题不大。
我大概迭代了10000次,5000次保存一次模型,结果因为空间不够,导致进程中断,不过整个流程没有什么问题。
保存的5000次和10000次迭代模型。
Cornernet模型测试
官方同样提供了一个训练了500k迭代次数的CornerNet模型,不过其用了10个Titan X GPUs,所以代码里有个地方默认的是10个GPU,如果你没有10个GPU,你需要把那个地方更改一下,不然有可能会报错,还有配置文件里的batchsize也需要更改以适应你的gpu显存。怎么修改在下面。
我们可以从如下链接(500k迭代次数模型下载链接,同样需要google。
)下载,并将其放在**/cache/nnet/CornerNet**文件夹下,
- 执行如下代码进行测试:
python test.py CornerNet --testiter 500000 --split <split>
split==testing表示测试testdev2017下的图片,在代码中有定义,有时间我会在github上更新一个annotation版本的CornerNet代码。
生成可视化检测照片代码修改
执行命令,CornerNet会自动生成results.json文件,其中存储了图像id和detection坐标点,但是如果想生成可视化后的object detection图片需要进行如下修改。
在CornerNet/test/coco.py代码中的kp_detection函数内第152行的
if debug
改为:
if True
再在191行下加入一行代码:
cv2.imwrite(debug_file, image)
然后在terminal下执行:
python test.py CornerNet --testiter 500000 --split <split>
输出结果
随便放几张效果不错的。
不好的结果
仔细观察CornerNet输出的可视化结果,我们可以发现CornerNet检测的两个主要问题:
- 对于密集型的object经常会出现对两个同样object之间的区域也列为object,可能不太好描述,看图就明白了。
直接将两个car之间的区域也检测为car;
直接将两个person之间的区域也检测为person。
又或者将tennis racket中的区域也检测为object;
- 对于一些密集型object检测不准确
比如下面的sheep,很多没检测都,而且直接将很大一块草地也检测为sheep了。
- 其他的检测不到和检测定位差距较大问题
下图两个孩子的检测框明显和实际差距过大。
bird没有检测到。
fire hvdrant 没有检测到。
总之虽然,效果不错,但是还是有很大问题。
正因为,其是通过角点来判断,所以对于密集型object出现这种将object之间的区域也检测为object也不足为奇。
使用新的配置文件说明
如果想使用新的配置文件,按照如下方案,我还没试过。
- 使用新的配置文件:
如果想测试不同的超参数,但是又不想重写原始的配置文件,可以创建一个带后缀的配置文件(model-suffix.json),但是不需要在models/下创建一个带后缀的model-suffix.py文件。
python test.py <model> --testiter <iter> --split <split> --suffix <suffix>
- 使用官方重写的多尺度配置文件:
python test.py CornerNet --testiter <iter> --split <split> --suffix multi_scale
有空会补上训练和测试结果。已补上训练成功截图和测试结果,因为算力原因,就先不从头开始训CornerNet了。
2019.10.9,2019.10.12更新。
希望能帮到大家。随手点赞是对我最大的认可。
装不了 pytorch=0.4.0? ubuntu下 基于 cuda=92 和 pytorch=1.2 配置环境跑通 CornerNet 训练和测试流程 步骤详解(包括GPU限制问题详解)相关推荐
- 0 基础在 Ubuntu 下安装 apache2 + mysql +php,建立 DVWA 靶场环境(基于 php 开发的网站)
up 该教程存在一定的缺陷,是 up 在安装过程中遇到的一些问题,由于没有使用 phpstudy,因此这个可能对于新手来讲不太友好 1. 首先我们进行的是 apache2 的安装 1. 首先我们应该安 ...
- Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建
Ubuntu下基于 Cilium CNI 的 Kubernetus集群环境搭建 1. 前言 2. 安装三个Ubuntu 2.1 三个机器都关闭防火墙 2.2 三个机器都关闭swap 2.3 三个机器都 ...
- Ubuntu下Zotero及Docear的安装、插件配置、联合使用
Ubuntu下Zotero及Docear的安装.插件配置.联合使用 最近在做课程的project,免不了要读大量的文献,但是之前一直没有养成良好的文献管理习惯,读完的论文过两天总是要忘记.趁着五一放假 ...
- KDJ指标详解包括什么kdj指标详解会发生钝化吗
股市中为了很好的追踪一些情况,大家通常会进行一定的指标分析,而KDJ指标详解曲线就是衡量股市变化的技术性指标,很多人可能只是听说过这种情况,具体怎么操作还不明白,下面我们就以QR社区的知识为大家简单介 ...
- ubuntu16.04下NVIDIA+CUDA+CUDNN+TensorFlow+Pytorch+Opencv等深度学习环境配置
1.Ubuntu16.04配置 1.1 更改Ubuntu源 所谓源,可以理解为Ubuntu从何处下载软件.默认的源是server for china,个人测试这是从美国的服务器下载软件进行安装的,为了 ...
- ubuntu下部署eclipse集成hadoop\android\web\GCC开发环境小记
Hadoop环境: 1.部署: 1)ubuntu上创建新用户账号:hadoop/123,并设置为管理员: 2)ubuntu上安装SSH:创建rsa无密码ssh-key: 3)ubun ...
- [zz]Ubuntu下使用Eclipse和PyDev搭建完美Python开发环境
在Windows下成功地搭好了一个Python开发环境,这次转战Ubuntu有了前面的经验,相对轻松多了 还发现Ubuntu下的操作反而比Windows方便些. 安装环境 Intel Core 725 ...
- pytorch神经网络训练及测试流程代码
神经网络的训练及测试其实是个相对固定的流程,下面进行详细说明,包括命令行设置基本参数.如数据集路径等其他参数的设置.学习率.损失函数.模型参数的保存与加载及最终train.py与test.py的mai ...
- linux(ubuntu)下基于java的在线音乐仿qq播放器,
linux下基于java的在线音乐仿qq播放器,界面挺漂亮,界面全都是本人自己用java来画的,主要是我自己喜欢用ubuntu,但是由于没有人去做它的播放器,就自己来了,可以在线,有专辑图片,播放列表 ...
最新文章
- 你这代码写得真丑,满屏的try-catch,全局异常处理不会吗?
- 我和美国 AI 博士聊了聊:2020 年,这件事比存钱更重要!
- 如何快速实现物联网行业中的实名认证
- 笔记-高项案例题-2017年下-整体管理-变更管理
- JSONUtils.toJSONString的一个坑
- eureka之InstanceInfo类
- 开发中 MySQL 规范
- Ubuntu16安装GTK+2.0教程
- [云计算] 001.云计算简介
- 提高生产力,这4款设计软件能自动生成代码
- 炫酷个人引导页主页自适应HTML源码
- Android应用优化之冷启动优化
- 一个人的时候,学会坦然。
- Office2016打开文件提示“文件已损坏”,WPS打开却正常的解决办法
- python 传奇服务端_Python官方最后通牒:Python 2传奇20年将落幕,Python 3接力!
- 2018宁夏网络赛 B Goldbach (米勒拉宾素数测试)
- svn服务端删除版本库_svn历史版本删除(为svn库瘦身)
- 智能网联汽车——智能化
- 软考高级 真题 2010年下半年 信息系统项目管理师 案例分析
- 计算机之父阿兰·图灵传奇的一生
热门文章
- 手机信号推流到rtmp服务器,大概是最简单的 rtmp 推流服务器搭建方法
- 全球软件案例研究峰会,今日13:30线上开幕,ShowMeBug B站联合直播,赶紧扫码关注占坑位吧
- HDMI音视频接口原理(VR设备接口)
- 点发送短信无反应是很多用户在搭建优雅草蜻蜓q系统中常见问题-解决点击发送短信无反应
- 预计华为Mate10比小米Mix2强大好几倍,一起来看看它“强大的”短信误删恢复功能吧
- 物联网智能家居DIY_Linux篇(1) 使用串口线传输文件
- php 车型分类筛选,车型分类_车型详解 - 买车攻略 - 淘车
- ps游戏在什么系统下开发_引擎级防沉迷! Unity携手腾讯游戏推出防沉迷系统开发工具...
- 十大最笨网络创业点子成就数位富翁
- ret/retf/iret