LabelImg批量重命名功能:管理大规模图像数据集

LabelImg批量重命名功能:管理大规模图像数据集

【免费下载链接】labelImg 🎉 超级实用!LabelImg,图像标注神器,现在加入Label Studio社区,享受多模态数据标注新体验!🚀 简单易用,支持XML、YOLO和CreateML格式,适用于ImageNet等项目。不再单独维护,立即尝试Label Studio,安装一键到位,更灵活,功能更强大!👇 安装即刻开始:pip3 install labelImg,或访问 获取源码构建。一起探索数据标注的新边界!👨‍💻👩‍💻【此简介由AI生成】 【免费下载链接】labelImg 项目地址: https://gitcode.com/gh_mirrors/la/labelImg

在处理大规模图像数据集时,高效的文件管理是提升标注效率的关键环节。本文将详细介绍如何利用LabelImg结合Python脚本实现图像文件的批量重命名,解决数据集整理中的常见痛点,让你的标注工作流程更加顺畅。

为什么需要批量重命名功能

当你处理包含数百甚至数千张图像的数据集时,可能会遇到以下问题:

  • 原始文件名杂乱无章,包含随机字符或无意义编号
  • 不同批次采集的图像命名规则不一致
  • 需要按类别、日期或其他属性对图像进行分组管理
  • 标注文件(XML/TXT)与图像文件的命名对应关系混乱

这些问题会严重影响标注效率,甚至导致标注文件与图像文件对应错误。而LabelImg本身虽然没有直接提供批量重命名功能,但我们可以通过结合其文件管理特性和简单的Python脚本来实现这一需求。

LabelImg的文件管理基础

LabelImg提供了基本的文件浏览和管理功能,通过这些功能我们可以方便地查看和导航图像文件:

LabelImg文件列表

主要文件管理功能包括:

  • 文件列表窗口:在右侧面板中显示当前目录下的所有图像文件
  • 图像导航:使用快捷键A(上一张)和D(下一张)快速切换图像
  • 批量标注:打开整个目录后可连续进行标注工作

这些功能为我们的批量重命名操作提供了基础支持。相关实现代码可以在labelImg.py中找到,特别是以下关键部分:

223:         open_dir = action(get_str('openDir'), self.open_dir_dialog,
224:                           'Ctrl+u', 'open', get_str('openDir'))
233:         open_next_image = action(get_str('nextImg'), self.open_next_image,
234:                                  'd', 'next', get_str('nextImgDetail'))
236:         open_prev_image = action(get_str('prevImg'), self.open_prev_image,
237:                                  'a', 'prev', get_str('prevImgDetail'))

实现批量重命名的两种方法

方法一:使用LabelImg的文件列表结合外部脚本

这种方法适用于需要根据标注内容或特定规则进行重命名的场景。

  1. 导出文件列表:首先在LabelImg中打开图像所在目录,确保所有需要重命名的图像都已加载到文件列表中

  2. 使用Python脚本批量重命名:LabelImg项目中提供了一个实用工具脚本tools/label_to_csv.py,我们可以基于此修改实现批量重命名功能。以下是一个简单的实现示例:

import os
import csv
from pathlib import Path

def batch_rename_images(image_dir, output_dir, prefix="img_", start_index=1):
    """
    批量重命名图像文件并保持标注文件同步
    
    参数:
    - image_dir: 原始图像目录
    - output_dir: 重命名后的图像输出目录
    - prefix: 新文件名前缀
    - start_index: 起始编号
    """
    # 创建输出目录(如果不存在)
    Path(output_dir).mkdir(parents=True, exist_ok=True)
    
    # 支持的图像格式
    image_extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.gif']
    
    # 获取所有图像文件
    image_files = []
    for file in os.listdir(image_dir):
        if any(file.lower().endswith(ext) for ext in image_extensions):
            image_files.append(file)
    
    # 按文件名排序(确保顺序一致)
    image_files.sort()
    
    # 重命名计数器
    count = start_index
    
    # 记录重命名前后的对应关系
    rename_mapping = []
    
    for old_filename in image_files:
        # 获取文件扩展名
        ext = os.path.splitext(old_filename)[1]
        
        # 构建新文件名
        new_filename = f"{prefix}{count:06d}{ext}"
        
        # 构建完整路径
        old_path = os.path.join(image_dir, old_filename)
        new_path = os.path.join(output_dir, new_filename)
        
        # 复制并重命名文件(使用复制而非移动,保留原始文件)
        with open(old_path, 'rb') as fsrc, open(new_path, 'wb') as fdst:
            fdst.write(fsrc.read())
        
        # 处理对应的标注文件
        for ann_ext in ['.xml', '.txt', '.json']:
            old_ann_path = os.path.splitext(old_path)[0] + ann_ext
            if os.path.exists(old_ann_path):
                new_ann_path = os.path.splitext(new_path)[0] + ann_ext
                with open(old_ann_path, 'rb') as fsrc, open(new_ann_path, 'wb') as fdst:
                    fdst.write(fsrc.read())
        
        # 记录映射关系
        rename_mapping.append({
            'old_filename': old_filename,
            'new_filename': new_filename
        })
        
        count += 1
    
    # 保存重命名映射表
    with open(os.path.join(output_dir, 'rename_mapping.csv'), 'w', newline='') as csvfile:
        fieldnames = ['old_filename', 'new_filename']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        for row in rename_mapping:
            writer.writerow(row)
    
    print(f"成功重命名 {count - start_index} 个文件,映射表已保存至 rename_mapping.csv")

# 使用示例
if __name__ == "__main__":
    # 设置源目录和输出目录
    image_directory = "/path/to/your/images"
    output_directory = "/path/to/renamed/images"
    
    # 调用重命名函数
    batch_rename_images(
        image_dir=image_directory,
        output_dir=output_directory,
        prefix="dataset_",
        start_index=1
    )

方法二:基于标注内容的智能重命名

如果你需要根据图像中的标注类别进行重命名,可以结合LabelImg的标注文件解析功能。LabelImg支持多种标注格式,包括Pascal VOC XML和YOLO格式,我们可以解析这些文件并根据标注信息进行重命名。

以下是一个基于标注内容的重命名脚本示例,它会根据图像中出现的主要类别对文件进行重命名:

import os
import xml.etree.ElementTree as ET
from collections import Counter

def get_main_category(xml_path):
    """从Pascal VOC XML标注文件中获取主要类别"""
    try:
        tree = ET.parse(xml_path)
        root = tree.getroot()
        
        # 收集所有目标类别
        categories = []
        for obj in root.findall('object'):
            category = obj.find('name').text
            categories.append(category)
        
        if not categories:
            return "unlabeled"
        
        # 找出出现次数最多的类别
        most_common = Counter(categories).most_common(1)
        return most_common[0][0]
    
    except Exception as e:
        print(f"解析标注文件时出错: {xml_path}, 错误: {e}")
        return "error"

def rename_by_category(image_dir):
    """根据标注类别重命名图像文件"""
    # 支持的图像格式
    image_extensions = ['.jpg', '.jpeg', '.png', '.bmp']
    
    # 标注文件扩展名
    ann_ext = '.xml'  # Pascal VOC格式
    
    # 获取所有图像文件
    image_files = []
    for file in os.listdir(image_dir):
        ext = os.path.splitext(file)[1].lower()
        if ext in image_extensions:
            image_files.append(file)
    
    # 按文件名排序
    image_files.sort()
    
    # 类别计数器
    category_counter = {}
    
    for image_file in image_files:
        # 获取图像文件名(不含扩展名)
        base_name = os.path.splitext(image_file)[0]
        ext = os.path.splitext(image_file)[1]
        
        # 对应的标注文件路径
        ann_path = os.path.join(image_dir, base_name + ann_ext)
        
        # 如果标注文件存在,则获取主要类别
        if os.path.exists(ann_path):
            main_category = get_main_category(ann_path)
        else:
            main_category = "unlabeled"
        
        # 更新类别计数器
        if main_category not in category_counter:
            category_counter[main_category] = 1
        else:
            category_counter[main_category] += 1
        
        # 构建新文件名
        new_base_name = f"{main_category}_{category_counter[main_category]:04d}"
        new_image_file = new_base_name + ext
        new_ann_file = new_base_name + ann_ext
        
        # 重命名图像文件
        old_image_path = os.path.join(image_dir, image_file)
        new_image_path = os.path.join(image_dir, new_image_file)
        os.rename(old_image_path, new_image_path)
        
        # 重命名标注文件(如果存在)
        if os.path.exists(ann_path):
            old_ann_path = ann_path
            new_ann_path = os.path.join(image_dir, new_ann_file)
            os.rename(old_ann_path, new_ann_path)
        
        print(f"重命名: {image_file} -> {new_image_file} (类别: {main_category})")
    
    print("重命名完成!")
    print("类别统计:")
    for category, count in category_counter.items():
        print(f"  {category}: {count} 个文件")

# 使用示例
if __name__ == "__main__":
    # 设置包含图像和标注文件的目录
    dataset_dir = "/path/to/your/dataset"
    
    # 调用重命名函数
    rename_by_category(dataset_dir)

重命名后的标注工作流

完成批量重命名后,你可以按照以下步骤在LabelImg中继续进行标注工作:

  1. 打开重命名后的目录:启动LabelImg,使用Ctrl+U快捷键打开重命名后的图像目录

  2. 验证文件列表:在右侧文件列表中确认所有图像都已正确加载

  3. 开始标注:使用W键创建边界框,AD键切换图像,Ctrl+S保存标注

  4. 使用自动保存:在"视图"菜单中勾选"自动保存模式",启用自动保存功能

LabelImg标注界面

LabelImg的自动保存功能可以确保你的标注工作不会丢失,相关设置在labelImg.py中的实现如下:

413:        self.auto_saving = QAction(get_str('autoSaveMode'), self)
414:        self.auto_saving.setCheckable(True)
415:        self.auto_saving.setChecked(settings.get(SETTING_AUTO_SAVE, False))

最佳实践与注意事项

  1. 备份原始数据:在执行批量重命名操作前,始终备份原始数据集,以防意外情况

  2. 使用复制而非移动:在测试阶段,建议使用复制操作代替移动,确保原始文件安全

  3. 保存重命名映射表:如上述脚本所示,保存重命名前后的映射关系,便于后续追溯

  4. 统一文件命名规范

    • 使用有意义的前缀(如类别名称)
    • 使用固定位数的序号(如0001, 0002)确保排序正确
    • 保持文件名简洁明了
  5. 与标注格式匹配:确保重命名后的图像文件与标注文件(XML/TXT)保持同名,否则LabelImg将无法自动关联它们

  6. 使用版本控制:对于重要的数据集,考虑使用Git等版本控制工具跟踪文件变更

总结

通过本文介绍的方法,你可以轻松实现LabelImg数据集的批量重命名,解决大规模图像数据管理的痛点。无论是简单的序号重命名还是基于标注内容的智能分类命名,都能有效提升你的标注工作效率。

记住,良好的文件管理习惯是成功完成大规模标注项目的关键。结合LabelImg的强大标注功能和本文提供的批量重命名技巧,你将能够更高效地处理各种图像数据集。

如果你在使用过程中遇到任何问题,可以查阅项目的README.rst文档或查看源代码获取更多帮助。

【免费下载链接】labelImg 🎉 超级实用!LabelImg,图像标注神器,现在加入Label Studio社区,享受多模态数据标注新体验!🚀 简单易用,支持XML、YOLO和CreateML格式,适用于ImageNet等项目。不再单独维护,立即尝试Label Studio,安装一键到位,更灵活,功能更强大!👇 安装即刻开始:pip3 install labelImg,或访问 获取源码构建。一起探索数据标注的新边界!👨‍💻👩‍💻【此简介由AI生成】 【免费下载链接】labelImg 项目地址: https://gitcode.com/gh_mirrors/la/labelImg

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值