前言
进行语义分割 但数据量又不是很大的时候,进行数据增强是一个不错的选择
在语义分割中可以使用Augmentor进行数据增强(这里就不对Augmentor进行介绍啦,可以在网上搜搜,很多很快就能上手)
在增强之后Augmentor会将被操作后的图片以及掩码图片输出在同一个位置,并且进行有规律的命名
如图:
对数据增强后png图片以及掩码图片进行对应命名
import os
import cv2
import sys
import time
import shutil
from tqdm import tqdm
def chang_filename(folder_path,output_parent_folder_name,name, i):
output_folder ="/home/netted/img_process_ml/photo/phone/output_mask"
# 如果目标文件夹不存在,则创建它
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# _groundtruth_(1)_img的img会随着文件夹的名字变化而变化
# 注意观察output文件夹掩码图片与实物图片命名的规律
mask = cv2.imread(folder_path +'/' +"_groundtruth_(1)_"+output_parent_folder_name + name)
if mask is None:
print("图片为空")
sys.exit()
cv2.imwrite(output_folder+"/" + i + ".png", mask)
def remake_filename():
# 待批量重命名的文件夹 png文件夹存放的是原图png
# 数据增强后会在png文件夹产生一个output文件夹 里面包含了增强后的掩码以及增强后的图片
src_folder = "/home/img_process_ml/photo/phone/img/output"
dst_folder = "/home/img_process_ml/photo/phone/output_jpg"
class_name = ".jpg" # 重命名后的文件名后缀
#设置图片输出的“零值” 例如输入2023 则图片从2024开始输出
base_num = 2023
# 如果目标文件夹不存在,则创建它
if not os.path.exists(dst_folder):
os.makedirs(dst_folder)
#获取output文件夹的父文件夹的名字 如img/output 则为img
output_parent_folder_name = src_folder.split('/')[-2]
file_in = os.listdir(src_folder) # 返回文件夹包含的所有文件名
new_file_in = [word for word in file_in if "_original" in file_in ]
num_file_in = len(new_file_in) # 获取文件数目
print(new_file_in, num_file_in) # 输出修改前的文件名
# 创建一个进度条对象
pbar = tqdm(total=base_num)
for i in range(0, num_file_in):
t = str(i + 1 + base_num)
#获取单个文件名
img_name = new_file_in[i]
# 如果存放原图的文件夹叫img 这里需要改成img_original
split_name = output_parent_folder_name+"_original"
if split_name in img_name:
name = img_name.split(split_name)[1]
print(img_name,name)
# # 重命名文件名 并输出到指定文件夹
shutil.copy(src_folder + "/" + file_in[i], dst_folder + "/" + t + class_name)
# os.rename()
chang_filename(src_folder,output_parent_folder_name,name, t)
pbar.update(1) # 每次迭代更新进度条
# 等待一段时间以便处理下一张图片
time.sleep(0.02)
file_out = os.listdir(dst_folder)
#进行排序
file_out = sorted(file_out, key=lambda x: int(x.split(class_name)[0]))
print(file_out) # 输出修改后的结果
remake_filename()
该代码会同时命名图片A以及对应图片A的掩码A 生成1.png 2.png等等
批量修改图片名称
当进行数据增强后并且将增强后的图片以及掩码图片分离开来并命名成数字形式
或者有其他需求 将图片原先的数字改为另外一种数字进行命名
例如将500-1000的图片变成1-500 或者1-500变为500-1000
import os
from tqdm import tqdm
import time
def remake_filename(filename):
path_in = "C:/Users/Administrator/Desktop/img"#待批量重命名的文件夹
#class_name = ".json" # 重命名后的文件名后缀
class_name = ".jpg" #重命名后的文件名后缀
# 输出的基础值 相当于0 输出图片会以此为0 第一张图片则命名为 output_minimum +1
output_minimum = 481
print("设定输出的0值:",output_minimum)
file_in = os.listdir(path_in) #返回文件夹包含的所有文件名
file_in = sorted(file_in,key=lambda x:int(x.split(class_name)[0]))
num_file_in = len(file_in) #获取文件数目
print(file_in) #输出修改前的文件名
print("文件数目=",num_file_in)
#获取图片名字 包含文件类型在内
num_list = []
for img_name in file_in:
# 获取文件类型前的名字 例如1.jpg 则num = 1
num = img_name.split(class_name)[0]
num = int(num)
num_list.append(num)
#获取最小值
min_num = min(num_list)
print("当前文件夹最小值:",min_num)
min_num = int(min_num) - 1
print("当前文件夹的0值:",min_num)
pbar = tqdm(total=num_file_in)
for i in range(0,num_file_in):
img_name = file_in[i]
num = int(img_name.split(class_name)[0])
diff = num - min_num
output_num = str(output_minimum + diff)
new_name = os.rename(path_in+"/"+file_in[i],path_in+"/"+output_num + class_name) #重命名文件名
pbar.update(1)
time.sleep(0.01)
file_out = os.listdir(path_in)
file_out = sorted(file_out,key=lambda x:int(x.split(class_name)[0]))
print(file_out) #输出修改后的结果
remake_filename(1)
单纯给文件进行排序
效果:文件会随机排成 1、2、3、4…
import os
from tqdm import tqdm
import time
def remake_filename(filename):
path_in = "/home/netted/img_process_ml/photo"#待批量重命名的文件夹
#class_name = ".json" # 重命名后的文件名后缀
class_name = ".jpg" #重命名后的文件名后缀
file_in = os.listdir(path_in) #返回文件夹包含的所有文件名
num_file_in = len(file_in) #获取文件数目
print(file_in) #输出修改前的文件名
print("文件数目=",num_file_in)
pbar = tqdm(total=num_file_in)
for i in range(0,num_file_in):
os.rename(path_in+"/"+file_in[i],path_in+"/"+str(i+1) + class_name) #重命名文件名
pbar.update(1)
time.sleep(0.01)
file_out = os.listdir(path_in)
file_out = sorted(file_out,key=lambda x:int(x.split(class_name)[0]))
print(file_out) #输出修改后的结果
remake_filename(1)