MTCNN中構建圖像金字塔

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章