Keras使用预训练模型迁移学习单通道灰度图像详解

 更新时间:2024年02月27日 11:14:12   作者:任博啥时候能毕业?  
这篇文章主要介绍了Keras使用预训练模型迁移学习单通道灰度图像详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1. 问题引出      

最近在做一个图像分类的项目,由于性能比较差,因此需要尝试将彩色图转为灰度图进行训练,从而屏蔽掉颜色对分类结果的影响而着重关注纹理、结构等信息。

由于样本数量较少,只有几百张的样子,如果自己搭网络的话从头训练的话,势必会因为样本数量的问题,无法达到一个满意的效果,因此考虑借鉴Imagenet的预训练权重。

但是在Imagenet上预训练的模型(Xception, Resnet, VGG等)都是处理的彩色图,如果要使用预训练模型就必须要3通道的图像。

搜索了一下,基本上目前的解决方法:

暴力的将单通道的图复制为3份,然后合成为一张RGB图。

显然,该图3个通道的数值完全相等,这样存在很多冗余计算,我们称之为“伪RGB图”。

为了方便起见,自己实现了两种方法,完成如下转换:

  • RGB图  →  灰度图   →   伪RGB图

其中,转换为灰度图时,均使用的是如下标准公式:

  • L=R*299/1000+G*587/1000+B*114/1000

2. 解决方案

首先,导入必要的包:

from multiprocessing import Pool
from PIL import Image
import numpy as np
import os

2.1. 直接使用convert将L转为RGB

def fakeRgb1(path, dst):
    '''
    方法1:直接使用convert将L转为RGB
    :param path:图片输出路径
    :param dst:图片输出路径
    :return:rgb3个通道值相等的rgb图像
    '''
    b = Image.open(path)
    # L代表转换为灰度图
    if b.mode != 'L':
        L = b.convert('L')
    L = L.convert('RGB')
    # 将图像转为数组
    rgb_array = np.asarray(L)
    # 将数组转换为图像
    rgb_image = Image.fromarray(rgb_array)
    rgb_image.save(dst + '\\' + path.split('\\')[-1])
    print(dst + '\\' + path.split('\\')[-1])

2.2. 数组拼接方法

def fakeRgb2(path, dst):
    '''
    方法二:最原始的拼接数组方法
    :param path:图片输入路径
    :param dst:图片输出路径
    :return:rgb3个通道值相等的rgb图像
    '''
 
    b = Image.open(path)
    # L代表转换为灰度图
    if b.mode != 'L':
        L = b.convert('L')
    # 将图像转为数组
    b_array = np.asarray(L)
    # 将3个二维数组重叠为一个三维数组
    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. 多进程加速运行 

由于是批量处理,因此可能会遇到同时转换很多张图片,那么这个时候就必须使用多进程加速了,具体的加速方法看我的这篇博客:

Python:多进程运行含有任意个参数的函数

本文的加速代码如下:

def get_image_paths(folder):
    return [os.path.join(folder, f) for f in os.listdir(folder)]
 
if __name__ == '__main__': # 多线程,多参数,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.使用预训练模型训练     

这部分就和训练普通RGB图像一样即可,在这里不赘述。 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何利用PyQt5制作一个简单的登录界面

    如何利用PyQt5制作一个简单的登录界面

    初学者制作登录界面时常遇到网上代码看不懂、不会用、用不了的问题,下面这篇文章主要给大家介绍了关于如何利用PyQt5制作一个简单的登录界面,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 用Python进行栅格数据的分区统计和批量提取

    用Python进行栅格数据的分区统计和批量提取

    该教程其实源于web,我看到之后觉得很实用,于是自己又重复做了一遍,写了详细的注释分享给大家,希望对大家的研究有帮助,本文讲述了栅格的分区统计,批量提取,深化理解遍历循环等内容
    2021-05-05
  • 基于Python实现简单的学生点名系统

    基于Python实现简单的学生点名系统

    现在的学生大部分都很积极,会主动举手回答问题。但是,也会遇到一些不好的情况,比如年级越高主动举手的人越少,所以本文做了一个随机的学生点名系统可以帮老师解决这些问题
    2022-09-09
  • 使用Pytorch实现two-head(多输出)模型的操作

    使用Pytorch实现two-head(多输出)模型的操作

    这篇文章主要介绍了使用Pytorch实现two-head(多输出)模型的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Anaconda安装后Spyder闪退解决办法

    Anaconda安装后Spyder闪退解决办法

    作为研究深度学习的一员,经常会遇到各种突如其来的bug,最近又碰到了一个关于spyder打开后又闪退的问题,下面这篇文章主要给大家介绍了关于Anaconda安装后Spyder闪退的解决办法,需要的朋友可以参考下
    2023-04-04
  • 详解用Pytest+Allure生成漂亮的HTML图形化测试报告

    详解用Pytest+Allure生成漂亮的HTML图形化测试报告

    这篇文章主要介绍了详解用Pytest+Allure生成漂亮的HTML图形化测试报告,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 基于Python实现音乐播放器的实现示例代码

    基于Python实现音乐播放器的实现示例代码

    这篇文章主要介绍了如何利用Python编写简易的音乐播放器,文中的示例代码讲解详细,具有一的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Python从列表推导到zip()函数的5种技巧总结

    Python从列表推导到zip()函数的5种技巧总结

    在本篇文章里小编给大家整理的是关于Python从列表推导到zip()函数的5种技巧的相关知识点和代码,需要的朋友们参考学习下。
    2019-10-10
  • pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)

    pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)

    这篇文章主要介绍了pycharm无法安装第三方库的解决办法以scrapy为例,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Selenium定时刷新网页的实现代码

    Selenium定时刷新网页的实现代码

    这篇文章主要介绍了Selenium定时刷新网页的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10

最新评论