域自适应方法MIC代码复现流程详解与问题解决记录

题目:MIC: Masked Image Consistency for Context-Enhanced Domain Adaptation

论文arxiv.org/pdf/2212.01322

源码:https://github.com/lhoyer/MIC

1. 配置训练环境

1.1 获取代码

直接在github上下载,解压后打开文件夹可以看到有分类(cls)、检测(det)、分割(seg)三个任务类型,此时右键cls用pycharm打开

1.2 创建虚拟环境

在Anaconda Prompt中创建名为MIC的虚拟环境,根据项目中readme文件中的要求,选择python为3.8.5版本

conda create --name MIC python=3.8.5

此时即可打开pycharm中刚刚创建的项目界面,点击右下角解释器添加本地解释器,打开conda环境列表,选择刚刚创建的虚拟环境MIC

然后在终端下载依赖

pip install -r requirements.txt

2.训练脚本

2.1参数配置

对于论文中的实验,可以使用脚本自动生成不同的配置并对其进行训练

python run_experiments.py --exp <ID>

打开experiments.py参阅有关可用实验及其分配ID的更多信息

这里选择第二套实验配置

    elif id == 2:
        architecture = 'resnet101'
        datasets = [
            ('VisDA2017', 'Synthetic', 'Real'),
        ]
        udas = [
            # uda method, alpha, q, patch, ratio, aug
            ('cdan_mcc_sdat_masking', 0.9, None, 64, 0.7, True),
        ]
        for (dataset, source, target), (uda, alpha, pseudo_label_weight, mask_block_size, mask_ratio, caug) \
                in itertools.product(datasets, udas):
            if caug:
                # augmentation parameters from DAFormer
                mask_color_jitter_p, mask_color_jitter_s, mask_blur = 0.2, 0.2, True
            else:
                mask_color_jitter_p, mask_color_jitter_s, mask_blur = 0, 0, False
            cfg = config_from_vars()
            cfgs.append(cfg)

只需在终端输入以下命令即可选择该配置开始训练

python run_experiments.py --exp 2

在运行训练命令之前需要登录wandb网站,注册登录之后创建一个项目,项目命名为cls(任意命名),然后回到pycharm界面打开终端输入wandb login按照提示登陆wandb,如果报错则更新wandb。

然后打开examples下的cdan_mcc_sdat_masking.py文件,将project的值更改为刚才创建的项目名称。

2.2 数据集预下载(可选)

实验配置2中用到的数据集是visda2017,可以在examples文件下按照如下结构创建目录

下载网址: 

("image_list", "image_list.zip", "https://cloud.tsinghua.edu.cn/f/c107de37b8094c5398dc/?dl=1"),

("train", "train.tar", "http://csr.bu.edu/ftp/visda17/clf/train.tar"),

("validation", "validation.tar", "http://csr.bu.edu/ftp/visda17/clf/validation.tar")

如果需要提前下载另一个数据集Officehome,下载方法类似

不提前下载也行,运行训练脚本时会自动下载,只要网络没问题结果是一样的。但是其中的image_list文件经常因为网络问题无法下载,即使提前下载也有可能下载不了,因个人网络情况而异,如果这个文件实在无法下载,可以等train和validation都下载并解压好了,在两个文件夹的最后分别可以找到一个image_list.txt文件,只需将这两个文件复制到image_list下,并将来自train文件夹中的txt文件改成train.txt,来自validation文件夹中的txt文件改成validation.txt。

3. 训练中的报错及解决方法

3.1 路径问题

报错:

The system cannot find the path specified.

解决:run.experiments.py中用到cd方法,且使用不正确,注意cd方法一般是在命令行使用的快捷命令,用于修改工作目录,可改用cwd方法,代码修改如下,整体替换即可

import argparse
import subprocess
from experiments import generate_experiment_cfgs

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--exp',default='2',
        type=int,
        help='Experiment id as defined in experiment.py',
    )
    parser.add_argument(
        '--machine', type=str, default='local', choices=[
            'local',
        ])
    args = parser.parse_args()
    cfgs = generate_experiment_cfgs(args.exp)

    for i, cfg in enumerate(cfgs):
        if args.machine == 'local':
            print(f'Run config {i}/{len(cfgs)}:', cfg)
            sub_out = subprocess.run(cfg["EXEC_CMD"], shell=True, cwd=cfg["subfolder"])
            if sub_out.returncode != 0:
                print(f"Error executing {cfg['EXEC_CMD']} in {cfg['subfolder']}")
        else:
            raise NotImplementedError(f"Machine type {args.machine} is not supported.")

另外运行训练脚本前要保证工作目录一定要在cls下,比如(MIC) PS F:\ME\downloading\MIC-master\cls,否则还会报错找不到路径

3.2 内存问题

报错:

RuntimeError: [enforce fail at ..\c10\core\CPUAllocator.cpp:79] data. DefaultCPUAllocator: not enough memory: you tried to allocate 102760448 bytes.

解决:如果是用cpu调试代码,一定会遇到内存不足的问题,可以在训练脚本cdan_mcc_sdat_masking.py中的342行把默认的batch-size调成2,356行的workers改成0

 parser.add_argument('-b', '--batch-size', default=16, type=int,
 parser.add_argument('-j', '--workers', default=0, type=int, metavar='N',

3.3 numpy更新语法弃用问题

dalib/modules/grl.py文件中第71行有个过时的用法np.float需要更改,只需去掉np.

3.4 torch和cuda版本不对应导致无法调用GPU

在GPU上训练时还是会显示内存不足,打开命令行输入命令nvidia-smi可以看到GPU占用情况,发现GPU没有被调用,训练时仅使用了CPU,那这种情况就很可能是torch和cuda版本不对应引起的,所以我们去这个网站(download.pytorch.org/whl/torch_stable.html)上下载和我们需要的版本接近的torch+cuda的二进制包,这里的包都是对应好的,另外还要再下载一个对应的torchvision包(版本对应参考下表)

这里我选择了torch1.10.0,那么torchvision版本就是0.11.0

注意两个文件的完整文件名,其余部分要选一样的,都有cu113,cp38,windows系统

下载好之后使用pip 指定路径安装,如果下载好文件位于C:\Users\ME路径下,则安装命令为

pip install C:\Users\ME\torch-1.10.0+cu113-cp38-cp38-win_amd64.whl
pip install C:\Users\ME\torchvision-0.11.0+cu113-cp38-cp38-win_amd64.whl

作者:2201_75589799

物联沃分享整理
物联沃-IOTWORD物联网 » 域自适应方法MIC代码复现流程详解与问题解决记录

发表回复