|
|
|
|
import sys
|
|
|
|
|
import numpy as np
|
|
|
|
|
import os
|
|
|
|
|
import cv2
|
|
|
|
|
|
|
|
|
|
IMAGE_SIZE = 128
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def resize_image(image,height = IMAGE_SIZE,width = IMAGE_SIZE):
|
|
|
|
|
top,bottom,left,right = 0,0,0,0
|
|
|
|
|
#获取图像大小
|
|
|
|
|
h,w,_ = image.shape
|
|
|
|
|
#对于长宽不一的,取最大值
|
|
|
|
|
longest_edge = max(h,w)
|
|
|
|
|
#计算较短的边需要加多少像素
|
|
|
|
|
if h < longest_edge:
|
|
|
|
|
dh = longest_edge - h
|
|
|
|
|
top = dh // 2
|
|
|
|
|
bottom = dh - top
|
|
|
|
|
elif w < longest_edge:
|
|
|
|
|
dw = longest_edge - w
|
|
|
|
|
left = dw // 2
|
|
|
|
|
right = dw - left
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
#定义填充颜色
|
|
|
|
|
BLACK = [0,0,0]
|
|
|
|
|
|
|
|
|
|
#给图像增加边界,使图片长、宽等长,cv2.BORDER_CONSTANT指定边界颜色由value指定
|
|
|
|
|
constant_image = cv2.copyMakeBorder(image,top,bottom,left,right,cv2.BORDER_CONSTANT,value=BLACK)
|
|
|
|
|
|
|
|
|
|
return cv2.resize(constant_image,(height,width))
|
|
|
|
|
#读取数据
|
|
|
|
|
images = [] #数据集
|
|
|
|
|
labels = [] #标注集
|
|
|
|
|
def read_path(path_name):
|
|
|
|
|
for dir_item in os.listdir(path_name):
|
|
|
|
|
full_path = path_name + '\\' + dir_item
|
|
|
|
|
if os.path.isdir(full_path):
|
|
|
|
|
read_path(full_path)
|
|
|
|
|
else:
|
|
|
|
|
#判断是人脸照片
|
|
|
|
|
if dir_item.endswith('.jpg'):
|
|
|
|
|
image = cv2.imread(full_path)
|
|
|
|
|
image = resize_image(image)
|
|
|
|
|
|
|
|
|
|
images.append(image)
|
|
|
|
|
labels.append(path_name)
|
|
|
|
|
|
|
|
|
|
return images,labels
|
|
|
|
|
|
|
|
|
|
#为每一类数据赋予唯一的标签值
|
|
|
|
|
def label_id(label,users,user_num):
|
|
|
|
|
for i in range(user_num):
|
|
|
|
|
if label.endswith(users[i]):
|
|
|
|
|
return i
|
|
|
|
|
|
|
|
|
|
#从指定位置读数据
|
|
|
|
|
def load_dataset(path_name):
|
|
|
|
|
users = os.listdir(path_name)
|
|
|
|
|
|
|
|
|
|
user_num = len(users)
|
|
|
|
|
|
|
|
|
|
images,labels = read_path(path_name)
|
|
|
|
|
|
|
|
|
|
images_np = np.array(images)
|
|
|
|
|
|
|
|
|
|
#每个图片夹都赋予一个固定唯一的标签
|
|
|
|
|
|
|
|
|
|
labels_np = np.array([label_id(label,users,user_num) for label in labels])
|
|
|
|
|
|
|
|
|
|
return images_np,labels_np
|
|
|
|
|
|