yolov4tiny / evaluate.py
gbahlnxp's picture
Upload folder using huggingface_hub
1d6d5bf verified
#!/usr/bin/env python3
# Copyright 2023-2024 NXP
# SPDX-License-Identifier: MIT
import wget
import zipfile
import json
import glob
import os
import tensorflow as tf
import numpy as np
from tqdm import tqdm
from pycocotools.cocoeval import COCOeval
from pycocotools.coco import COCO
from example import load_image
from example import decode_output, run_inference, gen_box_colors
OBJECT_DETECTOR_TFLITE = "yolov4-tiny_416_quant.tflite"
SCORE_THRESHOLD = 0.0
NMS_IOU_THRESHOLD = 0.5
INFERENCE_IMG_SIZE = 416
LABEL_MAP = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 27, 28, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 70, 72, 73, 74, 75, 76,
77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90]
COCO_WEBSITE = "http://images.cocodataset.org"
VAL_IMG_URL = COCO_WEBSITE + "/zips/val2017.zip"
VAL_ANNO_URL = COCO_WEBSITE + "/annotations/annotations_trainval2017.zip"
BOX_COLORS = gen_box_colors()
print("Downloading COCO validation dataset...")
response = wget.download(VAL_IMG_URL, "val2017.zip")
response = wget.download(VAL_ANNO_URL, "annotations_trainval2017.zip")
with zipfile.ZipFile("val2017.zip", 'r') as zip_ref:
zip_ref.extractall("coco")
with zipfile.ZipFile("annotations_trainval2017.zip", 'r') as zip_ref:
zip_ref.extractall("coco")
interpreter = tf.lite.Interpreter(OBJECT_DETECTOR_TFLITE)
interpreter.allocate_tensors()
annotations = COCO(annotation_file="coco/annotations/instances_val2017.json")
def evaluate(interpreter):
image_filenames = glob.glob("coco/val2017/*")
results = []
for image_fn in tqdm(image_filenames, desc="Evaluating"):
image_id = int(os.path.splitext(os.path.basename(image_fn))[0])
orig_image, img = load_image(image_fn)
yolo_output = run_inference(interpreter, img)
scores, boxes, classes = decode_output(yolo_output,
SCORE_THRESHOLD,
NMS_IOU_THRESHOLD)
shp = orig_image.shape
boxes = boxes.numpy()
boxes /= INFERENCE_IMG_SIZE
boxes *= np.array([shp[1], shp[0], shp[1], shp[0]])
boxes = boxes.astype(np.int32)
boxes[..., 2] = boxes[..., 2] - boxes[..., 0]
boxes[..., 3] = boxes[..., 3] - boxes[..., 1]
for score, box, clas in zip(scores.numpy(), boxes, classes.numpy()):
results.append({"image_id": image_id,
"category_id": int(LABEL_MAP[clas]),
"bbox": [float(x) for x in list(box)],
"score": float(score)})
return results
predictions = evaluate(interpreter)
with open("predictions.json", "w") as f:
json.dump(predictions, f, indent=4)
predictions = annotations.loadRes("predictions.json")
cocoeval = COCOeval(annotations, predictions, "bbox")
cocoeval.evaluate()
cocoeval.accumulate()
cocoeval.summarize()