CornerNet的配置、训练与测试
一、前言
论文地址:https://arxiv.org/abs/1808.01244
开源代码:https://github.com/umich-vl/CornerNet
CornerNet论文阅读:https://blog.csdn.net/LLyj_/article/details/88900615
以下纯属个人按照README和Issues的实践记录,如有不当还请大家多多指教。
二、配置、训练、测试
-
首先创建一个 Anaconda的环境,在根目录下运行以下命令:
conda create --name CornerNet --file conda_packagelist.txt
在这个过程中,也许有些包比较大,会出现错误,那就把那个报错的单独拿出来安装,用清华源比较快。
-
上述全部安装完成之后,环境就建好了,接下来是激活环境,输入以下命令:
source activate CornerNet
激活成功后你会发现,在命令行的最前面多出了一个(CornerNet),这代表在虚拟环境中,也就是你第一步所创建的环境,如图所示:
-
接下来编译corner pooling layers,因为他是C++写的,输入以下命令:
# 进入相应的目录下 cd <CornetNet dir>/models/py_utils/_cpools/ # 运行以下命令 python setup.py install --user
没有报出error即成功,warning不管他。
-
接下来编译NMS,输入以下命令:
# 进入相应的目录下 cd <CornetNet dir>/external # 编译 make
-
接下来Installing MS COCO APIs,逐步运行以下命令:
# 先在根目录下创建data文件夹 mkdir data # 进入到data目录下 cd <CornetNet dir>/data # 下载,README里面的git那句没用,所以我去查阅了issue,作者有提供过一个新的,所以这里我们跟README不一样 git clone https://github.com/cocodataset/cocoapi.git coco # 进入相应目录 cd <CornetNet dir>/data/coco/PythonAPI # 编译 make
-
接下来最费时间:下载数据集,这里我是没下载,因为我一直在学习目标检测,所以coco数据集用了好几次,建议把这些常用的数据集(Pascal voc、coco等)放在硬盘里,以便跑其他算法时省去下载的时间,当然,也可以下载:
# 下载annotations,这里给出链接,进入链接直接下载 https://drive.google.com/file/d/1dop4188xo5lXDkGtOZUzy2SHOD_COXz4/view # 下载完annotations后,在<CornetNet dir>/data/coco下手动新建目录:annotations,然后把上步下载的annotations放进去 # 接着下载images,下载3个,分别是2014 Train, 2014 Val, 2017 Test,链接如下: http://cocodataset.org/#download # 接下来在<CornerNet dir>/data/coco/新建images目录,把下载的三个放进去,分别改名为trainval2014, minival2014 testdev2017
-
接下来开始训练,作者在论文中说到,训练用的是10个Titan X (PASCAL) 我没钱所以用是的GPU是一个Tesla K80,所以训练时稍微改了代码,具体如下:
# 首先是指定一个GPU,所以我直接在train.py中添加了一句,这一句的作用是指定GPU torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = True os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 加上这句 # 之后修改了CornerNet.json中的两个地方,具体如下: "batch_size": 3, # 原来是"batch_size": 49, "chunk_sizes": [3], # 原来是"chunk_sizes": [4,5,5,5,5,5,5,5,5,5],这是相对应的,因为是10个GPU,所以这里有10个数,且加起来等于batch_size=49
训练过程截图:
按照我的这个训练速度,大概30分钟能迭代340次,总共50万次。测试的话,训练结束后就自动测试,坐等ap就好了。
tips:这个50万次是原来默认的,但是一般在训练一个网络之前,我通常都会把迭代次数调小一点,比如调成200,这样的目的是为了看训练完一遍的结果,看他训练结束后会咋样,会不会报错啥的,然后有些可能还会测试,所以先看它完整的一遍流程,最后确保无误之后,把迭代次数调大,然后就可以高枕无忧了。
三、遇到的问题
说明:大家如果遇到了问题,可以GitHub上的Issues查找,我的所有问题都是Issues找到解决方案的。因为有时候百度查不到。