【深度学习】CNN应用于图像分类的建模全流程

news2024/11/26 0:31:57

文章目录

      • 1.摘要
      • 2.图片的准备及预处理
      • 3.打包并保存数据
      • 4.搭建模型
      • 5.训练模型
      • 6.测试模型
      • 7.总结

1.摘要

图像分类,也可以称作图像识别,顾名思义,就是辨别图像中的物体属于什么类别。核心是从给定的分类集合中给图像分配一个标签的任务。实际上,这意味着我们的任务是分析一个输入图像并返回一个将图像分类的标签,而卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),非常适合做图片分类任务,是计算机视觉中应用最广泛的方法,通过指定卷积大小,窗口移动大小,一步步的移动来学习数据特征,每次学习计算卷积层后,计算一次最大的池化层,这样可防止过拟合,降低维度,经过反复传播训练,直到最优解。
为此,本篇将实现CNN进行图像分类的整个全流程,包括:1.图片的准备预处理;2.图片的数据集的打包;3.CNN模型的搭建;4.模型的训练;5.结果测试。希望对读者有所帮助。

2.图片的准备及预处理

首先,本文准备的数据集是皮肤病的病理图片,分为两类,包括:melanoma(黑素瘤),nevus(痣),共计510张图片。为方便大家进行学习,我将图片的链接放在此处,供大家使用。链接:https://pan.baidu.com/s/1EJBRQ52sVZMgjhVlgP8qMQ
提取码:duc4
在这里,由于数据集中的照片太大,本文使用笔记本进行训练,计算性能有限,我将RGB图片转换为灰度图,并将尺寸统一为500*500,减小数据量导入CNN模型,读者可根据自己电脑性能进行调节参数,提升识别准确率。

import numpy as np
import cv2
import os,glob,tqdm
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split
# 搭建模型
import tensorflow as tf
from tensorflow.keras.layers import Dense,Conv2D,MaxPool2D,Flatten
from tensorflow.keras import optimizers,losses
import matplotlib.pyplot as plt
%matplotlib inline

查看数据集中的一张照片ISIC_0012258.jpg,及大小

img = cv2.imread('./picture_set/datasets1/melanoma/ISIC_0012258.jpg')
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

在这里插入图片描述

img.shape

在这里插入图片描述
定义一个函数,将数据集中的图片转换为灰度图,大小转化为5005001的大小。

# 准备两个列表,存放数据和标签
img_list,label_list = [],[]
labels = os.listdir("./picture_set/datasets1/")
# 遍及所有文件夹
for label in labels:
    file_list = glob.glob('./picture_set/datasets1/%s/*.jpg'%label)
    # 遍及每一张照片
    for img_file in tqdm.tqdm(file_list,desc="处理%s"%label):
    	# 读取图片
        img = cv2.imread(img_file)
        # 转换为灰度图
        img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        #  改变尺寸
        img_resize = cv2.resize(img_gray,(500,500))
        # 增加维度
        img_resize_ = np.expand_dims(img_resize,axis=2)
        img_list.append(img_resize_)
        label_list.append(label)

在这里插入图片描述

np.array(img_list).shape,np.array(label_list).shape

在这里插入图片描述

3.打包并保存数据

第二章节我们已经对数据进行了预处理,这部分我将数据打包为npz格式的数据,方便后面建模导入模型方便。打包代码很简单,如下:

X = np.array(img_list)
y = np.array(label_list)
#存储为numpy文件
np.savez('img_data.npz',X,y)

打包完成后,将会在目录下有个img_data.npz文件。

4.搭建模型

首先对刚才的打包数据进行解析,并查看我们的数据集和标签。

# 读取npz文件
data = np.load('img_data.npz')
img_list = data["arr_0"]
label_list = data["arr_1"]
img_list.shape,label_list.shape

数据集的特征尺寸为(510,500,500,1),标签值为(500,)
在这里插入图片描述
可以看到模型的标签为两类(melanoma,nevus)

print("类别名称:",np.unique(label_list))
print("打印标签:",label_list)

在这里插入图片描述
接下来,我将对标签值进行独热编码,方便模型导入。代码如下:

OE = OneHotEncoder()
label = OE.fit_transform(np.expand_dims(label_list,1))
y = label.toarray()
y[:10]

在这里插入图片描述
我对所有的病理图片进行分割,以便更好的训练网络,通过sklearn库的train_test_split()将图片划分完训练集和测试集,到此数据集准备完成。

x_train,x_test,y_train,y_test = train_test_split(img_list,y,test_size=0.15,random_state=0,shuffle=True)

print(x_train.shape,y_train.shape,x_test.shape,y_test.shape)

数据集准备完成,接下来搭建CNN模型。

new_model = tf.keras.Sequential([
    Conv2D(16,3,padding="same",input_shape=(500,500,1),activation="relu"),
    MaxPool2D((2,2)),
    Conv2D(32,3,padding="same",activation="relu"),
    MaxPool2D((2,2)),
    Conv2D(64,3,padding="same",activation="relu"),
    MaxPool2D((2,2)),
    Flatten(),
    Dense(200,activation="relu"),
    Dense(50,activation="relu"),
    Dense(2,activation="softmax")
])
new_model.compile(optimizer=optimizers.Adam(learning_rate=0.0001),loss=losses.categorical_crossentropy,metrics=["accuracy"])
new_model.summary()

在这里插入图片描述

5.训练模型

history = new_model.fit(x_train,y_train,validation_data=(x_test,y_test),batch_size=30,epochs=10)

在这里插入图片描述
笔记本性能有限,感兴趣的可以自己增大训练epoch,调整模型参数等等。接下来,可视化模型准确度和损失。代码如下:

plt.plot(history.history["loss"],label="train_set")
plt.plot(history.history["val_loss"],label="test_set")
plt.title('model loss')
plt.xlabel("epoch")
plt.ylabel("loss")
plt.legend()
plt.show()

在这里插入图片描述

plt.plot(history.history["acc"],label="train_set")
plt.plot(history.history["val_acc"],label="test_set")
plt.title('model acc')
plt.xlabel("epoch")
plt.ylabel("acc")
plt.legend()
plt.show()

在这里插入图片描述
完成训练后,我们将模型进行保存,方便后续进行部署使用。

new_model.save("mp.h5")

6.测试模型

加载模型并查看模型结构

model = tf.keras.models.load_model("mp.h5")
model.summary()

在这里插入图片描述
导入成功之后,将测试图片导入,我提取了数据集中的一张图片进行测试,标签为melanoma

# 提取中数据集中的一张图片进行测试---标签为melanoma
img_test = cv2.imread('./picture_set/datasets1/melanoma/ISIC_0012258.jpg')
img_test_gray = cv2.cvtColor(img_test,cv2.COLOR_BGR2GRAY)
img_test_resize = cv2.resize(img_test_gray,(500,500))
img_test_resize_ = np.expand_dims(img_test_resize,axis=2)
img_input = np.expand_dims(img_test_resize_,axis=0)
pred = model.predict(img_input)
pred

在这里插入图片描述

print("照片melanoma预测的标签为:",labels[np.argmax(pred)])

在这里插入图片描述

7.总结

到这里,我们完成了整个图片识别的全流程,从数据准备到CNN建模,从训练模型到模型预测,通过皮肤病数据集,为大家完整的展示了深度学习在图片分类中的完整流程,希望对大家工作学习中有所帮助。

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

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

相关文章

DBeaver连接InterSystems IRIS、Ensemble、Cache操作说明

一、驱动获取 1.1、本地安装目录获取 JDBC驱动:“安装目录\dev\java\lib\JDK18” 如需获取ODBC等其他连接驱动则返回“安装目录\dev”路径选择对应文件夹2.1、Intersystems官方获取 官方下载:https://intersystems-community.github.io/iris-driver-…

深度学习基本部件-激活函数详解

激活函数概述 前言激活函数定义激活函数性质 Sigmoid 型函数 Sigmoid 函数Tanh 函数 ReLU 函数及其变体 ReLU 函数Leaky ReLU/PReLU/ELU/Softplus 函数 Swish 函数激活函数总结参考资料 本文分析了激活函数对于神经网络的必要性,同时讲解了几种常见的激活函数的原理…

纸牌游戏红心大战拱猪设计(C语言)

纸牌游戏红心大战设计 ( C语言 ) 红心大战是Windows的经典游戏,中国式的红心是拱猪游戏,加入了方块J羊和梅花10 变压器(即俗称加倍)。加大了游戏难度和趣味性。 试制此游戏是准备编制网络版拱猪或红心大战的基础框架&#xff0c…

Linux下时间处理相关函数

Linux下时间处理相关函数 1 .系统时间和 RTC 时间 Linux 系统下包含两个时间: 系统时间和 RTC 时间。   系统时间: 是由主芯片的定时器进行维护的时间, 一般情况下都会选择芯片上最高精度的定时器作为系统时间的定时基准, 以避…

深度聚类方法之对比聚类(Contrastive Clustering,CC)

1.参考文献 《Contrastive Clustering》 2.深度聚类方法 深度聚类方法大致分为以下几类: ①分阶段:使用深度网络进行对比学习or自动编码器完成表征学习(目的:把同类样本集中到一起,拉开不同类样本的聚类),然后使用聚…

【6】SCI易中期刊推荐——人工智能神经科学机器人学(中科院3区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

头条某星图 登录协议解析2023/1/9

文章目录 文章目录 文章目录前言网址加密字段请求逻辑生成s_v_web_id账号密码的加密方式fp滑块登录成功前言 可以关注我哟,一起学习,主页有更多练习例子 如果哪个练习我没有写清楚,可以留言我会补充 如果有加密的网站可以留言发给我,一起学习共享学习路程 如侵权,联系我删…

【JavaGuide面试总结】Java高级特性基础篇·下

【JavaGuide面试总结】Java高级特性基础篇下1.什么是序列化?什么是反序列化?2.序列化协议对应于 TCP/IP 4 层模型的哪一层?3.常见序列化协议有哪些?4.为什么不推荐使用 JDK 自带的序列化?5.如果有些字段不想进行序列化怎么办?6.…

梦幻西游H5私服服务端超详细图文架设教程

想体验经典Q版西游霸服高兴吗?想体验满级VIP的尊贵吗?想体验一招秒杀的痛快吗?各种极品配备、翅膀、宠物统统给你,就在梦幻西游!本文解说梦幻西游H5游戏的架设教程,想钻研H5游戏如何实现,体验游…

基于Python实现的车辆检测计数+车牌定位+车牌识别的融合技术,使用pytorch深度学习框架

车辆检测计数车牌检测与车牌识别 介绍 基于pytorch深度学习框架,实用开源模型yolov4实现模板检测与yolov5实现车牌检测与LPRNet实现车牌检测 完整代码下载地址:基于Python实现的车辆检测计数车牌定位车牌识别的融合技术 基于win10系统,实用…

JSP SSM加班管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM加班管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和 数据库,系统主要采用B/…

python数据分析及可视化(十九)Power BI中M函数的使用、数据建模、度量值、DAX

M函数 用鼠标操作的步骤背后的逻辑都是M函数,在编辑器里都会有体现出来,选中左侧的表名称,点击右键,选择高级编辑器,就会进入到高级编辑器界面,里面会显示每一步的操作步骤。 M函数基本规范 M函数对大小写…

常用JavaScript库

1、前端工具类库 jQuery是一个快速、小型且功能丰富的 JavaScript 库,它使HTML文档遍历和操作、事件处理、动画和 AJAX 之类的事情变得更加简单。当时jQuery库不但简化了代码,而且提供出色的跨浏览器支持,其极大的提高了 Web 开发人员的工作效…

sqlserver连接时报错 [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

电脑重新安装系统了,当我再次链接数据库时 ,发现报错 [IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序很明显是少了驱动,只要安装了Microsoft ODBC Driver 11 for SQL Server这个驱动就可以了。 没安装驱动…

实时性升至秒级!飞桨PaddleSpeech赋能金融双录业务走向智能化

听说IT圈十个人里有九个是男性开发者,女生并不多,陈雪儿可以算是这个群体中独特的存在。 作为杭州谐云科技有限公司(简称谐云)智能边缘团队的AI技术专家,陈雪儿带领团队历经一年半研发的“金融双录智能质检系统”&…

功率放大器怎么选择型号的(功率放大器选购技巧)

很多电子工程师虽然频繁使用功率放大器,但是对于功率放大器的选择和选购技巧还是不清楚,下面就来为大家介绍一下如何挑选合适的功率放大器型号。 一般情况下,功率放大器购买决策的主要考虑因素是输出功率、线性度、频率范围和VSWR失配容限。放…

网络和VPC简单介绍

网络和VPC 传统网络 传统网络从一开始就是一个分布式的网络,没有中心的控制节点,网路中的各个设备之间通过口口相传的方式学习网络的可达信息,由每台设备自己决定要如何转发,这直接导致了没有整体观念,不能从整个网络…

免费PDF转换器软件有哪些?不妨试试这几款

在工作中和学习中很多小伙伴都有转换文件的需求,例如将PDF文件转换为word、excel、PPT、图片等类型的文件,这时候我们就需要一款专业且高效率的PDF转换器来帮助我们处理文件,那么转换器的性价比也是我们需要考虑的,那么免费PDF转换…

内存管理系统

文章目录前言前置知识makefile位图内存池规划实验操作实验一实验二实验三实验四实验五前言 博客记录《操作系统真象还原》第八章实验的操作~ 实验环境:ubuntu18.04VMware , Bochs下载安装 实验内容: 实现 assert 断言。实现字符串操作函数…

合并表记录 C语言实现

合并表记录 描述 数据表记录包含表索引index和数值value&#xff08;int范围的正整数&#xff09;&#xff0c;请对表索引相同的记录进行合并&#xff0c;即将相同索引的数值进行求和运算&#xff0c;输出按照index值升序进行输出。 提示: 0 < index < 11111111 1 <…