NWSD / evaluate.py
Ehlum-Lucas
Initial commit
4109acb
#!/usr/bin/env python3
"""
Water Surface Segmentation Evaluation Script
Evaluate the trained model on a validation dataset.
"""
import argparse
import os
import sys
from pathlib import Path
from ultralytics import YOLO
def parse_arguments() -> argparse.Namespace:
"""Parse command line arguments."""
parser = argparse.ArgumentParser(
description="Evaluate water surface segmentation model",
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.add_argument(
"--data",
type=str,
required=True,
help="Path to validation dataset or data.yaml file"
)
parser.add_argument(
"--weights",
type=str,
default="model/nwsd-v2.pt",
help="Path to model weights file"
)
parser.add_argument(
"--img",
type=int,
default=640,
help="Image size for evaluation"
)
parser.add_argument(
"--batch",
type=int,
default=16,
help="Batch size for evaluation"
)
parser.add_argument(
"--conf",
type=float,
default=0.25,
help="Confidence threshold"
)
parser.add_argument(
"--iou",
type=float,
default=0.45,
help="IoU threshold for NMS"
)
parser.add_argument(
"--device",
type=str,
default="",
help="Device to use for evaluation (cpu, cuda, mps)"
)
parser.add_argument(
"--project",
type=str,
default="runs/segment",
help="Project directory for results"
)
parser.add_argument(
"--name",
type=str,
default="nwsd_eval",
help="Experiment name"
)
parser.add_argument(
"--save-json",
action="store_true",
help="Save results in JSON format"
)
parser.add_argument(
"--save-txt",
action="store_true",
help="Save results in TXT format"
)
parser.add_argument(
"--plots",
action="store_true",
help="Generate evaluation plots"
)
return parser.parse_args()
def validate_inputs(args: argparse.Namespace) -> None:
"""Validate input arguments."""
if not os.path.exists(args.data):
raise FileNotFoundError(f"Data path not found: {args.data}")
if not os.path.exists(args.weights):
raise FileNotFoundError(f"Model weights not found: {args.weights}")
def main():
"""Main evaluation function."""
args = parse_arguments()
try:
validate_inputs(args)
print(f"Loading model: {args.weights}")
model = YOLO(args.weights)
eval_params = {
'data': args.data,
'imgsz': args.img,
'batch': args.batch,
'conf': args.conf,
'iou': args.iou,
'device': args.device,
'project': args.project,
'name': args.name,
'save_json': args.save_json,
'save_txt': args.save_txt,
'plots': args.plots,
'verbose': True,
}
print("Starting evaluation with parameters:")
for key, value in eval_params.items():
print(f" {key}: {value}")
results = model.val(**eval_params)
print("\n" + "="*50)
print("EVALUATION RESULTS SUMMARY")
print("="*50)
if hasattr(results, 'box') and results.box is not None:
print(f"mAP50: {results.box.map50:.4f}")
print(f"mAP50-95: {results.box.map:.4f}")
if hasattr(results, 'seg') and results.seg is not None:
print(f"Segmentation mAP50: {results.seg.map50:.4f}")
print(f"Segmentation mAP50-95: {results.seg.map:.4f}")
print("\nEvaluation completed successfully!")
except Exception as e:
print(f"Error: {str(e)}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()