计算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()
相关推荐
M78佐菲19 分钟前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
VL——MOESR1 小时前
【具身智能】VLA论文阅读随笔
论文阅读·人工智能·机器学习·具身智能·vla
晊晌_h2 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
方银的技术分享2 小时前
十五、AI训练师:机器学习-过拟合与欠拟合
人工智能·深度学习·机器学习
我找到地球的支点啦2 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考2 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客3 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
戴西软件4 小时前
戴西iDWS.3DViz Suite数据轻量化可视化软件,从传统桌面软件向云端协同的重大突破
大数据·运维·网络·人工智能·机器学习·3d
小白羊丨6 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt