原文地址: https://arxiv.org/abs/1603.06208
翻译链接:http://tongtianta.site/paper/838
Project地址:https://kanezaki.github.io/rotationnet/
Caffe代码地址:https://github.com/kanezaki/rotationnet (本文主要介绍)
Pytorch代码地址:https://github.com/kanezaki/pytorch-rotationnet
1. 文章简介
这篇文章还挺有意思的,主要做的是3D视角选择方面的工作,可以完成类内和类间的模型对齐。通过网络可以学习一个关于视角的隐变量vi,并且像物体检测一样,在类别后加入了一个背景类。最后做测试的时候,可以不需要像训练集一样,视角一定是顺序的,可以任意变换角度,都可以识别出对应的类别和角度。
在ModelNet 40和ModelNet 10上这个网络都达到了很高的精度,目前就是在这个数据集上的SOTA。
如果对视角相关的工作感兴趣的话,这篇文章是非常推荐认真读的文章。
最主要作者是个美腻的小姐姐,感兴趣的话可以去她的个人主页上瞧一瞧,Github上也有她的头像,有问题还可以邮件跟她亲密交流,真的是科研动力十足。话不多说,开始撸代码吧。
https://kanezaki.github.io/index_jp.html
2. 代码调试
作者Github上的代码操作步骤非常详细,但是过程中有很多坑,亲自踩过才知道这些细节的重要性。下面给出我调试过程中遇到的问题,按照下面的方法进行调试,应该不会出问题。
作者还提供了一个torch版本的,但是作者自己在issue里也提出了,目前他们调试的结果没有复现caffe版本的性能,我们也在同步调试这个代码。在本文里介绍的还是caffe版本
系统是Ubuntu 18.04, GPU: 1080 Ti,CUDA:10.0
1.1 编译caffe-rotation v2
(1)编译caffe过程中就全是坑,比如opencv的环境,比如Makefile.config的各种配置
在10.64.156.11上配置没有成功,主要原因是opencv版本的问题,那台开发机上装了很多opencv的版本,因此有点混乱,最后编译caffe的时候显示是opencv 4.0.0
后面在10.64.156.12开发机上完成了配置,主要参考链接
https://www.cnblogs.com/go-better/p/7161006.html
(2)编译完成之后,还需要修改~/.bashrc,将caffe的文件夹加入系统路径,然后进入python,看少什么库就加什么库,例如scikit-image, Pillow等
(3)当import caffe没有问题的时候,代表caffe编译完成
2.1 运行demo.sh
下载所需要的预训练权重,bash demo.sh运行demo
(1)这个过程中,也有一些地方需要注意,比如要修改路径,与caffe-rotationv2路径一致;还有对权重存放的文件夹的路径也要注意,修改在demo.sh里修改对应的变量即可
(2)然后运行程序,发现有个在transform(in_,mean)总是报错,通过断点调试,发现是因为程序中给出的默认图片的大小与实际input的大小不一样,将程序中默认的图片大小改成227即可运行程序,运行完了之后的结果如下。
Case 1: predictions的输出维度为41(40类+1个背景类)*12(12个视角) = 492
Case 2: predictions的输出维度为41*20 = 820,参数意义与Case 1相同。
2.2 运行demo2.sh
demo2.sh是一个关于视角的Demo。不仅可以预测出对应的类别,还可以对齐角度。
问题总结:
(1)bash demo2.sh时会报错,表示没有找到reference_poses_car.txt,后来去对应的文件夹中找也没有找到,后来发现在make_reference_poses.sh里有生成每个类别对应的这个文件,于是就想运行这个.sh文件。
将数据集下载放入对应的文件夹后,bash make_reference_poses.sh就可以生成每个类别对应的txt和npy文件。
(2)然后再运行demo2.sh的时候,在有些类别可以直接运行,有些类别在读图的时候,还是会报错,错误为EOF Error,是关于PIL模块的错误,报错的语句为caffe.io.load_image(im_f),后来去网上查了一下,save_scores.py的文件开始时加入了以下的语句就可以了。
from skimage import io
io.use_plugin(‘matplotlib’)
参考链接:https://blog.csdn.net/limumumu888/article/details/50883886
demo2.sh运行结果:
Case 1:
左边为训练,右边为测试之后的结果
Case 2:
3.1 测试集分类结果 – Case 1 (Subset)
修改一下模型的路径直接就可以bash test_modelnet40.sh进行测试,将所有类别的正确率取平均值,在Case 1下,平均分类正确率为90%。
3.2 测试集分类结果 – Case 2 (Subset)
平均分类正确率:92.125%。
3.3 测试集分类结果 – ModelNet 10 (Full)
平均分类正确率:98.458% (文中表5的结果)
3.4 测试集分类结果 – ModelNet 40 (Full)
平均分类正确率:97.366%
4. 训练网络
主要是有部分权重没有下载好,需要自己下个权重,然后要整理下文件夹的树形关系。
(1)RCNN权重
作者Github上的地址下载不正确,后来找了rbg自己的Github提供的权重
https://github.com/rbgirshick/rcnn/blob/master/data/fetch_models.sh
(2)ILSVRC 12的权重
cd到如下目录 caffe-rotationnet2/data/ilsvrc12
在该目录下 bash get_ilsvrc_aux.sh
然后就可以开始训练了,训练的过程中,还有个小问题是编译好的Caffe需要放在程序的文件夹内,并且需要把caffe-rotationnet2重命名为caffe-rotationnet,到此基本就可以完成训练了。
文件夹的结构如下:
训练过程如下:
程序中,每隔1000 Iteration,存一个caffemodel,并且输出分类正确率。