mmdetectionでカスタムCOCOデータセットに対応する方法

**mmdetectionでカスタムデータに対応するための邪道な方法です**

公式ではcustomdataset用のconfigで元のconfigを
overwriteして使う方法が出ていますが…

これモデルを変えるごとにoverwriteするパラメータが違うので
configいちいち作らねばなりません

元のconfigたちはcocoのデータセットがデフォルトで入っているため
cocoの情報をいじればモデル変更時のconfig書き換えを最小限にできます

・カスタムデータセット（1クラス）を準備
・データ形式はcoco
・フォルダ構造（フォルダ構造はこの通りにつくることでconfig書き換えの手間が大幅削減）
　　├─coco
　　│ ├─annotations
　　│ │ ├─instances_train2017.json
　　│ │ └─instances_val2017.json
　　│ ├─train2017(train用画像のフォルダ)
　　│ └─val2017（valid用画像のフォルダ）


#### mmdet/datasets/coco.pyの変更

mmdet/datasets/coco.pyにcocoのクラス名が記載されています
そこをカスタムデータセットに合うように変更します
paletteは表示の色なのでお好みで

13行目付近
```mmdet/datasets/coco.py
@DATASETS.register_module()
class CocoDataset(BaseDetDataset):
    """Dataset for COCO."""
    METAINFO = {
        'classes':
        ('abnormal'),
        # palette is a list of color tuples, which is used for visualization.
        'palette':
        [(220, 20, 60)]
    }
    # METAINFO = {
    #     'classes':
    #     ('person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train',
    #      'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign',
    #      'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep',
    #      'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella',
    #      'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard',
    #      'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard',
    #      'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork',
    #      'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange',
    #      'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair',
    #      'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv',
    #      'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave',
    #      'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase',
    #      'scissors', 'teddy bear', 'hair drier', 'toothbrush'),
    #     # palette is a list of color tuples, which is used for visualization.
    #     'palette':
    #     [(220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), (106, 0, 228),
    #      (0, 60, 100), (0, 80, 100), (0, 0, 70), (0, 0, 192), (250, 170, 30),
    #      (100, 170, 30), (220, 220, 0), (175, 116, 175), (250, 0, 30),
    #      (165, 42, 42), (255, 77, 255), (0, 226, 252), (182, 182, 255),
    #      (0, 82, 0), (120, 166, 157), (110, 76, 0), (174, 57, 255),
    #      (199, 100, 0), (72, 0, 118), (255, 179, 240), (0, 125, 92),
    #      (209, 0, 151), (188, 208, 182), (0, 220, 176), (255, 99, 164),
    #      (92, 0, 73), (133, 129, 255), (78, 180, 255), (0, 228, 0),
    #      (174, 255, 243), (45, 89, 255), (134, 134, 103), (145, 148, 174),
    #      (255, 208, 186), (197, 226, 255), (171, 134, 1), (109, 63, 54),
    #      (207, 138, 255), (151, 0, 95), (9, 80, 61), (84, 105, 51),
    #      (74, 65, 105), (166, 196, 102), (208, 195, 210), (255, 109, 65),
    #      (0, 143, 149), (179, 0, 194), (209, 99, 106), (5, 121, 0),
    #      (227, 255, 205), (147, 186, 208), (153, 69, 1), (3, 95, 161),
    #      (163, 255, 0), (119, 0, 170), (0, 182, 199), (0, 165, 120),
    #      (183, 130, 88), (95, 32, 0), (130, 114, 135), (110, 129, 133),
    #      (166, 74, 118), (219, 142, 185), (79, 210, 114), (178, 90, 62),
    #      (65, 70, 15), (127, 167, 115), (59, 105, 106), (142, 108, 45),
    #      (196, 172, 0), (95, 54, 80), (128, 76, 255), (201, 57, 1),
    #      (246, 0, 122), (191, 162, 208)]
    # }
```

#### mmdet/evaluation/functional/class_names.pyの変更

72行目付近
```mmdet/evaluation/functional/class_names.py
def coco_classes() -> list:
    """Class names of COCO."""
    # return [
    #     'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train',
    #     'truck', 'boat', 'traffic_light', 'fire_hydrant', 'stop_sign',
    #     'parking_meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep',
    #     'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella',
    #     'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard',
    #     'sports_ball', 'kite', 'baseball_bat', 'baseball_glove', 'skateboard',
    #     'surfboard', 'tennis_racket', 'bottle', 'wine_glass', 'cup', 'fork',
    #     'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange',
    #     'broccoli', 'carrot', 'hot_dog', 'pizza', 'donut', 'cake', 'chair',
    #     'couch', 'potted_plant', 'bed', 'dining_table', 'toilet', 'tv',
    #     'laptop', 'mouse', 'remote', 'keyboard', 'cell_phone', 'microwave',
    #     'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase',
    #     'scissors', 'teddy_bear', 'hair_drier', 'toothbrush'
    # ]
    return [
        'abnormal'
    ]
```

#### configのnum_classesを変更
使いたいモデルのconfigを開いてnum_classesを探してください
cocoはデフォルトnum_classes=80になっているので今回はnum_classes=1にします

**以上！**


**学習はこちらを参考にどうぞ**

https://qiita.com/takekappa/items/acb8df6d70ca399aa171