关于dataset需要用到的小技巧:
1、排序sort_humanly()
python中自带的sorted()函数,通常是直接按照名字对应的ascall码值对应的大小排序,但通常仅仅需要对文件名字中数字进行排序,因此具体实现如下:
def tryint(s): #//将元素中的数字转换为int后再排序
try:
return int(s)
except ValueError:
return s
def str2int(v_str): # //将元素中的字符串和数字分割开
return [tryint(sub_str) for sub_str in re.split('([0-9]+)', v_str)]
def sort_humanly(v_list): #//以分割后的list为单位进行排序
return sorted(v_list, key=str2int)
2、获得cityscape等公开数据集的list
def get_cityscape_list(path):
switch = os.listdir(path)
img_all_list = []
for i in range(len(switch)):
img_path = os.path.join(path,switch[i])
img_switch_list = glob.glob(img_path+"/*.png")
img_switch_list = sort_humanly(img_switch_list)
img_all_list.append(img_switch_list)
img_all_list = _flatten(img_all_list) #list直接appendlist之后,得到的是一个二维list,通常需要转换成一维list
return img_all_list
3、存储命名
获取输入图片及前面文件夹名字方式:
img_name = noisy_files[i]
img_name = img_name.replace("hazerain_level1","dehaze_rain")
name = img_name.split("\\")[-1]
name = "\\"+ name
fold_path = img_name.replace(name,"")
if not os.path.exists(fold_path):
os.mkdir(fold_path)
如果需要重新命名,最好不要直接类似"%d"%str(i)这种,最后的命名排序就是这种1、10、11、12……19、100
正确的命名方式:name = save_dir + "/%03d".format(i)+".png",最后命名的结果就是001,002, 003……
4、对数据随机切割成对应patch大小
input_data = cv2.imread(input_image_path,-1)
label_data = cv2.imread(label_image_path,-1) #opencv读取的图片为BGR格式
if self.patch_size !=0:
row = np.random.randint(label_data.shape[0]-self.patch_size)
col = np.random.randint(label_data.shape[1]-self.patch_size)
input_data = input_data[row:row+self.patch_size, col:col+self.patch_size, :]
label_data = label_data[row:row+self.patch_size, col:col+self.patch_size, :]
input_data = np.transpose(input_data,(2,0,1)) #将BGR图片格式转换成RGB格式
label_data = np.transpose(label_data,(2,0,1))
后续………………