PyTorch의 MaskR-CNN에서 Focal로스 도입

이 보도가 해야 할 일


PyTorch에서MaskR-CNN을 설치할 때에서 "focal loss"를 가져오고 싶습니다.
그래서 나는 이 글을 도입하려고 노력했다.포칼 로스의 해설 기사가 아니라

모티프


자기가 사용하는 데이터의 편차가 크기 때문에 RetinaNet처럼 포칼 로스를 가져오면 식별률이 좋아지지 않을까 싶어요.이 때문에'매스카르-CNN에 포칼 로스를 가져오고 싶다'는 생각까지 들었다.

분류된loss함수가 어디 있어요?


찾아봤는데 여기.에 있어요.

PyTroch의MaskR-CNN과FasterR-CNN의 분류에서crossentropy를 사용하고 있는 것 같습니다.

이루어지다


이 논단 구현 참조
코드 자체가 이거야.
focal_loss
class FocalLoss(nn.Module):

    def __init__(self, weight=None,
             gamma=2.5, reduction='mean'):
        nn.Module.__init__(self)
        self.gamma = gamma
        self.reduction = reduction
        self.weight=weight

    def forward(self, input_tensor, target_tensor):
        log_prob = F.log_softmax(input_tensor, dim=-1)
        prob = torch.exp(log_prob)
        return F.nll_loss(
            ((1 - prob) ** self.gamma) * log_prob, 
            target_tensor, 
            weight=self.weight,
            reduction = self.reduction
        )
가져오십시오fastrcnn_loss.여기에서 파일 이름을 my로 설정합니다fastrcnn_loss_with_focal_loss.py로 저장합니다.
my_fastrcnn_loss_with_focal_loss.py
import torch.nn.functional as F
from torch import nn

class FocalLoss(nn.Module):

    def __init__(self, weight=None,
                 gamma=2.5, reduction='mean'):
        nn.Module.__init__(self)
        self.weight=weight
        self.gamma = gamma
        self.reduction = reduction

    def forward(self, input_tensor, target_tensor):
        log_prob = F.log_softmax(input_tensor, dim=-1)
        prob = torch.exp(log_prob)
        return F.nll_loss(
            ((1 - prob) ** self.gamma) * log_prob, 
            target_tensor, 
            weight=self.weight,
            reduction = self.reduction
        )

def fastrcnn_loss(class_logits, box_regression, labels, regression_targets):
    # type: (Tensor, Tensor, List[Tensor], List[Tensor]) -> Tuple[Tensor, Tensor]
    """
    Computes the loss for Faster R-CNN.
    Args:
        class_logits (Tensor)
        box_regression (Tensor)
        labels (list[BoxList])
        regression_targets (Tensor)
    Returns:
        classification_loss (Tensor)
        box_loss (Tensor)
    """

    labels = torch.cat(labels, dim=0)
    regression_targets = torch.cat(regression_targets, dim=0)

    #この部分をfocal_lossへ変更する
    #classification_loss = F.cross_entropy(class_logits, labels)
    focal=FocalLoss()
    classification_loss = focal(class_logits, labels)
    #変更はここまで

    # get indices that correspond to the regression targets for
    # the corresponding ground truth labels, to be used with
    # advanced indexing
    sampled_pos_inds_subset = torch.where(labels > 0)[0]
    labels_pos = labels[sampled_pos_inds_subset]
    N, num_classes = class_logits.shape
    box_regression = box_regression.reshape(N, box_regression.size(-1) // 4, 4)

    box_loss = F.smooth_l1_loss(
        box_regression[sampled_pos_inds_subset, labels_pos],
        regression_targets[sampled_pos_inds_subset],
        beta=1 / 9,
        reduction='sum',
    )
    box_loss = box_loss / labels.numel()

    return classification_loss, box_loss

이후, 저번와 같은 방식으로MaskR-CNN을 실현한 후, 특히
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
뒤에 코드를 삽입합니다.(중간 코드는 공식 튜토리얼)
mask_rcnn_model.py
import torchvision
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor

model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)

num_classes = 2
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)

#ここまででネットワークを作る
#ここから損失関数を変更していく

from my_fastrcnn_loss_with_focal_loss import fastrcnn_loss
torchvision.models.detection.roi_heads.fastrcnn_loss=fastrcnn_loss

.따라서 focal loss를 Mask R-CAN에 설치할 수 있습니다.(다 했을 텐데)

잡담


weight 설정 시
class FocalLoss(nn.Module):

    def __init__(self, 
                 gamma=2.5, reduction='mean'):
        nn.Module.__init__(self)
        self.weight=self.weight = torch.tensor([1. ,100. ,2. ,2. ,1.]).cuda()
        self.gamma = gamma
        self.reduction = reduction

    def forward(self, input_tensor, target_tensor):
    ...
쿠다 코어에 설정하면 잘 될 거예요.

끝맺다


실제로 포칼 로스 도입과 관련해 리지온 프로포즈al 네트워크를 사용하는 모델이 별다른 효과가 없을 것이라는 우려가 제기됐는데, 과연 어떻게 될까.
약간의 의문이 있지만 설치 자체는 이미 완성된 것 같다.잘 됐다.

좋은 웹페이지 즐겨찾기