1. 程式人生 > >(人臉識別2-5)——人臉識別模型訓練集處理

(人臉識別2-5)——人臉識別模型訓練集處理

人臉識別模型訓練集處理

前面已經實現將人臉拍攝下來儲存在traindata資料夾內,但是這還不夠,我們需要對測試圖片進行大小的調整,因為有些圖片的格式長短不一樣,這樣對於後面我們訓練模型不方便處理,而且較大的圖片檔案處理運算量也非常大。

這裡再次說一下問價夾的存放形式,不然無法讀取,程式無法執行,如果看懂了程式,稍加改動其實還是可以適應不同的資料夾形式

這裡先貼上程式碼,所有詳細的解釋都在註釋上

# -*- coding: utf-8 -*-

import os
import numpy as np
import cv2

IMAGE_SIZE = 64


# 按照指定影象大小調整尺寸
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 # RGB顏色 BLACK = [0, 0, 0] # 給影象增加邊界,是圖片長、寬等長,cv2.BORDER_CONSTANT指定邊界顏色由value指定 constant = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT, value=BLACK) # 調整影象大小並返回
return cv2.resize(constant, (height, width)) # 讀取訓練資料i images = [] labels = [] def file_exit(path_name,son_path_name):#判斷path_name資料夾下是否有file_name lists = os.listdir(path_name)#該目錄下的所有資料夾 for list in lists:#遍歷所有檔案,如果存在與son_path_name同名的資料夾,返回1即找到測試集檔案 if list == son_path_name: print ('file exits') return 1 return 0 def read_path(path_name,son_path_name):#讀取路徑下的資料集,併為每張圖片新增一個類別標籤 parent_path = os.path.abspath(os.path.join(path_name, '..')) exit_code=file_exit(parent_path,son_path_name)#判斷該路徑下是否有測試集目錄 if exit_code == 1:#如果有,則全路徑是當前路徑上一級+測試集資料夾名 fullpath = parent_path +'/'+ son_path_name for dir_item in os.listdir(fullpath):#遍歷所有的圖片 if dir_item.endswith('.jpg'):#如果格式是圖片,則進行大小處理 image = cv2.imread(fullpath+'/'+dir_item) image = resize_image(image, IMAGE_SIZE, IMAGE_SIZE) images.append(image) labels.append(son_path_name) print labels return images, labels # 從指定路徑讀取訓練資料,path_name是當前檔案所在路徑,son_path_name是需要尋找的存放測試資料的子目錄名 def load_dataset(path_name,son_path_name): images, labels = read_path(path_name,son_path_name)#讀取子目錄下的所有測試資料集 # 將輸入的所有圖片轉成四維陣列,尺寸為(圖片數量*IMAGE_SIZE*IMAGE_SIZE*3) # IMAGE_SIZE為64,故對我來說尺寸為1200 * 64 * 64 * 3 # 圖片為64 * 64畫素,一個畫素3個顏色值(RGB) images = np.array(images) print(images.shape) # 標註資料,'traindata'資料夾下都是訓練集的臉部影象,全部指定為0,另外一個資料夾下是測試集的,全部指定為1 labels = np.array([0 if label==('traindata') else 1 for label in labels]) print labels return images, labels if __name__ == '__main__': path_name=os.getcwd()#getcwd()獲取當前.py檔案所在目錄,載入與此目錄所在路徑上一級的traindata資料夾下的所有訓練檔案 images, labels = load_dataset(path_name,'traindata')

原博主是對資料夾的一些操作進行全部處理,這種處理方式在我看來不是很好,這裡自己程式碼自己進行重寫和新增一些自己的方法,進行資料夾的讀取和操作,對於相關的資料夾的處理操作可以參見:python——【轉載】os操作檔案目錄

主要的檔案操作程式碼在:

def file_exit(path_name,son_path_name):#判斷path_name資料夾下是否有file_name
    lists = os.listdir(path_name)#該目錄下的所有資料夾
    for list in lists:#遍歷所有檔案,如果存在與son_path_name同名的資料夾,返回1即找到測試集檔案
        if list == son_path_name:
            print ('file exits')
            return 1
    return 0


def read_path(path_name,son_path_name):#讀取路徑下的資料集,併為每張圖片新增一個類別標籤
    parent_path = os.path.abspath(os.path.join(path_name, '..'))
    exit_code=file_exit(parent_path,son_path_name)#判斷該路徑下是否有測試集目錄

    if exit_code == 1:#如果有,則全路徑是當前路徑上一級+測試集資料夾名
        fullpath = parent_path +'/'+ son_path_name

        for dir_item in os.listdir(fullpath):#遍歷所有的圖片

            if dir_item.endswith('.jpg'):#如果格式是圖片,則進行大小處理
                image = cv2.imread(fullpath+'/'+dir_item)
                image = resize_image(image, IMAGE_SIZE, IMAGE_SIZE)

                images.append(image)
                labels.append(son_path_name)
    print labels
    return images, labels

這裡分為兩個方法,第一個方法是判斷該路徑下是否有一個名為son_path_name的資料夾,也就是traindata資料夾。第二個方法是讀取當前Python檔案的路徑的上一級目錄,也就是前面圖片貼出來的openvideo_test資料夾,我們需要進入到該路徑的父目錄才能訪問traindata資料夾。具體操作請看上面程式碼。

下面我們將利用keras庫對這些訓練資料進行模型的訓練。