baselines演算法庫common/tile_images.py模組分析
阿新 • • 發佈:2022-03-19
該模組只有一個函式,全部內容:
import numpy as np def tile_images(img_nhwc): """ Tile N images into one big PxQ image (P,Q) are chosen to be as close as possible, and if N is square, then P=Q. input: img_nhwc, list or array of images, ndim=4 once turned into array n = batch index, h = height, w = width, c = channel returns: bigim_HWc, ndarray with ndim=3""" img_nhwc = np.asarray(img_nhwc) N, h, w, c = img_nhwc.shape H = int(np.ceil(np.sqrt(N))) W = int(np.ceil(float(N)/H)) img_nhwc = np.array(list(img_nhwc) + [img_nhwc[0]*0 for _ in range(N, H*W)]) img_HWhwc = img_nhwc.reshape(H, W, h, w, c) img_HhWwc = img_HWhwc.transpose(0, 2, 1, 3, 4) img_Hh_Ww_c= img_HhWwc.reshape(H*h, W*w, c) return img_Hh_Ww_c
輸入的是一個batch的圖片資料,維度為n*h*w*c , n為batch_size, h為圖片高度, w為圖片寬度, c為圖片通道數。
這個模組,或者說這個函式的作用將n個圖片拼接成一個大圖片,大圖片的高為H個圖片的高h堆砌成,畫素為H*h,
大圖片的寬為W個圖片的高w堆砌成,畫素為W*w。
這時候有一個注意的問題那就是輸入的圖片個數,即batch_size可能不是可以開平方的數,如果batch_size可以開平方,那麼H=W=sqrt(n),
如果n不能開平方,那麼H則向下約近sqrt(n)的取整,W則向下約近n/H的取整。
即使是這樣設定H、W也不能避免H*W不等於n,這時就需要對拼接圖片進行補零操作:
img_nhwc = np.array(list(img_nhwc) + [img_nhwc[0]*0 for _ in range(N, H*W)])
也就是說如果H*W小於n則用0補齊以保證一共拼接的圖片個數為H*W個,因為前面對H、W計算時使用的是向下約近,因此H*W不存在大於n的情況。
==============================================