python脚本对labelme标注的数据集进行镜面旋转扩充数据集
生活随笔
收集整理的這篇文章主要介紹了
python脚本对labelme标注的数据集进行镜面旋转扩充数据集
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用labelme做數(shù)據(jù)集標注效率不得不說非常感人,由此開始思考如何利用已經(jīng)標注的數(shù)據(jù)集
參考如下腳本
編寫python腳本對labelme標注的數(shù)據(jù)集進行左右/上下鏡面翻轉(zhuǎn)擴充數(shù)據(jù)集_Alex-Leung的博客-CSDN博客
做了一些小小的修改,增加了旋轉(zhuǎn)90度、270度、180度的情況,標1得6。labelme的數(shù)據(jù)格式等情況不再贅述,代碼如下
from ast import If from PIL import Image import os import glob import json import base64 import math # 數(shù)據(jù)集路徑 path = ".\\1\\" # 生成數(shù)據(jù)的保存路徑 save_path = ".\\2\\" # 當前數(shù)據(jù)集圖片格式 file_format = ".jpg" # 替換格式jpg -> json replace_format = ".json" # 左右翻轉(zhuǎn)文件名附加字符 LR = "lr_" # 上下翻轉(zhuǎn)文件名附加字符 TB = "tb_"# 轉(zhuǎn)angel度文件名附加字符 R90 = "r90_" # 轉(zhuǎn)180度文件名附加字符 R180= "r180_" # 轉(zhuǎn)270度文件名附加字符 R270= "r270_"# 獲取數(shù)據(jù)集目錄的圖片數(shù)據(jù)集 img_list = glob.glob(path + "*" + file_format)print("左右翻轉(zhuǎn)-start") # 1.遍歷圖片 for i in range(len(img_list)):# 圖片路徑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')# 讀取jsonsetting = json.load(f)# 獲取當前圖片尺寸width = setting['imageWidth']height = setting['imageHeight']# 獲取中軸mid_width = width / 2mid_height = height / 2print("中軸:x-" + str(mid_width) + ",y-" + str(mid_height))# 2.遍歷shapesfor 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_widthnew_x = mid_width - diselif temp_x < mid_width:dis = mid_width - temp_xnew_x = mid_width + diselse:new_x = temp_xnew_y = temp_ysetting['shapes'][i2]['points'][i3][0] = new_xsetting['shapes'][i2]['points'][i3][1] = new_y# 從json獲取文件名file_name = setting['imagePath']# 修改json文件名setting['imagePath'] = LR + file_namefull_path = save_path + LR + file_namefull_path = full_path.replace(file_format, replace_format)# 圖片轉(zhuǎn)換pri_image = Image.open(img_path)# 左右鏡面翻轉(zhuǎn)FLIP_LEFT_RIGHTpri_image.transpose(Image.FLIP_LEFT_RIGHT).save(save_path + LR + file_name)# 將轉(zhuǎn)換后的圖片進行base64加密with open(save_path + LR + file_name, 'rb') as f:setting['imageData'] = base64.b64encode(f.read()).decode()string = json.dumps(setting)# 將修改后的json寫入文件with open(full_path, 'w', encoding='utf-8') as f:f.write(string)f.close()print(img_path + "-------轉(zhuǎn)換完成")setting = Noneelse:print(json_path + "-------文件不存在") print("左右翻轉(zhuǎn)-end") # 原理同上 print("上下翻轉(zhuǎn)-start") for i in range(len(img_list)):img_path = img_list[i]json_path = img_list[i].replace(file_format, replace_format)is_exists = os.path.exists(json_path)if is_exists:f = open(json_path, encoding='utf-8')setting = json.load(f)width = setting['imageWidth']height = setting['imageHeight']mid_width = width / 2mid_height = height / 2for i2 in range(len(setting['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_y > mid_height:dis = temp_y - mid_heightnew_y = mid_height - diselif temp_y < mid_height:dis = mid_height - temp_ynew_y = mid_height + diselse:new_y = temp_ynew_x = temp_xsetting['shapes'][i2]['points'][i3][0] = new_xsetting['shapes'][i2]['points'][i3][1] = new_yfile_name = setting['imagePath']setting['imagePath'] = TB + file_namefull_path = save_path + TB + file_namefull_path = full_path.replace(file_format, replace_format)pri_image = Image.open(img_path)# 上下鏡面翻轉(zhuǎn)FLIP_TOP_BOTTOMpri_image.transpose(Image.FLIP_TOP_BOTTOM).save(save_path + TB + file_name)with open(save_path + TB + file_name, 'rb') as f:setting['imageData'] = base64.b64encode(f.read()).decode()string = json.dumps(setting)with open(full_path, 'w', encoding='utf-8') as f:f.write(string)f.close()print(img_path + "-------轉(zhuǎn)換完成")setting = Noneelse:print(json_path + "-------文件不存在") print("上下翻轉(zhuǎn)-end")def rolationer(path,save_path,file_format,replace_format,descritions,angel):print("反時針旋轉(zhuǎn)%s度-start"%angel)# 1.遍歷圖片for i in range(len(img_list)):# 圖片路徑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')# 讀取jsonsetting = json.load(f)# 獲取當前圖片尺寸width = setting['imageWidth']height = setting['imageHeight']# 獲取中軸mid_width = width / 2mid_height = height / 2print("中軸:x-" + str(mid_width) + ",y-" + str(mid_height))# 2.遍歷shapesfor 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]new_x = (temp_x - mid_width)*math.cos(math.radians(angel)) - (temp_y - mid_height)*math.sin(math.radians(angel))+ mid_width new_y =(temp_x - mid_width)*math.sin(math.radians(angel))+ (temp_y - mid_height)*math.cos(math.radians(angel)) + mid_height setting['shapes'][i2]['points'][i3][0] = new_xsetting['shapes'][i2]['points'][i3][1] = new_y# 從json獲取文件名file_name = setting['imagePath']# 修改json文件名setting['imagePath'] = descritions + file_namefull_path = save_path + descritions + file_namefull_path = full_path.replace(file_format, replace_format)# 圖片轉(zhuǎn)換pri_image = Image.open(img_path)# 左右鏡面翻轉(zhuǎn)FLIP_LEFT_RIGHT,反時針旋轉(zhuǎn)angel度 Image.ROTATE_90,反時針旋轉(zhuǎn)180 Image.ROTATE_180 反時針旋轉(zhuǎn)270度 Image.ROTATE_270if angel==90:pri_image.transpose(Image.ROTATE_270).save(save_path + descritions + file_name)elif angel==180:pri_image.transpose(Image.ROTATE_180).save(save_path + descritions + file_name)elif angel==270:pri_image.transpose(Image.ROTATE_90).save(save_path + descritions + file_name)else:print('輸入正確的角度!')return# 將轉(zhuǎn)換后的圖片進行base64加密with open(save_path + descritions + file_name, 'rb') as f:setting['imageData'] = base64.b64encode(f.read()).decode()string = json.dumps(setting)# 將修改后的json寫入文件with open(full_path, 'w', encoding='utf-8') as f:f.write(string)f.close()print(img_path + "-------轉(zhuǎn)換完成")setting = Noneelse:print(json_path + "-------文件不存在")print("反時針旋轉(zhuǎn)%s度-end"%angel)rolationer(path,save_path,file_format,replace_format,R90,90) rolationer(path,save_path,file_format,replace_format,R180,180) rolationer(path,save_path,file_format,replace_format,R270,270)效果如下圖所示:
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的python脚本对labelme标注的数据集进行镜面旋转扩充数据集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络工程实验四 防火墙实验
- 下一篇: 【Android开发】自定义圆角butt