Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解
1. 問題引出
最近在做一個(gè)圖像分類的項(xiàng)目,由于性能比較差,因此需要嘗試將彩色圖轉(zhuǎn)為灰度圖進(jìn)行訓(xùn)練,從而屏蔽掉顏色對(duì)分類結(jié)果的影響而著重關(guān)注紋理、結(jié)構(gòu)等信息。
由于樣本數(shù)量較少,只有幾百張的樣子,如果自己搭網(wǎng)絡(luò)的話從頭訓(xùn)練的話,勢(shì)必會(huì)因?yàn)闃颖緮?shù)量的問題,無法達(dá)到一個(gè)滿意的效果,因此考慮借鑒Imagenet的預(yù)訓(xùn)練權(quán)重。
但是在Imagenet上預(yù)訓(xùn)練的模型(Xception, Resnet, VGG等)都是處理的彩色圖,如果要使用預(yù)訓(xùn)練模型就必須要3通道的圖像。
搜索了一下,基本上目前的解決方法:
暴力的將單通道的圖復(fù)制為3份,然后合成為一張RGB圖。
顯然,該圖3個(gè)通道的數(shù)值完全相等,這樣存在很多冗余計(jì)算,我們稱之為“偽RGB圖”。
為了方便起見,自己實(shí)現(xiàn)了兩種方法,完成如下轉(zhuǎn)換:
- RGB圖 → 灰度圖 → 偽RGB圖
其中,轉(zhuǎn)換為灰度圖時(shí),均使用的是如下標(biāo)準(zhǔn)公式:
- L=R*299/1000+G*587/1000+B*114/1000
2. 解決方案
首先,導(dǎo)入必要的包:
from multiprocessing import Pool from PIL import Image import numpy as np import os
2.1. 直接使用convert將L轉(zhuǎn)為RGB
def fakeRgb1(path, dst): ''' 方法1:直接使用convert將L轉(zhuǎn)為RGB :param path:圖片輸出路徑 :param dst:圖片輸出路徑 :return:rgb3個(gè)通道值相等的rgb圖像 ''' b = Image.open(path) # L代表轉(zhuǎn)換為灰度圖 if b.mode != 'L': L = b.convert('L') L = L.convert('RGB') # 將圖像轉(zhuǎn)為數(shù)組 rgb_array = np.asarray(L) # 將數(shù)組轉(zhuǎn)換為圖像 rgb_image = Image.fromarray(rgb_array) rgb_image.save(dst + '\\' + path.split('\\')[-1]) print(dst + '\\' + path.split('\\')[-1])
2.2. 數(shù)組拼接方法
def fakeRgb2(path, dst): ''' 方法二:最原始的拼接數(shù)組方法 :param path:圖片輸入路徑 :param dst:圖片輸出路徑 :return:rgb3個(gè)通道值相等的rgb圖像 ''' b = Image.open(path) # L代表轉(zhuǎn)換為灰度圖 if b.mode != 'L': L = b.convert('L') # 將圖像轉(zhuǎn)為數(shù)組 b_array = np.asarray(L) # 將3個(gè)二維數(shù)組重疊為一個(gè)三維數(shù)組 rgb_array = np.zeros((b_array.shape[0], b_array.shape[1], 3), "uint8") rgb_array[:, :, 0], rgb_array[:, :, 1], rgb_array[:, :, 2] = b_array, b_array, b_array rgb_image = Image.fromarray(rgb_array) rgb_image.save(dst + '\\' + path.split('\\')[-1]) print(dst + '\\' + path.split('\\')[-1])
3. 多進(jìn)程加速運(yùn)行
由于是批量處理,因此可能會(huì)遇到同時(shí)轉(zhuǎn)換很多張圖片,那么這個(gè)時(shí)候就必須使用多進(jìn)程加速了,具體的加速方法看我的這篇博客:
Python:多進(jìn)程運(yùn)行含有任意個(gè)參數(shù)的函數(shù)
本文的加速代碼如下:
def get_image_paths(folder): return [os.path.join(folder, f) for f in os.listdir(folder)] if __name__ == '__main__': # 多線程,多參數(shù),starmap版本 images = get_image_paths(path) output = [src for i in images] zip_args = list(zip(images, output)) pool = Pool() pool.starmap(fakeRgb2, zip_args) pool.close() pool.join()
4.使用預(yù)訓(xùn)練模型訓(xùn)練
這部分就和訓(xùn)練普通RGB圖像一樣即可,在這里不贅述。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
總結(jié)python 三種常見的內(nèi)存泄漏場景
這篇文章主要介紹了總結(jié)python 三種常見的內(nèi)存泄漏場景,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11Python使用PyCrypto實(shí)現(xiàn)AES加密功能示例
這篇文章主要介紹了Python使用PyCrypto實(shí)現(xiàn)AES加密功能,結(jié)合具體實(shí)例形式分析了PyCrypto實(shí)現(xiàn)AES加密的操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05Python中使用matplotlib模塊errorbar函數(shù)繪制誤差棒圖實(shí)例代碼
在matplotlib中,errorbar方法用于繪制帶誤差線的折線圖,下面這篇文章主要給大家介紹了關(guān)于Python中使用matplotlib模塊errorbar函數(shù)繪制誤差棒圖的相關(guān)資料,需要的朋友可以參考下2022-08-08Python?標(biāo)準(zhǔn)庫?fileinput與文件迭代器
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫fileinput與文件迭代器,fileinput模塊可以對(duì)一個(gè)或多個(gè)文件中的內(nèi)容進(jìn)行迭代、遍歷等操作,更多詳細(xì)內(nèi)容需要的朋友可以參考一下2022-09-09python3.6使用tkinter實(shí)現(xiàn)彈跳小球游戲
這篇文章主要為大家詳細(xì)介紹了python3.6使用tkinter實(shí)現(xiàn)彈跳小球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Python中動(dòng)態(tài)獲取對(duì)象的屬性和方法的教程
本文主要介紹了如何在Python中動(dòng)態(tài)獲取對(duì)象的屬性和方法,并運(yùn)行使用它們,需要的朋友可以參考一下2015-04-04