本人 在阅读facenet-master项目时 ,看到一段代码是对文件下各文件图片进行处理,觉得还不错由此记录下来。处理的内容如下所示:
代码 如下 :
import argparse
import os
import random
import sys
from PIL import Image
from scipy import misc
class ImageClass():
def __init__(self,name,image_paths):
self.name=name
self.image_paths=image_paths
def __str__(self):
return self.name+","+str(len(self.image_paths))+'images'
def __len__(self):
return len(self.image_paths)
def get_image_paths(facedir):
image_paths=[]
if os.path.isdir(facedir):
images=os.listdir(facedir)
image_paths=[os.path.join(facedir,img) for img in images]
return image_paths
def get_dataset(path,has_class_direcories=True):
dataset=[]
path_exp=os.path.expanduser(path)
classes =[path for path in os.listdir(path)\
if os.path.isdir(os.path.join(path_exp,path))]
classes.sort()
nrod_classes=len(classes)
for i in range(nrod_classes):
class_name=classes[i]
facedir=os.path.join(path_exp,class_name)
image_paths=get_image_paths(facedir)
dataset.append(ImageClass(class_name,image_paths))
return dataset
def main(args):
output_dir=os.path.expanduser(args.output_dir)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
dataset=get_dataset(args.input_dir)
for cls in dataset:
output_class_dir=os.path.join(output_dir,cls.name)
if not os.path.exists(output_class_dir):
os.makedirs(output_class_dir)
# if args.random_order:
# random.shuffle(cls.image_paths)
for image_path in cls.image_paths:
filename=os.path.splitext(os.path.split(image_path)[1])[0]
output_filename=os.path.join(output_class_dir,filename+'.png')
print(image_path)
if not os.path.exists(output_filename):
try :
# img=misc.imread(image_path)
# filename_base, file_extension=os.path.splitext(output_filename)
# output_filename_n="{}{}".format(filename_base,file_extension)
# # misc.imsave(output_filename_n,img)
img = Image.open(image_path).convert('LA')
filename_base, file_extension=os.path.splitext(output_filename)
output_filename_n = "{}{}".format(filename_base, file_extension)
img.save(output_filename_n)
except (IOError,ValueError,IndexError) as e:
errorMassage='{}:{}'.format(image_path,e)
print(errorMassage)
def parse_arguments(argv):
parser=argparse.ArgumentParser()
parser.add_argument('input_dir',type=str,help='Director with unaligned images.',default="/dataset")
parser.add_argument('output_dir',type=str,help='Directory with aligend face image',default='/new_dataset')
return parser.parse_args(argv)
if __name__=='__main__':
main(parse_arguments(sys.argv[1:]))
我用的是win7 ,Pycharm。 运行以上代码时需要 在 Edit Configurations 的 Parameters 输入input_dir 和 output_dir的值 我的dataset在同目录下,所以输入的是 dataset 和new_dataset
linux 下好像是输入/dataset 和 /new_dataset
我两个参数都用了 default ,照理来说是 不需要输入这两个 参数的 , 但是还是需要,没道理呀。