問題描述
在做人臉識別的時候,前期的資料處理過程中可能會遇到乙個問題,即將人臉從不同尺寸的影象中擷取出來,再進行「對齊」操作。這樣可以使每乙個擷取的人臉中的眼睛等位置處於同一位置,會對後面的識別演算法起到一定的優化作用。
比如,下面 3 張所示,人臉的位置,影象的大小各不一樣。我們所需要做的就是,將人臉從各個中擷取出來,再旋轉進行校正,使得眼睛在同一位置上,最後將的大小也統一調整為 224 x 224。
校正的效果如下圖所示:
實現步驟
整個過程遵循以下幾個步驟:
找兩眼間的直線距離並計算該直線與水平線之間的夾角,即傾斜角度
根據找到的傾斜角度旋轉
在旋轉後的中找到眼睛的位置
根據眼睛座標找到包含面部的框的寬度和高度
調整的尺寸
1. 計算直線距離及傾斜角度
計算兩眼之間的距離很簡單,只要找出兩個向量的座標就可以計算出來。計算兩眼之間的距離直線的傾斜角度,就是將兩個向量相減,得到一組橫縱座標,然後利用 arctan 的公式求解角度,公式如下所示:
大多數 sin / cos 等函式要求角度為弧度,可以使用這個轉換公式:angle = angle * 180 / π。
1.找到眼睛傾斜的角度和兩眼距離
p1 = np.array(eye[0])[::-1] # 左眼座標
p2 = np.array(eye[1])[::-1] # 右眼座標
dist = np.sqrt(np.sum(p1-p2)**2) # 兩隻眼睛之間的距離
dp = p1 - p2
angle = np.arctan(dp[0] / dp[1])
2. 根據找到的角度旋轉
2. 旋轉
from scipy import ndimage
# 旋轉
rot_img = ndimage.rotate(face, angle=+angle*180/np.pi)
# 旋轉後影象的中點
rot_image_center = np.array((np.array(rot_img.shape[:2]) - 1) / 2,
dtype=np.int)
3. 尋找旋轉後眼睛的位置
尋找旋轉後眼睛的位置,就是尋找旋轉後兩個點的座標。旋轉的時候,我們是以中點為原點來旋轉的,因而需要先求解出原的原點,也就是的中心點。下面是以原點 (x0, y0) 為中心旋轉後,求座標的公式:
3. 在旋轉後的中找到眼睛的座標
# 原兩眼距離的中點
org_eye_center = np.array((p1 + p2) / 2, dtype=np.int)
# 原影象的中點
org_image_center = np.array((np.array(face.shape[:2]) - 1) / 2, dtype=np.int)
# 以中心進行旋轉,在旋轉後的中找到眼睛的中點
r = np.array([[np.cos(angle), np.sin(angle)], [-np.sin(angle), np.cos(angle)]])
rot_eye_center = np.dot(r, org_eye_center[::-1]
-org_image_center[::-1])[::-1] + rot_image_center
rot_eye_center = np.array(rot_eye_center, dtype=int)
4. 根據眼睛座標找到包含面部的框的寬度和高度
找到旋轉後眼睛的座標,可以利用眼睛的座標來框出人臉的大致範圍。這裡就直接看**,從**中比較好理解。
4. 根據眼睛座標找到包含面部的框的寬度和高度
mid_y, mid_x = rot_eye_center
mul = 2
y_top = int(max(mid_y - mul * dist, 0))
y_bot = int(min(mid_y + mul * dist, rot_img.shape[0]))
x_left = int(max(mid_x - mul * dist, 0))
x_right = int(min(mid_x + mul * dist, rot_img.shape[1]))
cropped_img = rot_img[y_top:y_bot+1, x_left:x_right+1, :]
5. 裁剪
將旋轉並框出的人臉進行裁剪,將其設定為統一的尺寸。
5. 裁剪影象的尺寸為 224x224
import skimage.transform as transform
scaled_img = transform.resize(cropped_img, [224, 224], mode='constant')
plt.imshow(scaled_img)
參考文獻
Python學習筆記 1 1 2 認識Python
一.課程目標 二.詳情解讀 1.初識pythonpython語言是一種高階程式語言,它於1991年由吉多.範羅蘇姆 guido van rossum 發明。目前主要應用於web開發 gui開發 網路爬蟲 資料科學 人工智慧等領域。python官方 python語言也是一種多正規化程式語言,即物件導向...
python實現演算法 kmp演算法python實現
kmp演算法python實現 kmp演算法 kmp演算法用於字串的模式匹配,也就是找到模式字串在目標字串的第一次出現的位置 比如abababc 那麼bab在其位置1處,bc在其位置5處 我們首先想到的最簡單的辦法就是蠻力的乙個字元乙個字元的匹配,但那樣的時間複雜度會是o m n kmp演算法保證了時...
python呼叫qt Qt 下呼叫 Python
qt是乙個跨平台的c 圖形使用者介面應用程式框架,而python是一門非常強大的程式語言,本文主要介紹了如何在osx系統下qt呼叫python指令碼。先上 include 包含呼叫python相應的標頭檔案 include int main int argc,char ar 初始化python直譯器...