• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

Segmentation

23.03.23 00:11 작성 23.04.03 08:46 수정 조회수 526

0

안녕하세요, 선생님.

pretrained 모델을 기반으로 해서 segmentation하는 custom 모델을 만드려고합니다.

관련 코드가 섹션 15 Mask RCNN에 opencv_mask_rcnn_infrence인 것 같아 참고하고 있는데요.

그래서 먼저 CVAT 툴을 이용하여 train, val job을 각각 만들고 폴리곤으로 이미지에 손상 영역을 그려주었습니다.

이후, Export job dataset - coco 1.0 포맷으로 내보냈는데

  1. coco 1.0과 coco kepoints 1.0의 포맷 차이가 궁금합니다. 그리고 어떤 포맷으로 내보내는게 정답인지도 궁금합니다.

  2.  또, 그리고 나서 labels_to_names_seq= {0:'gap'} 로 클래스명을 수정 매핑해주고

    다른 코드는 수정하지 않고 돌리는데 오류가 떠서 무슨 문제인지 몰라 여쭤봅니다.

     

  3. 추가적으로 전혀 다른 분야의 새로운 이미지를 라벨링해서 쓸 때 어떠한 부분을 수정하여야 하고 유의해서 써야하는 지 답변해주실 수 있으실까요..부탁드립니다!

답변 4

·

답변을 작성해보세요.

0

안녕하세요, 강사님.

저번 train_detector(model, datasets, cfg, distributed=False, validate=False)으로 일단 코드를 고쳐서 돌려보라고 주신 답변에 학습은 잘 되었습니다. 감사드립니다!

이번에는 mm_mask_rcnn_train_balloon 같은 코드를 custom 데이터셋에서 클래스를 하나에서 두개로 추가하여 돌리고 있는 중입니다.

# epochs는 config의 runner 파라미터로 지정됨. 기본 12회 
train_detector(model, datasets, cfg, distributed=False, validate=False)

이번에는 여기서 'NoneType' object has no attribute 'get' 오류가 떠서 해결을 못하고 있는데 혹시 도움을 주실 수 있으실까요?

image

아, 질문 업데이트가 또 있는 걸 놓쳤군요.

그런데, 전체 코드를 안보고 오류 내용으로만 봐서는 뭐가 문제인지 잘 모르겠습니다만,

오류 내용으로는 config에서 train_cfg가 none이여서 오류가 발생하는 것으로 보입니다. config 설정을 다시 한번 확인 부탁드립니다.

그리고 지금 이 질문 thread는 제가 쫓아가기 힘들게 되어 있어서 가급적이면 더 이상 여기에 업데이트 하지 마시고 새롭게 질문을 올려 주셨으면 합니다.

0

추가적으로 mm_mask_rcnn_train_balloon 를 구글 코랩에서 학습을 시킬 때

image

이 부분에서 "세션이 다운되었습니다." 라는 경고창이 뜨면서 학습이 중단되어서

function ClickConnect()도 콘솔창에 붙여넣어보고 코랩 pro 버전도 사보았는데 똑같은 문제가 계속 발생해서 학습이 완료되지 않습니다. 무엇이 문제인지 여쭤봐도 될까요?

아래는 세션이 다운되었습니다 경고창이 뜨면서 나타난 결과창입니다..!

2023-03-28 02:17:28,439 - mmdet - INFO - Automatic scaling of learning rate (LR) has been disabled.
2023-03-28 02:17:28,450 - mmdet - INFO - load checkpoint from local path: /content/mmdetection/checkpoints/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
2023-03-28 02:17:28,700 - mmdet - WARNING - The model and loaded state dict do not match exactly

size mismatch for roi_head.bbox_head.fc_cls.weight: copying a param with shape torch.Size([81, 1024]) from checkpoint, the shape in current model is torch.Size([2, 1024]).
size mismatch for roi_head.bbox_head.fc_cls.bias: copying a param with shape torch.Size([81]) from checkpoint, the shape in current model is torch.Size([2]).
size mismatch for roi_head.bbox_head.fc_reg.weight: copying a param with shape torch.Size([320, 1024]) from checkpoint, the shape in current model is torch.Size([4, 1024]).
size mismatch for roi_head.bbox_head.fc_reg.bias: copying a param with shape torch.Size([320]) from checkpoint, the shape in current model is torch.Size([4]).
size mismatch for roi_head.mask_head.conv_logits.weight: copying a param with shape torch.Size([80, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([1, 256, 1, 1]).
size mismatch for roi_head.mask_head.conv_logits.bias: copying a param with shape torch.Size([80]) from checkpoint, the shape in current model is torch.Size([1]).
2023-03-28 02:17:28,709 - mmdet - INFO - Start running, host: root@21ec773421f3, work_dir: /content/tutorial_exps
2023-03-28 02:17:28,710 - mmdet - INFO - Hooks will be executed in the following order:
before_run:
(VERY_HIGH   ) StepLrUpdaterHook                  
(NORMAL      ) CheckpointHook                     
(LOW         ) EvalHook                           
(VERY_LOW    ) TextLoggerHook                     
 -------------------- 
before_train_epoch:
(VERY_HIGH   ) StepLrUpdaterHook                  
(NORMAL      ) NumClassCheckHook                  
(LOW         ) IterTimerHook                      
(LOW         ) EvalHook                           
(VERY_LOW    ) TextLoggerHook                     
 -------------------- 
before_train_iter:
(VERY_HIGH   ) StepLrUpdaterHook                  
(LOW         ) IterTimerHook                      
(LOW         ) EvalHook                           
 -------------------- 
after_train_iter:
(ABOVE_NORMAL) OptimizerHook                      
(NORMAL      ) CheckpointHook                     
(LOW         ) IterTimerHook                      
(LOW         ) EvalHook                           
(VERY_LOW    ) TextLoggerHook                     
 -------------------- 
after_train_epoch:
(NORMAL      ) CheckpointHook                     
(LOW         ) EvalHook                           
(VERY_LOW    ) TextLoggerHook                     
 -------------------- 
before_val_epoch:
(NORMAL      ) NumClassCheckHook                  
(LOW         ) IterTimerHook                      
(VERY_LOW    ) TextLoggerHook                     
 -------------------- 
before_val_iter:
(LOW         ) IterTimerHook                      
 -------------------- 
after_val_iter:
(LOW         ) IterTimerHook                      
 -------------------- 
after_val_epoch:
(VERY_LOW    ) TextLoggerHook                     
 -------------------- 
after_run:
(VERY_LOW    ) TextLoggerHook                     
 -------------------- 
2023-03-28 02:17:28,713 - mmdet - INFO - workflow: [('train', 1)], max: 36 epochs
2023-03-28 02:17:28,717 - mmdet - INFO - Checkpoints will be saved to /content/tutorial_exps by HardDiskBackend.
2023-03-28 02:18:51,959 - mmdet - INFO - Saving checkpoint at 12 epochs
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 5/5, 1.3 task/s, elapsed: 4s, ETA:     0s2023-03-28 02:18:58,414 - mmdet - INFO - Evaluating bbox...
2023-03-28 02:18:58,446 - mmdet - INFO - 
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.112
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=1000 ] = 0.205
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=1000 ] = 0.065
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.200
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.018
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.272
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=300 ] = 0.272
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=1000 ] = 0.272
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.400
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.071
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = -1.000

2023-03-28 02:18:58,447 - mmdet - INFO - Evaluating segm...
/usr/local/lib/python3.9/dist-packages/mmdet-2.28.2-py3.9.egg/mmdet/datasets/coco.py:470: UserWarning: The key "bbox" is deleted for more accurate mask AP of small/medium/large instances since v2.12.0. This does not change the overall mAP calculation.
  warnings.warn(
2023-03-28 02:18:58,480 - mmdet - INFO - 
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.077
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=1000 ] = 0.209
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=1000 ] = 0.008
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.136
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.015
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.250
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=300 ] = 0.250
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=1000 ] = 0.250
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.382
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.043
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = -1.000

2023-03-28 02:18:58,481 - mmdet - INFO - Epoch(val) [12][5]	bbox_mAP: 0.1117, bbox_mAP_50: 0.2054, bbox_mAP_75: 0.0645, bbox_mAP_s: 0.2002, bbox_mAP_m: 0.0178, bbox_mAP_l: -1.0000, bbox_mAP_copypaste: 0.1117 0.2054 0.0645 0.2002 0.0178 -1.0000, segm_mAP: 0.0770, segm_mAP_50: 0.2095, segm_mAP_75: 0.0079, segm_mAP_s: 0.1363, segm_mAP_m: 0.0149, segm_mAP_l: -1.0000, segm_mAP_copypaste: 0.0770 0.2095 0.0079 0.1363 0.0149 -1.0000
Loading and preparing results...
DONE (t=0.00s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *bbox*
DONE (t=0.02s).
Accumulating evaluation results...
DONE (t=0.01s).
Loading and preparing results...
DONE (t=0.00s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *segm*
DONE (t=0.02s).
Accumulating evaluation results...
DONE (t=0.01s).

아, 세션이 다운되었습니다. 댓글도 있군요..

제가 질문 게시판 새로운 UI에 적응이 여전히 잘 안되네요 ^^;;

근데, 올려 주신 메시지만 봐서는 세션 다운되었습니다 오류 메시지가 보이지는 않습니다만.. 메시지만 봐서는 성공적으로 학습이 완료된 것 같습니다.

train_detector()호출 시에 최종적으로 학습 수행하면서 오류가 발생하는 건가요?

그리고, 세션 다운되었습니다 오류가 강의 실습 코드를 돌릴때 발생하나요? 아님 Custom 데이터로 작성한 코드를 돌릴 때 발생하는 건지요? 강의 실습 코드이면 어떤 실습인지 기재 부탁드립니다.

세션이 다운되었습니다는 코랩에서 아마도 메모리등이 부족한 경우에 발생하기 쉽습니다. 코랩에서 커널 초기화 후에도 여전히 해당 오류가 발생하는 지 확인 부탁드립니다.

 

아닙니다. 답변 주시는 것만으로도 너무 감사하게 생각하고 있습니다!

image이미지가 잘 보이실지 모르겠으나 train_detector()를 호출 시에 학습을 수행하면서 아래 하단에 "세션이 다운되었습니다. 자동으로 다시 시작하는 중입니다." 창이 뜨고 학습이 중단됩니다.

코랩에서 커널 초기화하였고 코랩 프로 버전도 구매한 상태입니다.

강의 실습 코드는 mm_mask_rcnn_train_balloon를 참고하였고 데이터는 개인적으로 가지고 있는 이미지를 사용하여 CVAT 툴로 폴리곤 그려주고 COCO로 저장하여 경로만 맞게 설정해주었습니다.

+추가) 지금 원래 강의 코드인 mm_mask_rcnn_train_balloon도 코랩에서 돌려보니 같은 부분에서 오류가 똑같이 발생합니다..!

image

음, 저는 코랩에서 별문제 없이 balloon 데이터 세트로 학습이 됩니다만,

아직도 여전히 session down이 되면서 학습이 안되나요? 코랩 같은 경우 가끔 스스로 session down이 되는 경우가 있습니다. 다시 한번 실습을 수행해 보시고 결과 부탁드립니다. 그리고 원본 실습 코드를 변경하셨을 수도 있으니까 다시 실습 코드를 다운로드 받으시고 balloon 데이터 세트를 수행 부탁드립니다.

여전히 안되시면 코랩에서 런타임->런타임 유형 변경에서 GPU가 잡혀 있는지 확인 부탁드립니다.

그리고 코랩 cell에서 !nvidia-smi 를 입력하셔서 결과를 올려 주십시요.

다시 실습 코드를 다운로드 받고 balloon 데이터 세트를 수행했을 때 똑같이 세션 다운 되었습니다 오류가 뜨고 그 때 당시 잡혀있는 GPU창입니다. GPU 등급을 프리미엄으로 하고 런타임 구성을 고용량 RAM 으로 바꾸는 것이 좋을까요?

image코랩 cell에서 !nvidia-smi 를 입력해서 나온 결과창 같이 올려드립니다!

image

음. train_detector()호출시 validation 수행을 하면 뭔가 문제가 발생하는 군요.

원인 파악은 제가 시간이 필요할 것 같습니다. 일단 아래와 같이 validation을 False로 하고 수행해 주십시요.

train_detector(model, datasets, cfg, distributed=False, validate=False)

일단은 validation을 False로 하고 돌리니까 잘 돌아갑니다 ! 감사합니다.

0

삭제된 글입니다

오류 메시지의 내용을 일단 먼저 보셨으면 합니다.

draw_segment()를 뭔가 잘못 작성한것 같습니다. 다시한번 draw_segment()함수를 확인해 보십시요.

 

앗, 이게 댓글이 있었군요.

제가 댓글 알람이 너무 많이 와서... 거기다 인프런 질문 게시판 UI가 바뀌는 바람에 댓글이 있는지 한눈에 확인이 안되었군요. 답변이 좀 늦었습니다.

올려주신 내용으로 봐서는 draw_segment()함수 내에서 for loop를 돌지 않고, 바로 return masked_image를 수행하기 때문에 오류가 나는것 같습니다.

ann_seg_list가 값이 없는 리스트 같습니다.

음.. 그런데 본 강의는 파이썬에 대한 어느 정도 기본기가 있으셔야 합니다. 파이썬을 좀 더 시간 투자를 하고 본 강의를 들으시면 어떨까 싶습니다.

 

 

 

0

안녕하십니까,

  1. coco 1.0 포맷으로 해주시면 됩니다. kepoint는 아마 key point를 의미하신것 같습니다만, 이건 이미지의 key point만 만들어줍니다. coco keypoints 로 검색해보시면 어떤 건지 금방 확인하실 수 있을 것입니다.

  2. 위 코드에서 s_mask_b 가 is not defined 오류가 발생했다는 것은 위 코드에서 if score > conf_threshold 내의 로직이 수행되지 않아서 s_mask_b 가 값이 할당이 되지 않은 것입니다. 지금 학습 하신 모델 성능이 별로 안좋은 것 같습니다. score값과 conf_threshold 값을 비교해 보셔서 score값이 conf_threshold보다 작으면 conf_threshold 값을 낮춰서 진행해 보십시요.

     

  3. 음... 어떻게 답변드려야 할지 살짝 난감한 부분이 있군요. 지금 강의 전체가 여러가지 다른 이미지 segmentation들을 실습해 보면서 전혀 다른 분야의 새로운 이미지를 segmentation에 익숙해 지게 위해서 구성이 되어 있습니다만...

    헷갈리는 부분이 있으면 강의 내용을 천천히 다시 보시고 따라해 보시면 어떨까 싶습니다.

    안되는 부분이 있으면 질문 올려 주십시요.

감사합니다.

답변 감사드립니다!

s_mask_b 문제가 제가 가진 이미지에 맞게 학습을 시키는 단계를 거치지 않아 나타난 문제인 것 같습니다. 그래서 제가 가진 이미지 데이터셋에 맞게 학습을 시키는데 mm_mask_rcnn_train_balloon 코드가 더 적절해보여 다시 시도를 하고있습니다.

그러는 중에 아래와 같은 문제가 발생하였는데

CVAT에서 부터 잘못된 문제일까요,,?

image혼자 공부하다 보니 질문할 데가 마땅하지 않아 이렇게 질문드립니다..감사합니다!

coco.loadimgs()는 인자로 image id값을 가지는데 coco.loadimgs(0) 의 의미는 image id가 0을 입력받게 됩니다.

그런데 바로 위 라인 imgIds = coco.getImgIds(catIds=catIds ) 결과를 보시면 imgIds가 1
~ 5 까지 입니다. 즉 image id 0이 없습니다.

coco.loadimgs(1)[0]으로 image id 를 1을 줘서 해보십시요.