labelme 语义分割数据预处理

在使用百度飞浆PaddleX进行语义分割训练,要符合对应的数据集导入格式。

从网上可以找到关于labelme的下载和使用方法,这里就不作详细介绍了。不过与网上不同的是,我是通过打开.exe文件来使用labelme而不是.py文件。

.exe文件存放在:C:\Users\zeng\AppData\Roaming\Python\Python39\Scripts

.py文件存放在:C:\Users\zeng\AppData\Roaming\Python\Python39\site-packages\labelme

读者可以选择合适的方法打开。

而用labelme标注的生成的格式是json文件,里面包含了我们需要的标签标注后的png文件,因而使用labelme的json_to_dataset.exe来实现将脚送文件变成我们所需要的数据集。

在命令行输入

 labelme_json_to_dataset json文件路径

即可将json文件生成为同名的一个文件夹,里面有四个文件,分别是标签png文件,掩膜png文件,原图png文件以及标签名txt文件。

若想批量处理,则:

import os
import glob

path = r'C:\Users\zeng\PycharmProjects\pythonProject\...'  # 这里是指.json文件所在文件夹的路径
for json in os.listdir(path):
    if json.endswith('.json'):
        json_file = glob.glob(os.path.join(path, json)) # 返回为列表
        for file in json_file: # 读取列表中路径
            os.system('cmd /c "C:\\Users\\zeng\\AppData\\Roaming\\Python\\Python39\\Scripts\\labelme_json_to_dataset.exe" %s' % file)
            #print(file)

然后会生成一系列的文件夹,但是我们还是要移动png文件到符合PaddleX的文件夹里,不推荐手动移动和命名,可以使用Python来解决,如下:

import os
import shutil

# 源文件夹路径,其中包含要移动的子文件夹
source_folder = r'C:\Users\zeng\PycharmProjects\pythonProject\...'
# 目标文件夹路径,.png文件将被移动到这里
destination_folder = r'C:\Users\zeng\PycharmProjects\pythonProject\...'

# 确保目标文件夹存在,如果不存在则创建
if not os.path.exists(destination_folder):
    os.makedirs(destination_folder)

# 遍历源文件夹中的所有子文件夹
for subfolder_name in os.listdir(source_folder):
    subfolder_path = os.path.join(source_folder, subfolder_name)

    # 确保是文件夹,不是文件
    if os.path.isdir(subfolder_path):
        # 遍历子文件夹中的所有文件
        for filename in os.listdir(subfolder_path):
            # 检查文件扩展名是否为.png
            if filename.endswith('label.png'):
                # 构建完整的文件路径
                file_path = os.path.join(subfolder_path, filename)
                # 构建新的文件名,使用子文件夹的名称(去掉'_json'),并保留.png扩展名
                new_filename = subfolder_name.replace('_json', '') + '.png'
                new_file_path = os.path.join(destination_folder, new_filename)

                # 移动文件到目标文件夹并重命名
                shutil.move(file_path, new_file_path)
                print(f"Moved and renamed {filename} to {new_filename} in {destination_folder}")

# 再次遍历目标文件夹以重命名文件,去掉'_json'
for filename in os.listdir(destination_folder):
    if filename.endswith('.png'):
        # 构建完整的文件路径
        file_path = os.path.join(destination_folder, filename)
        # 构建新的文件名,去掉'_json'
        new_filename = filename.replace('_json', '')
        new_file_path = os.path.join(destination_folder, new_filename)

        # 重命名文件
        os.rename(file_path, new_file_path)
        print(f"Renamed {filename} to {new_filename} in {destination_folder}")

最后我们可以通过对比原有的jpg文件查看是否有漏。

import os

# JPEGImages文件夹路径
jpeg_images_folder = r'C:\Users\zeng\PycharmProjects\pythonProject\...'
# Annotations文件夹路径
annotations_folder = r'C:\Users\zeng\PycharmProjects\pythonProject\...'

# 获取JPEGImages文件夹中所有.jpg文件的名称列表(不包括扩展名)
jpeg_images = [os.path.splitext(filename)[0] for filename in os.listdir(jpeg_images_folder) if filename.endswith('.jpg')]

# 获取Annotations文件夹中所有.png文件的名称列表(不包括扩展名)
annotations_images = [os.path.splitext(filename)[0] for filename in os.listdir(annotations_folder) if filename.endswith('.png')]

# 比较两个列表,找出在JPEGImages中存在但在Annotations中缺失的文件
missing_images = [jpg for jpg in jpeg_images if jpg not in annotations_images]

# 打印缺失的图片
for missing_image in missing_images:
    print(f"Missing .png image for {missing_image}.jpg in {annotations_folder}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值