深度学习中的目标识别

news/2024/5/19 5:14:47/文章来源:https://blog.csdn.net/qq_59931372/article/details/129974860

 博主简介

博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c++,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的,如果有错误之处,大家可以指正。

专栏简介:   本专栏主要研究计算机视觉,涉及算法,案例实践,网络模型等知识。包括一些常用的数据处理算法,也会介绍很多的Python第三方库。如果需要,点击这里订阅专栏   。

给大家分享一个我很喜欢的一句话:“每天多努力一点,不为别的,只为日后,能够多一些选择,选择舒心的日子,选择自己喜欢的人!”


目录

编辑前言

​编辑目标识别的概念

​编辑神经网络的使用 

​编辑构建数据集的方法

编辑搭建神经网络

编辑训练及效果评估

​编辑解决过拟合

​编辑数据增强

​编辑迁移学习


前言

前面我们介绍了深度学习中的神经网络,那么本届我们就开始正式的进入深度学习中了,前面我们介绍过计算机视觉的四大任务:目标识别、目标检测、目标跟踪和目标分割。其中最基础的就是目标识别,几乎所有的计算机视觉的知识都是在目标识别问题上构建的,也就是说目标识别问题构成了整个计算机视觉的地基,如果我们不能解决识别问题,就无法建造我们的计算机视觉大厦。

本章,我们就通过一个项目实战来全面认识目标识别。本节我们用到的数据集:数据集下载。

目标识别的概念

目标识别的概念在前面我们就已经介绍过了,计算机视觉之所以叫做计算机视觉,这是用为这是基于计算机,模仿人类视觉的一种概念模型。但是计算机始终计算机,它并不能像人一样直接分别出物体,而是对物体进行标记。比如说,我们对一堆照片进行识别的时候,里面的猫识别成功后标记为1,如果是狗就标记为2.也就是他的识别是已经规划好的数据,并不能随机应变。

其次,计算机输出的是物体类别的概率,例如,第一类的概率为0.9,第二类的概率为0.1,最后取最大概率对应的类别进行输出,这与人类识别物体是不同的,从这方面可以看出,计算机是非常严谨的,应为他不会认为某一个类别的概率为100%。

由于计算机对于每一类都输出概率,就出现了一个引申概念:top k准确率,顾名思义就是将输出概率最大的k个类别输出,只要猜对其中的一个,就认为计算机猜对了,这在目标识别的评价中很常见,因为一张图片中往往有多个目标,而标签只有一个,所以简单的才一次决定输赢是不合理的,k的值由类别的数量决定,一般取5~10.

神经网络的使用 

构建数据集的方法

在进行神经网络的学习中,数据集的使用是非常重要的,在这个过程中,我们可以使用开源的数据集,也可以自己创建数据集。下面我们准备对猫狗大战数据集进行使用。

(1)、将图片构建成同样的大小,这是用与一般的卷积神经网络需要输入图片的大小固定。

(2)、对每张图片构建数据标签,对于猫狗大战,图片猫标记为0,图片狗标记为1.

(3)、将数据集分为训练集和测试集,一般比例为4:1,或5:1.为了防止过拟合,我们需要在训练集上训练,之后再测试集测试,当训练集和测试集最终表现差不多的时候,我们就可以认为模型没有过拟合,而最终的结果也需要使用测试集上的准确率。

(4)、分批次,对于深度学习,我们一般使用小批次梯度下降算法,所以我们需要确定每个批次图片的数量,数量需要更具我们的CPU或GPU的内存来决定,一般取64或129张图片为一个批次。

(5)、随机打乱训练集的图片顺序,为了提升训练结果,每训练完一遍数据集后,我们需要对数据集进行随机打乱顺序,确保每个批次输入的图片都是完全随机的,否则很容易陷入局部极值。

来吧,展示,上代码:

import tensorflow as tf
import os
#读取数据集并构建数据集
_URL='https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip'
#解压
path_to_zip=tf.keras.utils.get_file('cats_and_dogs.zip',origin=_URL,extract=True)
PATH=os.path.join(os.path.dirname(path_to_zip),'cats_and_dogs_filtered')
#分为训练集和测试集
train_dir=os.path.join(PATH,'train')
validation_dir=os.path.join(PATH,'validation')#分为猫图片和狗图片
train_cats_dir=os.path.join(train_dir,'cats')
train_dogs_dir=os.path.join(train_dir,'dogs')
validation_cats_dir=os.path.join(validation_dir,'cats')
validation_dogs_dir=os.path.join(validation_dir,'dogs')
#批次大小
batch_size=64
epochs=20
#图片输入大小为150*150
IMG_HEIGHT=150
IMG_WIDTH=150
#从目录生成数据集,shuffle表示随机打乱数据顺序
train_data_gen=tf.keras.preprocessing.image.ImageDataGenerator()
train_data_gentor=train_data_gen.flow_from_directory(batch_size=batch_size,directory=train_dir,shuffle=True,target_size=(IMG_HEIGHT,IMG_WIDTH),class_mode='binary')
val_data_gen=tf.keras.preprocessing.image.ImageDataGenerator()
val_data_gentor=val_data_gen.flow_from_directory(batch_size=batch_size,directory=validation_dir,target_size=(IMG_HEIGHT,IMG_WIDTH),class_mode='binary')

搭建神经网络

接下来我们需要根据图片的大小搭建一个合适的神经网络,对于初学者,建议使用10层左右的神经网络。一般来说,只对神经网络的第一层和最后一层有输入和输出大小的限制。例如,第一层的输入需要图片的形状,而最后一层的输出需要为物体类别数量。

第一层:3x3卷积层,32个输出通道,输入形状为图片的形状:150x150x3,填充1个像素,激活函数为relu()。

第二层:2x2的最大池化层。

第三层:3x3的卷积层,64个输出通道,填充一个像素,激活函数为relu()。

第四层:2x2的最大池化层。

第五层:3x3的卷积层,64个输出通道,填充一个像素,激活函数为relu()。

第六层:2x2的最大池化层。

第七层:输出为256维的全连接层,激活函数为relu()。

第八层:输出为1维的全连接层,激活函数为sigmoid()。


#搭建神经网络
#每一行代表神经网络的一层
model=tf.keras.models.Sequential([tf.keras.layers.Conv2D(32,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64,3,padding='same',activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64,3,padding='same',activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(256,activation='relu'),tf.keras.layers.Dense(1,'sigmoid')
])

训练及效果评估

为了防止可能出现错误,我们先不要再整个数据机上训练,而是在小规模的数据集上训练,保证模型可以在小规模数据集上过拟合,进而使用整个数据集。

接下来就可以训练了,我们需要选择优化器,一般来说Adam优化器可以解决大部分问题,损失函数我们一般选择交叉熵损失,在本例中我们使用二分类交叉熵。训练过程中我们可以美国一定部署把当前损失和准确率记录下来,以此来判断模型训练的效果。当我们发现损失函数不再下降时应该即时停止训练。


#训练
#编译模型,输入优化器,损失函数,训练过程需要保存的特征
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
#训练
history=model.fit_generator(train_data_gen,steps_per_epoch=100//batch_size, #每轮的步数epochs=epochs,validation_data=val_data_gen,validation_steps=100//batch_size
)

解决过拟合

当我们使用的数据集比较小的时候,就需要用一定的方法防止过拟合。所以可以通过减小模型参数来解决过拟合问题。


model1=tf.keras.models.Sequential([tf.keras.layers.Conv2D(32,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(32,3,padding='same',activation='relu'),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(128,activation='relu'),tf.keras.layers.Dense(1,activation='sigmoid')
])

第二种方法是增加正则化项,常用的为L1和L2正则化方法。在神经网络中我们一般用L2正则化方法,我们需要调整权重系数,有一个神奇的值0.0005,此值可以作为大部分问题的权重系数。


model=tf.keras.Sequential([tf.keras.layers.Conv2D(32,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3),kernel_regularizer=tf.keras.regularizers.l2(l=0.0005)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3),kernel_regularizer=tf.keras.regularizers.l2(l=0.0005)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Conv2D(64,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3),kernel_regularizer=tf.keras.regularizers.l2(l=0.0005)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Flatten(),tf.keras.layers.Dense(256,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(l=0.0005)),tf.keras.layers.Dense(1,activation='sigmoid',kernel_regularizer=tf.keras.regularizers.l2(l=0.0005))
])

第三种方法是加入Dropout层,Dropout层的原理在前面已经讲过,一般来说Dropout层的效果比前两个更好,我们需要调整删除神经元的概率,一般设为0.5.


#增加Dropout层
model=tf.keras.Sequential([tf.keras.layers.Conv2D(32,3,padding='same',activation='relu',input_shape=(IMG_HEIGHT,IMG_WIDTH,3)),tf.keras.layers.MaxPooling2D(),tf.keras.layers.Dropout(0.5), #设置Dropout层tf.keras.layers.Conv2D(64,3,padding='same',activation='relu'),tf.keras.layers.Dropout(0.5), #Dropout层tf.keras.layers.Conv2D(64,3,padding='same',activation='relu'),tf.keras.layers.MaxPooling2D(), #池化层tf.keras.layers.Flatten(),tf.keras.layers.Dense(256,activation='relu'), #全连接层tf.keras.layers.Dropout(0.5),tf.keras.layers.Dense(1,activation='sigmoid')])

当然,我们可以把前几个方法结合在一起,组成一个最佳的模型,最后,对于深度学习,还有一个非常重要的超参数,就是学习效率。一般来说,我么可以从0.001开始调整,当学习率太高时,我们难以得到高精度的结果;当学习率太小时,训练时间很长。

#调整学习率
#学习率先用0.001训练
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#学习率调小为原来的1/10
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),loss='sparse_categorical_crossentropy',metrics=['accuracy'])

数据增强

果我们使用的数据非常少,那么我们得到的数据就不会很准确。这时候就需要数据增强,其实说简单点,就是将数据集增多,例如你有2000张图片,我们可以翻转,变色等方式改变图片,以此达到增加数据。在之后的训练中,每轮如果还是用2000张图片进行训练,但是每一轮的图片都是不同的。经过了随机变换,得到的数据模型会更加准确。


#随即水平反转
image_gen=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,horizontal_flip=True)
#随机竖直翻转
image_gen=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,vertical_flip=True)
#随即旋转
image_gen=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,rotation_range=45)
#随即缩放,zoom_range在0~1表示图片缩放比例范围[1-zoom_range,1+zoom_range]
image_gen=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,zoom_range=0.5)
#全部应用
image_gen_train=tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255,rotation_range=45,width_shift_range=.15,height_shift_range=.15,horizontal_flip=True,vertical_flip=True,zoom_range=0.5
)

迁移学习

迁移学习是什么?

其实说的简单点就是借用别人的模型来进行训练自己的任务,优点就是速度快,效果好。就比如说,书本上的知识很详细,很多,但是理解起来可能没那么快,但是如果有一个人给你讲解,那是不是就很快能理解。也就是吸收别人的东西。

迁移学习主要有两种方法:第一种叫微调(Fine Tune),顾名思义就是对已经训练好的模型进行细微的调整,一般我们会调整整个模型的最后几层;

第二种方法叫作加层,就是在模型最后增加几层,然后对这几个层进行训练即可。

下面我借用ResNet50模型来简单的介绍一下如何使用迁移学习:

#选则基础模型
base_model=tf.keras.applications.ResNet50(weights='imagenet')
base_model.summary()
#将基础模型的参数设置为不可训练
base_model.trainable=False
#加层
prediction_layer1=tf.keras.layers.Dense(128,activation='relu')
prediction_layer2=tf.keras.layers.Dense(1,activation='sigmoid')
model=tf.keras.Sequential([base_model,prediction_layer1,prediction_layer2
])
#微调
fine_tune_at=150
for layer in base_model.layers[fine_tune_at:]:layer.trainable=True
base_model.summary()
prediction_layer=tf.keras.layers.Dense(1,activation='sigmoid')
model=tf.keras.Sequential([base_model,prediction_layer
])

 

 

好了,这里我们已经初步认识了如何搭建自己的神经网络和数据集以及一些啥=常规的方法,下一节我们就开始学习神经网络中的视觉了。拜拜了你嘞!

点赞加关注不迷路

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拓展系统命令

文章目录拓展系统命令使用方式拓展系统命令快速运行方法命令 - ZFASTRUN安全运行方法命令 - ZFASTSAFERUN快速运行Query方法命令 - ZFASTQUERY安全运行Query方法 命令 - ZSAFEQUARY防止调试时误将数据提交命令 - ZTRN在Terminal执行SQL语句命令 - ZSQL安全Global命令 - ZSAFEKI…

Windows命令提示符之常见命令--动态更新

序言: 在大家接触Windows电脑的过程中,一般是直接通过鼠标来进行操作,很少甚至没有用到过命令来执行操作,而想必大家都看过电影里面的黑客大神都是通过密密麻麻的指令来操作的,并且执行的速度也会比我们用鼠标块&…

二进制插入与查找组成一个偶数最接近的两个素数

二进制插入 链接:二进制插入_牛客题霸_牛客网 (nowcoder.com) 描述:给定两个32位整数n和m,同时给定i和j,将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j1&#xff…

在unreal中的基于波叠加的波浪水面材质原理和制作

关于水的渲染模型 如何渲染出真实的水体和模拟,是图形学,游戏开发乃至仿真领域很有意思的一件事 记得小时候玩《Command & Conquer: Red Alert 3》,被当时的水面效果深深震撼,作为一款2008年出的游戏,现在想起它…

没想到大厂Adobe还有这些“猫腻”!

北京时间周四晚间,图像及视频生产力工具大厂Adobe发布公告,宣布旗下的视频创作应用Premiere Pro将喜提一系列新的AI功能。这也是Adobe上个月发布AIGC创作功能“萤火虫”后的最新动作。综合Adobe的官方公告和演示视频,最大亮点就是基于文字的视…

什么是线性回归?线性回归有什么特征?

什么是线性回归 线性回归定义与公式 线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。 特点:只有一个自变量的情况称为单变量回归,多于一个自变量情况的叫做多元回归 线…

剑指 Offer (第 2 版)

(简单)剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请…

python实现图像的平移、镜像、旋转(不调用CV库)

python实现图像的平移、镜像、旋转(不调用CV库) 老师布置的作业。。。。。 平移图像 图像的平移在几何变换中算是最简单的变换之一,话不多说,直奔主题 由图可知,在opencv中图像的原点一般为左上角,设初始…

1 Spark的环境搭建

1 Spark的环境搭建 1.1 Windows - Spark安装 一、下载并安装软件 \1. 下载并安装Java8:https://www.oracle.com/java/technologies/downloads/ (1) 原因:Spark由Scala语言开发。而Scala代码会被编译成Java字节码。因此Spark的…

总结821

学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 暴力英语:早上背颂并默写第19篇文章《I always knew I was going to be rich》,还有两三篇就达成…

一图看懂 xlwt 模块:读写 Excel 文件的数据和格式信息, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 xlwt 模块:读写 Excel 文件的数据和格式信息, 资料整理笔记(大全)摘要模块图类关系图模块全展开【xlwt】统计常量模块1 xlwt.compat2 xl…

中核科技:科技匠心 智启未来

​  2023 年4月 13—15 日,2023年易派客工业品展览会、石油石化工业展览会、第七届中国石油和化工行业采购年会,在苏州国际博览中心胜利召开。本次展会展览面积53000平方米,参展企业500余家,汇集了中国工业制造领域的大型国企央…

第一章 webpack与构建发展简史

官方loader和插件 Loaders | webpack Plugins | webpack 为什么需要构建工具&#xff1f; 初识webpack webpack默认配置文件&#xff1a;webpack.config.js 可以通过webpack --config <config_file_name>指定配置文件 rules是个数组&#xff0c;一个打包配置可以有多…

直方图 颜色映射

文章目录hist map1. 原理2.灰度图3. 对于彩色图像4. 直方图规定化效果hist map 1. 原理 code:https://github.com/rossgoodwin/hmap 利用队列记录 hist src > tgt, src < tgt , src tgt的 索引。 然后&#xff0c;对于每个hist excess, 将其移动到 hist deficit 进行…

PS学习记录-基础操作与快捷键

1、复制图层 在【移动工具】状态下&#xff0c;配合【alt】按键拖动图像&#xff0c;可以进行复制图层 当然&#xff0c;PS里复制图层的方式很多&#xff0c;比如&#xff1a;选中图层&#xff0c;按【ctrlJ】&#xff0c;也是复制图层 2、多选图层 2.1同上&#xff0c;也是…

微信支付,JSAPI支付,APP支付,H5支付,Native支付,小程序支付功能详情以及回调处理

一.支付相关文档地址支付wiki&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml支付api: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/index.shtml开发工具包(SDK)下载&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtm…

【你听说了吗】GPT-5据说已经学完了世界上现存所有的视频

文章目录前言一、GPT-5会带来什么&#xff1f;二、我们该怎么办&#xff1f;总结前言 最近半年要说最火的产品&#xff0c;无疑是ChatGPT &#xff0c;很多同学都在用 GPT 帮助自己工作&#xff0c;学习&#xff0c;提高效率&#xff01;尤其是 GPT4&#xff0c;性能强 GPT3.5…

Thymeleaf select回显并选中多个

语法&#xff1a;${#strings.indexOf(name,frag)} 或者 ${#lists.contains(list, element)} 或者 ${#strings.contains(name,ez)} 或者 ${#strings.containsIgnoreCase(name,ez)} 多选语法 &#xff1a; <select class"required" data-live-search"true&…

Tomcat处理请求的全过程

文章目录一、组件详解二、请求处理流程1.总体流程图2.Worker线程任务流程三、源码跟踪1.Tomcat启动线程组件2.Acceptor3.Poller4.Worker总结一、组件详解 在Tomcat处理客户端请求的过程中&#xff0c;这里面有三个组件概念&#xff0c;他们都是线程&#xff0c;分别负责不同的…

能翻译大量文字的软件-正规的翻译软件

复制自动翻译软件是一种能够复制并自动翻译文本的工具。当您阅读某一种语言的文本时&#xff0c;这种软件可以快速识别并翻译出来&#xff0c;以方便您更好地理解内容。与其他翻译软件不同的是&#xff0c;复制自动翻译软件可以直接在游览网站的过程中&#xff0c;直接对用户正…