티스토리 뷰

Develope/Python

Detectron - 응용편2 #validation

Jason park@ 2021. 8. 4. 14:58
반응형

이전글 : 2021.08.04 - [Develope/Python] - Detectron - 응용편1 #image labeling

 

Detectron - 응용편1 #image labeling

detectron 샘플 예제를 응용하기 위해 직접 모델을 만들어 보기로 한다. 안경을 구분해 내는 모델을 만들어 보도록 한다. 훈련용 이미지에 labeling 을 해줘야 하는데, 여러가지 툴 중 Polygon 형태의 lab

brtech.tistory.com

 

이전 응용편에 이어 validation 과정을 진행해볼 차례이다.

기본 코드는 샘플과 동일하며 다른점은 dataset 을 불러오는것과 validation 용 이미지를 불러오는 방식이 다를뿐 샘플과 완전히 동일하다.

샘플에서는 validation 용 이미지 파일 리스트가 json 파일로 되어있었지만, 굳이 따로 json 파일을 만들 필요 없이 이미지 폴더를 탐색하고 리스트화를 시키면 된다.

코드는 다음과 같다.

import numpy as np
import os, json, cv2, random

from detectron2 import model_zoo
from detectron2.structures import BoxMode
from detectron2.config import get_cfg
from detectron2.engine import DefaultPredictor
from detectron2.utils.visualizer import ColorMode
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog, DatasetCatalog
from detectron2.data.datasets import register_coco_instances

from os import listdir
from os.path import isfile, join

if __name__ == '__main__':


    json_file_path = "./result_coco.json"
    dataset_dir = "./"
    register_coco_instances("glasses_dataset", {}, json_file_path, dataset_dir)
    glasses_metadata = MetadataCatalog.get("glasses_dataset")

    cfg = get_cfg()

    # without cuda
    cfg.MODEL.DEVICE = "cpu"

    cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
    cfg.DATASETS.TRAIN = ("glasses_dataset",)
    cfg.DATASETS.TEST = ()
    cfg.DATALOADER.NUM_WORKERS = 2
    # cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")  # Let training initialize from model zoo
    cfg.SOLVER.IMS_PER_BATCH = 2
    cfg.SOLVER.BASE_LR = 0.00025  # pick a good LR
    cfg.SOLVER.MAX_ITER = 300    # 300 iterations seems good enough for this toy dataset; you will need to train longer for a practical dataset
    cfg.SOLVER.STEPS = []        # do not decay learning rate
    cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128   # faster, and good enough for this toy dataset (default: 512)
    cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1  # only has one class (ballon). (see https://detectron2.readthedocs.io/tutorials/datasets.html#update-the-config-for-new-datasets)
    # NOTE: this config means the number of classes, but a few popular unofficial tutorials incorrect uses num_classes+1 here.

    cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth")  # path to the model we just trained
    cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7   # set a custom testing threshold
    predictor = DefaultPredictor(cfg)

    from detectron2.engine import DefaultTrainer
    os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
    trainer = DefaultTrainer(cfg)
    trainer.resume_or_load(resume=True)

    # validation image list load
    files = [f for f in listdir(dataset_dir + "val") if isfile(join(dataset_dir + "val", f))]
    for d in random.sample(files, 5):
        img = dataset_dir + "val/"+d
        print(img)
        im = cv2.imread(img)
        outputs = predictor(im)
        v = Visualizer(im[:, :, ::-1],
                       metadata=glasses_metadata,
                       scale=0.5,
                       instance_mode=ColorMode.IMAGE_BW   # remove the colors of unsegmented pixels. This option is only available for segmentation models
                       )
        out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
        print(outputs)
        cv2.imshow("image", out.get_image()[:, :, ::-1])
        cv2.waitKey(0)
        cv2.destroyAllWindows()



    from detectron2.evaluation import COCOEvaluator, inference_on_dataset
    from detectron2.data import build_detection_test_loader
    evaluator = COCOEvaluator("glasses_dataset", ("bbox", "segm"), False, output_dir="./output/")
    val_loader = build_detection_test_loader(cfg, "glasses_dataset")
    print(inference_on_dataset(trainer.model, val_loader, evaluator))

안경을 쓴 사람과 안경을 쓰지 않은 사람 모두 잘 구분해 내고 검증 결과 또한 좋은 점수가 나왔다.

 

어떻게 구분해 내는지.. 마냥 신기할 따름이다 

책으로 이론을 공부하고 있지만 아직도 잘 모르겠다..

무튼, 응용편을 이렇게 마무리 한다. 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함