Deep Learning

[Paper] CADTransformer: Panoptic Symbol Spotting Transformer for CAD Drawings (2)

ju_young 2023. 4. 8. 02:49
728x90

Methodology

Tokenizing with Graphical Primitives

래스터 이미지에서 feature map을 추출하기위해 HRNetV2-W48 모델을 사용

  1. graphical primitive들(호, 선 등)로 분해
  2. bilinear로 feature vector를 interpolation
  3. primitive의 중간 위치 좌표를 feature map에 projection

Figure 3 (b)에 나타난 것처럼 feature map을 추출할 때에만 래스터 이미지를 사용하고 이외에는 CAD Drawing(vector image)을 사용한다. 또한 그림에서 vertex alignment라는 부분은 2, 3 과정이라 생각되며 코드를 확인해보면 pytorch의 grid_sample 함수로 2번 과정을 거친후 Linear 레이어를 통해 3번 과정이 수행되는 것이라 생각된다.

def vert_align_custom(feats, verts, interp_mode='bilinear',
    padding_mode='zeros', align_corners=True):
    if torch.is_tensor(verts):
        if verts.dim() != 3:
            raise ValueError("verts tensor should be 3 dimensional")
        grid = verts
    else:
        raise ValueError(
            "verts must be a tensor or have a "
            + "`points_padded' or`verts_padded` attribute."
        )
    grid = grid[:, None, :, :2]  # (N, 1, V, 2)
    if torch.is_tensor(feats):
        feats = [feats]
    for feat in feats:
        if feat.dim() != 4:
            raise ValueError("feats must have shape (N, C, H, W)")
        if grid.shape[0] != feat.shape[0]:
            raise ValueError("inconsistent batch dimension")
    feats_sampled = []
    for feat in feats:
        feat_sampled = F.grid_sample(
            feat,
            grid,
            mode=interp_mode,
            padding_mode=padding_mode,
            align_corners=align_corners,
        )  # (N, C, 1, V)
        feat_sampled = feat_sampled.squeeze(dim=2).transpose(1, 2)  # (N, V, C)
        feats_sampled.append(feat_sampled)
    feats_sampled = torch.cat(feats_sampled, dim=2)  # (N, V, sum(C))
    return feats_sampled

 

Semantic Symbol Spotting Head

  1. transformer에서 얻은 feature vector로 N개의 entity의 semantic score를 계산
  2. CE loss를 사용하여 loss 계산
  3. maximum score(argmax)를 사용하여 entity의 label을 예측

Instance Symbol Spotting Head

일반적으로 detection을 수행할때 bounding box로 예측할 경우 문제가 생긴다. 예를 들어 하나의 문(door)이 있고 문의 한 쪽에 벽이 겹쳐있다면 예측된 box는 정확도가 떨어진다.

 

이런 문제를 해결하기위해 instance의 중심을 기준으로 주변의 entity들을 모아 entity 별 offset vector들을 예측하는 것을 제안한다. 즉, 어떤 중심이 되는 instance를 기준으로 주변 entity들의 offset vector를 예측하여 관련된 것들만 묶는다는 얘기이다. 

 

이후 clustering (mean-shift algorithm)을 수행한다.

 

[reference]

https://github.com/VITA-Group/CADTransformer/blob/main/models/model.py

728x90