python 連續矯正 Python 進行人臉校正

2021-10-19 01:21:47 字數 2377 閱讀 3693

問題描述

在做人臉識別的時候,前期的資料處理過程中可能會遇到乙個問題,即將人臉從不同尺寸的影象中擷取出來,再進行「對齊」操作。這樣可以使每乙個擷取的人臉中的眼睛等位置處於同一位置,會對後面的識別演算法起到一定的優化作用。

比如,下面 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直譯器...