object-detection / evaluator.py
mingyang91's picture
fix runtime error in coco evaluator
1d08b5b verified
import shutil
from typing import Callable
from PIL.Image import Image
from coco_eval import CocoEvaluator
from tqdm import tqdm
from yolo_dataset import YoloDataset, MaterialYoloDataset
from yolo_model import YoloModel
image_loader = Callable[[str], Image]
def coco_evaluate(model: YoloModel, dataset: YoloDataset, confidence_threshold=0.6):
coco_gt = dataset.to_coco()
# initialize evaluator with ground truth (gt)
evaluator = CocoEvaluator(coco_gt=coco_gt, iou_types=["bbox"])
print("Running evaluation...")
coco_anns = []
for image_id, annotations in tqdm(coco_gt.imgToAnns.items()):
# get the inputs
image = coco_gt.imgs[image_id]
results = model.model(source=dataset.load_image(image["file_name"]))
for result in results:
coco_anns.extend(yolo_boxes_to_coco_annotations(image_id, result.boxes,
confidence_threshold=confidence_threshold))
evaluator.update(coco_anns)
evaluator.synchronize_between_processes()
evaluator.accumulate()
evaluator.summarize()
def yolo_evaluator(model: YoloModel, dataset: YoloDataset):
return Metrics(model=model, material=dataset.to_material())
class Metrics:
def __init__(self, model: YoloModel, material: MaterialYoloDataset):
self.model = model
self.material = material
self.val = None
def __enter__(self):
if self.val is None:
self.material.__enter__()
self.val = self.model.model.val(data=self.material.yaml)
return self.val
def __exit__(self, exc_type, exc_val, exc_tb):
self.material.__exit__(exc_type, exc_val, exc_tb)
shutil.rmtree(self.val.save_dir)
def yolo_boxes_to_coco_annotations(image_id: int, yolo_boxes, confidence_threshold=0.6):
return [
{
"image_id": int(image_id),
"category_id": int(box.cls.tolist()[0]),
"bbox": box.xywh.tolist()[0],
"score": box.conf.tolist()[0],
}
for box in yolo_boxes if box.conf.tolist()[0] > confidence_threshold
]
def main():
yolo_dataset = YoloDataset.from_path('tests/coco8.zip')
coco_gt = yolo_dataset.to_coco()
model = YoloModel("ultralyticsplus/yolov8s", "yolov8s.pt")
# model = YoloModel("SHOU-ISD/fire-and-smoke", "yolov8n.pt")
# evaluate(model=model, coco_gt=coco_gt, loader=yolo_dataset.load_image, confidence_threshold=0.1)
# Validate the model
with yolo_dataset.to_material() as material:
metrics = model.model.val(data=material.yaml)
print(metrics.box.map) # map50-95
print(metrics.box.map50) # map50
print(metrics.box.map75) # map75
print(metrics.box.maps) # a list contains map50-95 of each category
if __name__ == '__main__':
main()