在使用百度飞浆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}")