ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Deep Learning - 4
    machine learning 2020. 12. 10. 13:53

    Mask-RCNN custom dataset 돌리기 위한 준비

    requirements.txt에 있는 것을 모두 설치해준다음에

    tensorflow-gpu==1.15.0

    gpu를 사용하기 위해 위와 같이 입력.

    keras == 2.0.8, scikit-image = 0.16.2 로 설치해주어야 정상 훈련이 가능하다.

    # Root directory of the project
    
    ROOT_DIR = os.path.abspath("/home/ubuntu/..../.../...")

    프로젝트의 ROOT_DIR을 자신의 경로와 맞게 설정한다.

    그 다음에 configuration을 지정해준다. 여기서 Name은 나중에 .h5 로그 파일이 지정되는 폴더의 이름의 일부가 된다.

    ############################################################
    #  Configurations
    ############################################################
    
    
    class CustomConfig(Config):
        """Configuration for training on the toy  dataset.
        Derives from the base Config class and overrides some values.
        """
        # Give the configuration a recognizable name
        NAME = "object"
    
        # We use a GPU with 12GB memory, which can fit two images.
        # Adjust down if you use a smaller GPU.
        IMAGES_PER_GPU = 2
    
        # Number of classes (including background)
        NUM_CLASSES = 1 + 3  # Background + toy
    
        # Number of training steps per epoch
        STEPS_PER_EPOCH = 100
    
        # Skip detections with < 90% confidence
        DETECTION_MIN_CONFIDENCE = 0.9

    반드시 via_region_data.json파일에 있는 regional_attributes가 올바른지 확인할 것

    아래에서 self.add_class의 Dent, Scratch, Others가 실제로 위의 json파일의 regional attributes에 없을 경우 dimension 관련 에러가 발생하니 꼭 유의 할 것

    제대로 지정하지 않은 경우 아래와 같은 에러가 발생한다.

    def_load_custom만 잘 설정해주면 나머지는 알아서 된다.

    ############################################################
    #  Dataset
    ############################################################
    
    class CustomDataset(utils.Dataset):
    
        def load_custom(self, dataset_dir, subset):
            """Load a subset of the bottle dataset.
            dataset_dir: Root directory of the dataset.
            subset: Subset to load: train or val
            """
            # Add classes. We have only one class to add.
            self.add_class("object", 1, "Dent")
            self.add_class("object", 2, "Scratch")
            self.add_class("object", 3, "Others")
            
    
            # Train or validation dataset?
            assert subset in ["train", "val"]
            dataset_dir = os.path.join(dataset_dir, subset)
    
            # Load annotations
            # VGG Image Annotator saves each image in the form:
            # { 'filename': '28503151_5b5b7ec140_b.jpg',
            #   'regions': {
            #       '0': {
            #           'region_attributes': {},
            #           'shape_attributes': {
            #               'all_points_x': [...],
            #               'all_points_y': [...],
            #               'name': 'polygon'}},
            #       ... more regions ...
            #   },
            #   'size': 100202
            # }
            # We mostly care about the x and y coordinates of each region
            annotations = json.load(open(os.path.join(dataset_dir, "via_region_data.json")))
            annotations = list(annotations.values())  # don't need the dict keys
    
    
            annotations = [a for a in annotations if a['regions']]
            
            # Add images
            for a in annotations:
                # Get the x, y coordinaets of points of the polygons that make up
                # the outline of each object instance. There are stores in the
                # shape_attributes (see json format above)
                # for b in a['regions'].values():
                #    polygons = [{**b['shape_attributes'], **b['region_attributes']}]
                # print("string=", polygons)
                # for r in a['regions'].values():
                #    polygons = [r['shape_attributes']]
                #    # print("polygons=", polygons)
                #    multi_numbers = [r['region_attributes']]
                    # print("multi_numbers=", multi_numbers)
                polygons = [r['shape_attributes'] for r in a['regions'].values()]
                objects = [s['region_attributes'] for s in a['regions'].values()]
                # print("multi_numbers=", multi_numbers)
                # num_ids = [n for n in multi_numbers['number'].values()]
                # for n in multi_numbers:
                num_ids = []
                for n in objects:
            	#        print(n)
            	#print(type(n))
                    try:
                        print(n)
                        if 'Dent' == n['name']:
                            
                            num_ids.append(1)
                        elif 'Scratch' == n['name']:
                            num_ids.append(2)
                        elif 'Others' == n['name']:
                            num_ids.append(3)
                    except:
                        pass
    
                # print("num_ids=", num_ids)
                # print("num_ids_new=", num_ids_new)
                # categories = [s['region_attributes'] for s in a['regions'].values()]
                # load_mask() needs the image size to convert polygons to masks.
                # Unfortunately, VIA doesn't include it in JSON, so we must read
                # the image. This is only managable since the dataset is tiny.
                image_path = os.path.join(dataset_dir, a['filename'])
                image = skimage.io.imread(image_path)
                height, width = image.shape[:2]
    
                self.add_image(
                    "object",
                    image_id=a['filename'],  # use file name as a unique image id
                    path=image_path,
                    width=width, height=height,
                    polygons=polygons,
                    num_ids=num_ids)

    훈련!!!

    mask rcnn 파일이 있는 곳 까지 가서 파이썬 파일을 실행시켜준다.

    —dataset 과 —weight이 모두 존재해야 훈련이 가능하다

    —weights = 'coco' 는 인터넷에서 코코를 받으면 훈련이 되어 편리하므로 이렇게 사용했음.

    python3 final.py train --dataset=/home/ubuntu/projects/mask_rcnn_damage_detection/new --weights='coco'

    segmentation 해보기

    여기서 weights는 아까 train에서 저장된 h5파일을 지정하면된다.

    그리고 image는 segmentation하고자 하는 이미지를 넣어주면 된다.

    python3 final.py splash --weights=/home/ubuntu/projects/mask_rcnn_damage_detection/logs/balloon20200901T1339/mask_rcnn_balloon_0008.h5 \
    --image=/home/ubuntu/projects/mask_rcnn_damage_detection/customImages/val/38305_2.jpg

     

    'machine learning' 카테고리의 다른 글

    Deep Learning - 6  (0) 2020.12.11
    Deep Learning - 5  (0) 2020.12.10
    Deep Learning - 3  (0) 2020.12.10
    Deep Learning - 2  (0) 2020.12.10
    Deep Learning - 1  (0) 2020.12.10
Designed by Tistory.