test_coco.py
cal_area
import os
import pickle
import cv2
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
import sys
FILE = Path(__file__).resolve()
ROOT = FILE.parents[0].parents[0] # YOLOv5 root directory
if str(ROOT) not in sys.path:
sys.path.append(str(ROOT)) # add ROOT to PATH
ROOT = Path(os.path.relpath(ROOT, Path.cwd())) # relative
import src.evaluators.coco_evaluator as coco_evaluator
import src.evaluators.pascal_voc_evaluator as pascal_voc_evaluator
import src.utils.converter as converter
import src.utils.general_utils as general_utils
from src.bounding_box import BoundingBox
from src.utils.enumerators import BBFormat, BBType, MethodAveragePrecision
#############################################################
# DEFINE GROUNDTRUTHS AND DETECTIONS
#############################################################
current_dir = os.path.dirname(os.path.realpath(__file__))
dir_imgs = 'C:\\D\\code\\yolov5\\val\\images'
dir_gts = 'C:\\D\\code\\yolov5\\val\\labels'
dir_dets = 'C:\\D\\code\\yolov5\\runs\\val\\exp_CIOU300\\labels'
filepath_yolo_names = 'C:\\D\\code\\ship.names'
gt_bbs = converter.yolo2bb(dir_gts, dir_imgs, filepath_yolo_names, bb_type=BBType.GROUND_TRUTH)
det_bbs = converter.yolo2bb(dir_dets, dir_imgs, filepath_yolo_names, bb_type=BBType.DETECTED)
small=200**2
medium=550**2
large=np.inf#np.inf
gt_bbs = converter.yolo2bb(dir_gts, dir_imgs, filepath_yolo_names, bb_type=BBType.GROUND_TRUTH)
N=len(gt_bbs)
N_s=0
N_m=0
N_l=0
for i in range(N):
area_i=gt_bbs[i].get_area()
if area_i <small:
N_s=N_s+1
elif (area_i>=small) & (area_i<medium):
N_m=N_m+1
elif (area_i>=medium) & (area_i<large):
N_l=N_l+1
print(">= medium <%s large_size's num is =%s, percent is %s"%(large,N_l,N_l/N))
print(">=small <%s medium_size's num is =%s, percent is %s"%(medium,N_m,N_m/N))
print("<%s small_size's num is =%s, percent is %s"%(small,N_s,N_s/N))
print("total num",N)
#############################################################
# EVALUATE WITH COCO METRICS
#############################################################
coco_res1 = coco_evaluator.get_coco_summary(gt_bbs, det_bbs)
#coco_res2 = coco_evaluator.get_coco_metrics(gt_bbs, det_bbs)
print(coco_res1)
设置small medium large的像素范围
small = {
#i: _evaluate(iou_threshold=i, max_dets=100, area_range=(0, 32**2))##
i: _evaluate(iou_threshold=i, max_dets=100, area_range=(50**2, 100**2))##
for i in iou_thresholds
}
APsmall = [x['AP'] for k in small for x in small[k] if x['AP'] is not None]
APsmall = np.nan if APsmall == [] else np.mean(APsmall)
ARsmall = [
x['TP'] / x['total positives'] for k in small for x in small[k] if x['TP'] is not None
]
ARsmall = np.nan if ARsmall == [] else np.mean(ARsmall)
medium = {
#i: _evaluate(iou_threshold=i, max_dets=100, area_range=(32**2, 96**2))
i: _evaluate(iou_threshold=i, max_dets=100, area_range=(100**2, 200**2))
for i in iou_thresholds
}
APmedium = [x['AP'] for k in medium for x in medium[k] if x['AP'] is not None]
APmedium = np.nan if APmedium == [] else np.mean(APmedium)
ARmedium = [
x['TP'] / x['total positives'] for k in medium for x in medium[k] if x['TP'] is not None
]
ARmedium = np.nan if ARmedium == [] else np.mean(ARmedium)
large = {
#i: _evaluate(iou_threshold=i, max_dets=100, area_range=(96**2, np.inf))
i: _evaluate(iou_threshold=i, max_dets=100, area_range=(550**2, np.inf))
for i in iou_thresholds
}
ref
https://github.com/rafaelpadilla/review_object_detection_metrics