본문 바로가기
OpenMMLab(미공개)/MMDetection

[MMDetection] Customization - Models

by cogito21_python 2024. 1. 13.
반응형

Customize Models

- 모델은 5가지 타입으로 구성됨

  - backbone: FCN network로 featurer map들을 추출함

- neck: backbone과 head의 사이에 있는 구성요소 

- head: 특정한 task를 위한 구성요소

- roi extractor: feature map들에서 RoI 특징을 뽑아내는 부분

- loss: loss를 계산하기 위한 head의 구성요소

 

새로운 구성요소 추가하기

Backbone 추가하기

1. 새로운 backbone 생성: mmdet/models/backbones/모델명.py

import torch.nn as nn
from mmdet.registry import MODELS

@MODELS.register_module()
class 모델명(nn.Module):
  def __init__(self, arg1, arg2):
    pass
    
  def forward(self, x):
    pass

 

2. 모듈 불러오기

# mmdet/models/backbones/__init__.py에 추가
from .모델명 import 모델명

# 다른 방식
custom_imports = dict(
  imports=['mmdet.models.backbones.모델명'],
  allow_failed_imports=False)

 

3. config file에서 backbone 사용

model = dict(
  ...
  backbone = dict(
    type="모델명",
    arg1=xxx,
    arg2=xxx),
    ...

 

Neck 추가하기

1. 새로운 neck 정의하기: mmdet/models/necks/neck이름.py

import torch.nn as nn
from mmdet.registry import MODELS

@MODELS.register_module()
class neck이름(nn.Module):
  def __init__(self, in_channels, out_channels,
               num_outs, start_level=0, end_level=-1,
               add_extra_convs=False):
    pass
  
  def forward(self, inputs):
    pass

 

2. 모듈 불러오기

# mmdet/models/necks/__init__.py
from .neck이름 import neck이름

# 다른 방식
cutsom_imports = dict(
  imports=['mmdet.models.necks.neck이름],
  allow_failed_imports=False)

 

3. config file 에서 neck사용

neck = dict(
  type="neck이름",
  in_channels=[256, 512, 1024, 2048],
  out_channels=256,
  num_outs=5)

 

Head 추가하기

1.  새 head 생성하기: mmdet/models/roi_heads/bbox_heads/헤드명.py

- 3개의 function 구현 필요

 

Loss 추가하기

1. 새로운 loss 생성: mmdet/models/losses/my_loss.py

import torch
import torch.nn as nn

from mmdet.registry. import MODELS
from .utils import weighted_loss

@weighted_loss
def my_loss(pred, target):
  asser pred.size() == target.size() and target.numel() > 0
  loss = torch.abs(pred - target)
  return loss
  
 @MODELS.register_module()
 class MyLoss(nn.Module):
   def __init__(self, reduction="mean", loss_weight=1.0):
     super(MyLoss, self).__init__()
     self.reduction = reduction
     self.loss_weight = loss_weight
반응형

'OpenMMLab(미공개) > MMDetection' 카테고리의 다른 글

[MMDetection] Train & Test - Configs  (0) 2024.01.13
[MMDetection] 기본 개념  (0) 2024.01.13
[MMDetection] 환경설정  (0) 2024.01.13
[MMDetection] 개요  (0) 2024.01.13