【计算机视觉+CNN】keras+ResNet残差网络实现图像识别分类实战(附源码和数据集 超详细)

news2024/11/19 3:48:56

需要源码和数据集请点赞关注收藏后评论区留言私信~~~

一、深度卷积神经网络模型结构

1:LeNet-5

LeNet-5卷积神经网络首先将输入图像进行了两次卷积与池化操作,然后是两次全连接层操作,最后使用Softmax分类器作为多分类输出,它对手写数字的识别十分有效,取得了超过人眼的识别精度,被应用于邮政编码和支票号码,但是它网络结构简单,难以处理复杂的图像分类问题

 

 

2:AlexNet

随着高效的并行计算处理器(GPU)的兴起,人们建立了更高效的卷积神经网络,它是一个8层的神经网络模型,包括5个卷积层以及响应的池化层,3个全连接层

3:ZF-Net 

它所使用的卷积神经网络结构是基于AlexNet进行了调整,主要的改进是把第一个卷积层的卷积核滤波器的尺寸从11×11更改为7×7大小,并且步长从4减小到2,这个改进使得输出特征图的尺寸增加到100×100,相当于增加了网络的宽度,可以保留更多的原始像素信息

 4:VGG-Net

VGG网络设计的原理是利用增加网络模型的深度来提高网络的性能,VGG网络的组成可以分为八个部分,包括五个卷积池化组合,两个全连接特征层和一个全连接分类层,每个卷积池化组合是由1-4个的卷积层进行串联所组成的,所有卷积层的卷积核的尺寸大小是3×3

5:GoogLeNet 

该网络模型的基本结构是利用Inception模块进行级联,在实现了扩大卷积神经网络的层数时,网络参数却得到了降低,这样可以对计算资源进行充分使用,使得算法的计算效率大大提高

6:ResNet

ResNet的主要思想就是在标准的前馈卷积网络中,加上一个绕过一些层的跳跃连接,每绕过一层就会产生出一个残差块,卷积层预测添加输入张量的残差。ResNet将网络层数提高到了152层,虽然大幅增加了网络的层数,却将训练更深层的神经网络的难度降低了,同时也显著提升了准确率。

 

二、ResNet图像识别分类实战 

项目结构如下

 

三、代码

部分代码如下 需要全部代码和数据集请点赞关注收藏后评论区留言私信~~~

# -*- coding: utf-8 -*-
'''ResNet50 model for Keras.

# Reference:

- [Deep Residual Learning for Image Recognition](https://arxiv.org/abs/1512.03385)

Adapted from code contributed by BigMoyan.
'''
from __future__ import print_function

import numpy as np
import warnings

from keras.layers import Input
from keras import layers
from keras.layers import Dense
from keras.layers import Activation
from keras.layers import Flatten
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import GlobalMaxPooling2D
from keras.layers import ZeroPadding2D
from keras.layers import AveragePooling2D
from keras.layers import GlobalAveragePooling2D
from keras.layers import BatchNormalization
from keras.models import Model
from keras.preprocessing import image
import keras.backend as K
from keras.utils import layer_utils
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import decode_predictions
from keras.applications.imagenet_utils import preprocess_input
from keras.applications.imagenet_utils import  obtain_input_shape
from keras.utils.layer_utils import get_source_inputs

#要先去这里下载训练模型 没网搞不了
WEIGHTS_PATH = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.2/resnet50_weights_tf_dim_ordering_tf_kernels.h5'
WEIGHTS_PATH_NO_TOP = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.2/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5'

#定义标识模块实现偏差函数
def identity_block(input_tensor, kernel_size, filters, stage, block):
    '''''
        描述:实现偏差单元
        参数 :  X – 输入数据
                k_stride – 卷积核步长
                k_size – 卷积核尺寸
                stage – 网络位置
                block – 图层名称
        返回值:X的激活结果
        '''

    filters1, filters2, filters3 = filters
    if K.image_data_format() == 'channels_last':
        bn_axis = 3
    else:
        bn_axis = 1
    #定义偏差
    conv_name_base = 'res' + str(stage) + block + '_branch'
    bn_name_base = 'bn' + str(stage) + block + '_branch'
    #1 主要路径 卷积->池化->激活
    x = Conv2D(filters1, (1, 1), name=conv_name_base + '2a')(input_tensor)
    x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2a')(x)
    x = Activation('relu')(x)
    #2 主要路径 卷积->池化->激活
    x = Conv2D(filters2, kernel_size,
               padding='same', name=conv_name_base + '2b')(x)
    x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2b')(x)
    x = Activation('relu')(x)
    #3主要路径 卷积->池化
    x = Conv2D(filters3, (1, 1), name=conv_name_base + '2c')(x)
    x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2c')(x)

    x = layers.add([x, input_tensor])
    x = Activation('relu')(x)
    return x

#定义卷积块以实现卷积操作
def conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2, 2)):
    """conv_block is the block that has a conv layer at shortcut
    描述:实现卷积操作
    参数 :  X – 输入数据
            k_stride – 卷积核步长
            k_size – 卷积核尺寸
            stage – 图层名
            block – 模块名
            stride – 与卷积核不同的步长
    返回值:    X -- X的卷积结果

    """
    filters1, filters2, filters3 = filters
    if K.image_data_format() == 'channels_last':
        bn_axis = 3
    else:
        bn_axis = 1
    conv_name_base = 'res' + str(stage) + block + '_branch'
    bn_name_base = 'bn' + str(stage) + block + '_branch'

    x = Conv2D(filters1, (1, 1), strides=strides,
               name=conv_name_base + '2a')(input_tensor)
    x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2a')(x)
    x = Activation('relu')(x)

    x = Conv2D(filters2, kernel_size, padding='same',
               name=conv_name_base + '2b')(x)
    x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2b')(x)
    x = Activation('relu')(x)

    x = Conv2D(filters3, (1, 1), name=conv_name_base + '2c')(x)
    x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2c')(x)

    shortcut = Conv2D(filters3, (1, 1), strides=strides,
                      name=conv_name_base + '1')(input_tensor)
    shortcut = BatchNormalization(axis=bn_axis, name=bn_name_base + '1')(shortcut)

    x = layers.add([x, shortcut])
    x = Activation('relu')(x)
    return x

#定义resNet50函数来设置resNet50网络
def ResNet50(include_top=True, weights='imagenet',
             input_tensor=None, input_shape=None,
             pooling=None,
             classes=1000):

    '''''
    描述 : 建立resNet50 网络
    参数 :  input_shape  -- 输入数据
            classes – 类的数目
    返回值 :模型—keras模型

    #将输入定义为具有形状的张量


    # Raises
        ValueError: in case of invalid argument for `weights`,
            or invalid input shape.
    '''
    if weights not in {'imagenet', None}:
        raise ValueError('The `weights` argument should be either '
                         '`None` (random initialization) or `imagenet` '
                         '(pre-training on ImageNet).')

    if weights == 'imagenet' and include_top and classes != 1000:
        raise ValueError('If using `weights` as imagenet with `include_top`'
                         ' as true, `classes` should be 1000')

    # Determine proper input shape
    input_shape = obtain_input_shape(input_shape,
                                      default_size=224,
                                      min_size=197,
                                      data_format=K.image_data_format(),
                                      require_flatten=include_top or weights)

    if input_tensor is None:
        img_input = Input(shape=input_shape)
    else:
        if not K.is_keras_tensor(input_tensor):
            img_input = Input(tensor=input_tensor, shape=input_shape)
        else:
            img_input = input_tensor
    if K.image_data_format() == 'channels_last':
        bn_axis = 3
    else:
        bn_axis = 1

    x = ZeroPadding2D((3, 3))(img_input)
    x = Conv2D(64, (7, 7), strides=(2, 2), name='conv1')(x)
    x = BatchNormalization(axis=bn_axis, name='bn_conv1')(x)
    x = Activation('relu')(x)
    x = MaxPooling2D((3, 3), strides=(2, 2))(x)

    x = conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1))
    x = identity_block(x, 3, [64, 64, 256], stage=2, block='b')
    x = identity_block(x, 3, [64, 64, 256], stage=2, block='c')

    x = conv_block(x, 3, [128, 128, 512], stage=3, block='a')
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='b')
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='c')
    x = identity_block(x, 3, [128, 128, 512], stage=3, block='d')

    x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='b')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='c')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='d')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='e')
    x = identity_block(x, 3, [256, 256, 1024], stage=4, block='f')

    x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a')
    x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b')
    x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c')

    x = AveragePooling2D((7, 7), name='avg_pool')(x)

    if include_top:
        x = Flatten()(x)
        x = Dense(classes, activation='softmax', name='fc1000')(x)
    else:
        if pooling == 'avg':
            x = GlobalAveragePooling2D()(x)
        elif pooling == 'max':
            x = GlobalMaxPooling2D()(x)

    # Ensure that the model takes into account
    # any potential predecessors of `input_tensor`.
    if input_tensor is not None:
        inputs = get_source_inputs(input_tensor)
    else:
        inputs = img_input
    # Create model.
    model = Model(inputs, x, name='resnet50')

    # load weights
    if weights == 'imagenet':
        if include_top:
            weights_path = get_file('resnet50_weights_tf_dim_ordering_tf_kernels.h5',
                                    WEIGHTS_PATH,
                                    cache_subdir='models',
                                    md5_hash='a7b3fe01876f51b976af0dea6bc144eb')
        else:
            weights_path = get_file('resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5',
                                    WEIGHTS_PATH_NO_TOP,
                                    cache_subdir='models',
                                    md5_hash='a268eb855778b3df3c7506639542a6af')
        model.load_weights(weights_path)
        if K.backend() == 'theano':
            layer_utils.convert_all_kernels_in_model(model)

        if K.image_data_format() == 'channels_first':
            if include_top:
                maxpool = model.get_layer(name='avg_pool')
                shape = maxpool.output_shape[1:]
                dense = model.get_layer(name='fc1000')
                layer_utils.convert_dense_weights_data_format(dense, shape, 'chan
    model = ResNet50(include_top=True, weights='imagenet')

    im(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    print('Input image shape:', x.shape)

    preds = model.predict(x)
    print('Predicted:', decode_predictions(preds))

创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL插入汉字报错的解决方案

MySQL插入汉字报错的原因是字符集的问题,MySQL默认使用的是Latin(拉丁文)字符集,可以在创建数据库时指定其字符集:CREATE DATABASE test DEFAULT CHARACTER SET utf8 或者修改MySQL的配置文件,可以参考以下…

Qt事件循环嵌套,BlockingQueuedConnection与QWaitCondition比较

前言: 之前写过有关事件循环和条件变量的博客: Qt使用事件循环,信号,stop变量,sleep阻塞,QWaitConditionQMutex条件变量,退出子线程工作_大橘的博客-CSDN博客_qt stop函数 Qt事件循环&#x…

Unity3D导出Android工程中使用并交互

, 目录 1,版本信息 2,前期准备 Unity方面: Android方面: 3,Android与Unity3D交互 1,版本信息 unity2020 android studio 2021 *不要用android studio 2020系列,存在不能导入Library的b…

Spring学习 | Bean作用域生命周期

文章目录一、作用域1.1 xml文件中配置1.2 注解配置二、生命周期2.1 四个阶段2.2 添加后置处理器2.3 实现aware类型接口2.4 Bean 初始化的方式2.5 Bean 销毁的方式2.6 测试程序学习视频🎥:https://www.bilibili.com/video/BV1Vf4y127N5 一、作用域 ❓ 引入…

Linux系统中裸机按键中断的驱动方法

大家好,今天主要和大家聊一聊,如何实现按键中断的驱动​方法。 目录 ​第一:外部中断头文件实现 ​第二:外部中断源文件的具体实现 ​第三:编写对应的main.c函数 ​第一:外部中断头文件实现 #ifndef _…

基于keras平台CNN神经网络模型的服装识别分析

在许多介绍图像识别任务的介绍中,通常使用着名的MNIST数据集。 最近我们被客户要求撰写关于图像识别的研究报告,包括一些图形和统计输出。但是,这些数据存在一些问题: 1.太简单了。例如,一个简单的MLP模型可以达到99…

Java搭建宝塔部署实战毕设项目springboot客户管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目,springboot客户管理系统源码,感兴趣的朋友可以自行下载搭建测试。 技术架构 技术框架:SpringBoot MySQL5.7 mybatis shiro Lay…

DDR4时序标准规范(一)

DDR4时序标准规范引脚描述DDR4 SDRAM寻址DDR4架构的模块描述功能描述简化状态机基本功能复位和初始化程序上电和初始化顺序电压稳定后的复位初始化顺序无控制的下电顺序引脚描述 标志类型功能CK_t, CK_c输入Clock: CK_t和CK_c是差分时钟输入。所有的地址和控制输入信号在CK_t的…

主成分分析(PCA)原理及R语言实现及分析实例

主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分。最近我们被客户要求撰写关于主成分分析(PCA)的研究报告,包括一些图形和统计输出。…

Vagrant搭建Centos

1.下载安装vagrant 01访问Vagrant官网 ​ https://www.vagrantup.com/ 02 点击Download ​ Windows,MacOS,Linux等 03 选择对应的版本 04 傻瓜式安装 05 命令行输入vagrant,测试是否安装成功,显示如下: 2.下载安装virtua…

半解析快速傅里叶变换

我们提出了一种处理傅里叶变换的方法,其并不需要二次多项式相位项的抽样,而是用解析的方法处理。我们提出该理论的同时也给出了几个例子证明其潜力。 1.简介 物理光学建模需要频繁地从空间转换到角频域,反之亦然。这可以由电场和磁场分…

网络编程(用于不同电脑之间的信息交互):UDP、TCP

网络编程: 在网络通信写一下,不同计算机运行的程序,可以进行数据传输 IP地址:设备(手机、电脑等)在网络中的地址,是唯一的标识 端口:应用程序在设备中唯一的表示 协议&#xff1a…

数据结构学习——表、查找

定义 设记录表L(R1 R2…其中Ri(L<i<n)为记录&#xff0c; 对给定的某个值k&#xff0c; 在表L中确定key k的记录的过程&#xff0c;称为查找。若表Lz中存在记录Ri de key k,记为Ri.key,则查找成功&#xff0c;返回该记录在表L中的序号i&#xff08;或Ri的地址&#xff…

优秀的 Verilog/FPGA开源项目介绍(二十)- 张量处理单元(TPU)

介绍张量处理单元( Tensor Processing Unit, TPU ) 是谷歌专门为神经网络机器学习开发的人工智能加速器 专用集成电路(ASIC) &#xff0c;特别是使用谷歌自己的TensorFlow软件。谷歌于 2015 年开始在内部使用 TPU&#xff0c;并于 2018 年将它们作为其云基础设施的一部分并通过…

Zabbix6.0使用教程 (三)—zabbix6.0的安装要求

接上篇&#xff0c;我们继续为大家详细介绍zabbix6.0的使用教程之zabbix6.0的安装部署。接下来我们将从zabbix部署要求到四种不同的安装方式逐一详细的为大家介绍。本篇讲的是部署zabbix6.0的要求。 zabbix6.0安装要求 硬件&#xff1a;内存和磁盘 Zabbix6.0安装 运行需要物…

算法精品讲解(2)——DP问题入门(适合零基础者,一看就会)

目录 前言 DP问题它是什么&#xff08;了解&#xff09; 从中学的例题谈起 再来说一下&#xff0c;DP问题的核心思想&#xff08;理解&#xff09; DP问题的解决方法 先说方法论&#xff1a; 再说具体的例子 例一&#xff1a; 例二&#xff1a; 例三&#xff1a; DP和…

kotlin之range范围表达式

Kotlin 中的 Range 有 CharRange、LongRange、IntRange range 范围 CharRange、LongRange、IntRange 范围区间 var a:IntRange 50..100for (i in a){ //遍历50~100的分数分别在什么位置print("成绩&#xff1a;$i")if(i in 1..59){ //1~59 范围println("…

Leica Infinity三维映射环境数据

Leica Infinity三维映射环境数据 Leica Infinity是软件工程师和该领域专家的名字&#xff0c;以及您的工作计划信息。该软件被设计和呈现为一个强大的产品&#xff0c;并且来自六边形组。Leica Infinity产品的居民试图用新的眼光创造新的数据处理。使用此软件&#xff0c;您可以…

和ChatGPT 比一比谁更懂Kubernetes?

有时&#xff0c;很难得到关于云原生世界中棘手话题的明确答案。哪个是最好的服务网格&#xff1f;平台工程只是devops的另一个标签吗&#xff1f;多云是一种风险吗&#xff1f; 如果你无法从一个人那里得到直截了当的答案——为什么不问一台机器呢&#xff1f; 因此&#xf…

net6自动注册到Consul 代码实例

简单理解: 服务多的时候&#xff0c;服务地址都是写固定&#xff0c;增加一个地址&#xff0c;配置一次&#xff0c;配置nginx或者其他配置&#xff0c;麻烦 有了这个就可以通过应用服务上报服务名servicename和访问地址&#xff0c;同一个服务名servicename可以有多个节点&a…