Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解
1. 問(wèn)題引出
最近在做一個(gè)圖像分類的項(xiàng)目,由于性能比較差,因此需要嘗試將彩色圖轉(zhuǎn)為灰度圖進(jìn)行訓(xùn)練,從而屏蔽掉顏色對(duì)分類結(jié)果的影響而著重關(guān)注紋理、結(jié)構(gòu)等信息。
由于樣本數(shù)量較少,只有幾百?gòu)埖臉幼樱绻约捍罹W(wǎng)絡(luò)的話從頭訓(xùn)練的話,勢(shì)必會(huì)因?yàn)闃颖緮?shù)量的問(wèn)題,無(wú)法達(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)文章
利用Python腳本實(shí)現(xiàn)傳遞參數(shù)的三種方式分享
使用python腳本傳遞參數(shù)在實(shí)際工作過(guò)程中還是比較常用。這篇文章為大家總結(jié)了三個(gè)常用的方式,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12
Python使用gTTS實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音的終極指南
gTTS是一款基于Google翻譯API的Python文本轉(zhuǎn)語(yǔ)音庫(kù),支持100+種語(yǔ)言,只需幾行代碼即可生成MP3語(yǔ)音文件,下面我們就來(lái)看看它的具體應(yīng)用吧2026-05-05
使用python將微信image下.dat文件解密為.png的方法
這篇文章主要介紹了使用python將微信image下.dat文件解密為.png的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Python實(shí)戰(zhàn)之實(shí)現(xiàn)獲取動(dòng)態(tài)圖表
這篇文章主要介紹了利用Python實(shí)現(xiàn)動(dòng)態(tài)化圖表,文中的示例代碼介紹詳細(xì),對(duì)我們的工作或?qū)W習(xí)有一定的價(jià)值,感興趣的同學(xué)可以學(xué)習(xí)一下2021-12-12
Python中shutil模塊的常用文件操作函數(shù)用法示例
shutil模塊提供比OS模塊更強(qiáng)大的本地文件操作功能,包括文件的壓縮和解壓縮等,下面我們就來(lái)列舉Python中shutil模塊的常用文件操作函數(shù)用法示例:2016-07-07
Python使用pip安裝庫(kù)的四種方式及異常的解決方案
這篇文章主要介紹了Python使用pip安裝庫(kù)的四種方式及異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2026-03-03
Python操作PostgreSql數(shù)據(jù)庫(kù)的方法(基本的增刪改查)
這篇文章主要介紹了Python操作PostgreSql數(shù)據(jù)庫(kù)(基本的增刪改查),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

