欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解

 更新時(shí)間:2024年02月27日 11:14:12   作者:任博啥時(shí)候能畢業(yè)?  
這篇文章主要介紹了Keras使用預(yù)訓(xùn)練模型遷移學(xué)習(xí)單通道灰度圖像詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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)文章

最新評(píng)論