2023年6月21日发(作者:)
paddlepaddle4应⽤于图像分类的数据加载器该代码只能⽤于图像分类任务1、⽤于图像分类的txt列表⽣成import osimport randomdef get_fpaths_fnames_labels(path,seed=123): sub_dir=r(path) fpaths=[] fnames=[] labels=[] class_dict={} i=0 for sub_path in sub_dir: fnames_class_one=r(path+''+sub_path) labels_class_one=len(fnames_class_one)*[i] fpaths+=len(fnames_class_one)*[path+''+sub_path] fnames+=fnames_class_one labels+=labels_class_one class_dict[sub_path]=i i+=1 #保证每次shuffle的结果都是⼀样的 (seed) tmp=list(zip(fpaths,fnames,labels)) e(tmp) #fpaths,fnames,labels=zip(*tmp) print(class_dict,'n') return tmpdef save_train_line(path,save_name,ext='.png',mode='w'): result= get_fpaths_fnames_labels(path) ftrainval = open(save_name, mode) for fpath,fname,label in result: if th(ext): ("%s%s %sn"%(fpath,fname,label)) print("%s%s %sn"%(fpath,fname,label)) ()
def save_train_val(path,train_name,val_name,mode='w',train_rate=0.7,ext='.png'): result= get_fpaths_fnames_labels(path) train_len=int(train_rate*len(result)) ftrain = open(train_name, mode) for i in range(train_len): fpath,fname,label=result[i] if th(ext): ("%s%s %sn"%(fpath,fname,label)) print("%s%s %s"%(fpath,fname,label)) () fval = open(val_name, mode) for i in range(train_len,len(result)): fpath,fname,label=result[i] if th(ext): ("%s%s %sn"%(fpath,fname,label)) print("%s%s %s"%(fpath,fname,label)) ()if __name__ == "__main__": print("Generate txt for ") path=r"C:AI_DatasetUCMerced_LandUseImages" # mode='a+' 以追加的⽅式写⼊png后缀的图⽚ #save_train_line(path,"SECOND_",ext=".png",mode='a+') save_train_val(path,"Images ","Images ",train_rate=0.7,ext=".tif",mode='w') print("Finish write!")
执⾏后输出信息如下所⽰Generate txt for {'agricultural': 0, 'airplane': 1, 'baseballdiamond': 2, 'beach': 3, 'buildings': 4, 'chaparral': 5, 'denseresidential': 6, 'forest': 7, 'freeway': 8, 'golfcourse': 9,
'harbor': 10, 'intersection': 11, 'mediumresidential': 12, 'mobilehomepark': 13, 'overpass': 14, 'parkinglot': 15, 'river': 16, 'runway': 17, 'sparseresidential':
18, 'storagetanks': 19, 'tenniscourt': 20}
C:AI_DatasetUCMerced_ 18C:AI_DatasetUCMerced_ 1C:AI_DatasetUCMerced_ 17C:AI_DatasetUCMerced_ 4C:AI_DatasetUCMerced_ 19C:AI_DatasetUCMerced_ 15C:AI_DatasetUCMerced_ 10C:AI_DatasetUCMerced_ 2C:AI_DatasetUCMerced_ 92、应⽤于图像分类的数据加载器其中需要注意的是RandomResizedCrop⽅法,可能会由于⽬标在图像中的尺⼨太⼩且在图像的边缘位置,导致裁剪区域全是背景(不包含⽬标),因此强⾏添加了Resized,对RandomResizedCrop⽅法的操作范围作了限制。import paddlefrom import Datasetfrom import transformsfrom PIL import Image
class ImageClsDataset(Dataset): def __init__(self, annotation_lines,input_shape): super(ImageClsDataset, self).__init__() tion_lines=annotation_lines = len(annotation_lines) _shape=input_shape #在paddle模型中数据是CHW的格式 cess_image=e([ nessTransform(0.3), tionTransform(0.3), stTransform(0.3), nsform(0.1), Rotation(degrees=30), HorizontalFlip(), VerticalFlip(), ((300,300)),#⽤于克服RandomResizedCrop随机裁剪后导致⽬标不在图像中的缺陷 ResizedCrop(input_shape), or(), ize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225),data_format='CHW') ]) def __getitem__(self, index): name ,label= tion_lines[index].replace('n','').split(' ') image = (name) image = cess_image(image) return image, _tensor([int(label)], dtype='int64') def __len__(self): return #ToTensor将形状为 (H x W x C)的输⼊数据 或 y 转换为 (C x H x W),并进⾏归⼀化。如果想保持形状不变,可以将参数 data_forma3、具体调⽤⽅法#加载数据集train_line="Images "with open(train_line,"r") as f: train_lines = nes()
# 测试定义的数据集custom_dataset = ImageClsDataset(train_lines,input_shape=(256,256))
print('=============custom dataset=============')for data, label in custom_dataset: print(, label) break
BATCH_SIZE=8# 如果要加载内置数据集,将 custom_dataset 换为 train_dataset 即可train_loader = ader(custom_dataset, batch_size=BATCH_SIZE, shuffle=True)print('=============train model=============')for batch_id, data in enumerate(train_loader()): x_data = data[0] y_data = data[1]
print(x_) print(y_) breakprint(y_data)代码输出如下=============custom dataset=============[3, 256, 256] 18=============train model=============[8, 3, 256, 256][8]Tensor(shape=[8], dtype=int32, place=CUDAPinnedPlace, stop_gradient=True, [0 , 20, 1 , 13, 6 , 15, 15, 10])
2023年6月21日发(作者:)
paddlepaddle4应⽤于图像分类的数据加载器该代码只能⽤于图像分类任务1、⽤于图像分类的txt列表⽣成import osimport randomdef get_fpaths_fnames_labels(path,seed=123): sub_dir=r(path) fpaths=[] fnames=[] labels=[] class_dict={} i=0 for sub_path in sub_dir: fnames_class_one=r(path+''+sub_path) labels_class_one=len(fnames_class_one)*[i] fpaths+=len(fnames_class_one)*[path+''+sub_path] fnames+=fnames_class_one labels+=labels_class_one class_dict[sub_path]=i i+=1 #保证每次shuffle的结果都是⼀样的 (seed) tmp=list(zip(fpaths,fnames,labels)) e(tmp) #fpaths,fnames,labels=zip(*tmp) print(class_dict,'n') return tmpdef save_train_line(path,save_name,ext='.png',mode='w'): result= get_fpaths_fnames_labels(path) ftrainval = open(save_name, mode) for fpath,fname,label in result: if th(ext): ("%s%s %sn"%(fpath,fname,label)) print("%s%s %sn"%(fpath,fname,label)) ()
def save_train_val(path,train_name,val_name,mode='w',train_rate=0.7,ext='.png'): result= get_fpaths_fnames_labels(path) train_len=int(train_rate*len(result)) ftrain = open(train_name, mode) for i in range(train_len): fpath,fname,label=result[i] if th(ext): ("%s%s %sn"%(fpath,fname,label)) print("%s%s %s"%(fpath,fname,label)) () fval = open(val_name, mode) for i in range(train_len,len(result)): fpath,fname,label=result[i] if th(ext): ("%s%s %sn"%(fpath,fname,label)) print("%s%s %s"%(fpath,fname,label)) ()if __name__ == "__main__": print("Generate txt for ") path=r"C:AI_DatasetUCMerced_LandUseImages" # mode='a+' 以追加的⽅式写⼊png后缀的图⽚ #save_train_line(path,"SECOND_",ext=".png",mode='a+') save_train_val(path,"Images ","Images ",train_rate=0.7,ext=".tif",mode='w') print("Finish write!")
执⾏后输出信息如下所⽰Generate txt for {'agricultural': 0, 'airplane': 1, 'baseballdiamond': 2, 'beach': 3, 'buildings': 4, 'chaparral': 5, 'denseresidential': 6, 'forest': 7, 'freeway': 8, 'golfcourse': 9,
'harbor': 10, 'intersection': 11, 'mediumresidential': 12, 'mobilehomepark': 13, 'overpass': 14, 'parkinglot': 15, 'river': 16, 'runway': 17, 'sparseresidential':
18, 'storagetanks': 19, 'tenniscourt': 20}
C:AI_DatasetUCMerced_ 18C:AI_DatasetUCMerced_ 1C:AI_DatasetUCMerced_ 17C:AI_DatasetUCMerced_ 4C:AI_DatasetUCMerced_ 19C:AI_DatasetUCMerced_ 15C:AI_DatasetUCMerced_ 10C:AI_DatasetUCMerced_ 2C:AI_DatasetUCMerced_ 92、应⽤于图像分类的数据加载器其中需要注意的是RandomResizedCrop⽅法,可能会由于⽬标在图像中的尺⼨太⼩且在图像的边缘位置,导致裁剪区域全是背景(不包含⽬标),因此强⾏添加了Resized,对RandomResizedCrop⽅法的操作范围作了限制。import paddlefrom import Datasetfrom import transformsfrom PIL import Image
class ImageClsDataset(Dataset): def __init__(self, annotation_lines,input_shape): super(ImageClsDataset, self).__init__() tion_lines=annotation_lines = len(annotation_lines) _shape=input_shape #在paddle模型中数据是CHW的格式 cess_image=e([ nessTransform(0.3), tionTransform(0.3), stTransform(0.3), nsform(0.1), Rotation(degrees=30), HorizontalFlip(), VerticalFlip(), ((300,300)),#⽤于克服RandomResizedCrop随机裁剪后导致⽬标不在图像中的缺陷 ResizedCrop(input_shape), or(), ize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225),data_format='CHW') ]) def __getitem__(self, index): name ,label= tion_lines[index].replace('n','').split(' ') image = (name) image = cess_image(image) return image, _tensor([int(label)], dtype='int64') def __len__(self): return #ToTensor将形状为 (H x W x C)的输⼊数据 或 y 转换为 (C x H x W),并进⾏归⼀化。如果想保持形状不变,可以将参数 data_forma3、具体调⽤⽅法#加载数据集train_line="Images "with open(train_line,"r") as f: train_lines = nes()
# 测试定义的数据集custom_dataset = ImageClsDataset(train_lines,input_shape=(256,256))
print('=============custom dataset=============')for data, label in custom_dataset: print(, label) break
BATCH_SIZE=8# 如果要加载内置数据集,将 custom_dataset 换为 train_dataset 即可train_loader = ader(custom_dataset, batch_size=BATCH_SIZE, shuffle=True)print('=============train model=============')for batch_id, data in enumerate(train_loader()): x_data = data[0] y_data = data[1]
print(x_) print(y_) breakprint(y_data)代码输出如下=============custom dataset=============[3, 256, 256] 18=============train model=============[8, 3, 256, 256][8]Tensor(shape=[8], dtype=int32, place=CUDAPinnedPlace, stop_gradient=True, [0 , 20, 1 , 13, 6 , 15, 15, 10])
发布评论