关于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_list3、存储命名
获取输入图片及前面文件夹名字方式:
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))后续………………
