计算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()
相关推荐
专注仿真22 分钟前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
码爸34 分钟前
支持向量机介绍与示例
算法·机器学习·支持向量机
怕浪猫44 分钟前
2028编程圈很火的10个Skills
算法·面试·github
别动我齐刘海2 小时前
Linux 系统调试学习1
linux·运维·服务器·c++·学习·机器学习·机器人
szxinmai主板定制专家4 小时前
储能EMS + 协调控制器实战:RK3568/3576/3588+FPGA+AI 故障录波与诊断
人工智能·深度学习·机器学习·fpga开发·rk3588·rk3576·协调控制器
努力努力再努力wz5 小时前
【机器学习入门系列】从随机事件到正态分布:一文梳理概率论的核心知识
人工智能·机器学习·概率论
Nil2085 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展
Shaoshing6 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
loulanyue_6 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法
碧海银沙音频科技研究院6 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别