图像分割实战-系列教程3:unet医学细胞分割实战1(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

🍁🍁🍁图像分割实战-系列教程 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传

上篇内容:
Unet系列算法
下篇内容:
unet医学细胞分割实战2

1、医学细胞数据集介绍

1.1 数据集

如图所示,右图就是原始数据,而左边就是标签,一共670条训练数据

1.2 原始数据集预处理

上面的数据是经过处理的,实际上的原始数据是在Kaggle上下载的公开数据集

是包含的一个一个的文件夹,每个文件夹中分别是数据和标签

而标签中是细胞图像中,对每一个细胞都做成了标签,分成了很多张小图片,我们首先要做的是把这些小图片拼到一起

import os
from glob import glob
import cv2
import numpy as np
from tqdm import tqdm 
img_size = 96
paths = glob('inputs/stage1_train/*')
os.makedirs('inputs/dsb2018_%d/images' % img_size, exist_ok=True)
os.makedirs('inputs/dsb2018_%d/masks/0' % img_size, exist_ok=True)
for i in tqdm(range(len(paths))):
    path = paths[i]
    img = cv2.imread(os.path.join(path, 'images',
                     os.path.basename(path) + '.png'))
    mask = np.zeros((img.shape[0], img.shape[1]))
    for mask_path in glob(os.path.join(path, 'masks', '*')):
        mask_ = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) > 127
        mask[mask_] = 1
    if len(img.shape) == 2:
        img = np.tile(img[..., None], (1, 1, 3))
    if img.shape[2] == 4:
        img = img[..., :3]
    img = cv2.resize(img, (img_size, img_size))
    mask = cv2.resize(mask, (img_size, img_size))
    cv2.imwrite(os.path.join('inputs/dsb2018_%d/images' % img_size,
                os.path.basename(path) + '.png'), img)
    cv2.imwrite(os.path.join('inputs/dsb2018_%d/masks/0' % img_size,
                os.path.basename(path) + '.png'), (mask * 255).astype('uint8'))

这部分代码只需要把那些小图片按照顺序汇总,使用OpenCV拼在一起就可以了,然后所有的数据都是这样的处理方式,最后会得到1.1形式的数据集,这里就不演示以及解释代码了,如果对OpenCV不熟悉的可以参数这篇教程

2、训练参数解读

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('--name', default=None, help='model name: (default: arch+timestamp)')
    parser.add_argument('--epochs', default=100, type=int, metavar='N', help='number of total epochs to run')
    parser.add_argument('-b', '--batch_size', default=8, type=int, metavar='N', help='mini-batch size (default: 16)')
    parser.add_argument('--arch', '-a', metavar='ARCH', default='NestedUNet', choices=ARCH_NAMES, help='model architecture: ' +
                        ' | '.join(ARCH_NAMES) + ' (default: NestedUNet)')
    parser.add_argument('--deep_supervision', default=False, type=str2bool)
    parser.add_argument('--input_channels', default=3, type=int, help='input channels')
    parser.add_argument('--num_classes', default=1, type=int, help='number of classes')
    parser.add_argument('--input_w', default=96, type=int, help='image width')
    parser.add_argument('--input_h', default=96, type=int, help='image height')
    parser.add_argument('--loss', default='BCEDiceLoss', choices=LOSS_NAMES, help='loss: ' +
                        ' | '.join(LOSS_NAMES) + ' (default: BCEDiceLoss)')
    
    # dataset
    parser.add_argument('--dataset', default='dsb2018_96', help='dataset name')
    parser.add_argument('--img_ext', default='.png', help='image file extension')
    parser.add_argument('--mask_ext', default='.png', help='mask file extension')

    # optimizer
    parser.add_argument('--optimizer', default='SGD', choices=['Adam', 'SGD'], help='loss: ' +
                        ' | '.join(['Adam', 'SGD']) + ' (default: Adam)')
    parser.add_argument('--lr', '--learning_rate', default=1e-3, type=float, metavar='LR', help='initial learning rate')
    parser.add_argument('--momentum', default=0.9, type=float, help='momentum')
    parser.add_argument('--weight_decay', default=1e-4, type=float, help='weight decay')
    parser.add_argument('--nesterov', default=False, type=str2bool, help='nesterov')

    # scheduler
    parser.add_argument('--scheduler', default='CosineAnnealingLR',
                        choices=['CosineAnnealingLR', 'ReduceLROnPlateau', 'MultiStepLR', 'ConstantLR'])
    parser.add_argument('--min_lr', default=1e-5, type=float,
                        help='minimum learning rate')
    parser.add_argument('--factor', default=0.1, type=float)
    parser.add_argument('--patience', default=2, type=int)
    parser.add_argument('--milestones', default='1,2', type=str)
    parser.add_argument('--gamma', default=2/3, type=float)
    parser.add_argument('--early_stopping', default=-1, type=int,
                        metavar='N', help='early stopping (default: -1)')
    
    parser.add_argument('--num_workers', default=0, type=int)

    config = parser.parse_args()

    return config
  1. 参数函数
  2. 参数实例化对象
  3. 指定网络的名字(Unet++)
  4. 训练epochs,数据很小,h和w很小、量也小,100轮够了,20分钟就能跑完
  5. batch_size根据自己显卡资源指定
  6. 网络架构,在后面部分会解释
  7. 是否需要在每个位置都加上监督
  8. 输入通道数
  9. 类别个数,当前任务比较简单,只有是细胞和不是细胞
  10. 输入图像H
  11. 输入图像W
  12. 指定损失函数为交叉熵
  13. 数据集名字
  14. 图像文件的扩展名
  15. 掩码文件的扩展名
  16. 优化器SGD
  17. 学习率
  18. 动量加速
  19. 学习率衰减
  20. 使用了一个自定义的类型转换函数 str2bool 来处理输入值
  21. scheduler,指定使用默认值为 'CosineAnnealingLR’为学习率调度器
  22. 最小学习率
  23. factor,指定在特定条件下调整学习率时的乘法因子,默认值为0.1
  24. patience,对于一些调度器(如 ReduceLROnPlateau),这个参数定义了在性能不再提升时要等待多少周期之后才减少学习率。默认值为 2。类型为 int。
  25. milestones,对于 MultiStepLR 调度器,这个参数定义了何时降低学习率的周期数。默认值是 ‘1,2’(表示一个字符串,您可能需要在代码中将其分割为多个数值)。类型为 str。
  26. gamma值
  27. 设置提前停止
  28. 用于指定在数据加载时用于数据预处理的进程数。

上篇内容:
Unet系列算法
下篇内容:
unet医学细胞分割实战2

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

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

相关文章

STM32——通用计时器

通用计时器框图 1.时钟源 1)内部时钟(CK_INT) 2)外部时钟模式 1:外部输入引脚(TIx),x1,2(即只能来自于通道 1 或者通道 2) 3)外部时钟模式 2:外部触发输入(ETR) 4&#…

androidStudio 没有新建flutter工程的入口?

装了flutter dart 插件 执行了 flutter doctor 也执行了 flutter doctor --android-license 最后重启了 androidStudio 还是没发现在哪新建flutter项目工程 原来 plugins 下的 Android APK Support没有勾选

[C#]C# winform实现imagecaption图像生成描述图文描述生成

介绍: 地址:C#https://github.com/ruotianluo/ImageCaptioning.pytorch 效果: 测试环境: vs2019 onnxruntime1.16.3 opencvsharp4.8 代码: using System; using System.Collections.Generic; using System.Comp…

win11出现安全中心空白和IT管理员已限制对某些区域的访问(不一样的解决方式),真实的个人经历,并且解决经过

1、个人的产生问题的经历 2023年12月22日,由于我买了一块电脑的固态硬盘1T,想要扩容,原来电脑自带512G(由于个人是一个程序员,导致512G实在太古鸡肋)装好以后,想要重装一下系统,来个大清理。结果不出意料&…

二叉树BFS

前置知识 二叉树节点的定义 二叉树是递归定义的 /*** Definition for a binary tree node.(LeetCode)*/public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode…

自然语言处理2——轻松入门情感分析 - Python实战指南

目录 写在开头1.了解情感分析的概念及其在实际应用中的重要性1.1 情感分析的核心概念1.1.1 情感极性1.1.2 词汇和上下文1.1.3 情感强度1.2 实际应用中的重要性 2. 使用情感分析库进行简单的情感分析2.1 TextBlob库的基本使用和优势2.1.1 安装TextBlob库2.1.2 文本情感分析示例2…

小程序面试题 | 17.精选小程序面试题

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

[Angular] 笔记 24:ngContainer vs. ngTemplate vs. ngContent

请说明 Angular 中 ngContainer, ngTemplate 和 ngContent 这三者之间的区别。 chatgpt 回答: 这三个在 Angular 中的概念是关于处理和组织视图的。 1. ngContainer: ngContainer 是一个虚拟的 HTML 容器,它本身不会在最终渲染…

算法训练day53|动态规划part14

参考:代码随想录 1143.最长公共子序列 重点:状态的转移与递推公式的确定 本题和动态规划:718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 …

java企业网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web企业网站系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

go的json数据类型处理

json对象转slice package mainimport ("encoding/json""fmt""github.com/gogf/gf/container/garray" )func main() {// JSON 字符串jsonStr : ["apple", "banana", "orange"]//方法一:// 解析 JSON 字…

Netty(一)-NIO

一、Netty 现在的互联网环境下,分布式系统大行其道,而分布式系统的根基在于网络编程,而Netty恰恰是Java领域网络编程的王者。如果要致力于开发高性能的服务器程序,高性能的客户端程序,必须掌握Netty。 1、NIO NIO&…

2023年新一代开发者工具 Vue ,正式开源!

以下文章来源于前端充电宝 ,作者CUGGZ 近日,Vue 新一代开发者工具(DevTools)正式开源!Vue DevTools 是一个旨在增强 Vue 开发人员体验的工具,它提供了一些功能来帮助开发者更好地了解 Vue 应用。下面就来看…

音频播放软件Foobar2000 mac特点介绍

Foobar2000 mac是一款高度可定制的音频播放器,适用于Windows平台。它支持各种音频格式,包括MP3、FLAC、AAC、WMA等,同时也支持各种音频插件和效果器,可以提供更好的音质和用户体验。 Foobar2000 mac软件特点 1. 高度可定制&#…

汇编语言指令系列

目录 (一)七大寻址方式 ① 立即寻址: ② 寄存器寻址: ③ 直接寻址: ④ 寄存器间接寻址: ⑤ 变指寻址: ⑥ 相对寻址: ⑦ 位寻址: (二)重要…

网络交换机端口管理会面临的问题

交换机端口管理是跟踪网络交换机及其端口连接详细信息的过程,在大型网络中,交换机端口管理过程通常使用自动化交换机端口管理工具执行。 通过网络交换机端口提供的完全控制和可见性使交换机端口管理工具在管理网络时必不可少,在网络中部署交…

utf8mb4_0900_ai_ci、utf8mb4_0900_as_ci、utf8mb4_0900_as_cs 这三者有什么区别

utf8mb4_0900_ai_ci, utf8mb4_0900_as_ci, 和 utf8mb4_0900_as_cs 是 MySQL 数据库中使用的字符集和校对规则。这些校对规则决定了如何比较和排序字符数据。它们属于 utf8mb4 字符集,这是 UTF-8 编码的超集,支持最多 4 个字节的字符,能够存储…

回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 (多指标,多图)

回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 (多指标,多图) 目录 回归预测 | MATLAB实OOA-LSTM基于鱼鹰优化算法优化长短期记忆网络的多输入单输出数据回归预测模型 (多指标&a…

【信息安全原理】——期末复习(冲刺篇)

📖 前言:快考试了,做篇期末总结,都是重点与必考点。 题型:简答题(45分)、协议分析题(210分)(给一个报文或工作流程,分析存在的问题)、…

SpringBoot用JDK1.8的依赖设置pom.xml

pom.xml的修改主要是两个地方: 1.修改springframework的版本为2.5.0,版本太高可能和其他插件搭配有冲突; 2.Java的版本修改成8,也就是对应JDK1.8。