mirror of https://github.com/alibaba/EasyCV.git
108 lines
3.1 KiB
Python
108 lines
3.1 KiB
Python
#! -*- coding: utf8 -*-
|
|
# Copyright (c) Alibaba, Inc. and its affiliates.
|
|
import os
|
|
import shutil
|
|
import time
|
|
import unittest
|
|
import uuid
|
|
|
|
import torch
|
|
from mmcv.parallel import MMDataParallel
|
|
from tests.ut_config import TMP_DIR_LOCAL
|
|
from torch import distributed as dist
|
|
|
|
from easycv.datasets import build_dataloader
|
|
from easycv.file import io
|
|
from easycv.hooks.swav_hook import SWAVHook
|
|
from easycv.runner import EVRunner
|
|
from easycv.utils.logger import get_root_logger
|
|
from easycv.utils.test_util import pseudo_dist_init
|
|
|
|
|
|
class DummyDataset(object):
|
|
|
|
def __getitem__(self, idx):
|
|
output = {'img': [torch.randn(3, 224, 224), torch.randn(3, 224, 224)]}
|
|
return output
|
|
|
|
def __len__(self):
|
|
return 4
|
|
|
|
|
|
def _build_model():
|
|
from easycv.models import build_model
|
|
num_crops = [1, 1]
|
|
epoch_queue_starts = 1
|
|
model = dict(
|
|
type='SWAV',
|
|
pretrained=None,
|
|
train_preprocess=['randomGrayScale', 'gaussianBlur'],
|
|
backbone=dict(
|
|
type='ResNet',
|
|
depth=18,
|
|
in_channels=3,
|
|
out_indices=[4], # 0: conv-1, x: stage-x
|
|
norm_cfg=dict(type='SyncBN')),
|
|
# swav need mulit crop ,doesn't support vit based model
|
|
neck=dict(
|
|
type='NonLinearNeckSwav',
|
|
in_channels=512,
|
|
hid_channels=512,
|
|
out_channels=128,
|
|
with_avg_pool=False),
|
|
config=dict(
|
|
# multi crop setting
|
|
num_crops=num_crops,
|
|
|
|
# swav setting
|
|
crops_for_assign=[0, 1],
|
|
epsilon=0.05,
|
|
nmb_prototypes=3000,
|
|
sinkhorn_iterations=3,
|
|
temperature=0.1,
|
|
|
|
# queue setting
|
|
queue_length=3840,
|
|
epoch_queue_starts=epoch_queue_starts))
|
|
|
|
return build_model(model)
|
|
|
|
|
|
class SWAVHookTest(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
print(('Testing %s.%s' % (type(self).__name__, self._testMethodName)))
|
|
|
|
def test_swav_hook(self):
|
|
work_dir = os.path.join(TMP_DIR_LOCAL, uuid.uuid4().hex)
|
|
io.makedirs(work_dir)
|
|
timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime())
|
|
log_file = os.path.join(work_dir, '{}.log'.format(timestamp))
|
|
logger = get_root_logger(log_file=log_file)
|
|
|
|
model = _build_model()
|
|
model = MMDataParallel(model, device_ids=[0]).cuda()
|
|
optimizer = torch.optim.SGD(model.parameters(), lr=0.02, momentum=0.95)
|
|
runner = EVRunner(
|
|
model=model, work_dir=work_dir, optimizer=optimizer, logger=logger)
|
|
|
|
dump_path = os.path.join(work_dir, 'data')
|
|
swav_hook = SWAVHook(gpu_batch_size=4, dump_path=dump_path)
|
|
runner.register_hook(swav_hook)
|
|
|
|
dataset = DummyDataset()
|
|
dataloader = build_dataloader(
|
|
dataset, imgs_per_gpu=4, workers_per_gpu=1)
|
|
runner.data_loader = [dataloader]
|
|
|
|
pseudo_dist_init()
|
|
runner.run([dataloader], [('train', 1)], 2)
|
|
self.assertIn('queue0.pth', io.listdir(dump_path))
|
|
|
|
shutil.rmtree(work_dir, ignore_errors=True)
|
|
dist.destroy_process_group()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|