搭建环境
方法1:直接搭建环境
克隆项目Domain-Adaptive-Faster-RCNN-PyTorch
git clone https://github.com/krumo/Domain-Adaptive-Faster-RCNN-PyTorch.git
参考项目中的INSTALL.md搭建环境
新建虚拟环境
conda create -n da_fasterrcnn_krumo python=3.6
切换环境
conda activate da_fasterrcnn_krumo
切换到项目主路径
cd Domain-Adaptive-Faster-RCNN-PyTorch
装包
conda install ipython
pip install ninja yacs cython matplotlib opencv-python
查看gcc版本,使用gcc-7,可以参考ubuntu18.04 gcc-7安装与多版本切换
gcc -v
装pytorch,torchvision,cudatoolkit
PS:若需使用国内镜像源加速,则去掉-c pytorch
conda install pytorch==1.4.0 torchvision==0.5.0 cudatoolkit=10.1 -c pytorch
install pycocotools
cd Domain-Adaptive-Faster-RCNN-PyTorch
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
python setup.py build_ext install
验证当前环境
我第一次装的时候在下一步的编译mask-rcnn的环节编译没通过,报错及解决办法参见后文的报错1,在这里需要确认一下当前的环境。
- pytorch=1.4.0,torchvision=0.5.0,cudatoolkit=10.1,gcc=7.5
验证pytorch,torchvision,cudatoolkit版本
conda list
验证pytorch-gpu是否安装成功:
python
import torch
torch.cuda.is_available()
验证cuda的编译器nvcc版本
nvcc -V
验证gcc版本
gcc -v
install PyTorch Detection(编译mask-rcnn)
cd Domain-Adaptive-Faster-RCNN-PyTorch
git clone https://github.com/facebookresearch/maskrcnn-benchmark.git
cd maskrcnn-benchmark
python setup.py build develop
编译成功
报错及解决方法
报错1:
ninja:build stopped:subcommand failed
原因:pytorch版本问题,一开始按照github的说明,装的pytorch1.0-nightly-cuda10.2。
解决办法:
- 参考RuntimeError: Error compiling objects for extension #1236
配置环境改为pytorch=1.4,torchvision=0.5.0,cuda=10.1,gcc=7.5。- 由于本机之前装有多个cuda,为了确保编译成功,我利用docker拉了一个pytorch1.4-cudatoolkit10.1版本的镜像,在该容器中进一步进行项目环境的搭建,容器的搭建方法参见我的另一篇博客docker搭建pytorch环境。
报错2:
subprocess.CalledProcessError: Command ‘[‘which’, ‘g++’]’ returned non-zero exit status 1.
原因:没有装g++
解决办法:
sudo apt install build-essential
准备数据集
官方数据集
由于本模型为域适应检测网络,需要准备源域和目标域,分别是cityscapes和foggy_cityscapes。
下载Cityscapes dataset,可以参考Cityscapes使用方法,需要进入官网注册登录之后进行下载。
下载原图leftImg8bit_trainvaltest.zip和标签gtFine_trainvaltest.zip
下载完成后进行解压。
gtFine_trainvaltest目录结构
leftImg8bit_trainvaltest目录结构
下载foggy_cityscapes dataset
下载leftImg8bit_trainvaltest_foggy.zip
解压后,leftImg8bit_trainvaltest_foggy的目录结构
foggy_cityscapes的标签就用cityscapes的标签gtFine_trainvaltest.zip,拷贝一份即可;
实际没用该项目的脚本进行数据集的转换,参见下文。
git clone https://github.com/krumo/Detectron-DA-Faster-RCNN.git
切换到项目所在路径
cd /workspace/project/Detectron-DA-Faster-RCNN
准备环境
conda install h5py
pip install scipy
pip install future
git clone https://github.com/mcordts/cityscapesScripts.git
数据从VOC格式转成coco格式
- 利用Detectron-DA-Faster-RCNN项目转换数据集格式
使用项目中的脚本’tools/convert_cityscapes_to_coco.py’ 和’tools/convert_sim10k_to_coco.py’进行转换。
由于我使用的docker环境里没有编译器,只能使用命令行运行脚本。- PS:实际没有用到Detectron-DA-Faster-RCNN项目进行转换,因为Domain-Adaptive-Faster-RCNN-PyTorch项目的tools/cityscapes路径下,提供了针对cityscapes和foggy_cityscapes的转换coco的脚本。
对cityscapes进行转换
添加环境变量,可参考linux添加环境变量
添加文件
由于cityscapesscripts/evaluation文件夹下缺少instances2dict_with_polygons.py文件,可以从instances2dict_with_polygons.pyx下载地址单独下载该脚本,放到相应的位置。
PS:实际上Domain-Adaptive-Faster-RCNN-PyTorch项目中tools/cityscapes路径下也存在该脚本。
运行脚本
运行脚本的时候需要传3个参数:
- dataset设为默认值"cityscapes_instance_only";
- outputdir为cityscapes数据集解压的路径;
- outdir为转换后数据集的存放路径;
注意要根据需要,修改convert_cityscapes_to_coco.py文件,以生成train和val和test的json文件;
cd /workspace/project/Domain-Adaptive-Faster-RCNN-PyTorch
需要保证/workspace/dataset/cityscapes/coco_format路径存在,否则输出不成功
python tools/cityscapes/convert_cityscapes_to_coco.py --dataset="cityscapes_instance_only" --datadir=/workspace/dataset/cityscapes --outdir=/workspace/dataset/cityscapes/coco_format
报错及解决办法
报错1
ModuleNotFoundError: No module named ‘cityscapesscripts.evaluation.instances2dict_with_polygons’
解决办法:
- 先看PS;
- 下载https://github.com/mcordts/cityscapesScripts.git项目;
- 按照上面的操作在import前把包所在的路径添加到python的环境变量中,需要注意的是项目名称cityscapesScripts和我们需要import的包cityscapesscripts大小写不一样,参考linux添加环境变量;
- 由于项目相应的路径下只有instances2dict.py,没有instances2dict_with_polygons.py,参考基于 caffe2 及 detectron 的 segment for every thing 的训练,把instances2dict.py拷贝一份,重命名为instances2dict_with_polygons.py;
- PS:Domain-Adaptive-Faster-RCNN-PyTorch/tools/cityscapes路径下也有该文件。
报错2
ModuleNotFoundError: No module named ‘detectron.utils.cython_bbox’
原因:python不能直接调用.pyx文件,需要编译生成.c文件
解决办法
- 参考python文件中import pyx文件问题
编译不成功,报错
ImportError: cannot import name ‘deque’ from ‘collections’
不知道怎么解决,换方法;
在报错的boxes.py文件中,在报错的import前,加入下面两行
import pyximport
pyximport.install()
继续报错
fatal error: numpy/arrayobject.h: No such file or directory
#include “numpy/arrayobject.h”
参考fatal error: numpy/arrayobject.h No such file or directory解决方法
apt-get install python-numpy
生成json文件
同样对foggy_cityscapes进行转换
cd /workspace/project/Domain-Adaptive-Faster-RCNN-PyTorch
生成train和val和test的json文件;
需要保证/workspace/dataset/cityscapes/coco_format路径存在,否则输出不成功;
python tools/cityscapes/convert_foggy_cityscapes_to_coco.py --dataset="foggy_cityscapes" --datadir=/workspace/dataset/foggy_cityscapes --outdir=/workspace/dataset/foggy_cityscapes/coco_format
至此,得到的cityscapes和foggy_cityscapes的目录结构如下
参考下文的报错4,把cityscapes和foggy_cityscapes的原图和json标签拷贝到项目下,并修改项目中的数据读取路径,目录结构如下
也可以参考github使用软链接
训练模型
切换到项目所在路径
cd /workspace/project/Domain-Adaptive-Faster-RCNN-PyTorch
命令行进行训练
python tools/train_net.py --config-file "configs/da_faster_rcnn/e2e_da_faster_rcnn_R_50_C4_cityscapes_to_foggy_cityscapes.yaml"
显存占用情况
没有修改batch size等其他参数,直接跑的官方给出的数据和模型,占用显存6G左右。
训练时间
- 默认迭代步数MAX_ITER为70000,可在configs/da_faster_rcnn/e2e_da_faster_rcnn_R_50_C4_cityscapes_to_foggy_cityscapes.yaml文件下进行查看;
- 由于设置了功率上限(见下文报错8),训练速度降低,在2070下,初步估计训练花费时间为24h;
报错及解决方法
报错1
ImportError: cannot import name ‘_C’ from ‘maskrcnn_benchmark’
解决办法:
参考【论文阅读笔记】MASK R-CNN代码和论文结合阅读
修改头文件
把Domain-Adaptive-Faster-RCNN-PyTorch/maskrcnn_benchmark/layers目录下包含from maskrcnn_benchmark import _C的如下的4个脚本处都改为from ._utils import _C
报错2
from .cv2 import *
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
原因是docker里的cv2装的有问题,import cv2失败
解决办法
apt install libgl1-mesa-glx
报错3
FileNotFoundError: [Errno 2] No such file or directory: ‘datasets/cityscapes/annotations/instancesonly_filtered_gtFine_train.json’
解决办法:
按照上面的流程将数据集转换为coco格式,并放到相应的位置。
报错4
FileNotFoundError: [Errno 2] No such file or directory: ‘datasets/cityscapes/images/zurich_000011_000019_leftImg8bit.png’
解决办法:
报错原因是没找到标签对应的原图,从报错中的路径可以看出,图像是在images文件夹下,和我的原图路径不符合,需要把图像存放路径修改以下,并把图像放到相应位置。
修改代码中数据的存放路径maskrcnn_benchmark/config/paths_catalog.py
使用脚本把原图放到项目的相应位置中。
'''
20210927
origin cityscapes and foggy cityscapes datasets has train val and test,in each folder ,data is organized by city,such as the path below:
/home/ecust/txx/docker/container/pytorch1.4/dataset/cityscapes/leftImg8bit_trainvaltest/leftImg8bit/train/aachen/aachen_000000_000019_leftImg8bit.png
we need to use this python script to make images directly under train/val/test folder and copy origin images to the fodler of detection project folder.
'''
import glob
import os
import sys
from shutil import copy
if __name__=='__main__':
current_path=os.getcwd()
print("current_path=",current_path)
source_folder="/workspace/dataset"
target_folder="datasets"
img_path_all=glob.iglob(os.path.join(source_folder,'*/*/*/*/*/*.png'))
for img_path in img_path_all:
# print(img_path)
dataset_name=img_path.split('/')[-6]
img_or_anno=img_path.split('/')[-5]
dataset_split=img_path.split('/')[-3]
image_name=img_path.split('/')[-1]
if img_or_anno in ["leftImg8bit_trainvaltest","leftImg8bit_trainvaltest_foggy"]:
print('-'*50)
# print(dataset_name)
# print(img_or_anno)
# print(dataset_split)
# print(image_name)
print(img_path)
target_path=os.path.join(target_folder,dataset_name)
target_path=os.path.join(target_path,dataset_split)
if os.path.exists(target_path)==False:
os.makedirs(target_path)
target_path=os.path.join(target_path,image_name)
print(target_path)
copy(img_path,target_path)
最终项目中的数据文件夹结构如下
报错5:
AttributeError: ‘list’ object has no attribute ‘resize’
解决办法:
参考mask-rcnn benchmark 错误:‘List’ object has no attribute ‘resize’ 的解决方法
修改maskrcnn_benchmark/data/datasets/coco.py
三处self.transforms修改为self._transforms
报错6
RuntimeError: DataLoader worker (pid 962) is killed by signal: Bus error. It is possible that dataloader’s workers are out of shared memory. Please try to raise your shared memory limit.
原因分析:
参考链接,报错提示共享内存不足,因为我的数据和项目存放在docker容器下,查看docker的共享内存,发现默认的shm只有64M,因此需要修改容器的共享内存大小。
在docker容器内查看共享内存大小
df -h
解决办法:
修改容器的共享内存大小
查看容器信息
容器id为06b7be1cc029
docker ps -a
查找要修改容器的完整id
docker inspect 06b7be1cc029 |grep Id
进入/var/lib/docker/containers 目录下找到与 Id 相同的目录
这里可能会碰到权限不够无法cd的情况,需要切换到root权限进行操作
sudo su
cd /var/lib/docker/containers
cd 06b7be1cc029066af08e1dc6bc4a16e52a57cbc6a1065fd3c16a7ea4bd6ff943/
pytorch1.4为docker name,可通过docker ps -a查看
docker update pytorch1.4 --restart=always
停止docker
service docker stop
修改 hostconfig.json文件
“ShmSize”:67108864,根据需要改为30g(30* 1024* 1024* 1024),也就是32212254720,保存后退出。
gedit hostconfig.json
启动docker
systemctl start docker
再次进入容器可以发现共享内存shm已经变成30G了
报错7
selected_polygons.append(self.polygons[i])
IndexError: list index out of range
解决办法:
- 参考maskrcnn训练问题报错:selected_polygons.append(self.polygons[i]) IndexError: list index out of range
- 修改以下两个文件,将文件中的torch.uint8改为torch.bool即可
maskrcnn_benchmark/structures/segmentation_mask.py
maskrcnn_benchmark/modeling/balanced_positive_negative_sampler.py
报错8
刚开始训练电脑就重启
解决办法
- 方法一
减小batch size(不知道有没有作用)
修改Domain-Adaptive-Faster-RCNN-PyTorch/configs/da_faster_rcnn/e2e_da_faster_rcnn_R_50_C4_cityscapes_to_foggy_cityscapes.yaml里的超参数,把33行的IMS_PER_BATCH值由2改为1。
- 方法二
控制gpu的最大功耗,参考电脑跑神经网络容易自动重启
通过nvidia-smi命令可以查看当前电源的最大功率是215W,经测试,本机通过下面的命令改为了125W。
sudo nvidia-smi -pl 125
修改过后,结果如下图所示。
测试模型
切换路径
cd /workspace/project/Domain-Adaptive-Faster-RCNN-PyTorch
修改tools/test_net.py脚本
- 修改权重读取的路径,把脚本中69行附近的load模型的地址按照自己设置的路径进行修改;
- PS:如果没修改过训练的权重保存路径的话,默认路径在项目主目录下,如果想修改训练时的输出路径,可修改maskrcnn_benchmark/config/defaults.py脚本中的398行的_C.OUTPUT_DIR
# _ = checkpointer.load(cfg.MODEL.WEIGHT)
test_weight_path="output/train/tmp/model_0000000.pth"
_ = checkpointer.load(test_weight_path)
运行tools/test_net.py脚本
读取前面训练过程中生成的.pth权重文件,得到训练结果之后查看AP50的值。
python tools/test_net.py
训练结果(有问题)
使用默认的超参数,在cityscapes和foggy_cityscapes数据集上进行训练,得到的AP50指标只有0.12不到,相比github给出的0.41差距很大,暂时不清楚哪里有问题。
[1]:Mask R-CNN pytorch实现代码测试和解读
[2]:RuntimeError: Error compiling objects for extension #1236
[3]:报错subprocess.CalledProcessError: Command ‘[‘which‘, ‘g++‘]‘ returned non-zero exit status 1.
[4]:docker搭建pytorch环境
[5]:Domain-Adaptive-Faster-RCNN-PyTorch
[6]:图像语意分割Cityscapes训练数据集使用方法详解
[7]:cityscapes数据集转COCO格式
[8]:基于 caffe2 及 detectron 的 segment for every thing 的训练
[9]:linux添加环境变量
[10]:fatal error: numpy/arrayobject.h No such file or directory解决方法
[11]:Dataset之Cityscapes:Cityscapes数据集的简介、安装、使用方法之详细攻略
[12]:【论文阅读笔记】MASK R-CNN代码和论文结合阅读
[13]:cv2 import error
[14]:instances2dict_with_polygons.pyx下载地址
[15]:Foggy Cityscapes
[16]:Domain-Adaptive Object Detection via Uncertainty-Aware Distribution Alignment
[17]:cityscapes官网下载地址
[18]:mask-rcnn benchmark 错误:‘List’ object has no attribute ‘resize’ 的解决方法
[19]:RuntimeError: DataLoader worker (pid XXX) is killed by signal: Bus error (给运行中的容器修改共享内存)
[20]:docker容器添加对外映射端口
[21]:maskrcnn训练问题报错:selected_polygons.append(self.polygons[i]) IndexError: list index out of range
[22]:电脑跑神经网络容易自动重启
[23]:NVIDIA 显卡在 Ubuntu 下限制其功率的方法