域自适应方法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