MTCNN中構建圖像金字塔
MTCNN在進行人臉檢測任務時,輸入是一張圖像,輸出圖像中人臉所在位置的Bounding Box。MTCNN基於卷積神經網絡,通常只適用於檢測一定尺寸範圍內的人臉,比如其中的P-Net,用於判斷12×12大小範圍內是否含有人臉,但是輸入圖像中人臉的尺寸未知,需要構建圖像金字塔獲得不同尺寸的圖像,縮放圖像是爲了將圖像中的人臉縮放到網絡能檢測的適宜尺寸,只要某個人臉被放縮到12×12左右,就可以被檢測出來,下圖爲MTCNN人臉檢測流程。
構建金字塔需要解決幾個問題:
1. 金字塔要建多少層,即一共要生成多少張圖像
2. 每張圖像的尺寸如何確定
在人臉檢測時,通常要設置原圖中要檢測的最小人臉尺寸,原圖中小於這個尺寸的人臉可以忽略,MTCNN代碼中爲minsize=20,MTCNN P-Net用於檢測12×12大小的人臉。
人臉檢測中的圖像金字塔構建,涉及如下數據:
輸入圖像尺寸,定義爲(h, w) = (100, 120)
最小人臉尺寸,定義爲 min_face_size = 20
最大人臉尺寸,如果不設置,爲圖像高寬中較短的那個,定義爲max_face_size = 100
網絡能檢測的人臉尺寸,定義爲net_face_size = 12
金字塔層間縮放比率,定義爲factor = 0.709
圖像金字塔中
最大縮放尺度max_scale = net_face_size / min_face_size = 12 / 20,
最小縮放尺度min_scale = net_face_size / max_face_size = 12 / 100,
中間的縮放尺度scale_n = max_scale * (factor ^ n) = ,
對應的圖像尺寸爲(h_n, w_n) = (h * scale_n, w_n * scale_n)
舉例解釋說明:
當原圖(100, 120)中有一個最小人臉(20, 20)時,
(20, 20)>(12, 12)圖像縮小比(爲縮放尺寸的倒數)最小20 / 12,原圖由(100, 120)>(60, 72),圖像(60, 72)爲圖像金字塔的最底層。根據金字塔層間縮放比率,每層圖像的尺寸爲:
(h_n, w_n) = (h * scale_n, w_n * scale_n)
=(100×12/20×0.709^ n,120×12/20×0.709^ n)
同時需要保證min(h_n, w_n) >net_face_size
附上代碼:
def processed_image(img, scale):
height, width, channels = img.shape
new_height = int(height * scale)
new_width = int(width * scale)
new_dim = (new_width, new_height)
img_resized = cv2.resize(img, new_dim, interpolation=cv2.INTER_LINEAR) # resized image
img_resized = (img_resized - 127.5) / 128
return img_resized
def pyramid_image(img):
net_size = 12
min_face_size = 20
current_scale = float(net_size) / self.min_face_size # find initial scale
im_resized = processed_image(img, current_scale) # the first layer of image pyramid
current_height, current_width, _ = im_resized.shape
while min(current_height, current_width) > net_size:
current_scale *= self.scale_factor
im_resized = processed_image(im, current_scale)