Mask-Rcnn 활용

우수민·2021년 3월 17일
0
post-custom-banner

최근에는 vision에 관한 논문들이 많이 출시 되고 있다. 그중에서도 가장 많이 쓰이는 모델이 yolo인데 실제로 이를 활용한 논문이 공개되었다.

논문에 관해선 파라미터와 사용한 데이터, 결과등을 아래의 링크에 정리해 두었다. 실제 만드는 모델도 이를 참고하였다.

정리 : https://velog.io/@suminwooo/Yolo-%ED%99%9C%EC%9A%A9-book-segmentation-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC
논문 링크 : https://www.researchgate.net/publication/346820617_Research_of_YOLO_Architecture_Models_in_Book_Detection

한가지 아쉬운점은 book segmentation을 하기 위해 yolo를 사용하여 똑같이 구현하려고 하였으나 cuda11에선 tensorflow 1버전을 지원이 되지 않았고 1버전을 많이 사용하지 않아 수정하기도 쉽지 않기에 mask rcnn을 사용하였다.


Mask Rcnn 모델링 과정

(mask rcnn 논문 정리 : https://velog.io/@suminwooo/Mask-RCNN-%EB%85%BC%EB%AC%B8-%EB%B6%84%EC%84%9D)

모델링 과정은 아래의 순서로 진행하였다.

1. 데이터 수집

  • 데이터의 경우에는 회사 DB에 존재하는 이미지를 활용

2. 데이터 라벨링

  • Mask Rcnn, Yolo 모델의 경우 coco나 imagenet의 데이터를 활용할 수 있는데, 만들려고 하는 모델의 경우 클래스가 배경과 책만으로 이루어져 있기 때문에 새롭게 라벨링 데이터를 구성하게 되었다.
  • labeling의 경우에는 vgg image annotator를 활용하여 라벨링 데이터를 만들었다.
  • 실제 모델 학습에는 위에 논문과 비슷하게 500장의 이미지를 라벨링을 하고 augmentation을 실시하여 데이터의 수를 증가 시켰다.


vgg image annotator 링크 : https://www.robots.ox.ac.uk/~vgg/software/via/via.html

3. 모델 학습

3-1. Train

  • Mask rcnn을 사용한 예시나 다른 모델의 구성을 보면 학습시키는 방법을 선택할 수 있다.
    0. Which weights to start with : 전이 학습 or 처음부터 학습
    1. Fine tune the head branches
    2. Fine tune layers from ResNet stage 4 and up
    3. Fine tune all layers

3-2. Loss function

  • 모델을 학습하면서 실시간으로 모델의 loss를 확인 할 수 있다. 기본적으로 총 6개의 loss가 설정되어 있다. 이는 tensorboard를 통해 확인 할 수 있다.
    1. epoch_loss : 2~5번 loss의 합을 log로 취한 값
    2. epoch_mrcnn_bbox_loss : 경계 상자의 크기가 정확한 지 판단하는 값
    3. epoch_mrcnn_class_loss : 클래스가 정확한지 판단하는 값
    4. epoch_mrcnn_mask_loss : 인스턴스의 모양(픽셀이 인스턴스에 올바르게 할당되는지)이 정확한지 판단하는 값
    5. epoch_rpn_bbox_loss : bbox의 크기가 맞는지 판단하는 값
    6. epocj_rpn_class_loss : bbox의 클래스가 맞는지 확인하는 값

  • 6개의 로스를 보면서 계속 모델을 튜닝하는 과정을 거치는데 실제 모델에서는 1개의 클래스만 존재하기 때문에 2, 4, 5번만 활용하여 loss를 확인한다.


참고 링크 : https://www.debugcn.com/ko/article/45423969.html

4. 모델 튜닝 & 검증

  • 모델을 학습할때엔 stackoverflow에 모델을 향상시킬 수 있는 내용으로 많이 나와있어서 참고할만한 내용이 있었다.
1. head만 훈련시키는 것보다 all을 추가하여 훈련시키는 것이 좋다.
2. default option( head layer epoch = 100회, 4+ layer (fine tune resnet stage 4 and up) epoch = 60, all layer epoch = 10)도 성능이 좋다.
3. augmentation은 복잡하게 적용하는 것보다 fipud, fliplr, rotating가 적당하다고 함.
4. 옵티마이저로 SGD with clipnorm가 적당(적용중). Adam은 빠르나 local optimal가 어려움
5. 데이터셋을 cluster(likes gray, color, HSV... )로 나누는 것은 도움이 되지 않는다고함
6. 데이터셋 확보
7. 높은 weight decay(즉, L2 regularization)
8. k-fold cross-validation
9. anchor scale 낮추기(예시 : I tried anchor scale (4, 8, 16, 32, 64), (8, 16, 32, 64,128) and it performed worse than (16, 32, 64, 128, 256))

5. 테스트 결과 확인

  • 아직 완벽한 모델을 찾고 있는 중이지만, 지금같은 결과를 통해 최적화 시켜 나간다면 좋은 결과로 나올 수 있다고 생각한다.

활용 링크 : https://github.com/akTwelve/Mask_RCNN

profile
데이터 분석하고 있습니다
post-custom-banner

0개의 댓글