fix(detect): 切片统计的口径

原先把"有一边小于 160"记为填充、否则记为裁剪,但 400x100 这种既要横向裁剪
又要纵向填充,会被算成纯填充。改成两个独立计数并说明可同时发生。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Shaun Zhou
2026-09-23 15:13:18 +08:00
co-authored by Claude Opus 5
parent 474b7b50a0
commit 23562448ba
+13 -6
View File
@@ -138,7 +138,11 @@ def main() -> int:
label_file = label_path_for(source) label_file = label_path_for(source)
boxes = parse_label(label_file.read_text(encoding="utf-8")) if label_file.exists() else [] boxes = parse_label(label_file.read_text(encoding="utf-8")) if label_file.exists() else []
tiles = plan_tiles(width, height, args.size, args.overlap) tiles = plan_tiles(width, height, args.size, args.overlap)
sizes_seen["填充" if width < args.size or height < args.size else "裁剪"] += 1 # 两者可以同时发生:400x100 的图既要横向裁剪又要纵向填充
if width < args.size or height < args.size:
sizes_seen["需要填充"] += 1
if width > args.size or height > args.size:
sizes_seen["需要裁剪"] += 1
stats["源图"] += 1 stats["源图"] += 1
positives, empties = [], [] positives, empties = [], []
@@ -180,9 +184,12 @@ def main() -> int:
logger.info("处理 [%d] 已产出 %d 片", stats["源图"], stats["产出片"]) logger.info("处理 [%d] 已产出 %d 片", stats["源图"], stats["产出片"])
logger.info( logger.info(
"源图 %d(其中 %d 张靠镜像填充、%d 张需裁剪)-> 片 %d(有框 %d,空 %d,丢弃空片 %d)", "源图 %d(%d 张有维度不足需镜像填充,%d 张有维度超出需裁剪,两者可同时发生)",
stats["源图"], sizes_seen["填充"], sizes_seen["裁剪"], stats["产出片"], stats["源图"], sizes_seen["需要填充"], sizes_seen["需要裁剪"],
stats["有框片"], stats["空片"], stats["丢弃的空片"], )
logger.info(
"产出片 %d(有框 %d,空 %d;另按配额丢弃空片 %d)",
stats["产出片"], stats["有框片"], stats["空片"], stats["丢弃的空片"],
) )
logger.info("逐类框数: %s", dict(sorted(per_class.items()))) logger.info("逐类框数: %s", dict(sorted(per_class.items())))
@@ -205,8 +212,8 @@ def main() -> int:
"min_visibility": args.min_visibility, "min_visibility": args.min_visibility,
"max_empty_ratio": args.max_empty_ratio, "seed": args.seed, "max_empty_ratio": args.max_empty_ratio, "seed": args.seed,
"counts": dict(stats), "per_class_boxes": dict(per_class), "counts": dict(stats), "per_class_boxes": dict(per_class),
"source_images_padded": sizes_seen["填充"], "source_images_padded": sizes_seen["需要填充"],
"source_images_cropped": sizes_seen["裁剪"], "source_images_cropped": sizes_seen["需要裁剪"],
}, },
ensure_ascii=False, indent=2, ensure_ascii=False, indent=2,
), ),