1.说明
用labelme标注工具标注的时候,标注完一张照片点击保存,生成的json文件跟原始照片在一个文件夹。而且在标注的时候并不是每张照片都标注,在实际目标检测算法YOLO等)应用的时候需要将图片和标注文件分开,此脚本实现将多个文件下的原始照片和json文件分开保存
2.思想
标注文件跟原始照片同名,根据json文件的文件名去复制对应的图片(同一文件夹内有些照片未标注,所以不能根据标注图片文件名去复制标注文件)
3.代码
#python源码
import os
import shutil
fileSourcePath = input("请输入源路径(例如D:\\\\picture):") #照片和json源文件路径
LabelmeImgNewPath = input("请输入已标注图片的新路径(例如D:\\\\picture):")
jsonNewPath = input("请输入标注数据json文件的新路径(例如D:\\\\picture):")
filelist = os.listdir(fileSourcePath)
j = 0
for filename in filelist: #遍历子目录文件夹
everyFilePath = fileSourcePath + "\\" + str(filename) #每一个子目录的路径,两个反斜杠输出是一个斜杠,
imgJsonList = os.listdir(everyFilePath) #子目录文件夹下,照片和json的列表
#1.先复制json
jsonList = [] #存取json文件名
imgList = [] #存取照片文件名
LabelmeImg = [] #存取标注的图片的名字
for i in imgJsonList:
if i.split(".")[1] == "json":
jsonList.append(i)
else:
imgList.append(i)
for jsonName in jsonList:
jsonOldPath = everyFilePath + "\\" + str(jsonName) # 子目录下的json路径
shutil.copy(jsonOldPath, jsonNewPath)
for imgName in imgList:
if str(str(imgName.split(".")[0]) + ".json") in jsonList: # 如果图片的名字加上后缀,在jsonList中能找到,则取出来
LabelmeImg.append(imgName)
for LabelmeImgName in LabelmeImg:
LabelmeImgOldPath = everyFilePath + "\\" + LabelmeImgName
shutil.copy(LabelmeImgOldPath, LabelmeImgNewPath)
print("已经成功处理标注照片和标注数据的文件夹:" + str(filename))
j += 1
print("已经成功复制子目录:" + str(j) + "个")
4.举例
-
原始路径
有些子目录文件夹下有对应的照片和json,有些子目录下只有照片(因为照片没有可标注类型)
同时存在照片和标注文件的子目录:
-
测试完的json文件新路径
-
测试完的已标注图片的新路径