计算YOLO数据集中每个类的目标数

这里写自定义目录标题

运行命令:

bash 复制代码
python count_labels.py --data data.yaml --labels labels

计算YOLO数据集中每个类的目标数。类名从data.yaml读取。

bash 复制代码
import argparse
from collections import Counter
from pathlib import Path

import yaml


def count_dir(label_dir: Path):
    """Count (class_id -> object count) and (class_id -> image count) under a dir."""
    obj_count = Counter()
    img_count = Counter()
    files = sorted(label_dir.rglob('*.txt'))
    for f in files:
        cls_in_img = set()
        if f.stat().st_size == 0:
            continue
        for line in f.read_text().strip().splitlines():
            parts = line.split()
            if len(parts) != 5:
                continue
            cls = int(float(parts[0]))
            obj_count[cls] += 1
            cls_in_img.add(cls)
        for c in cls_in_img:
            img_count[c] += 1
    return obj_count, img_count, len(files)


def main():
    p = argparse.ArgumentParser(description='Count YOLO objects per class from data.yaml')
    p.add_argument('--data', required=True, help='/mnt/sda/rdd/datasets_big2small/data640_640/data.yaml')
    p.add_argument('--labels', required=True, help='/mnt/sda/rdd/datasets_big2small/data640_640/labels/train')
    args = p.parse_args()

    with open(args.data) as f:
        cfg = yaml.safe_load(f)
    names = cfg.get('names') or [str(i) for i in range(cfg.get('nc', 1))]
    print(f'classes (nc={len(names)}): {names}\n')

    root = Path(args.labels)
    splits = [d for d in root.iterdir() if d.is_dir()] if root.is_dir() else []
    if splits:
        targets = sorted(splits)
        print(f'found splits: {[d.name for d in targets]}')
        totals = Counter()
        img_totals = Counter()
        for d in targets:
            oc, ic, nf = count_dir(d)
            print(f'\n--- {d.name} ({nf} label files) ---')
            for i, name in enumerate(names):
                print(f'  {i:>2} {name:<12} objects={oc[i]:>6}  images={ic[i]:>6}')
            totals += oc
            img_totals += ic
        print('\n--- TOTAL ---')
        for i, name in enumerate(names):
            print(f'  {i:>2} {name:<12} objects={totals[i]:>6}  images={img_totals[i]:>6}')
    else:
        oc, ic, nf = count_dir(root)
        print(f'--- {root} ({nf} label files) ---')
        for i, name in enumerate(names):
            print(f'  {i:>2} {name:<12} objects={oc[i]:>6}  images={ic[i]:>6}')


if __name__ == '__main__':
    main()
相关推荐
Navigator_Z15 分钟前
LeetCode //C - 1313. Decompress Run-Length Encoded List
c语言·算法·leetcode
dialect_1 小时前
CODEFORCES ROUND 1127 DIV2
开发语言·c++·算法
Nuanyt1 小时前
LeetCode Hot 100 链表专题(四)· 3 题(Java)
java·算法·leetcode·链表·双指针
灯澜忆梦1 小时前
LeetCode 1861. 旋转盒子|Go 双指针解法
算法
高洁011 小时前
端侧大模型的应用场景与工程实践
人工智能·深度学习·机器学习·transformer·tornado
软件派2 小时前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
ZhengEnCi10 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
我要见SA姐113 小时前
GitHub Actions 自动化:5 个真实运维提效案例
运维·数据库·机器学习·oracle·回归
吞下星星的少年·-·13 小时前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序