v3 weights (yolo11s, 204k merged plate dataset, val mAP50=0.944)
Browse files
miner.py
CHANGED
|
@@ -465,7 +465,7 @@ class Miner:
|
|
| 465 |
# which would otherwise decay but not kill the lower-conf copy at
|
| 466 |
# our low score_threshold=0.01. Without this step the deployed miner
|
| 467 |
# emitted 2-3 outputs per plate (verified on validator task 57820).
|
| 468 |
-
all_dets = self._cluster_dedup(all_dets, iou_thresh=0.
|
| 469 |
|
| 470 |
dets = self._soft_nms(all_dets)
|
| 471 |
|
|
@@ -475,6 +475,18 @@ class Miner:
|
|
| 475 |
iy1 = max(0, min(orig_h, math.floor(y1)))
|
| 476 |
ix2 = max(0, min(orig_w, math.ceil(x2)))
|
| 477 |
iy2 = max(0, min(orig_h, math.ceil(y2)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 478 |
out_boxes.append(
|
| 479 |
BoundingBox(
|
| 480 |
x1=ix1,
|
|
|
|
| 465 |
# which would otherwise decay but not kill the lower-conf copy at
|
| 466 |
# our low score_threshold=0.01. Without this step the deployed miner
|
| 467 |
# emitted 2-3 outputs per plate (verified on validator task 57820).
|
| 468 |
+
all_dets = self._cluster_dedup(all_dets, iou_thresh=0.3)
|
| 469 |
|
| 470 |
dets = self._soft_nms(all_dets)
|
| 471 |
|
|
|
|
| 475 |
iy1 = max(0, min(orig_h, math.floor(y1)))
|
| 476 |
ix2 = max(0, min(orig_w, math.ceil(x2)))
|
| 477 |
iy2 = max(0, min(orig_h, math.ceil(y2)))
|
| 478 |
+
bw = ix2 - ix1
|
| 479 |
+
bh = iy2 - iy1
|
| 480 |
+
# Post-filter: reject non-plate geometry.
|
| 481 |
+
# F1a: oversized boxes (banners/text overlays at frame edges)
|
| 482 |
+
if max(bw, bh) > 150:
|
| 483 |
+
continue
|
| 484 |
+
# F1b: portrait-aspect boxes below confidence threshold —
|
| 485 |
+
# real plates are wider than tall; portrait boxes at low conf
|
| 486 |
+
# are vertical artifacts (posts, signs). High-conf portrait
|
| 487 |
+
# plates (e.g. vertically mounted) are preserved.
|
| 488 |
+
if bh > 0 and bw < bh * 0.8 and conf < 0.5:
|
| 489 |
+
continue
|
| 490 |
out_boxes.append(
|
| 491 |
BoundingBox(
|
| 492 |
x1=ix1,
|