DASSL은 도메인 적응 및 일반화에 대한 연구를 지원하기 위해 프로젝트 도메인 적응 앙상블 학습 (DAEL)을 위해 처음 개발 된 Pytorch 도구 상자입니다. DAEL에서는 단일 학습 프레임 워크 에서이 두 가지 문제를 통합하는 방법을 연구하기 때문입니다. 도메인 적응이 반 감독 학습과 밀접한 관련이 있다는 점을 감안할 때, 둘 다 표지되지 않은 데이터를 이용하는 방법을 연구합니다. 또한 후자를위한 연구를 지원하는 구성 요소도 포함됩니다.
왜 "dassl"이라는 이름은 무엇입니까? DASSL은 DA (Domain Adaptation)와 SSL (Semi-Supervised Learning)의 이니셜을 결합하여 자연스럽고 유익한 소리를냅니다.
DASSL에는 모듈 식 설계 및 통합 인터페이스가있어 새로운 DA/DG/SSL 방법의 빠른 프로토 타이핑 및 실험이 가능합니다. Dassl을 사용하면 몇 줄의 코드만으로 새로운 방법을 구현할 수 있습니다. 믿지 마세요? 기존의 많은 방법의 구현이 포함 된 엔진 폴더를 살펴보십시오 (다시 돌아와서이 repo를 별표 할 것입니다). :-)
기본적으로 DASSL은 다음과 같은 분야에서 연구에 적합합니다.
그러나 깔끔한 디자인 덕분에 DASSL은 코드베이스로 사용하여 이와 같은 딥 러닝 프로젝트를 개발할 수도 있습니다. :-)
DASSL의 단점은 분산 다중 GPU 교육을 지원하지 않는 것입니다 (DASSL은 DataParallel DistributedDataParallel 하여 모델을 래핑합니다.
우리는 다른 프로젝트와 달리 DASSL에 대한 자세한 문서를 제공하지 않습니다. DASSL은 연구 목적으로 개발되었고 연구원으로서 소스 코드를 읽는 것이 중요하다고 생각하며, 우리는 당신이 그렇게하도록 격려하는 것이 좋습니다. :-)
v0.6.0 : 메소드 클래스 이름과 일치하는 cfg.TRAINER.METHOD_NAME 만듭니다.v0.5.0 : transforms.py 에 대한 중요한 변경 . 1) center_crop 테스트에서 기본 변환이됩니다 (이미지 종횡비를 유지하기 위해 작은 가장자리를 특정 크기로 크기를 조정 한 후 적용). 2) 훈련의 경우 random_crop 또는 random_resized_crop 사용하면 Resize(cfg.INPUT.SIZE) 가 비활성화됩니다. 이러한 변경 사항은 기존 구성 파일에 사용 된 교육 변환이나 원시 이미지가 제곱되지 않으면 테스트 변환에 아무런 차이가 없습니다 (유일한 차이점은 이제 이미지 종횡비가 존중된다는 것입니다).v0.4.3 : self.dm (data manager)의 속성을 SimpleTrainer 기에 복사하고 self.dm 선택 사항을 선택하십시오. 즉, DataManager 사용하지 않고 원하는 모든 소스에서 데이터 로더를 구축 할 수 있습니다.v0.4.2 : 중요한 업데이트는 drop_last=is_train and len(data_source)>=batch_size 설정하는 것입니다. Dassl은 다음 방법을 구현했습니다.
단일 소스 도메인 적응
멀티 소스 도메인 적응
도메인 일반화
반 감독 학습
다른 사람들이 더 쉽게 벤치마킹 할 수 있도록 방법을 여기에 추가하기 위해 PR을 자유롭게 만들어보십시오!
DASSL은 다음 데이터 세트를 지원합니다.
도메인 적응
도메인 일반화
반 감독 학습
콘다가 제대로 설치되어 있는지 확인하십시오.
# Clone this repo
git clone https://github.com/KaiyangZhou/Dassl.pytorch.git
cd Dassl.pytorch/
# Create a conda environment
conda create -y -n dassl python=3.8
# Activate the environment
conda activate dassl
# Install torch (requires version >= 1.8.1) and torchvision
# Please refer to https://pytorch.org/ if you need a different cuda version
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
# Install dependencies
pip install -r requirements.txt
# Install this library (no need to re-build if the source code is modified)
python setup.py developDataSets.md의 지침에 따라 데이터 세트를 전처리하십시오.
기본 인터페이스는 tools/train.py 에서 구현되며 기본적으로
args cfg = setup_cfg(args) tools/train.py 구성을 초기화합니다.build_trainer(cfg) 로 trainer 인스턴스화합니다.trainer.train() 에 전화하십시오.아래는 인기있는 도메인 적응 데이터 세트, Office-31에 대한 소스 전용 기준을 훈련하기위한 예를 제공합니다.
CUDA_VISIBLE_DEVICES=0 python tools/train.py
--root $DATA
--trainer SourceOnly
--source-domains amazon
--target-domains webcam
--dataset-config-file configs/datasets/da/office31.yaml
--config-file configs/trainers/da/source_only/office31.yaml
--output-dir output/source_only_office31 $DATA 데이터 세트가 설치된 위치를 나타냅니다. --dataset-config-file 이미지 크기 및 모델 아키텍처와 같은 데이터 세트 (이 경우 Office-31)의 공통 설정을로드합니다. --config-file 하이퍼 파라미터 및 최적화 매개 변수와 같은 알고리즘 별 설정을로드합니다.
여러 소스, 즉 멀티 소스 도메인 적응 작업을 사용하려면 --source-domains 에 더 많은 소스를 추가하면됩니다. 예를 들어, Minidomainnet에서 소스 전용 기준선을 훈련하려면
CUDA_VISIBLE_DEVICES=0 python tools/train.py
--root $DATA
--trainer SourceOnly
--source-domains clipart painting real
--target-domains sketch
--dataset-config-file configs/datasets/da/mini_domainnet.yaml
--config-file configs/trainers/da/source_only/mini_domainnet.yaml
--output-dir output/source_only_minidn훈련이 끝나면 모델 가중치는 로그 파일 및 시각화를위한 텐서 보드 파일과 함께 지정된 출력 디렉토리에 저장됩니다.
로그 파일에 저장된 결과를 인쇄하려면 (따라서 모든 로그 파일을 철저하게 진행하고 평균/std를 직접 계산할 필요가 없습니다) tools/parse_test_res.py 사용할 수 있습니다. 지침은 코드에서 찾을 수 있습니다.
MCD 와 같은 다른 트레이너의 경우 구성 파일을 변경하지 않고 --trainer MCD 설정할 수 있습니다. 즉, SourceOnly 경우 (가장 간단한 경우) 동일한 교육 매개 변수를 사용합니다. N_STEP_F (기능 추출기를 업데이트하는 단계 수)와 같은 MCD에서 하이퍼 파라미터를 수정하려면 TRAINER.MCD.N_STEP_F 4 기존 입력 인수에 추가 할 수 있습니다 (그렇지 않으면 기본값이 사용됩니다). 또는 사용자 정의 설정을 저장하기 위해 새 .yaml 구성 파일을 만들 수 있습니다. 알고리즘 별 하이퍼 파라미터의 전체 목록은 여기를 참조하십시오.
모델 테스트는 --eval-only 사용하여 수행 할 수 있으며 코드는 trainer.test() . 또한 훈련 된 모델을 제공하고 사용할 모델 파일 (예 : 저장된 에포크)을 지정해야합니다. 예를 들어, model.pth.tar-20 사용하려면 output/source_only_office31/model 에서 저장하면
CUDA_VISIBLE_DEVICES=0 python tools/train.py
--root $DATA
--trainer SourceOnly
--source-domains amazon
--target-domains webcam
--dataset-config-file configs/datasets/da/office31.yaml
--config-file configs/trainers/da/source_only/office31.yaml
--output-dir output/source_only_office31_test
--eval-only
--model-dir output/source_only_office31
--load-epoch 20 --model-dir 훈련 단계에서 --output-dir 에 지정된 디렉토리 경로를 입력하는 것으로 간주합니다.
좋은 관행은 dassl/engine/trainer.py 통해 일반적인 기능과 교육 루프를 제공하는베이스 트레이너 클래스와 함께 Familar를 얻는 것입니다. 도메인 적응 또는 반 감독 학습을위한 트레이너 클래스를 작성하려면 새로운 클래스는 TrainerXU 서브 클래스 할 수 있습니다. 도메인 일반화를 위해 새로운 클래스는 TrainerX 서브 클래스 할 수 있습니다. 특히, TrainerXU 와 TrainerX 표지되지 않은 데이터에 데이터 로더를 사용하는지 여부는 주로 다릅니다. 기본 클래스를 사용하면 새로운 트레이너가 손실 계산 및 모델 업데이트를 수행하는 forward_backward() 메소드 만 구현하면됩니다. 예를 들어 dassl/enigne/da/source_only.py 참조하십시오.
backbone 기능 추출을 수행하는 컨볼 루션 신경 네트워크 모델에 해당합니다. head (옵션 모듈)는 추가 처리를 위해 backbone 위에 장착됩니다. 예를 들어 MLP 일 수 있습니다. backbone 과 head 작업의 기본 모델 역할을하는 SimpleNet() ( dassl/engine/trainer.py 참조)을 구성하기위한 기본 빌딩 블록입니다. network 에는 이미지 생성기와 같은 맞춤형 신경망 모델이 포함되어 있습니다.
새 모듈, 즉 백본/헤드/네트워크를 추가하려면 먼저 해당 registry , 즉 backbone 용 BACKBONE_REGISTRY , HEAD_REGISTRY for head 및 NETWORK_RESIGTRY network 하여 모듈을 먼저 등록해야합니다. 새 backbone 의 경우 dassl/modeling/backbone/backbone.py 에 정의 된대로 모델을 서브 클래스 Backbone 으로하고 self._out_features 속성을 지정해야합니다.
우리는 새로운 backbone 추가하는 방법에 대한 예를 제공합니다.
from dassl . modeling import Backbone , BACKBONE_REGISTRY
class MyBackbone ( Backbone ):
def __init__ ( self ):
super (). __init__ ()
# Create layers
self . conv = ...
self . _out_features = 2048
def forward ( self , x ):
# Extract and return features
@ BACKBONE_REGISTRY . register ()
def my_backbone ( ** kwargs ):
return MyBackbone () 그런 다음 MODEL.BACKBONE.NAME 으로 my_backbone 설정하여 자신의 아키텍처를 사용 할 수 있습니다. 자세한 내용은 dassl/modeling 의 소스 코드를 참조하십시오.
코드 구조 예제는 다음과 같습니다. 서브 클래스 DatasetBase 확인하고 @DATASET_REGISTRY.register() 에 데이터 세트를 등록하십시오. train_x , train_u (선택 사항), val (선택 사항) 및 test 중에는 train_u 와 val None 단순히 무시할 수 있습니다. 이러한 각 변수에는 Datum Objects 목록이 포함되어 있습니다. Datum Object (여기에서 구현)에는 impath (String) 및 label (int)과 같은 단일 이미지에 대한 정보가 포함되어 있습니다.
from dassl . data . datasets import DATASET_REGISTRY , Datum , DatasetBase
@ DATASET_REGISTRY . register ()
class NewDataset ( DatasetBase ):
dataset_dir = ''
def __init__ ( self , cfg ):
train_x = ...
train_u = ... # optional, can be None
val = ... # optional, can be None
test = ...
super (). __init__ ( train_x = train_x , train_u = train_u , val = val , test = test )DASSL 위에 구축 된 이와 같은 일부 프로젝트에서 데이터 세트 코드를 살펴 보는 것이 좋습니다.
우리는 여기서 Dassl과 관련된 연구를 공유하고 싶습니다.
이 코드가 연구에 유용하다고 생각되면 다음 논문에 대한 신용을 제공하십시오.
@article{zhou2022domain,
title={Domain generalization: A survey},
author={Zhou, Kaiyang and Liu, Ziwei and Qiao, Yu and Xiang, Tao and Loy, Chen Change},
journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},
year={2022},
publisher={IEEE}
}
@article{zhou2021domain,
title={Domain adaptive ensemble learning},
author={Zhou, Kaiyang and Yang, Yongxin and Qiao, Yu and Xiang, Tao},
journal={IEEE Transactions on Image Processing},
volume={30},
pages={8008--8018},
year={2021},
publisher={IEEE}
}