File size: 3,927 Bytes
4109acb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#!/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()