一、前言
最近在做语义分割的数据集,labelme标注的json格式的。打算旋转90°、180°、270°来做数据增广,但发现还要重新一张张标注(三倍工作量)简直要吐了,果然咱不能再用传统方法。
幸好搜到了用户m0_67480197写的这篇博客:
但原文中很多人遇到了输出文件为空的问题,我对代码进行修改最后解决了这个问题。因此我针对我个人的情况写了这篇文章分享一下我的解决方法:
二、发现问题
1.修改部分
执行原文代码,发现打印的日志中只有-start和-end,没有中间处理过程的输出,于是开始寻找问题。研究代码不难发现在遍历的输入部分,其参数是img_list,在测试时打印输出img_list,发现结果为[] (空),往上追溯发现是这句的问题:
# 错误的
img_list = glob.glob(path + "*" + file_format)
原来我的数据集名称中带有下划线_,*号匹配不到,修改方法如下:
# 正确的
img_list = glob.glob(os.path.join(path, '*.jpg'))
再看原文代码74行:
# 错误的
full_path = save_path + LR + file_name
这里出现了一个语法问题,直接用+号会把字符直接连接起来,而我们要的是路径 + “/” + 文件名,很多人在定义自己的path时,结尾没有余留“/”,导致路径出错,修改方法如下:
# 正确的
full_path = os.path.join(save_path, LR + file_name)
2.完整代码如下
注:包括了一些个人添加的注释打印并修改了上述问题中的个别变量名称
from ast import If
from PIL import Image
import os
import glob
import json
import base64
import math
# 数据集路径
path = "D:\......\dataset"
# 生成数据的保存路径
save_path = "D:\......\dataset\output"
# 当前数据集图片格式
file_format = ".jpg"
# 替换格式jpg -> json
replace_format = ".json"
# 左右翻转文件名附加字符
LR = "lr_"
# 上下翻转文件名附加字符
TB = "tb_"
# 转angel度文件名附加字符
R90 = "r90_"
# 转180度文件名附加字符
R180 = "r180_"
# 转270度文件名附加字符
R270 = "r270_"
# 获取数据集目录的图片数据集
img_list = glob.glob(os.path.join(path, '*.jpg'))
print("数据集列表",img_list)
print("左右翻转-start")
# 1.遍历图片
for i in range(len(img_list)):
print("===================================================")
print("处理第%s张图片ing......"% i)
# 图片路径
img_path = img_list[i]
# 对应json路径
json_path = img_list[i].replace(file_format, replace_format)
# 判断json文件是否存在
is_exists = os.path.exists(json_path)
if is_exists:
# 打开json文件
f = open(json_path, encoding='utf-8')
# 读取json
setting = json.load(f)
# 获取当前图片尺寸
width = setting['imageWidth']
height = setting['imageHeight']
# 获取中轴
mid_width = width / 2
mid_height = height / 2
print("中轴:x-" + str(mid_width) + ",y-" + str(mid_height))
# 2.遍历shapes
for i2 in range(len(setting['shapes'])):
# 3.遍历每个shapes的点
for i3 in range(len(setting['shapes'][i2]['points'])):
temp_x = setting['shapes'][i2]['points'][i3][0]
temp_y = setting['shapes'][i2]['points'][i3][1]
if temp_x > mid_width:
dis = temp_x - mid_width
new_x = mid_width - dis
elif temp_x < mid_width:
dis = mid_width - temp_x
new_x = mid_width + dis
else