一、环境要求
- 首先确保宿主机上已经安装了nvidia,可以用nvidia-smi 查看,如果没有的话可以用下面的方法去安装(Ubuntu系统安装方法)
安装nvidia
# 检查适合系统的NAVIDIA版本
nvidia-detector
# 安装nvidia的命令
apt-get install nvidia-driver-440
安装完成后需要重启启动系统才能生效
卸载nvidia
sudo apt-get --purge remove nvidia*
sudo apt-get --purge remove "*nvidia*"
sudo apt-get --purge remove "*cublas*" "cuda*"
sudo apt autoremove
- 请通过 docker -v 检查 Docker 版本。对于 19.03 之前的版本,需要使用 nvidia-docker2 和 --runtime=nvidia 标记;对于 19.03 及之后的版本,将需要使用 nvidia-container-toolkit 软件包和 --gpus all 标记。这两个选项都记录在上面链接的网页上。我这里是20.04版本的docker,所以使用第二种安装方式:
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
二、拉取镜像
这里拉取镜像需要注意对应的cuda版本已经torch版本
从这里选取要安装的pytorch镜像
找到了对应的版本,复制后面拉取docker镜像的命令即可
docker pull pytorch/pytorch:1.10.0-cuda11.3-cudnn8-devel
三、创建容器安装detectron2
docker run -itd --init --gpus all --ipc=host --name sparseinst -p 35:22 --privileged=true pytorch/pytorch:1.10.0-cuda11.3-cudnn8-devel
# 进入容器
docker exec [容器名] it bash
apt-get update
apt-get install vim
apt-get install openssh-server
# 修改ssh连接配置,把PermitRootLogin prohibit-passwd改为PermitRootLogin yes
vim /etc/ssh/sshd_config
passwd root # 修改容器密码
service ssh start # 开启ssh服务
注意:如果pycharm中ssh可以连接,但是sftp无法连接的话,尝试如下操作
vim /etc/ssh/sshd_config
找到如下语句注释掉,然后添加如下语句
#Subsystem sftp /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
# 重启ssh 服务
service ssh restart
从上面pytorch的安装可以看出,我们选择的cuda版本是11.3的,torch版本是1.10的,那么我们接下来选择detectron2的时候也要选择对应的版本,由于SparseInst是基于detectron2的,所以需要安detectron2 detectron2安装地址 从里面选择要安装的版本,我选择了如下版本
# 这个是在容器中拉取的命令,如果项目报某个模块找不到直接pip安装就好了
python -m pip install detectron2 -f \
https://dl.fbaipublicfiles.com/detectron2/wheels/cu113/torch1.10/index.html
四、pycharm连接上传项目
pycharm连接docker容器之后,将项目上传到容器中,然后进入项目所在位置,想要将项目所给的实例运行起来需要再做一些准备,我们需要将训练好的权重模型下载下来,放到sparseinst项目中:
python train_net.py --config-file configs/sparse_inst_r50_giam.yaml --num-gpus 8 --eval MODEL.WEIGHTS sparse_inst_r50_giam_aug_2b7d68.pth
我们还需要coco数据集,这个可以从detectron2中下载,这个给出了每种数据集的获得方式,我们这里需要的是instances_{train,val}2017.json
将detectron2项目下载下来,然后在sparseinst项目中创建datasets文件夹,在detectron2的datasets中找到prepare_for_tests.sh,把它复制到sparseinst项目中的datasets中,然后赋予prepare_for_tests.sh权限chmod +x prepare_for_tests.sh
,执行./prepare_for_tests.sh
,执行完之后sparseinst中的datasets中就会显示coco/annotations/instances_{train,val}2017_100.json
,mv instances_{train,val}2017_100.json instances_{train,val}2017_100.json
然后运行
python train_net.py --config-file configs/sparse_inst_r50_giam.yaml --num-gpus 1 --eval MODEL.WEIGHTS sparse_inst_r50_giam_aug_2b7d68.pth
运行结果如下:
当然你也可以下载coco数据集去自己训练 coco数据集下载地址
需要将images和annotations全部下载下来,然后上传到sparseinst项目中的datasets中,进行解压,如果上面的下载地址不能下载可以从这里下载试试coco数据集下载地址,然后运行:
python train_net.py --config-file configs/sparse_inst_r50vd_dcn_giam_aug.yaml --num-gpus 1
放置数据集的结构如下
因为论文中用到的GPU数量是8,我们这里没有那么多GPU,所以需要修改batch-size的大小,不然会报错,修改IMS_PER_BATCH位置,我这里修改成8就可以运行了,当然如果你的GPU性能更高那么你也可以改的大一些,这样训练的时间也会缩短
训练结果如下,这是训练了两天的结果,训练了125000张图片
还在继续训练中。。。太慢了
五、如何使用自己的数据
1.修改train_net.py,注册自己的数据集
from detectron2.data.datasets import register_coco_instances
register_coco_instances("coco_my_train", {},
"datasets/crack/annotations/instances_train2017.json",
"datasets/crack/train2017/")
register_coco_instances("coco_my_val", {},
"datasets/crack/annotations/instances_val2017.json",
"datasets/crack/val2017/")
register_coco_instances("coco_my_test", {},
"datasets/crack/annotations/instances_test2017.json",
"datasets/crack/test2017/")
CLASS_NAMES = ["fissure", "water"]
2. 修改config.py
修改如下位置参数,你的数据集中的CLASS_NAMES 是多少这里就改成多少
3. 修改Base-SparseInst.yaml
把其中的DATASETS改成自己的数据集名称
这里有什么问题我们可以一起探讨,我也是有很多不懂的地方。