重点!
首先说一下具体的代码能运行成功所需要的条件:
cuda9.0
与cuda9.0相匹配的cudnn
pytorch0.4.0版本
然后就是自己遇到的一系列问题了:
Q1
首先我是想在自己原来的cuda10.0和cudnn下运行的,但是出现了很多问题,尤其是在编译DCNv2的时候,于是我参考了这篇博客,发现问题并没有解决,主要问题是想要和cuda10.0匹配,那么pytorch就不能是0.4.1版本的,就一定会高于这个版本,那么出现的ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.问题和TypeError: dist must be a Distribution instance问题就不可避免,想要解决就只能自己重写DCNv2的代码,所以我放弃了。
选择重新安装cuda9.0
前提:
自己的电脑是2080Ti的,已经有的环境是cuda10.0+与cuda10.0匹配的cudnn7.6.5。
由于代码在cuda10.0下会出现很多错误,所以我先把cuda10.0换成了cuda9.0。详细请参考另一篇博客:安装另一个版本cuda和cudnn
搭建环境
cuda和cudnn已经安装好了,开始利用Anaconda搭建一个新的环境,来运行CenterNet网络。
- 创建虚拟conda 环境
conda create --name CenterNet python=3.6
- 激活环境
conda activate CenterNet
以后运行CenterNet都要在这个环境中运行,关闭终端,再开启新的终端的时候,一定记得切换环境,否则肯定会有问题的。如果使用pycharm,也要记得加载新的环境。
pycharm加载新的环境方法:Files——settings——Project: CenterNet-master——Project Interpreter——点击Project Interpreter后面的设置符号,出现两个选项,选择Add那一项——选择conda Environment——Existing environment——选择自己刚才新建的环境CenterNet。 - 安装pytorch0.4.1版本:
pip install torch==0.4.1
- 安装 torchvision
pip install torchvision==0.2.2
一定一定!!!记住就是打开终端的时候记得切换环境!后面的很多操作,我没有强调切换环境,但是只要你是重新开启了新的终端就一定要切换环境!切换到CenterNet。
这样暂时算环境搭建完毕,现在想试试demo能不能跑起来。
测试demo
- 安装cocoapi
自己去下载一个cocoapi,github上有很多:参考
下载完,放在CenterNet目录下就可以了,然后进入到目录./cocoapi/PythonAPI 运行make
然后在运行:python setup.py install --user
- 安装需要用到的依赖库:
来到CenterNet的目录下,打开终端执行pip install -r requirements.txt
下载需要用到的依赖库。 - 编译 Compile deformable convolutional (from DCNv2).
进入到指定路径CenterNet_ROOT/src/lib/models/networks/DCNv2
下,运行make.sh
文件即可。 - 编译一下NMS,来到external文件下,打开终端,环境切换到CenterNet下,编译一下,
make
- 下载预训练的模型放置到models文件夹下,这里下载的是目标检测,选了一个最高分的。在这个网址中下载一个训练好的模型,我下载了第一个model。下载完了,放在models下。
- 然后开始可以测试demo,来到src文件下,打开终端,输入:
python demo.py ctdet --demo /home/dlut/网络/CenterNet-master/images/ --load_model /home/dlut/网络/CenterNet-master/models/ctdet_coco_dla_2x.pth
注意这个路径要改成自己的绝对路径。就可以看到测试的结果了。
我在运行的时候遇到了问题:RuntimeError: cuda runtime error (11) : invalid argument at /pytorch/aten/src/THC/THCGeneral.cpp:663
解决办法是:在demo.py中加了:
import torch
torch.backends.cudnn.enabled = False #加上这两句就可以跑通代码
准备自己的数据集
一般,我们自己的数据集都是VOC格式的,这个需要转换成coco格式的数据集,参考另一篇博客。
- 当我们生成三个json文件(train.json;val.json;test.json)之后,来到CenterNet-master这个工程里,在data文件夹下新建一个文件夹,名字就是你数据集的名字。
- 再在这个文件夹里面建两个文件夹(annotations里面存放的是我们之前生成的那三个json文件;images存放的是所有的图片,包括训练测试验证三个,所有的):
- 在src/lib/datasets/dataset里面新建一个
“insulatorBolt.py”
,文件内容照着文件夹下coco.py改成自己的。
(1)将COCO类改成自己的名字
class InsulatorBolt(data.Dataset):
(2)第14行num_classes=80
改成自己的类别数,我的是四类,所以改为了num_classes=4
(3)第15行default_resolution(这个参数有两种(300,300)或者(512,512),很明显512的参数计算量大,300计算量小,我用的是512),所以为:default_resolution = [512, 512]
(4)接下来的mean和std改成自己图片数据集的均值和方差,脚本链接: Python计算图片数据集的均值方差
通过计算,我的均值和方差改为了:
mean = np.array([1.816706, 1.856168, 1.751525],
dtype=np.float32).reshape(1, 1,