拜读了Objects as Points这篇论文,也想应用在自己的项目中。
论文地址:https://arxiv.org/abs/1904.07850
官方代码:https://github.com/xingyizhou/CenterNet
因为文章发表于2019年,当时原作者使用的PyTorch版本还是0.4.1,也就导致了现在用上了PyTorch1.x版本的朋友再编译和使用的时候有会踩到一些坑。主要问题出在src/lib/models/networks/DCNv2中文件的编译问题上。
还好github都能找到能兼容PyTorch1.x版本的DCNv2,当然安装步骤也会需要有些许变化。本文整理一下踩到的坑和解决办法,最终成功地在PyTorch1.8跑通了CenterNet
Anaconda创建一个虚拟环境,并activate进入到该环境中。
官方的安装参考:https://github.com/xingyizhou/CenterNet/blob/master/readme/INSTALL.md
首先Clone一下CenterNet的官方代码到本地。
CenterNet_ROOT=/path/to/clone/CenterNet
git clone https://github.com/xingyizhou/CenterNet $CenterNet_ROOT
先安装一下requirements
pip install -r requirements.txt
然后下面的步骤就要再官方的基础上做修改了,因为按照官方的对DCNv2进行修改,那就要遇上第一个报错:
ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.
报错原因就是PyTorch目前已经没有torch.utils.ffi函数了。
网上的方法很多是退回将PyTorch退回0.4.1,然后进行编译。然而,1.x的版本在将很多好用的模块直接引入torch或torchvision中,后续使用如果需要对网路进行一定的优化和修改,保留1.x版本还是更方便。
直接在仓库的issue中搜索,能找到这个解决方案:https://github.com/xingyizhou/CenterNet/issues/7
这个方案的环境是PyTorch1.1+CUDA10.1+Win10.
方案中首先编译了nms
cd CenterNet\src\lib\external
#python setup.py install
python setup.py build_ext --inplace
这一步在我这里成功完成。
遇到的deprecated问题,回答中是建议将原repo中的DCNv2替换成https://github.com/CharlesShang/DCNv2
cd CenterNet\src\lib\models\networks
rm -rf DCNv2
git clone https://github.com/CharlesShang/DCNv2
cd DCNv2
./make.sh
这时候出现了新的报错:
RuntimeError: Error compiling objects for extension
在CharlesShang的repo里搜issue,里面提到PyTorch1.1应该是可以正常编译的,但高于1.1版本就会遇到这个错误。同事,里面指路用一个更新版本的DCNv2,https://github.com/jinfagang/DCNv2_latest
cd CenterNet/src/lib/models/networks
rm -rf DCNv2
git clone https://github.com/jinfagang/DCNv2_latest
cd DCNv2_latest DCNv2
./make.sh
前一个错误消失了。报了新的错误,更奇怪了
ImportError: No module named torch
这就非常奇怪了,coda list环境里一切都是正常的,进入python再import torch也没有任何问题。
检查了一下make.sh
#!/usr/bin/env bash
sudo rm *.so
sudo rm -r build/
sudo python3 setup.py build develop
看完这个我明白了,sudo的使用使得编译使使用的不是Anaconda虚拟环境中的python,而是用了系统的python
#!/usr/bin/env bash
sudo rm *.so
sudo rm -r build/
python3 setup.py build develop
重新运行./make.sh,这次编译成功了。
运行一下
cd CenterNet/src/lib/models/networks/DCNv2
python testcpu.py
python testcuda.py
如果有正常的输出,那说明已经安装成功了,现在可以用CenterNet了。