게시글
질문&답변
local setting 질문
강사님 답변 감사합니다! 강사님 강의와 답변 덕분에 빠른 시간안에 detection model 학습 시켜서 생각보다 아주 아주 좋은 성능의 detector를 만들었습니다. custom data가 제가 볼땐 생각보다 애매한 데이터 들이 많아서 detection시에 혼동하는 경우가 많을 줄 알았는데 정식 테스트를 거치지는 않았지만 거의 95% 검출해 냅니다. 진짜 성능 끝내줍니다. mmdetection을 사용하니 정말 빠른 시간에 모델을 만들 수 있네요! 딥러닝 처음 한지는 오래되었지만, 딥러닝에만 집중하지 못해 4년이라는 시간만큼 뒤쳐져 있었는데 강의 집중해서 듣고 3일만에 segmentation model까지 만들었습니다. 다들 어떻게 이렇게 빨리 만들었냐고 물어보네요 ㅎㅎ 좋은 강의 감사합니다! 남은 부분도 열심히 듣고 궁금한 점이 있으면 또 질문 드리겠습니다!
- 0
- 7
- 626
질문&답변
local setting 질문
마지막으로 하나 더 질문이 있습니다! 제가 아래와 같이 config file을 만들어서 돌렸는데 혹시 한번이라도 train된 model은 어디에 저장되는지 궁금합니다. # The new config inherits a base config to highlight the necessary modification _base_ = 'mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py' # We also need to change the num_classes in head to match the dataset's annotation model = dict( roi_head=dict( bbox_head=dict(num_classes=5), mask_head=dict(num_classes=5))) # Modify dataset related settings dataset_type = 'COCODataset' classes = ('mark_part','hand_1','hand_part','hand_2','mark_body',) data = dict( train=dict( img_prefix='./configs/my_data/', classes=classes, #ann_file='balloon/train/annotation_coco.json'), ann_file='./configs/my_data/my_data_coco_train.json'), ) # We can use the pre-trained Mask RCNN model to obtain higher performance load_from = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth' #load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth' # noqa
- 0
- 7
- 626
질문&답변
local setting 질문
해당 내용이 어디서 수정되어야 하는지 좀 더 찾아보고 수정한 뒤에 결과 공유드리도록 하겠습니다. 추가로 질문이 있습니다. 개인적으로 가지고 있는 데이터셋을 학습시키려고 https://mmdetection.readthedocs.io/en/latest/tutorials/customize_dataset.html 위 링크에 있는 내용을 따라서 세팅한 뒤에 ``` python tools\train.py configs\my_data\mask_rcnn_r50_caffe_fpn_mstrain-poly ``` 위 명령으로 학습을 진행시켰습니다. 두가지 문제가 발생했는데 첫번째로는 (사진) type이 맞지 않는 문제가 3번 연달아 발생했습니다. 해당 파일로 이동해서 곱샘의 형태를 아래와 같이 변경하였습니다. #p[0::2] *= w_scale # origin #p[1::2] *= h_scale # origin p[0::2] = p[0::2] * w_scale # fixed p[1::2] = p[1::2] * h_scale # fixed 곱셈하는곳 두곳과 뺄셈하는 곳 한 곳을 수정하니 정상적으로 train이 시작되었는데 문제가 없는 행동일지 걱정됩니다. 두번째로는 첫번째 epoch 학습이 완료된 이후에 다음과 같은 에러메세지가 나왔습니다. (사진) 저 이미지를 왜 읽으려고 하는건지 궁금합니다. 위 이미지를 읽고자 하는거라면 정상적으로 학습이 되는 상태인게 맞을까요? 답변감사합니다
- 0
- 7
- 626
질문&답변
local setting 질문
안녕하십니까 강사님. 답변 감사합니다. 데이터셋 생성 코드와 config 설정 코드는 아래와 같습니다. 1. 데이터셋 생성 코드 import copy import os.path as osp import cv2 import mmcv import numpy as np from mmdet.datasets.builder import DATASETS from mmdet.datasets.custom import CustomDataset # 반드시 아래 Decorator 설정 할것.@DATASETS.register_module() 설정 시 force=True를 입력하지 않으면 Dataset 재등록 불가. @DATASETS.register_module(force=True) class KittyTinyDataset(CustomDataset): CLASSES = ('Car', 'Truck', 'Pedestrian', 'Cyclist') ##### self.data_root: /content/kitti_tiny/ self.ann_file: /content/kitti_tiny/train.txt self.img_prefix: /content/kitti_tiny/training/image_2 #### ann_file: /content/kitti_tiny/train.txt # annotation에 대한 모든 파일명을 가지고 있는 텍스트 파일을 __init__(self, ann_file)로 입력 받고, 이 self.ann_file이 load_annotations()의 인자로 입력 def load_annotations(self, ann_file): print('##### self.data_root:', self.data_root, 'self.ann_file:', self.ann_file, 'self.img_prefix:', self.img_prefix) print('#### ann_file:', ann_file) cat2label = {k:i for i, k in enumerate(self.CLASSES)} image_list = mmcv.list_from_file(self.ann_file) # 포맷 중립 데이터를 담을 list 객체 data_infos = [] for image_id in image_list: filename = '{0:}/{1:}.jpeg'.format(self.img_prefix, image_id) # 원본 이미지의 너비, 높이를 image를 직접 로드하여 구함. image = cv2.imread(filename) height, width = image.shape[:2] # 개별 image의 annotation 정보 저장용 Dict 생성. key값 filename 에는 image의 파일명만 들어감(디렉토리는 제외) data_info = {'filename': str(image_id) + '.jpeg', 'width': width, 'height': height} # 개별 annotation이 있는 서브 디렉토리의 prefix 변환. label_prefix = self.img_prefix.replace('image_2', 'label_2') # 개별 annotation 파일을 1개 line 씩 읽어서 list 로드 lines = mmcv.list_from_file(osp.join(label_prefix, str(image_id)+'.txt')) # 전체 lines를 개별 line별 공백 레벨로 parsing 하여 다시 list로 저장. content는 list의 list형태임. # ann 정보는 numpy array로 저장되나 텍스트 처리나 데이터 가공이 list 가 편하므로 일차적으로 list로 변환 수행. content = [line.strip().split(' ') for line in lines] # 오브젝트의 클래스명은 bbox_names로 저장. bbox_names = [x[0] for x in content] # bbox 좌표를 저장 bboxes = [ [float(info) for info in x[4:8]] for x in content] # 클래스명이 해당 사항이 없는 대상 Filtering out, 'DontCare'sms ignore로 별도 저장. gt_bboxes = [] gt_labels = [] gt_bboxes_ignore = [] gt_labels_ignore = [] for bbox_name, bbox in zip(bbox_names, bboxes): # 만약 bbox_name이 클래스명에 해당 되면, gt_bboxes와 gt_labels에 추가, 그렇지 않으면 gt_bboxes_ignore, gt_labels_ignore에 추가 if bbox_name in cat2label: gt_bboxes.append(bbox) # gt_labels에는 class id를 입력 gt_labels.append(cat2label[bbox_name]) else: gt_bboxes_ignore.append(bbox) gt_labels_ignore.append(-1) # 개별 image별 annotation 정보를 가지는 Dict 생성. 해당 Dict의 value값은 모두 np.array임. data_anno = { 'bboxes': np.array(gt_bboxes, dtype=np.float32).reshape(-1, 4), 'labels': np.array(gt_labels, dtype=np.long), 'bboxes_ignore': np.array(gt_bboxes_ignore, dtype=np.float32).reshape(-1, 4), 'labels_ignore': np.array(gt_labels_ignore, dtype=np.long) } # image에 대한 메타 정보를 가지는 data_info Dict에 'ann' key값으로 data_anno를 value로 저장. data_info.update(ann=data_anno) # 전체 annotation 파일들에 대한 정보를 가지는 data_infos에 data_info Dict를 추가 data_infos.append(data_info) return data_infos 2. config 코드는 아래와 같습니다. ### Config 설정하고 Pretrained 모델 다운로드 config_file = './mmdetection/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' checkpoint_file = './mmdetection/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' from mmcv import Config cfg = Config.fromfile(config_file) print(cfg.pretty_text) from mmdet.apis import set_random_seed # dataset에 대한 환경 파라미터 수정. cfg.dataset_type = 'KittyTinyDataset' cfg.data_root = './kitti_tiny/' # train, val, test dataset에 대한 type, data_root, ann_file, img_prefix 환경 파라미터 수정. cfg.data.train.type = 'KittyTinyDataset' cfg.data.train.data_root = './kitti_tiny/' cfg.data.train.ann_file = 'train.txt' cfg.data.train.img_prefix = 'training/image_2' cfg.data.val.type = 'KittyTinyDataset' cfg.data.val.data_root = './kitti_tiny/' cfg.data.val.ann_file = 'val.txt' cfg.data.val.img_prefix = 'training/image_2' cfg.data.test.type = 'KittyTinyDataset' cfg.data.test.data_root = './kitti_tiny/' cfg.data.test.ann_file = 'val.txt' cfg.data.test.img_prefix = 'training/image_2' # class의 갯수 수정. cfg.model.roi_head.bbox_head.num_classes = 4 # pretrained 모델 cfg.load_from = './mmdetection/checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' # 학습 weight 파일로 로그를 저장하기 위한 디렉토리 설정. cfg.work_dir = './mmdetection/tutorial_exps' # 학습율 변경 환경 파라미터 설정. cfg.optimizer.lr = 0.02 / 8 cfg.lr_config.warmup = None cfg.log_config.interval = 10 # config 수행 시마다 policy값이 없어지는 bug로 인하여 설정. cfg.lr_config.policy = 'step' # Change the evaluation metric since we use customized dataset. cfg.evaluation.metric = 'mAP' # We can set the evaluation interval to reduce the evaluation times cfg.evaluation.interval = 12 # We can set the checkpoint saving interval to reduce the storage cost cfg.checkpoint_config.interval = 12 # Set seed thus the results are more reproducible cfg.seed = 0 set_random_seed(0, deterministic=False) cfg.gpu_ids = range(1) #cfg.gpu_ids = 1 # We can initialize the logger for training and have a look # at the final config used for training print(f'Config:\n{cfg.pretty_text}') from mmdet.datasets import build_dataset from mmdet.models import build_detector from mmdet.apis import train_detector # train용 Dataset 생성. datasets = [build_dataset(cfg.data.train)] model = build_detector(cfg.model, train_cfg=cfg.get('train_cfg'), test_cfg=cfg.get('test_cfg')) model.CLASSES = datasets[0].CLASSES #-----------------train code ----------------------------- #mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir)) #%cd mmdetection # epochs는 config의 runner 파라미터로 지정됨. 기본 12회 cfg.lr_config.policy = 'step' train_detector(model, datasets, cfg, distributed=False, validate=True) 말씀해주신대로 config 상에 문제가 있는지 확인해보고 있습니다. colab에서 정상동작한 경우의 cfg 값과 local에서 돌리는 cfg 값의 차이가 있음을 확인했습니다. 확인된 내용은 아래와 같습니다. (사진) 다른 내용은 경로상의 차이정도만 있었고 위 차이는 왜 발생하는지 모르겠습니다. 주신 코드를 거의 그대로 돌렸는데 해당부분만 추가로 들어가 있습니다. 혹시 위 내용이 문제가 될까요? 감사합니다!
- 0
- 7
- 626
질문&답변
SignOut을 누르면 다시 로그인 페이지로 진행이 되지 ㅇ낳습니다.
수정해 주신 내용으로 수행해도 로그 아웃이 제대로 되지 않습니다. StreamBuilder도 정상적으로 넣었는데 account page에서 logout 버튼을 눌렀을때 RootPage에 stream이 정상적으로 동작하지 않습니다. 디버그 모드로 확인해봤는데 어떨때는 logout에 따른 onAuthStateChanged가 잡히는데 또 다른 경우에는 안잡힙니다... 어떻게 해결해야 하나요?
- 0
- 4
- 256