搭建目标检测模型之Harmonizing Transferability and Discriminability for Adapting Object Detectors

  • 搭建环境
  • 准备数据集
    • 下载数据集
      • 数据集1:PASCAL_VOC 07+12 and Clipart
      • 数据集2:cityscapes and foggy_cityscapes
    • 修改数据集配置信息
  • 预训练模型
  • 训练模型
    • 训练数据集1:PASCAL VOC + clipart (no interpolation)
    • 训练数据集2:cityscapes + foggy_cityscapes (no interpolation)
    • 报错及解决办法
      • 报错1:ModuleNotFoundError: No module named 'model.utils.cython_bbox'
      • 报错2:NameError: name 'numpy_include' is not defined
      • 报错3:AttributeError: 'Namespace' object has no attribute 'set_cfgs'
      • 报错4:RuntimeError: set_sizes_contiguous is not allowed on a Tensor created from .data or .detach().
      • 报错5:RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method.
      • 报错6:编译报错,RuntimeError: The detected CUDA version (9.0) mismatches the version that was used to compile PyTorch (10.2). Please make sure to use the same CUDA versions
      • 报错7:编译报错,/usr/include/c++/6/tuple:502:1: error: body of constexpr function
      • 报错8:编译报错,/usr/include/c++/6/tuple:483:67: error: mismatched argument pack lengths while expanding
      • 报错9:AttributeError: module 'torch.jit' has no attribute 'unused'
  • 测试模型
    • 测试数据集1:PASCAL VOC + clipart (no interpolation)
    • 测试数据集2:cityscapes + foggy cityscapes (no interpolation)
    • 报错及解决办法
      • 报错1:TypeError: __ init__() got an unexpected keyword argument 'path_return'
  • 训练结果

搭建环境

克隆项目HTCN

git clone git://github.com/xiangxiangtao/HTCN.git

主要环境

  • python=3.6.9
  • pytorch=1.0.1
  • cuda=10.0

其他环境参考fasterrcnn所需环境

编译

cd lib
python setup.py build develop

准备数据集

下载数据集

数据集1:PASCAL_VOC 07+12 and Clipart

准备PASCAL_VOC 07+12

参考Pascal VOC数据集使用方法

准备Clipart

参考cross-domain-detection

数据集2:cityscapes and foggy_cityscapes

下载cityscapes和foggy_cityscapes

参考cityscapes和foggy_cityscapes数据集使用记录,下载数据集,并将两个数据集转成voc格式。

修改数据集配置信息

以PASCAL_VOC 07+12 and Clipart为例

添加lib/datasets/

将数据集对应的脚本添加到lib/datasets/中

  • 对voc数据集,lib/datasets/中已经有了对应的脚本pascal_voc.py,不需要再添加;
  • 对clipart数据集,lib/datasets/中已经有了对应的脚本clipart.py,不需要再添加,不过需要根据实际需要修改clipart.py脚本中的路径,否则代码中的默认路径和clipart默认的路径组织方式不一样;
    在这里插入图片描述

修改lib/datasets/config_dataset.py

  • 修改__D.PASCAL和__D.CLIPART为实际的数据集所在路径;

修改lib/model/utils/parser_func.py

  • 对voc和clipart两个数据集,–dataset的值改为’voc_0712’,–dataset_t的值改为’clipart’,由于该脚本中set_dataset_args函数里已经有了对应的分支,不需要再进行修改;

修改lib/datasets/factory.py

根据前面的parser_func.py脚本中的args.imdb_name内容进行修改

  • args.dataset为"voc_0712"时,使用默认的代码即可;
  • args.dataset_t为"clipart"时,使用默认的代码即可;

预训练模型

下载预训练模型

点击HTCN中的链接,下载VGG16和ResNet101的预训练模型;
将预训练模型放到指定路径下,指定路径可以在lib/model/utils/config.py中进行修改;
搭建目标检测模型之Harmonizing Transferability and Discriminability for Adapting Object Detectors_第1张图片

训练模型

net可以选择vgg16/resnet101

python trainval_net_HTCN.py --dataset source_dataset --dataset_t target_dataset --net vgg16

训练数据集1:PASCAL VOC + clipart (no interpolation)

源数据集为pascal voc07+12,目标数据集为clipart,不采用论文的插值方法(cyclegan迁移);
使用论文中的res101预训练权重;

在这里插入图片描述

python trainval_net_HTCN.py --dataset 'voc_0712' --dataset_t 'clipart' --net res101

训练数据集2:cityscapes + foggy_cityscapes (no interpolation)

源数据集为cityscapes,目标数据集为foggy_cityscapes,不采用论文的插值方法(cyclegan迁移);
使用论文中的vgg16预训练权重;

python trainval_net_HTCN.py --dataset 'cs' --dataset_t 'cs_fg' --net vgg16

在这里插入图片描述

报错及解决办法

报错1:ModuleNotFoundError: No module named ‘model.utils.cython_bbox’

解决办法:

参考No module named ‘model.utils.cython_bbox’ #7

打开setup.py

gedit lib/setup.py

将里面的

    ext_modules = [
        extension(
            "model._C",
            sources,
            include_dirs=include_dirs,
            define_macros=define_macros,
            extra_compile_args=extra_compile_args,
        )
    ]

替换成

ext_modules = [ extension( "model._C", sources, include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, ), extension( "model.utils.cython_bbox", ["model/utils/bbox.pyx"], extra_compile_args={'cxx':[],'gcc': ["-Wno-cpp", "-Wno-unused-function"]}, include_dirs=[numpy_include] ) ]

报错2:NameError: name ‘numpy_include’ is not defined

解决办法

打开setup.py

gedit lib/setup.py

在刚才的ext_modules前面添加下面几行内容

    import numpy as np
    try: 
        numpy_include = np.get_include() 
    except AttributeError: 
        numpy_include = np.get_numpy_include()

报错3:AttributeError: ‘Namespace’ object has no attribute ‘set_cfgs’

解决办法:

数据集没配置好,参考前面的内容进行配置;

报错4:RuntimeError: set_sizes_contiguous is not allowed on a Tensor created from .data or .detach().

在这里插入图片描述

解决办法:

pytorch版本问题,参考报错提示进行修改,去掉data。

报错5:RuntimeError: Legacy autograd function with non-static forward method is deprecated. Please use new-style autograd function with static forward method.

原因:

网上说时由于pytorch版本大于1.3所以报错,但是我的pytorch版本时1.0.1,分析是由于我当前使用的系统cuda版本是10.2,目前不支持1.2及其以下的GPU版的pytorch,因此改为使用cuda9;

解决办法:

  • 切换系统默认的cuda
    因为本机装了10.2和9.0两个版本,在/usr/local中把cuda的软链接改为cuda-9.0,然后重新编译项目;

报错6:编译报错,RuntimeError: The detected CUDA version (9.0) mismatches the version that was used to compile PyTorch (10.2). Please make sure to use the same CUDA versions

原因:

检查了一下,发现CUDA_HOME这个环境变量已经改成了cuda9,nvcc的版本也变成了cuda9,但是在虚拟环境中使用conda list和进入命令行之后使用torch.__version__两种方式查看得到的pytorch版本不同,感觉可能是当前虚拟环境装了两个pytorch,再用pip list进行查看,果然发现pip还装了一个torch。

解决办法:

两个pytorch卸载掉不需要的一个即可;

报错7:编译报错,/usr/include/c++/6/tuple:502:1: error: body of constexpr function

原因:

参考CUDA9.0编译nvcc报错‘/usr/include/c++/6/tuple’,gcc当前版本为gcc-7,版本过高,切换到gcc-5;

解决办法:

参考ubuntu18.04 gcc-7安装与多版本切换切换到gcc-5;

报错8:编译报错,/usr/include/c++/6/tuple:483:67: error: mismatched argument pack lengths while expanding

原因:

查阅网上的解决方案,不确定时cuda的问题还是gcc的版本问题,尝试更换系统cuda版本。

解决办法:

重装了一个cuda10.0,编译通过。

报错9:AttributeError: module ‘torch.jit’ has no attribute ‘unused’

原因:

测试了一下,发现import torchvision会报该错误

解决办法:

无法解决,本地环境有点问题,直接pull了一个pytorch1.0,cuda10.0的docker环境,在docker环境下就没有该问题了,搭建方法参考docker搭建pytorch环境。

测试模型

net根据训练时取的主干网络进行选择

python test_net_HTCN.py --dataset source_dataset --dataset_t target_dataset --net vgg16 --load_name path_to_model

测试数据集1:PASCAL VOC + clipart (no interpolation)

python test_net_HTCN.py --dataset 'voc_0712' --dataset_t 'clipart' --net res101 --load_name 'models/res101/pascalvoc-clipart_res101_no_interpolation/target_clipart_eta_0.1_local_True_global_True_gamma_3_session_1_epoch_14_step_10000.pth'

测试数据集2:cityscapes + foggy cityscapes (no interpolation)

python test_net_HTCN.py --dataset 'cs' --dataset_t 'cs_fg' --net vgg16 --load_name 'models/vgg16/cityscapes-foggycigyscapes_vgg16_no_interpolation/globallocal_target_cs_fg_eta_0.1_local_context_True_global_context_True_gamma_3_session_1_epoch_7_step_8000.pth'

报错及解决办法

报错1:TypeError: __ init__() got an unexpected keyword argument ‘path_return’

解决办法:

去掉test_net_HTCN.py里132行的path_return=True参数

训练结果

[1]:Pascal VOC数据集使用方法
[2]:HTCN
[3]:ubuntu安装pytorch及使用过程的报错记录
[4]:CUDA9.0编译nvcc报错‘/usr/include/c++/6/tuple’
[5]:ubuntu18.04 gcc-7安装与多版本切换
[6]:docker搭建pytorch环境
[7]:cross-domain-detection
[8]:cityscapes和foggy_cityscapes数据集使用记录

你可能感兴趣的:(pytorch,深度学习)