搭建目标检测模型之Domain Adaptive Faster R-CNN for Object Detection in the Wild

搭建环境

方法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。
解决办法:

报错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,拷贝一份即可;

克隆项目Detectron-DA-Faster-RCNN

实际没用该项目的脚本进行数据集的转换,参见下文。

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无法导入Cython的.pyx文件?

在报错的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失败

解决办法

参考cv2 import error

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

解决办法:

报错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。

通过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 下限制其功率的方法

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_mountainriver

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值