resnet152训练_Resnet-152的图像预处理
152層的 Resnet的圖片輸入尺寸為224*224,那對于大多數情況,圖片的分辨率都是大于這個數值,那么該如何把圖片的尺寸裁剪到這樣一個尺寸,又如何進行數據增強呢?
第一,調整尺寸(Rescaling)
先將圖片較短的那條邊,隨機縮放到[256,480]這樣一個范圍內。注意,此時的圖片是等比例縮放的。舉個例子,原始圖片的尺寸為[1000,800,3],假設圖片短邊縮放到256,那么此時圖片的尺寸即為[320,256,3],即圖片的長寬比例是不變的。
第二,裁剪(Cropping)
將圖片進行水平翻轉,然后從原圖片和翻轉后的圖片中,隨機裁剪出224*224的圖片。那到底裁幾張呢?Resnet沒有明說。。。我覺得還是看自己計算機的配置。因為從理論上來說,假設裁剪過后的圖片尺寸為[256,256,3],如果按照步長為1,最多可以裁剪出(256-224)*(256-224) = 1024張,再加上水平翻轉的圖片,還要乘以個2,也就是2048張圖片。一張圖片擴展了2048倍,肯定是非常夸張了,那所以,我的做法是隨機裁剪個10張,就差不多了。
第三,歸一化(Normalizing)
具體做法就是對于整個訓練集圖片,每個通道分別減去訓練集該通道平均值。
第四,顏色抖動(color shifting)
這里resnet 引用的是Alexnet 2012年提出的做法,對于每張圖片,每個通道的數據先由二維轉成一維(例如256*256*3,轉成65536*3),再對該圖片(65536*3)三個通道求出協方差矩陣(3*3),再求出協方差矩陣的特征向量p和特征值λ,最后按照下圖這樣一個公式進行轉換進行變換, 這里α是一個服從均值為0,方差為0.1的隨機變量(簡單來說就是一個很小的隨機數),[p1,p2,p3]是一個3*3的矩陣,[λ1,λ2,λ3]的轉置是一個3*1的矩陣,最后矩陣相乘的結果也是個3*1的矩陣,剛好可以和原圖片3個通道相加,這里執行的是python中的廣播機制,即圖片每個通道65536個像素點都加上同一個數。
這樣就完成了顏色的隨機抖動,不過我一直想不明白特征值乘以特征向量有著什么樣的數學解釋,如果您知道,請聯系我(QQ380922457,知乎ID:梁航銘)
第五,測試方法
先抽取測試集圖像的四個角以及中間的224×224部分,還包括鏡像共有10個部分(Patch)結果,再對這10個輸入的測試結果做平均作為我們對該測試集圖片的最終測試結果。
代碼如下
from random import normalvariate
import numpy as np
import os
from PIL import Image
from random import randint
IMAGE_PATH ="/Users/lianghangming/Desktop/"
# 等比例地把圖片較短的一邊縮放到區間[256,480]
def rescale(image):
w = image.size[0]
h = image.size[1]
sizeMax =480
sizeMin =256
random_size = randint(sizeMin,sizeMax)
if w < h:
return image.resize((random_size,round(h/w * random_size)))
else:
return image.resize((round(w/h * random_size),random_size))
# 隨機裁剪圖片
def random_crop(image):
w = image.size[0]
h = image.size[1]
size =224
new_left = randint(0,w - size)
new_upper = randint(0,h - size)
return image.crop((new_left,new_upper,size+new_left,size+new_upper))
# 水平翻轉圖片
def horizontal_flip(image):
returnimage.transpose(Image.FLIP_LEFT_RIGHT)
# 圖片均值歸一化
def nomalizing(image,mean_value,add_num):
image = np.array(image)
# image = image.astype(float)
for i in range(3):
add_num = add_num.astype(int)
image[:,:,i] = (image[:,:,i] - mean_value[i] + add_num[i])#/std[i]
return image
# 求整個訓練集圖片的均值
def mean(image_dir):
for file in os.listdir(image_dir):
iffile.endswith("jpg"):
file = os.path.join(image_dir,file)
image = np.array(Image.open(file))
image = np.reshape(image,[-1,3])
try:
image_array = np.concatenate((image_array,image),0)# 第一張圖片不存在image_array
except:
image_array = image
mean_value = image_array.mean(0)
# std_value = image_array.std(0)
return mean_value
# 求整個訓練集圖片的PCA
def pca(image_dir,mean_value):
for file in os.listdir(image_dir):
iffile.endswith("jpg"):
file = os.path.join(image_dir,file)
image = np.array(Image.open(file))
image = np.reshape(image,[-1,3])
image = image.astype(float)
image -= mean_value# 零均值化
# image = image/255.0
try:
image_array = np.concatenate((image_array,image),0)# 第一張圖片不存在image_array
except:
image_array = image
# 求協方差矩陣
image_cov = np.cov([image_array[:,0],image_array[:,1],image_array[:,2]])
lambd,p = np.linalg.eig(image_cov)
alpha0 = normalvariate(0,0.1)
alpha1 = normalvariate(0,0.1) alpha2 = normalvariate(0,0.1)
v = np.transpose((alpha0*lambd[0],alpha1*lambd[1],alpha2*lambd[2]))
add_num = np.dot(v,np.transpose(p))
return add_num
如有錯誤,歡迎指正
總結
以上是生活随笔為你收集整理的resnet152训练_Resnet-152的图像预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat日志配置调整
- 下一篇: 孪生网络 Siamese Network