Pooling與馬賽克的秘密

ChebyshevTST發表於2023-11-18

  說到Pooling,相信學習過CNN的朋友們都不會感到陌生。Pooling在中文當中的意思是“池化”,在神經網路當中非常常見,通常用的比較多的一種是Max Pooling,具體操作如下圖:

  結合影像理解,相信你也會大概明白其中的本意。不過Pooling並不是只可以選取2x2的視窗大小,即便是3x3,5x5等等沒問題,步長(Stride)也是一個道理。除了在神經網路方面,Pooling為圖片打馬賽克也是可以取得不錯的效果,結合幾個例子看看。

  我們可以用Max Pooling先看看效果如何:

  Min Pooling和Average Pooling的操作也差不多,只不過把對應的操作函式變了而已。

  Min Pooling:

  小動物的皮膚顏色都換了,再看看Average Pooling:

  綜上來看,Average Pooling似乎更加逼真一些,不過換一張圖片可能效果就不一樣了。

  以下是Pooling操作的程式碼:

import cv2
import numpy as np


def average_pooling(img, G=5):
    out = img.copy()

    H, W, C = img.shape
    Nh = H // G
    Nw = W // G

    for y in range(Nh):
        for x in range(Nw):
            for c in range(C):
                out[G*y:G*(y+1), G*x:G*(x+1), c] = np.mean(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int64)

    return out
def max_pooling(img, G=5):
    out = img.copy()

    H, W, C = img.shape
    Nh = H // G
    Nw = W // G

    for y in range(Nh):
        for x in range(Nw):
            for c in range(C):
                out[G*y:G*(y+1), G*x:G*(x+1), c] = np.max(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int64)

    return out
def min_pooling(img, G=5):
    out = img.copy()

    H, W, C = img.shape
    Nh = H // G
    Nw = W // G

    for y in range(Nh):
        for x in range(Nw):
            for c in range(C):
                out[G*y:G*(y+1), G*x:G*(x+1), c] = np.min(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int64)

    return out

  由於是多顏色通道的圖片,所以記得別漏了這個引數。

相關文章