Showing
4 changed files
with
275 additions
and
6 deletions
... | @@ -65,18 +65,42 @@ | ... | @@ -65,18 +65,42 @@ |
65 | 65 | ||
66 | ### Precision & Recall | 66 | ### Precision & Recall |
67 | * Precision은 관련 Object만을 식별하는 능력을 나타낸다. | 67 | * Precision은 관련 Object만을 식별하는 능력을 나타낸다. |
68 | -Precision = TP / (TP + FP) 이며, 있는 것을 있다고 예측한 것을 있든 없든 있다고 예측한 것으로 나눈 값이다. | 68 | +Precision = TP / (TP + FP) 이며, 모든 식별 결과 중 옳게 검출한 비율을 의미한다. |
69 | * Recall은 모든 관련 케이스(모든 ground truth bounding boxes)를 찾는 능력을 나타낸다. | 69 | * Recall은 모든 관련 케이스(모든 ground truth bounding boxes)를 찾는 능력을 나타낸다. |
70 | -Recall = TP / (TP + FN) 이며, 있는 것을 있다고 예측한 것을 있는 것을 있다고든 없다고든 예측한 결과로 나눈 값이다. | 70 | +Recall = TP / (TP + FN) 이며, 마땅히 검출해내야하는 물체들 중에서 제대로 검출된 것의 비율을 의미한다. |
71 | 71 | ||
72 | ### PR Curve | 72 | ### PR Curve |
73 | -x축을 Recall, y축을 Precision으로 하여 나타낸 그래프이다. 이 그래프를 통해 object detector의 퍼포먼스를 측정할 수 있다. | 73 | +PR Curve는 confidence 레벨에 대한 threshold 값의 변화에 의한 object detector의 성능을 평가하는 방법이다. |
74 | +이는 x축을 Recall, y축을 Precision으로 하여 나타낸 그래프로 이 그래프를 통해 object detector의 퍼포먼스를 측정할 수 있다. | ||
75 | + | ||
76 | +예를 들어, 15개의 얼굴이 존재하는 어떤 데이터넷에서 한 얼굴을 검출하는 알고리즘에 의해 총 10개의 얼굴이 검출되었다고 가정해보자. 여기서 confidence는 0% ~ 100%까지 모두 고려하였다. | ||
77 | + | ||
78 | +|Detections|Confidences|TP or FP| | ||
79 | +|--|--|--| | ||
80 | +|A|57%|TP| | ||
81 | +|B|78%|TP| | ||
82 | +|C|43%|FP| | ||
83 | +|D|85%|TP| | ||
84 | +|E|91%|TP| | ||
85 | +|F|13%|FP| | ||
86 | +|G|45%|TP| | ||
87 | +|H|68%|FP| | ||
88 | +|I|95%|TP| | ||
89 | +|J|81%|TP| | ||
90 | + | ||
91 | +10개 중 7개는 제대로 검출 (TP) 되었고, 3개는 잘못 검출되었다. (FP) 이때 Precision = 7 / 10 = 0.7이고, Recall은 7 / 15(실제 얼굴 개수) = 0.47이다. | ||
92 | + | ||
93 | +위 결과를 confidence 레벨이 높은 순으로 재정렬하고, threshold를 95%로 정한다면 Precision = 1/1, Recall = 1/15 = 0.067이 된다. | ||
94 | +threshold를 91%로 낮추면 두 개가 검출된 것으로 판단할 것이고, Precision = 1, Recall = 2/15가 된다. | ||
95 | +이렇게 threshold값을 검출들의 confidence 레벨에 맞게 낮춰가면 Precision과 Recall 값이 변화한다. 이 변화하는 Precision과 Recall 값들을 x축을 Recall, Y축을 Precision으로 그래프를 나타내면 그것이 바로 PR Curve이다. | ||
96 | +즉, PR 곡선에서는 **recall 값의 변화에 따른 precision 값을 확인할 수 있다.** | ||
74 | 97 | ||
75 | ## Average Precision(AP) | 98 | ## Average Precision(AP) |
76 | -PR Curve 내부의 면적 값을 계산한다. 모든 Recall 값에서 평균화된 Precision을 나타내는 값이다. | 99 | +PR Curve는 성능을 평가하기에 아주 좋은 방법이지만, 단 하나의 숫자로 성능을 평가할 수 있도록 하기 위해 AP가 도입되었다. AP는 PR Curve에서 선 아래쪽의 면적으로 계산된다. 주어진 PR Curve를 단조적으로 감소하는 그래프가 되게 하기 위해 살짝 손봐준뒤, 아래 면적을 계산함으로서 AP를 구한다. |
77 | 100 | ||
78 | ## mAP | 101 | ## mAP |
79 | -모든 클래스들에 대한 AP의 평균 값이다. . . (https://towardsdatascience.com/map-mean-average-precision-might-confuse-you-5956f1bfa9e2) | 102 | +물체 클래스가 여러개인 경우 각 클래스 당 AP를 구한 다음 그것을 모두 합한 값에 클래스의 갯수로 나눠줌으로서 mAP를 구할 수 있다. |
103 | +(https://towardsdatascience.com/map-mean-average-precision-might-confuse-you-5956f1bfa9e2) | ||
80 | 다시 확인하고 글 남기기. | 104 | 다시 확인하고 글 남기기. |
81 | 105 | ||
82 | ## MOTA (Multiple Object Tracking Accuracy) | 106 | ## MOTA (Multiple Object Tracking Accuracy) |
... | @@ -278,7 +302,7 @@ print(torch.__version__, torch.cuda.is_available()) | ... | @@ -278,7 +302,7 @@ print(torch.__version__, torch.cuda.is_available()) |
278 | # opencv is pre-installed on colab | 302 | # opencv is pre-installed on colab |
279 | ``` | 303 | ``` |
280 | 304 | ||
281 | -이제, detectron2를 설치해주자. | 305 | +이제, detectron2를 설치해주고, 필요한 라이브러리들을 추가해주자. |
282 | ```python | 306 | ```python |
283 | # install detectron2: (Colab has CUDA 10.1 + torch 1.8) | 307 | # install detectron2: (Colab has CUDA 10.1 + torch 1.8) |
284 | # See https://detectron2.readthedocs.io/tutorials/install.html for instructions | 308 | # See https://detectron2.readthedocs.io/tutorials/install.html for instructions |
... | @@ -286,9 +310,253 @@ import torch | ... | @@ -286,9 +310,253 @@ import torch |
286 | assert torch.__version__.startswith("1.8") # need to manually install torch 1.8 if Colab changes its default version | 310 | assert torch.__version__.startswith("1.8") # need to manually install torch 1.8 if Colab changes its default version |
287 | !pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/torch1.8/index.html | 311 | !pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/torch1.8/index.html |
288 | # exit(0) # After installation, you need to "restart runtime" in Colab. This line can also restart runtime | 312 | # exit(0) # After installation, you need to "restart runtime" in Colab. This line can also restart runtime |
313 | + | ||
314 | +# Some basic setup: | ||
315 | +# Setup detectron2 logger | ||
316 | +import detectron2 | ||
317 | +from detectron2.utils.logger import setup_logger | ||
318 | +setup_logger() | ||
319 | + | ||
320 | +# import some common libraries | ||
321 | +import numpy as np | ||
322 | +import os, json, cv2, random | ||
323 | +from google.colab.patches import cv2_imshow | ||
324 | + | ||
325 | +# import some common detectron2 utilities | ||
326 | +from detectron2 import model_zoo | ||
327 | +from detectron2.engine import DefaultPredictor | ||
328 | +from detectron2.config import get_cfg | ||
329 | +from detectron2.utils.visualizer import Visualizer | ||
330 | +from detectron2.data import MetadataCatalog, DatasetCatalog | ||
331 | +``` | ||
332 | + | ||
333 | +먼저, pre-trained된 detectron2 모델을 돌려보자. 먼저 필요한 이미지는 COCO 데이터셋을 이용할 것이다. | ||
334 | +COCO 데이터셋에서 불러온 이미지는 다음과 같다. | ||
335 | +```python | ||
336 | +!wget http://images.cocodataset.org/val2017/000000439715.jpg -q -O input.jpg | ||
337 | +im = cv2.imread("./input.jpg") | ||
338 | +cv2_imshow(im) | ||
339 | +``` | ||
340 | +![coco](./images/coco.png) | ||
341 | + | ||
342 | +그 다음, 우리는 detectron2 configuration과 detectron2 `DefaultPredictor`를 생성하여 위 이미지에 대해 inference를 수행할 것이다. | ||
343 | +```python | ||
344 | +cfg = get_cfg() # detectron2의 default config를 불러온다. | ||
345 | +cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")) # value들을 file로부터 불러온다. | ||
346 | +cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5 # ROI_Heads의 threshold를 0.5로 지정한다. | ||
347 | +cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # model의 가중치를 지정한다. | ||
348 | +predictor = DefaultPredictor(cfg) # 단일의 input 이미지에 대해 단일의 device에서 작동하는 주어진 config에 대해 간단한 end-to-end predictor를 생성한다. | ||
349 | +outputs = predictor(im) # 해당 이미지를 모델에 넣어 얻은 결과물을 반환한다. | ||
350 | +``` | ||
351 | + | ||
352 | +Model의 Output Format에 대해 공식 문서로부터 알아보자. inference 모드에 있을 때, builtin 모델은 각 이미지에 대해 하나의 dict인 list[dict]를 출력한다. 모델이 수행하는 태스크에 따라 각 dict는 다음과 같은 필드를 포함할 수 있다. | ||
353 | +* pred_boxes : 탐지된 인스턴스 당 하나씩 N개의 boxes를 저장하는 Boxes | ||
354 | +* scores : `Tensor`이며, N개의 confidence scores 벡터를 나타낸다. | ||
355 | +* pred_classes : `Tensor`이며, [0,num_categories) 범위 내에 속하는 N개의 레이블 벡터 | ||
356 | +* pred_masks : (N, H, W)의 shape를 갖는 `Tensor`로서 탐지된 각 인스턴스를 나타낸다. | ||
357 | + | ||
358 | +.. 나머지는 [여기](https://detectron2.readthedocs.io/en/latest/tutorials/models.html#model-output-format)에서 자세히 확인할 수 있다. | ||
359 | +```python | ||
360 | +print(outputs["instances"].pred_classes) | ||
361 | +print(outputs["instances"].pred_boxes) | ||
362 | + | ||
363 | +# 결과 | ||
364 | +tensor([17, 0, 0, 0, 0, 0, 0, 0, 25, 0, 25, 25, 0, 0, 24], | ||
365 | + device='cuda:0') | ||
366 | +Boxes(tensor([[126.6035, 244.8977, 459.8291, 480.0000], | ||
367 | + [251.1083, 157.8127, 338.9731, 413.6379], | ||
368 | + [114.8496, 268.6864, 148.2352, 398.8111], | ||
369 | + [ 0.8217, 281.0327, 78.6072, 478.4210], | ||
370 | + [ 49.3954, 274.1229, 80.1545, 342.9808], | ||
371 | + [561.2248, 271.5816, 596.2755, 385.2552], | ||
372 | + [385.9072, 270.3125, 413.7130, 304.0397], | ||
373 | + [515.9295, 278.3744, 562.2792, 389.3802], | ||
374 | + [335.2409, 251.9167, 414.7491, 275.9375], | ||
375 | + [350.9300, 269.2060, 386.0984, 297.9081], | ||
376 | + [331.6292, 230.9996, 393.2759, 257.2009], | ||
377 | + [510.7349, 263.2656, 570.9865, 295.9194], | ||
378 | + [409.0841, 271.8646, 460.5582, 356.8722], | ||
379 | + [506.8767, 283.3257, 529.9403, 324.0392], | ||
380 | + [594.5663, 283.4820, 609.0577, 311.4124]], device='cuda:0')) | ||
381 | +``` | ||
382 | +Visualizer를 이용하여 예측된 결과를 이미지 위에 그릴 수 있다. | ||
383 | +```python | ||
384 | +v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2) | ||
385 | +out = v.draw_instance_predictions(outputs["instances"].to("cpu")) | ||
386 | +cv2_imshow(out.get_image()[:, :, ::-1]) | ||
387 | +``` | ||
388 | +![coco_output](./images/coco_output.png) | ||
389 | + | ||
390 | +이제, COCO 데이터셋의 카테고리에는 존재하지 않는 ballon 데이터를 이용하여 detectron2 모델을 트레이닝 해 볼 것이다. balloon segementation dataset을 COCO 데이터셋을 이용해 pre-trained된 모델에 train시키고, 이 모델이 새로운 클래스인 balloon을 인지할 수 있도록 해 보자. | ||
391 | +먼저, 필요한 데이터를 다운로드 받는다. | ||
392 | +```python | ||
393 | +# download, decompress the data | ||
394 | +!wget https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip | ||
395 | +!unzip balloon_dataset.zip > /dev/null | ||
396 | +``` | ||
397 | + | ||
398 | +다운받은 데이터셋을 detectron2의 트레이닝 시 요구되는 format에 맞게 변환하는 과정을 거친다. | ||
399 | + | ||
400 | +```python | ||
401 | +# if your dataset is in COCO format, this cell can be replaced by the following three lines: | ||
402 | +# from detectron2.data.datasets import register_coco_instances | ||
403 | +# register_coco_instances("my_dataset_train", {}, "json_annotation_train.json", "path/to/image/dir") | ||
404 | +# register_coco_instances("my_dataset_val", {}, "json_annotation_val.json", "path/to/image/dir") | ||
405 | + | ||
406 | +from detectron2.structures import BoxMode | ||
407 | + | ||
408 | +def get_balloon_dicts(img_dir): | ||
409 | + json_file = os.path.join(img_dir, "via_region_data.json") | ||
410 | + with open(json_file) as f: | ||
411 | + imgs_anns = json.load(f) | ||
412 | + | ||
413 | + dataset_dicts = [] | ||
414 | + for idx, v in enumerate(imgs_anns.values()): | ||
415 | + record = {} | ||
416 | + | ||
417 | + filename = os.path.join(img_dir, v["filename"]) | ||
418 | + height, width = cv2.imread(filename).shape[:2] | ||
419 | + | ||
420 | + record["file_name"] = filename | ||
421 | + record["image_id"] = idx | ||
422 | + record["height"] = height | ||
423 | + record["width"] = width | ||
424 | + | ||
425 | + annos = v["regions"] | ||
426 | + objs = [] | ||
427 | + for _, anno in annos.items(): | ||
428 | + assert not anno["region_attributes"] | ||
429 | + anno = anno["shape_attributes"] | ||
430 | + px = anno["all_points_x"] | ||
431 | + py = anno["all_points_y"] | ||
432 | + poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)] | ||
433 | + poly = [p for x in poly for p in x] | ||
434 | + | ||
435 | + obj = { | ||
436 | + "bbox": [np.min(px), np.min(py), np.max(px), np.max(py)], | ||
437 | + "bbox_mode": BoxMode.XYXY_ABS, | ||
438 | + "segmentation": [poly], | ||
439 | + "category_id": 0, | ||
440 | + } | ||
441 | + objs.append(obj) | ||
442 | + record["annotations"] = objs | ||
443 | + dataset_dicts.append(record) | ||
444 | + return dataset_dicts | ||
445 | + | ||
446 | +for d in ["train", "val"]: | ||
447 | + DatasetCatalog.register("balloon_" + d, lambda d=d: get_balloon_dicts("balloon/" + d)) | ||
448 | + MetadataCatalog.get("balloon_" + d).set(thing_classes=["balloon"]) | ||
449 | +balloon_metadata = MetadataCatalog.get("balloon_train") | ||
450 | +``` | ||
451 | + | ||
452 | +데이터가 올바른지 확인하기 위해 training set에서 임의로 선택한 샘플을 시각화해보자. | ||
453 | +```python | ||
454 | +dataset_dicts = get_balloon_dicts("balloon/train") | ||
455 | +for d in random.sample(dataset_dicts, 3): | ||
456 | + img = cv2.imread(d["file_name"]) | ||
457 | + visualizer = Visualizer(img[:, :, ::-1], metadata=balloon_metadata, scale=0.5) | ||
458 | + out = visualizer.draw_dataset_dict(d) | ||
459 | + cv2_imshow(out.get_image()[:, :, ::-1]) | ||
289 | ``` | 460 | ``` |
461 | +![ballon_sample](./images/balloon_sample.png) | ||
290 | 462 | ||
463 | +이제, 풍선 데이터셋을 COCO 데이터셋으로 pre-trained된 R50-FPN Mask R-CNN 모델에 fine-tune 되도록 트레이닝해보자. 트레이닝하는 코드는 다음과 같다. 위에서 `DefaultPredictor`를 사용할 때 이용했던 `get_cfg()`를 또 활용하여 트레이닝한다. | ||
464 | +여기서 `DefaultTrainer`는 default training logic을 이용하여 train하도록 한다. 그 과정은 다음과 같다. | ||
465 | +1. 주어진 config에 의해 정의된 모델, optimizer, dataloader을 이용하여 `SimpleTrainer`를 생성한다. 또한 LR schedular를 생성한다. | ||
466 | +2. 이전에 트레이닝 된 적이 있는지 확인하고 있다면 불러온다. | ||
467 | +3. config에 의해 정의된 common hooks를 등록한다. | ||
291 | 468 | ||
469 | +```python | ||
470 | +from detectron2.engine import DefaultTrainer | ||
471 | + | ||
472 | +cfg = get_cfg() | ||
473 | +cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")) | ||
474 | +cfg.DATASETS.TRAIN = ("balloon_train",) | ||
475 | +cfg.DATASETS.TEST = () | ||
476 | +cfg.DATALOADER.NUM_WORKERS = 2 | ||
477 | +cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") # Let training initialize from model zoo | ||
478 | +cfg.SOLVER.IMS_PER_BATCH = 2 | ||
479 | +cfg.SOLVER.BASE_LR = 0.00025 # pick a good LR | ||
480 | +cfg.SOLVER.MAX_ITER = 300 # 300 iterations seems good enough for this toy dataset; you will need to train longer for a practical dataset | ||
481 | +cfg.SOLVER.STEPS = [] # do not decay learning rate | ||
482 | +cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128 # faster, and good enough for this toy dataset (default: 512) | ||
483 | +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) | ||
484 | +# NOTE: this config means the number of classes, but a few popular unofficial tutorials incorrect uses num_classes+1 here. | ||
485 | + | ||
486 | +os.makedirs(cfg.OUTPUT_DIR, exist_ok=True) | ||
487 | +trainer = DefaultTrainer(cfg) | ||
488 | +trainer.resume_or_load(resume=False) | ||
489 | +trainer.train() | ||
490 | +``` | ||
491 | + | ||
492 | +트레이닝 한 결과 이미지를 확인하는 과정은 tutorial 코드에서 바로 확인할 수 있기 때문에 생략하고, AP를 통해 결과값을 평가하는 부분을 추가해보고자 한다. | ||
493 | +AP metric을 이용하여 퍼포먼스를 측정할 수 있다. AP는 보통 70% 이상이면 좋게 본다고 하는데, 이 부분은 정확하지 않다. | ||
494 | +```python | ||
495 | +from detectron2.evaluation import COCOEvaluator, inference_on_dataset | ||
496 | +from detectron2.data import build_detection_test_loader | ||
497 | +evaluator = COCOEvaluator("balloon_val", ("bbox", "segm"), False, output_dir="./output/") | ||
498 | +val_loader = build_detection_test_loader(cfg, "balloon_val") | ||
499 | +print(inference_on_dataset(trainer.model, val_loader, evaluator)) | ||
500 | + | ||
501 | +# 결과 | ||
502 | +Running per image evaluation... | ||
503 | +Evaluate annotation type *bbox* | ||
504 | +COCOeval_opt.evaluate() finished in 0.01 seconds. | ||
505 | +Accumulating evaluation results... | ||
506 | +COCOeval_opt.accumulate() finished in 0.00 seconds. | ||
507 | + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.668 | ||
508 | + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.847 | ||
509 | + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.797 | ||
510 | + Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.239 | ||
511 | + Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.549 | ||
512 | + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.795 | ||
513 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.222 | ||
514 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.704 | ||
515 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.766 | ||
516 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.567 | ||
517 | + Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.659 | ||
518 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.847 | ||
519 | +[07/08 22:50:53 d2.evaluation.coco_evaluation]: Evaluation results for bbox: | ||
520 | +| AP | AP50 | AP75 | APs | APm | APl | | ||
521 | +|:------:|:------:|:------:|:------:|:------:|:------:| | ||
522 | +| 66.758 | 84.719 | 79.685 | 23.917 | 54.933 | 79.514 | | ||
523 | + | ||
524 | +Running per image evaluation... | ||
525 | +Evaluate annotation type *segm* | ||
526 | +COCOeval_opt.evaluate() finished in 0.01 seconds. | ||
527 | +Accumulating evaluation results... | ||
528 | +COCOeval_opt.accumulate() finished in 0.00 seconds. | ||
529 | + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.768 | ||
530 | + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.842 | ||
531 | + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.840 | ||
532 | + Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.058 | ||
533 | + Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.565 | ||
534 | + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.936 | ||
535 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.248 | ||
536 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.782 | ||
537 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.842 | ||
538 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.600 | ||
539 | + Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.688 | ||
540 | + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.953 | ||
541 | +[07/08 22:50:53 d2.evaluation.coco_evaluation]: Evaluation results for segm: | ||
542 | +| AP | AP50 | AP75 | APs | APm | APl | | ||
543 | +|:------:|:------:|:------:|:-----:|:------:|:------:| | ||
544 | +| 76.799 | 84.203 | 83.958 | 5.838 | 56.506 | 93.572 | | ||
545 | +OrderedDict([('bbox', | ||
546 | + {'AP': 66.7575984802854, | ||
547 | + 'AP50': 84.71906024215401, | ||
548 | + 'AP75': 79.6850976022887, | ||
549 | + 'APl': 79.51426848548515, | ||
550 | + 'APm': 54.933394319629045, | ||
551 | + 'APs': 23.917443214909724}), | ||
552 | + ('segm', | ||
553 | + {'AP': 76.79883944079043, | ||
554 | + 'AP50': 84.20295316611471, | ||
555 | + 'AP75': 83.95779282808186, | ||
556 | + 'APl': 93.57150630750836, | ||
557 | + 'APm': 56.50588544163433, | ||
558 | + 'APs': 5.8381956414264895})]) | ||
559 | +``` | ||
292 | 560 | ||
293 | ### Reference | 561 | ### Reference |
294 | * [갈아먹는 Object Detection](https://yeomko.tistory.com/13?category=888201) | 562 | * [갈아먹는 Object Detection](https://yeomko.tistory.com/13?category=888201) |
... | @@ -298,3 +566,4 @@ assert torch.__version__.startswith("1.8") # need to manually install torch 1. | ... | @@ -298,3 +566,4 @@ assert torch.__version__.startswith("1.8") # need to manually install torch 1. |
298 | * [교수님 강의자료]() | 566 | * [교수님 강의자료]() |
299 | * [detectron2 github](https://github.com/facebookresearch/detectron2) | 567 | * [detectron2 github](https://github.com/facebookresearch/detectron2) |
300 | * [detectron2 documentation](https://detectron2.readthedocs.io/en/latest/tutorials/getting_started.html) | 568 | * [detectron2 documentation](https://detectron2.readthedocs.io/en/latest/tutorials/getting_started.html) |
569 | +* [물체 검출 알고리즘 성능 평가 방법 AP의 이해](https://bskyvision.com/465) | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
post/images/balloon_sample.png
0 → 100644
1020 KB
post/images/coco.png
0 → 100644
708 KB
post/images/coco_output.png
0 → 100644
781 KB
-
Please register or login to post a comment