医学YOLOv8 | 脑肿瘤检测实战

在医疗保健领域,准确和高效地识别脑肿瘤是一个重大挑战。本文中,我们将探讨一种使用 YOLOv8,一种先进的目标检测模型,将脑肿瘤进行分类的新方法,其准确率达到了 99%。通过将深度学习与医学图像相结合,我们希望这种方法将提高脑肿瘤识别的速度和准确性。

首先,我们将从 Kaggle 获取脑肿瘤分类数据集。然后,我们将利用各种数据清理方法来准备数据,以输入到我们的模型中。接下来,我们将从 Ultralytics 下载 YOLOv8,并对其进行调整以适应我们的具体情况。最后,我们将创建一个 FastAPI 应用程序以实现简化的使用。

1. 探索数据集

让我们仔细看看刚刚从 Kaggle 下载的数据集。数据集已经被分为训练集和测试集。数据集中有四种不同的肿瘤类别:胶质瘤、脑膜瘤、垂体瘤和无肿瘤。每个类别在训练集中约有 1300 个示例,在测试集中约有 300 个示例。

2. 数据准备

在此过程中,我们将利用各种技术来清理数据集图像。这些技术包括识别和删除损坏的图像,以及消除尺寸明显较小的图像。

2.1 删除损坏的图像

在这个过程中,我们必须检查每个类别中的所有图像,并验证它们是否可以使用 cv.imread 打开。如果无法打开,就必须从数据集中删除它,因为它可能是损坏的图像或根本不是图像文件。

2.2 删除尺寸不合格的图像

另一个数据清理技术涉及检查图像是否低于某个尺寸阈值并将其删除。这很重要,因为冗余数据可能会对我们的模型性能产生负面影响。下面的代码可以一次删除所有损坏的和低于阈值的图像。

import os
import cv2train_dir = "BrainTumor/train"categories = ["glioma", "meningioma", "notumor", "pituitary"]size_threshold = (10,10)
valid_extensions=('.jpg', '.png', '.jpeg')def is_image_corrupt(image_path):try:img = cv2.imread(image_path)if img is None:return Truereturn Falseexcept:return Truedef is_image_below_threshold(img_path):img = cv2.imread(image_path)if img.shape <= size_threshold:print(img.shape)return Truereturn Falsefor each_category in categories:folder_path = os.path.join(train_dir, each_category)for each_file in os.listdir(folder_path):image_path = os.path.join(folder_path, each_file)if os.path.isfile(image_path) and each_file.lower().endswith(valid_extensions):if is_image_corrupt(image_path) or is_image_below_threshold(image_path):os.remove(image_path)print(f"Removed corrupt image: {each_file}")

3. 数据分析

作为分析的一部分,我们将检查数据集以确定总记录数和每个类别的图像数量。我们还将评估类别的分布,并生成图表以增进对数据的理解。

这种方法允许我们从数据中获得洞察,以防止在将其输入模型时出现过拟合和欠拟合问题。

import matplotlib.pyplot as plt
import ostrain_dir = "/BrainTumor/train"
valid_extensions=('.jpg', '.png', '.jpeg')categories = ["glioma", "meningioma", "notumor", "pituitary"]
category_count = {}for each_category in categories:folder_path = os.path.join(train_dir, each_category)valid_images = [file for file in os.listdir(folder_path) if file.lower().endswith(valid_extensions)]category_count[each_category] = len(valid_images)fig, ax = plt.subplots(figsize=(10, 4))# Bar chart
bar_plot = plt.barh(list(category_count.keys()), list(category_count.values()), 0.5)
plt.title('Tumor Type Distribution')
plt.xlabel('Count')
plt.ylabel('Tumor Type')
for i, bar in enumerate(bar_plot):plt.text(bar.get_width(), bar.get_y() + bar.get_height() / 2, str(list(category_count.values())[i]), ha='left', va='center')plt.show()sample_size = sum(category_count.values())class_dist = {key : val/sample_size for key, val in category_count.items()}fig, ax = plt.subplots(figsize=(10, 4))# Bar chart
bar_plot = plt.barh(list(class_dist.keys()), list(class_dist.values()), 0.6)
plt.title('Class Distribution')
plt.xlabel('Class')
plt.ylabel('Percentage')for i, bar in enumerate(bar_plot):plt.text(bar.get_width(), bar.get_y() + bar.get_height() / 2, str(round(list(class_dist.values())[i], 3)), ha='left', va='center')plt.show()

所展示的代码将创建两个条形图,表示每个类别的图像数量和类别分布。图表显示我们的数据分布均匀,虽然在“无肿瘤”类中的图像数量稍多,但与其他类别相比仍然相对平衡。

5bbe587268b6a083618f216df7f97735.png

4. 数据可视化

在将数据输入之前,用肉眼查看它对于更好的理解是很重要的。下面提供的代码显示了每个类别的一张图像。

import matplotlib.pyplot as plt
import os
train_dir = "/BrainTumor/train"
valid_extensions=('.jpg', '.png', '.jpeg')categories = ["glioma", "meningioma", "notumor", "pituitary"]plt.figure(figsize=(12, 8))
for i, category in enumerate(categories):folder_path = os.path.join(train_dir, category)image_path = os.path.join(folder_path, os.listdir(folder_path)[0])if not image_path.lower().endswith(valid_extensions):continueimg = plt.imread(image_path)plt.subplot(2, 2, i+1)plt.imshow(img)plt.title(category)plt.axis("off")
plt.tight_layout()
plt.show()

输出:

9d5a02b8873782acf9ecf6b7e818c85b.png

5. 训练模型

在脑肿瘤分类项目中,我们将使用 YOLOv8 预训练模型。我们的第一步将是将这个模型导入项目中。接下来,我们将用我们的数据集微调预训练模型。最后,我们将在测试数据上评估模型,以确定每个类别的准确性。

from ultralytics import YOLOmodel = YOLO('yolov8m-cls.pt')  # load a pretrained YOLOv8n classification model# train/pre-tuned the model on our dataset
model.train(data='BrainTumor', epochs=3)# run the model on test data
res = model.val()# Result saved to runs/classify/val

要获得归一化混淆矩阵,导航到当前目录中的 runs/classify/val 文件夹。一旦进入那里,您将能够以以下图像的形式查看它。

d73e0b5269f6c573b690d1ea1c4de708.png

从所提供的数据中,模型在三个类别上达到了 100% 的性能,而在一个类别(脑膜瘤)上达到了 96%。因此,总准确性可以计算如下:(100 x 3 + 96) / 4 = 99%。

6. 测试自定义图像

在项目的最后一步,我们将在 FastAPI 中建立一个端点。这个端点将接受图像作为输入,并返回图像的标签预测。有了这个功能,我们可以轻松地在任何选择的图像上测试我们的模型。在微调模型后,它将生成另一个预训练模型文件(.pt),位于/run/classify/train/weights/best.pt 中。我们将将此文件集成到我们的 FastAPI 项目中。

以下是运行在端口 8000 上的 FastAPI 代码,它有一个 /images 的端点。这个端点将以图像作为输入,并返回由我们的模型(best.pt)预测的图像标签。

import subprocess
from fastapi import FastAPI, UploadFile, File
from ultralytics import YOLOdef model_train():model = YOLO('./runs/classify/train/weights/best.pt')  # load a pretrained YOLOv8n classification modelreturn modelapp = FastAPI()model_data = None@app.post("/images/")
def create_upload_file(image: UploadFile = File(...)):global model_dataif model_data is None:model_data = model_train()with open(f"./images/{image.filename}", "wb+") as f:f.write(image.file.read())result = model_data(f"./images/{image.filename}")return {"result": result[0].names[result[0].probs.top1]}def run_uvicon():uvicorn_command = ["uvicorn","main:app","--host", "127.0.0.1","--port", "8000","--reload",]subprocess.run(uvicorn_command, check=True)if __name__ == "__main__":run_uvicon()

输出:

313e2407ec9be96053542b87df6bad0a.png

结论

总之,我们文章中使用的数据是从 Kaggle 平台获取的。在此之后,我们对数据进行了清理处理,然后将其输入到模型中,最终生成了归一化混淆矩阵。作为最后一步,我们使用 FastAPI 建立了一个端点,使我们能够以高度准确和高效的方式进行预测,并随后返回输入系统的任何肿瘤图像的类别。

·  END  ·

HAPPY LIFE

f0dac550a7a2d0e6d499ffa692c3b31c.png

本文仅供学习交流使用,如有侵权请联系作者删除

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

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

相关文章

代码随想录阅读笔记-字符串【翻转字符串中单词】

题目 给定一个字符串&#xff0c;逐个翻转字符串中的每个单词。 示例 1&#xff1a; 输入: "the sky is blue" 输出: "blue is sky the" 示例 2&#xff1a; 输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前…

阿里云ECS服务器安装java环境相关软件

当前服务器版本为&#xff1a;Alibaba Cloud Linux 3.2104 LTS 64位 # lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: AlibabaCloud Description: Alibaba Cloud Linux release 3 (Soaring Falcon) Release: 3 Codename: SoaringFalcon# cat…

数据库简答题:期末+复试

文章目录 1.事务的特性:2.并发操作带来的数据不一致:4.区别几种范式:5.数据、数据库、数据库管理系统、数据库系统6.关系、关系模式和关系数据库的区别:7.关系数据库的特点:8.数据模型包括什么:9.逻辑独立性、物理独立性:10.人工管理阶段和数据库系统和文件系统的区别:11.等值连…

【Android】【Bluetooth Stack】蓝牙电话本协议分析(超详细)

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【蓝牙协议栈】专栏会持续更新中.....敬请期待&#xff01; 目录 1. 协议简述 1.1 PBAP…

个人商城系统开源(配置支付宝支付2)

原文地址&#xff1a;个人商城系统开源&#xff08;配置支付宝支付2&#xff09; - Pleasure的博客 下面是正文内容&#xff1a; 前言 在上一篇文章中我曾提到过关于网站支付宝支付的方法&#xff0c;接下来我们来介绍第二种。 个人博客地址&#xff1a;个人商城系统开源&…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例应用

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+GTX 8b/10b编解码SFP光口传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI…

C++:类和对象(上篇)

目录&#xff1a; 一&#xff1a;面向对象和过程的介绍 二&#xff1a;类的引入 三&#xff1a;类的定义 四&#xff1a;类的访问限定符以及封装 五&#xff1a;类的作用域 六&#xff1a;类的实例化 七&#xff1a;类对象大小的计算 八&#xff1a;类成员函数的this指…

【Linux】编译器-gcc/g++的使用(预处理、编译、汇编、连接)

目录 01.预处理&#xff08;宏替换&#xff09; 02.编译&#xff08;生成汇编&#xff09; 03.汇编&#xff08;生成机器可识别码&#xff09; 04.连接&#xff08;生成可执行文件或库文件&#xff09; 05.选项 编译器在编译代码时包含以下四个步骤&#xff1a;1.预处理 2…

商品规格存储问题

准备条件 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version> <!-- 指定您需要的 FastJSON 版本 --></dependency>Testvoid test6() {// 创建 JSON 对象JSONObjec…

MongoDB启动报错

spring boot 引入MongoDB启动报错 java.lang.IllegalStateException: Failed to introspect Class [io.micrometer.core.instrument.binder.mongodb.DefaultMongoConnectionPoolTagsProvider] from ClassLoader [sun.misc.Launcher$AppClassLoader18b4aac2] at org.springfra…

爬虫综合案例-获取房源信息并在地图上显示

文章目录 1.项目介绍2.项目分析3.爬取房源信息4. 导入高德地图5.地图上显示房源信息6.运行程序 1.项目介绍 本次案例将从 58 同城信息网爬取相关城市的房源出租信息&#xff0c;然后通过高德地图把房源信息地图显示&#xff0c;通过地图进行浏览&#xff0c;点击相应的热点文字…

二叉树|二叉树的层序遍历 (广度优先搜索)

力扣题目链接 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> que;if (root ! NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size que.size();vector<int>…

网络工程师练习题3

网络工程师 在Cisco Catalyst 3548以太网交换机上建立一个名为lib105的VLAN&#xff0c;下列正确的配置是&#xff08;&#xff09;。 A.Switch-3 548#vlan 1 name lib 105 Switch-3548#exitB.Switch-3548&#xff08;valn&#xff09; 1 name lib 105C. Switch-3548&#xf…

[运维] 可视化爬虫易采集-EasySpider(笔记)

一、下载 ​下载地址 下滑到Assets页面&#xff0c;选择下载 二、解压运 ​解压压缩包&#xff0c;打开文件夹 在此文件夹下打开Linux Terimal, 并输入以下命令运行软件&#xff1a; ./easy-spider.sh 注意软件运行过程中不要关闭terminal。 三、使用 1.开始 首先点击…

使用 CSS 实现毛玻璃效果

在现代 Web 设计中,毛玻璃效果越来越受欢迎。它能够让界面元素看起来更加柔和、朦胧,同时又不会完全遮挡背景内容,给人一种透明而又不失质感的视觉体验。虽然过去实现这种效果需要借助图像编辑软件,但现在只需要几行 CSS 代码,就可以在网页上呈现出令人惊艳的毛玻璃效果。 使用…

愚人节礼物(C++)

这不愚人节 快到了吗&#xff1f;身为顶级程序员&#xff0c;不用c编写愚人节礼物那心里是很不舒服的&#xff0c;所以&#xff0c;趁着愚人节到来之际&#xff0c;下面分享一种坑朋友的c代码&#xff1a; 内容包含一些敏感词&#xff0c;如果对你产生了影响或伤害&#xff0c;…

IDEA 配置阿里规范检测

IDEA中安装插件 配置代码风格检查规范 使用代码风格检测 在代码类中&#xff0c;右键 然后会给出一些不符合规范的修改建议&#xff1a; 保存代码时自动格式化代码 安装插件&#xff1a; 配置插件&#xff1a;

SPSS k-均值聚类的 anova分析表解读

from&#xff1a;SPSS K均值聚类&#xff08;k-means&#xff09;和可视化方法 - CollinsLi - 博客园 (cnblogs.com) F值&#xff1a;变量对聚类的贡献 显著性水平&#xff1a;<0.05 则因子显著

MyBatis面试简答题

以下是一份MyBatis的高难度简答题,共20题: 请解释MyBatis中#{}和${}的区别,并举例说明它们在实际应用中的使用场景。 MyBatis的Mapper接口是如何与XML映射文件关联的? 如何在MyBatis中实现动态SQL?请列举几种常见的动态SQL元素并解释其作用。 描述MyBatis中的ResultMap的作…