当前位置: 首页 > news >正文

基于CNN的医学X-Ray图像分类全程解析

数据集

我们所使用的数据集是胸部 X 光图像,它包含 2 个类别:肺炎和正常。该数据集由 Paulo Breviglieri 发布,是 Paul Mooney 最受欢迎数据集的修订版,此更新版本的数据集在验证集和测试集中的图像分布更加均衡。数据集分为 3 个文件夹(训练、测试、验证),包含肺炎和正常的子文件夹。

总数(图像):5,856例
训练观察:4,192(1,082 个正常病例,3,110 个肺部不透明病例)
验证观察:1,040(267 个正常病例,773 个肺部不透明病例)
测试观察:624(234 个正常病例,390 个肺部不透明病例)

首先,我们使用 Kaggle API 直接从 Kaggle 中提取数据集。为此,我们需要创建一个 API 令牌,该令牌位于 Kaggle API 选项卡下。单击“创建新 API 令牌”,将下载一个 json 文件,运行以下几行代码来安装所需的库并上传 json 文件。

! pip install -q kaggle
from google.colab import files
files.upload()
! mkdir ~/.kaggle
! cp kaggle.json ~/.kaggle/
! chmod 600 ~/.kaggle/kaggle.json

当提示“选择文件”时,上传下载好的 json 文件,运行下一行代码即可下载数据集。如果想获取数据集 API 命令来下载数据集,单击 Kaggle 数据集页面数据部分中的 3 个点,然后单击“复制 API 命令”。

! kaggle datasets download -d pcbreviglieri/pneumonia-xray-images

由于我使用 Google Colab 来运行此项目,因此数据集 zip 文件会下载到示例数据文件夹。现在,通过运行下一行代码,我们使用 zipfile 库将文件夹和文件解压缩到所需的目标文件夹。

import zipfile
zf = "/content/pneumonia-xray-images.zip"
target_dir = "/content/dataset/cnn/pneumonia_revamped"
zfile = zipfile.ZipFile(zf)
zfile.extractall(target_dir)

初始化

下载好的数据目录如下图所示:

content
└───dataset
└───cnn
└───pneumonia_revamped
├───test
│ ├───Normal
│ │ ├───image1.jpg
│ │ └───image2.jpg
│ └───Opacity
│ ├───image1.jpg
│ └───image2.jpg
├───train
│ ├───Normal
│ │ ├───image1.jpg
│ │ └───image2.jpg
│ └───Opacity
│ ├───image1.jpg
│ └───image2.jpg
└───val
├───Normal
│ ├───image1.jpg
│ └───image2.jpg
└───Opacity
├───image1.jpg
└───image2.jpg

在这部分代码中,我们定义目录路径,导入一些必要的库,并定义一些后面会用到的常用常量参数:

import matplotlib.pyplot as plt
import numpy as np              
import pandas as pd            train_path = '/content/dataset/cnn/pneumonia_revamped/train'
test_path = '/content/dataset/cnn/pneumonia_revamped/test'
valid_path = '/content/dataset/cnn/pneumonia_revamped/val'#小图像更大的batch_size是理想选择
batch_size = 16 
img_width = 500

准备数据

数据增强

图像增强通过创建现有训练集图像的修改版本来扩展数据集的大小,这有助于增加数据集的变化并最终提高模型预测新图像的能力。

from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Create Image Data Generator for Train Set
image_gen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2,zoom_range = 0.2,horizontal_flip = True,          )
# Create Image Data Generator for Test/Validation Set
test_data_gen = ImageDataGenerator(rescale = 1./255)

使用 tensorflow.keras.preprocessing.image 库,对于训练集,我们创建了一个生成器,它将定义的参数随机应用于训练集;对于测试集和验证集,我们只需重新进行缩放。

如下方法,参考上述代码定义一些图像数据生成器参数:

rescale: 每个数字图像由一个值在 0 到 255 之间的像素创建。0 表示黑色,255 表示白色,因此,将原始图像像素值的比例数组重新缩放到 [0,1] 之间,这使图像对整体损失的贡献更均衡。否则,像素范围越高的图像损失越大,应使用较低的学习率,像素范围越低的图像需要更高的学习率。

shear_range : 固定一个轴并以一定的角度(称为剪切角度)拉伸图像

zoom_range : 图像放大小于 1.0,图像缩小1.0 倍以上

horizo​​ntal_flip : 随机水平翻转

vertical_flip : 随机垂直翻转

rotaion_range : 随机旋转一定角度,范围为 0 到 180

width_shift_range : 水平移动

height_shift_range:垂直移动

brightness_range : 亮度 0.0 对应完全没有亮度,1.0 对应最大亮度

fill_mode :将图像的缺失值填充为最接近的值

将这些转换技术随机应用于图像(除了缩放以外)。

另外请参考:
https://github.com/aleju/imgaug
https://github.com/Fafa-DL/Image-Augmentation

https://github.com/albumentations-team/albumentations

https://github.com/z-bingo/awesome-image-denoising-state-of-the-art

加载数据

图像数据生成器有一个称为“目录迭代器”的类,用于从包含图像的文件夹中读取图像,返回 DirectoryIterator 类型 tensorflow.python.keras.preprocessing.image.DirectoryIterator。

train = image_gen.flow_from_directory(train_path,target_size=(img_height, img_width),color_mode='grayscale',class_mode='binary',batch_size=batch_size)
test = test_data_gen.flow_from_directory(test_path,target_size=(img_height, img_width),color_mode='grayscale',shuffle=False,   #注意这里的数据顺序class_mode='binary',batch_size=batch_size)
valid = test_data_gen.flow_from_directory(valid_path,target_size=(img_height, img_width),color_mode='grayscale',class_mode='binary', batch_size=batch_size)
Found 4192 images belonging to 2 classes. 
Found 624 images belonging to 2 classes. 
Found 1040 images belonging to 2 classes.

一些参数定义如下:

directory:
使用的第一个参数是定义的训练、测试和验证文件夹的路径;

target_size : 目标大小是输入图像的大小,每个图像都将调整为此大小(500 x 500);

color_mode:

如果图像是黑白或灰度,则设置为“灰度”,或者图像有三个颜色通道设置为“rgb”。这里使用灰度,因为它是 X 射线图像;

batch_size:
生成器按批次生成的图像数量。我们之前将批次大小定义为 16。我们选择 16 是因为图像太大,RAM无法进行处理,如果你所使用的显卡是3090/4090 24G;

class_mode :
如果只有两个类别需要预测,则设置为“binary”,如果没有设置为“categorical”,如果是一个自动编码器系统,输入和输出都可能是相同的图像,这种情况下设置为“input”。我们这里将其设置binary;

数据增强后读取一些训练集看看:

plt.figure(figsize=(12, 12))
for i in range(0, 10):plt.subplot(2, 5, i+1)for X_batch, Y_batch 

相关文章:

基于CNN的医学X-Ray图像分类全程解析

数据集 我们所使用的数据集是胸部 X 光图像,它包含 2 个类别:肺炎和正常。该数据集由 Paulo Breviglieri 发布,是 Paul Mooney 最受欢迎数据集的修订版,此更新版本的数据集在验证集和测试集中的图像分布更加均衡。数据集分为 3 个文件夹(训练、测试、验证),包含肺炎和正…...

C++初学者指南-5.标准库(第二部分)--排序序列操作

C初学者指南-5.标准库(第二部分)–排序序列操作 文章目录 C初学者指南-5.标准库(第二部分)--排序序列操作二分查找binary_searchlower_boundupper_boundequal_rangeincludes 合并mergeinplace_merge 设置操作set_unionset_intersectionset_differenceset_symmetric_difference …...

matplotlib库学习之绘图透明度设置(精炼准确)

matplotlib库学习之透明颜色设置 一、简介 在数据可视化中,透明度设置可以使图表更具层次感,特别是在多层叠加图表时。matplotlib库提供了多种方法来设置图表各个部分的透明度,包括图形、文本、图例、坐标轴等部分。 二、为什么要设置成透明…...

select多路复用(tcp通信)

文章目录 项目名称项目结构 项目名称 io_demo1 项目结构 $ tree . ├── build ├── CMakeLists.txt ├── debug.gdb ├── include │ ├── mysocket.h │ ├── tcp_client.h │ └── tcp_server.h ├── sources │ └── server.cpp └── src├─…...

STM32IIC与SPI详解

单片机里的通信协议其实蛮多的,IIC;SPI;MQTT;CAN;包括串口也是一种通信协议。而串口通信虽然实现了全双工,但需要至少三根线,为了节省这一根线的成本,于是IIC诞生了。 目录 一.IIC…...

K8s第三节:k8s1.23.1升级为k8s1.30.0

上回书说到我们使用了kubeadm安装了k8s1.23.1,但是在k8s1.24之前还是使用docker作为容器运行时,所以这一节我打算将我安装的k8s集群升级为1.30.0版本; 1、修改containerd 配置 因为我们安装的docker自带containerd,所以我们不需要重新安装con…...

.gitignore不生效的解决方案

为什么会不生效 因为文件已经被git追踪(或者说被track 或者说被索引,都是一个意思)。 目前.gitignore面对已经被git追踪的文件是无法生效的。(这是现状,我们只能接收这个现状。不过个人觉得git官方可以对这方面进行优化调整,让其…...

脱胎于 S 语言的R语言,Ross Ihaka 和 Robert Gentleman 和社区的力量让 R 在学术界与研究机构放光彩

R语言从一门用于统计学教学的编程语言,发展成为全球数据科学领域的重要工具,离不开其强大的功能、丰富的社区资源和开源精神。这些都离不开Ross Ihaka 和 Robert Gentleman 和 社区的力量。 在1990年代初,新西兰奥克兰大学的统计学教授Ross I…...

JavaEE 第6节 内存可见性问题以及解决方法

目录 一、什么是内存可见性问题? 1、问题代码演示 2、基础知识铺垫 1)硬件层面 2)模型层面(JMM) 二、内存可见性问题的原因 三、volatile解决内存可见性问题 一、什么是内存可见性问题? 1、问题代码…...

es基本操作

以下是一些 Elasticsearch 常用的命令,涵盖了索引管理、数据操作和集群管理等方面: 基本操作 检查集群状态: curl -X GET "localhost:9200/_cluster/health?pretty"查看集群健康状态和基本信息。 查看所有索引: curl…...

开源 AI 智能名片 S2B2C 商城小程序赋能下的社区团购商业模式研究

摘要:本文深入探讨了社区团购商业模式的本质、特点及其优势,并详细分析了开源 AI 智能名片 S2B2C 商城小程序在社区团购中的应用与价值。通过对相关案例的研究和数据的分析,揭示了这一创新组合对社区商业生态的重要影响,为未来社区…...

AutoSar AP软件规范中CM介绍及功能概要

1. 前言 为了理解AutoSar AP中EM的概念,生搬硬套的翻译了《 AUTOSAR SWS CommunicationManagement.pdf》的介绍部分,并按照自己的理解进行了修改。如下 2. AUTOSAR_SWS_CommunicationManagement.pdf的介绍部分 本文件包含AUTOSAR AP通信管理的功能、A…...

【图形学】TA之路-向量

向量 向量 是一个有大小和方向的数学对象。在三维空间中,向量通常表示为 (v_x, v_y, v_z)。 基本操作 加法: a b (a_x b_x, a_y b_y, a_z b_z)减法: a - b (a_x - b_x, a_y - b_y, a_z - b_z)标量乘法: k * v (k * v_x, …...

[flink]部署模式

部署模式 在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。 Flink为各种场景提供了不同的部署模式,主要有以下三种:会话模式(Session Mode)、单作业模式(Per-Job Mode&…...

为什么不用postman做自动化

面试的时候被问到:为什么不用postman做自动化 打开postman,看到用例集管理、API 管理、环境管理这三个功能,用户体验感算得上品牌等级了 为什么不用呢,文心一言给了一些答案 不适合大规模自动化测试:Postman 主要是为…...

一、Matlab基础

文章目录 一、Matlab界面二、Matlab窗口常用命令三、Matlab的数据类型3.1 数值类型3.2 字符和字符串3.3 逻辑类型3.4 函数句柄3.5 结构类型3.6 细胞数组 四、Matlab的运算符4.1 算术运算符4.2 关系运算符4.3 逻辑运算4.4 运算符优先级 五、Matlab的矩阵5.1 矩阵的建立5.2 矩阵的…...

执行java -jar命令,显示jar中没有主清单属性

在Java中,一个"主清单属性"(Main-Class attribute)是指定JAR文件中包含的应用程序入口点,即包含main方法的类的完全限定名。如果你尝试运行一个没有主清单属性的JAR文件,你可能会看到错误消息,如…...

【C++进阶】红黑树

目录 什么是红黑树?红黑树红黑树的性质 定义红黑树红黑树的操作insertinorderfindheightsize构造函数析构函数赋值拷贝判断红黑树 全部代码总结 什么是红黑树? 红黑树 红黑树(Red-Black Tree)是一种自平衡的二叉搜索树&#xff…...

linux使用ssh连接一直弹出密码框问题

1.查看ssh服务的状态 输入以下命令: sudo service sshd status 小编已经安装了。 如果出现 Loaded: error (Reason: No such file or directory) 提示的话,说名没有安装ssh服务,按照第二步:安装ssh服务。 如果出现 Active: in…...

Python 3 数据结构

Python 3 数据结构 引言 Python 是一种高级编程语言,因其简洁明了的语法和强大的功能而广受欢迎。在 Python 中,数据结构是组织和存储数据的方式,对于编写高效和可维护的代码至关重要。本文将深入探讨 Python 3 中的主要数据结构&#xff0…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

Java入门学习详细版(一)

大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

2025季度云服务器排行榜

在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

C++使用 new 来创建动态数组

问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

基于 TAPD 进行项目管理

起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...