第12章:基于TransUnet和SwinUnet网络实现的医学图像语义分割:腹部13器官分割(网页推理)
目录
1. 前言
2. TransUnet 和 SwinUnet
3. 腹部多器官分割
4. 训练
5. 推理
6. 项目下载
1. 前言
TransUNet 是一种用于医学图像分割的混合架构,结合了 Transformer 和 U-Net 的优势。它利用 Transformer 的全局上下文建模能力和 U-Net 的精确定位特性,在医学图像分割任务中实现了优异的性能。
TransUNet 的核心组成部分:
1. Transformer 编码器:Transformer 编码器用于捕捉输入图像中的长距离依赖关系和全局上下文信息。这在医学图像中尤为重要,因为整个图像的上下文信息对准确分割至关重要。输入图像首先被分割成多个图像块(patches),这些图像块被展平后通过一系列 Transformer 层进行处理。
2. U-Net 解码器:U-Net 解码器负责对特征图进行上采样,并将其与编码器中的高分辨率特征结合,生成精确的分割结果。编码器和解码器之间的跳跃连接(skip connections)有助于保留空间细节,这对精确分割非常重要。
3. 混合架构:TransUNet 的混合架构将 Transformer 编码器与 U-Net 解码器结合。Transformer 编码器提供丰富的全局上下文信息,而 U-Net 解码器确保精确定位和细节分割。
TransUNet 的优势:
- 全局上下文建模:Transformer 能够捕捉图像中的全局信息,解决了传统卷积神经网络(CNN)在长距离依赖关系建模上的局限性。
- 精确定位:U-Net 的解码器结构和跳跃连接确保了分割结果的细节和准确性。
- 适用于医学图像:TransUNet 在医学图像分割任务(如器官分割、病变检测等)中表现出色,能够处理复杂的解剖结构。
SwinUnet 是一种基于 **Swin Transformer** 的医学图像分割模型,结合了 Swin Transformer 的层次化特征提取能力和 U-Net 的经典编码器-解码器结构。SwinUnet 在医学图像分割任务中表现出色,尤其是在处理高分辨率图像时,能够有效捕捉全局上下文信息并保留局部细节。
SwinUnet 的核心思想:
1. Swin Transformer 作为骨干网络:Swin Transformer 是一种基于窗口(Window)机制的 Transformer 模型,通过局部窗口内的自注意力计算来降低计算复杂度,同时支持层次化特征提取。Swin Transformer 的层次化设计(Hierarchical Architecture)使其能够捕捉多尺度的特征信息,非常适合医学图像中复杂的目标结构。
2. U-Net 风格的编码器-解码器结构:SwinUnet 采用了经典的 U-Net 结构,包括编码器(下采样)和解码器(上采样)两部分。编码器部分使用 Swin Transformer 提取多层次特征,解码器部分通过上采样和跳跃连接(Skip Connections)恢复空间细节,从而实现精确的分割。
SwinUnet 的主要特点:
1. 基于窗口的自注意力机制:Swin Transformer 将图像划分为多个局部窗口,在每个窗口内计算自注意力,显著降低了计算复杂度。通过移动窗口(Shifted Window)机制,不同窗口之间可以交互信息,从而捕捉全局上下文。
2. 层次化特征提取:Swin Transformer 通过多阶段的下采样(Patch Merging)构建层次化特征金字塔,能够同时捕捉局部细节和全局信息。这种多尺度特征提取能力非常适合医学图像中不同大小的目标结构。
3. 跳跃连接:SwinUnet 在编码器和解码器之间引入了跳跃连接,将低层次的高分辨率特征与高层次语义特征结合,提升了分割的精度。
4. 计算效率高:相比于传统的 Vision Transformer(ViT),Swin Transformer 的窗口机制大幅减少了计算量,使其能够处理高分辨率医学图像。
SwinUnet 的优势:
- 全局与局部信息结合: Swin Transformer 能够同时捕捉全局上下文和局部细节,解决了传统 CNN 在长距离依赖建模上的不足。
- 多尺度特征提取:层次化设计使其能够处理医学图像中不同尺度的目标结构。
- 高分辨率图像处理:基于窗口的自注意力机制降低了计算复杂度,适合处理高分辨率医学图像。
- 通用性强:在多种医学图像分割任务(如器官分割、病变检测)中均表现出色。
SwinUnet 是一种结合了 Swin Transformer 和 U-Net 的先进医学图像分割模型。它通过 Swin Transformer 的层次化窗口机制实现了高效的全局上下文建模,同时利用 U-Net 的解码器结构和跳跃连接保留了局部细节。SwinUnet 在医学图像分割任务中表现优异,是当前医学图像分析领域的重要研究方向之一。
2. TransUnet 和 SwinUnet
代码如下:
其中实现的部分在这:
3. 腹部多器官分割
数据集文件如下:
标签采用0 1 2 ...标注,看起来是全黑的
其中,训练集的总数为799,验证集的总数为342
4. 训练
训练的参数如下:
- ct 如果数据集是医学影像的ct格式,那么会自动进行windowing增强,效果会更好
- model 可以选择TransUnet或者SwinUnet
- base size是预处理的图像大小,也就是输入model的图像尺寸
- batch size 批大小,epoch 训练轮次,lr 是cos衰减的起始值,lrf是衰减倍率,这里lr最终大小是0.01 * 0.001
- results 是训练生成的主目录
parser.add_argument("--ct", default=False,type=bool,help='is CT?') # Ct --> Trueparser.add_argument("--model", default='swinUnet',help='transUnet,swinUnet')parser.add_argument("--base-size",default=(224,224),type=tuple) # 根据图像大小更改parser.add_argument("--batch-size", default=4, type=int)parser.add_argument("--epochs", default=5, type=int)parser.add_argument('--lr', default=0.002, type=float)parser.add_argument('--lrf',default=0.002,type=float) # 最终学习率 = lr * lrfparser.add_argument("--img_f", default='.png', type=str) # 数据图像的后缀parser.add_argument("--mask_f", default='.png', type=str) # mask图像的后缀parser.add_argument("--results", default='runs', type=str) # 保存目录parser.add_argument("--data-train", default='./data/train/images', type=str)parser.add_argument("--data-val", default='./data/val/images', type=str)
模型信息如下:
指标如下:这里训练了200个epoch
训练日志如下:
"epoch:199": {"train log:": {"info": {"pixel accuracy": [0.9870787858963013],"Precision": ["0.9609","0.9276","0.9269","0.8783","0.7920","0.9686","0.9406","0.8954","0.8510","0.8087","0.8332","0.6710","0.6722"],"Recall": ["0.9499","0.9224","0.9211","0.8383","0.6954","0.9684","0.9349","0.8407","0.8014","0.6766","0.7812","0.3995","0.3718"],"F1 score": ["0.9554","0.9250","0.9240","0.8578","0.7406","0.9685","0.9377","0.8672","0.8255","0.7368","0.8064","0.5008","0.4788"],"Dice": ["0.9554","0.9250","0.9240","0.8578","0.7406","0.9685","0.9377","0.8672","0.8255","0.7368","0.8064","0.5008","0.4788"],"IoU": ["0.9145","0.8605","0.8587","0.7510","0.5880","0.9388","0.8828","0.7656","0.7028","0.5833","0.6756","0.3341","0.3147"],"mean precision": 0.855877697467804,"mean recall": 0.777043342590332,"mean f1 score": 0.8095670938491821,"mean dice": 0.8095670938491821,"mean iou": 0.7054123282432556}},"val log:": {"info": {"pixel accuracy": [0.9790719151496887],"Precision": ["0.9333","0.8834","0.8761","0.8169","0.6622","0.9539","0.8835","0.8654","0.7797","0.6982","0.7444","0.5177","0.5125"],"Recall": ["0.9096","0.8404","0.8526","0.7472","0.4546","0.9501","0.8547","0.7692","0.6896","0.5066","0.6195","0.2401","0.2349"],"F1 score": ["0.9213","0.8614","0.8642","0.7805","0.5391","0.9520","0.8689","0.8145","0.7319","0.5871","0.6762","0.3281","0.3221"],"Dice": ["0.9213","0.8614","0.8642","0.7805","0.5391","0.9520","0.8689","0.8145","0.7319","0.5871","0.6762","0.3281","0.3221"],"IoU": ["0.8541","0.7565","0.7609","0.6400","0.3690","0.9084","0.7681","0.6870","0.5772","0.4156","0.5108","0.1962","0.1920"],"mean precision": 0.7790209054946899,"mean recall": 0.6668398976325989,"mean f1 score": 0.7113207578659058,"mean dice": 0.7113207578659058,"mean iou": 0.5873586535453796}
5. 推理
这里推理利用streamlit在本地网页进行推理:streamlit run infer.py
这里页面没有优化,有兴趣的话可以自己试试
6. 项目下载
关于本项目代码和数据集、训练结果的下载:【更换数据集进行训练的话,参考readme文件,pip requirements文件就行了】
基于TransUnet和Swin-Unet实现的医学图像语义分割对比项目:腹部器官多类别图像语义分割资源-CSDN文库
关于图像分类、分割网络的改进:图像分类网络改进_听风吹等浪起的博客-CSDN博客
相关文章:
第12章:基于TransUnet和SwinUnet网络实现的医学图像语义分割:腹部13器官分割(网页推理)
目录 1. 前言 2. TransUnet 和 SwinUnet 3. 腹部多器官分割 4. 训练 5. 推理 6. 项目下载 1. 前言 TransUNet 是一种用于医学图像分割的混合架构,结合了 Transformer 和 U-Net 的优势。它利用 Transformer 的全局上下文建模能力和 U-Net 的精确定位特性&…...
DS图(下)(19)
文章目录 前言一、最短路径的概念二、单源最短路径-Dijkstra算法三、单源最短路径-Bellman-Ford算法四、多源最短路径-Floyd-Warshall算法总结 前言 加油,今天就是图的最后一篇了,撑住!! 今天我们要学的就是最短路径问题&…...
鸿蒙Harmony-Progress组件概述
鸿蒙Harmony-Progress组件概述 1.1Progress组件概述 作用:显示操作或任务的进度,支持线性,环形,刻度等多种样式适用场景:文件上传/下载、任务完成度、系统状态反馈等 2.1基础属性(参考官方文档ÿ…...
流数据库中的RisingWave和Materialize
流数据库(Streaming Database)是一种专门设计用于处理大量实时流数据的数据库,它能够在数据生成时立即进行处理,从而实现实时洞察和分析。RisingWave和Materialize都是这一领域的代表性技术。RisingWave和Materialize都是强大的流…...
【C++】多态详细讲解
本篇来聊聊C面向对象的第三大特性-多态。 1.多态的概念 多态通俗来说就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)。 编译时多态:主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的函数,通…...
防火墙的安全策略
1.VLAN 2属于办公区;VLAN 3属于生产区,创建时间段 [FW]ip address-set BG type object [FW-object-address-set-BG]address 192.168.1.0 mask 25 [FW]ip address-set SC type object [FW-object-address-set-SC]address 192.168.1.129 mask 25 [FW]ip address-se…...
Android 进程间通信
什么是IPC? Android 进程间通信(IPC,Inter-Process Communication)是Android操作系统中不同进程间交换数据和资源的一种机制。由于Android是多任务操作系统,每个应用通常运行在自己的进程中,以提高安全性和…...
【优先算法】专题——位运算
在讲解位运算之前我们来总结一下常见的位运算 一、常见的位运算 1.基础为运算 << &:有0就是0 >> |:有1就是1 ~ ^:相同为0,相异位1 /无进位相加 2.给一个数 n,确定它的二进制表示…...
深入理解k8s中的容器存储接口(CSI)
CSI出现的原因 K8s原生支持一些存储类型的PV,像iSCSI、NFS等。但这种方式让K8s代码与三方存储厂商代码紧密相连,带来不少麻烦。比如更改存储代码就得更新K8s组件,成本高;存储代码的bug还会影响K8s稳定性;K8s社区维护和…...
ZZNUOJ(C/C++)基础练习1061——1070(详解版)
目录 1061 : 顺序输出各位数字 C语言版 C版 1062 : 最大公约数 C C 1063 : 最大公约与最小公倍 C C 1064 : 加密字符 C C 1065 : 统计数字字符的个数 C C 1066 : 字符分类统计 C C 1067 : 有问题的里程表 C C 1068 : 进制转换 C C C(容器stack…...
ES6 变量解构赋值总结
1. 数组的解构赋值 1.1 基本用法 // 基本数组解构 const [a, b, c] [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3// 跳过某些值 const [x, , y] [1, 2, 3]; console.log(x); // 1 console.log(y); // 3// 解构剩余元素 const [first, ...re…...
机理模型与数据模型融合的方式
机理模型与数据模型的融合旨在结合两者的优势,以提供更准确、可靠的预测和决策支持。以下是几种常见的融合方式及其示例: 1. 特征增强(Feature Augmentation) 描述:将由机理模型计算得到的结果作为额外特征加入到数据…...
高效 MyBatis SQL 写法一
高效 MyBatis SQL 写法一 前言 MyBatis 作为一款优秀的持久层框架,极大地简化了数据库操作。 然而,在实际开发中,XML 配置的编写仍然可能显得繁琐。 本文将分享一些 MyBatis 动态 SQL 的优质写法,帮助开发者提升效率并减少错误…...
vue3中的ref相关的api及用法
在 Vue 3 中,ref 相关的 API 主要用于管理响应式数据。以下是 ref 相关的 API 及其用法: 1. ref ref 用于创建响应式的基本数据类型或对象。 用法示例: <script setup> import { ref } from vue;const count ref(0);const incremen…...
3 卷积神经网络CNN
1 Image Classification (Neuron Version) – 1.1 Observation 1 1.2 Observation 2 如果不同的receptive field需要相同功能的neuron,可以使这些neuron共享参数 1.3 Benefit of Convolutional Layer 2 Image Classification (Filter Version) 不用担心filter大小…...
CSV数据分析智能工具(基于OpenAI API和streamlit)
utils.py: from langchain_openai import ChatOpenAI from langchain_experimental.agents.agent_toolkits import create_csv_agent import jsonPROMPT_TEMPLATE """你是一位数据分析助手,你的回应内容取决于用户的请求内容。1. 对于文…...
解决php8.3无法加载curl扩展
把它的值更改为扩展存在的目录的绝对路径(扩展存在的目录为有php_xxx.dll存在的目录) extension_dir "e:\serv\php83\ext" 然后从php根目录复制 libssh2.dll 和 libcrypto-*.dll 和 libssl-*.dll 到Apache根目录下的bin目录 重启apache服务即可...
拍照对比,X70 PRO与X90 PRO+的细节差异
以下是局部截图(上X70P下X90PP) 对比1 这里看不出差异。 对比2 X90PP的字明显更清楚。 对比3 中下的字,X90PP显然更清楚。...
《MPRnet》学习笔记
paper:2102.02808 GitHub:swz30/MPRNet: [CVPR 2021] Multi-Stage Progressive Image Restoration. SOTA results for Image deblurring, deraining, and denoising. 目录 摘要 1、介绍 2、相关工作 2.1 单阶段方法 2.2 多阶段方法 2.3 注意力机…...
机器学习-线性回归(参数估计之结构风险最小化)
前面我们已经了解过关于机器学习中的结构风险最小化准则,包括L1 正则化(Lasso)、L2 正则化(Ridge)、Elastic Net,现在我们结合线性回归的场景,来了解一下线性回归的结构风险最小化,通…...
C++11详解(二) -- 引用折叠和完美转发
文章目录 2. 右值引用和移动语义2.6 类型分类(实践中没什么用)2.7 引用折叠2.8 完美转发2.9 引用折叠和完美转发的实例 2. 右值引用和移动语义 2.6 类型分类(实践中没什么用) C11以后,进一步对类型进行了划分&#x…...
深度学习系列--01.入门
一.深度学习概念 深度学习(Deep Learning)是机器学习的分支,是指使用多层的神经网络进行机器学习的一种手法抖音百科。它学习样本数据的内在规律和表示层次,最终目标是让机器能够像人一样具有分析学习能力,能够识别文字…...
熵采样在分类任务中的应用
熵采样在分类任务中的应用 在机器学习的分类任务里,数据的标注成本常常制约着模型性能的提升。主动学习中的熵采样策略,为解决这一难题提供了新的思路。本文将带你深入了解熵采样在分类任务中的原理、应用及优势。 一、熵采样的原理(优化版) 熵,源于信息论,是对不确定…...
vite配置之---依赖优化选项
vite optimizeDeps 配置项主要在 开发环境 中对依赖项发挥作用 optimizeDeps.entries vite optimizeDeps.entries 是 Vite 配置中的一个选项,用来指定要优化的入口文件。这在开发环境中尤其有用,因为它告诉 Vite 需要预构建哪些文件,以便加速…...
Shell基础:中括号的使用
在Shell脚本中,中括号([ ... ] 和 [[ ... ]])是一种常见的条件测试结构。它们用于进行文件类型检查、值比较以及逻辑判断。通过了解它们的不同特点和用法,能够帮助你编写更加高效、安全且易读的脚本。本文将详细介绍Shell中单中括…...
oracle ORA-27054报错处理
现象 在oracle执行expdp,rman备份,xtts的时候,由于没有足够的本地空间,只能使用到NFS的文件系统但有时候会出现如下报错 ORA-27054: NFS file system where the file is created or resides is not mounted with correct options根据提示信…...
SpringCloud速通教程
视频地址 文档地址 3. SpringCloud - 快速通关...
MapReduce分区
目录 1. MapReduce分区1.1 哈希分区1.2 自定义分区 2. 成绩分组2.1 Map2.2 Partition2.3 Reduce 3. 代码和结果3.1 pom.xml中依赖配置3.2 工具类util3.3 GroupScores3.4 结果 参考 本文引用的Apache Hadoop源代码基于Apache许可证 2.0,详情请参阅 Apache许可证2.0。…...
python算法和数据结构刷题[3]:哈希表、滑动窗口、双指针、回溯算法、贪心算法
回溯算法 「所有可能的结果」,而不是「结果的个数」,一般情况下,我们就知道需要暴力搜索所有的可行解了,可以用「回溯法」。 回溯算法关键在于:不合适就退回上一步。在回溯算法中,递归用于深入到所有可能的分支&…...
JDK 中 NIO 框架设计与实现:深入剖析及实战样例
一、引言 在 Java 的发展历程中,I/O(Input/Output)操作一直是构建高效、稳定应用程序的关键环节。传统的 Java I/O 操作基于流(Stream)的方式,虽然简单易用,但在面对高并发、大规模数据传输等场…...
基于springboot校园点歌系统
基于Spring Boot的校园点歌系统是一种专为校园场景设计的音乐点播平台,它能够丰富学生的校园生活,提升学生的娱乐体验。以下是对该系统的详细介绍: 一、系统背景与意义 在校园环境中,学生们对于音乐有着浓厚的兴趣,传…...
Spring 核心技术解析【纯干货版】- IX:Spring 数据访问模块 Spring-Jdbc 模块精讲
在现代企业级应用中,数据访问层的稳定性和高效性至关重要。为了简化和优化数据库操作,Spring Framework 提供了 Spring-JDBC 模块,旨在通过高度封装的 JDBC 操作,简化开发者的编码负担,减少冗余代码,同时提…...
React开发中箭头函数返回值陷阱的深度解析
React开发中箭头函数返回值陷阱的深度解析 一、箭头函数的隐式返回机制:简洁背后的规则二、块函数体中的显式返回要求:容易被忽视的细节三、真实场景下的案例分析案例1:忘记return导致组件渲染失败案例2:异步操作中的返回值陷阱 四…...
线程同步时定义 std::mutex 为什么要在前面添加 mutable 关键字
在C中,mutable关键字用于修饰类的成员变量,表示即使在一个const对象中,该成员变量也可以被修改。对于mutex这样的同步原语,使用mutable是必要的,原因如下: 1. 为什么需要 mutable? mutex通常用…...
【多线程】线程池核心数到底如何配置?
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 前置回顾2. 动态线程池2.1 JMX 的介绍2.1.1 MBeans 介绍 2.2 使用 JMX jconsole 实现动态修改线程池2.2.…...
Linux find 命令 | grep 命令 | 查找 / 列出文件或目录路径 | 示例
注:本文为 “Linux find 命令 | grep 命令使用” 相关文章合辑。 未整理去重。 如何在 Linux 中查找文件 作者: Lewis Cowles 译者: LCTT geekpi | 2018-04-28 07:09 使用简单的命令在 Linux 下基于类型、内容等快速查找文件。 如果你是 W…...
爬楼梯(dp)杭电复试
一个楼梯共有 nn 级台阶,每次可以走一级或者两级或者三级,问从第 00 级台阶走到第 nn 级台阶一共有多少种方案。 输入格式 一个整数 NN。 输出格式 一个整数,表示方案总数。 数据范围 1≤N≤201≤N≤20 输入样例: 4输出样…...
JVM执行引擎
一、执行引擎的概述: 执行引擎是]ava虚拟机核心的组成部分之一; “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则…...
企业四要素如何用PHP进行调用
一、什么是企业四要素? 企业四要素接口是在企业三要素(企业名称、统一社会信用代码、法定代表人姓名)的基础上,增加了一个关键要素,通常是企业注册号或企业银行账户信息。这种接口主要用于更全面的企业信息验证&#x…...
基于springboot河南省旅游管理系统
基于Spring Boot的河南省旅游管理系统是一种专为河南省旅游行业设计的信息管理系统,旨在整合和管理河南省的旅游资源信息,为游客提供准确、全面的旅游攻略和服务。以下是对该系统的详细介绍: 一、系统背景与意义 河南省作为中国的中部省份&…...
arm 下 多线程访问同一变量 ,使用原子操作 性能差问题
arm下原子操作性能差的原因 Linux Kernel(armv8-aarch64) 的原子操作的底层实现 - 极术社区 - 连接开发者与智能计算生态 arm 下如何解决 ARMs LSE (for atomics) and MySQL – MySQL On ARM – All you need to know about MySQL (and its variants) on ARM. arm 下lse 和…...
嵌入式工程师必学(143):模拟信号链基础
概述: 我们每天使用的许多电子设备,以及我们赖以生存的电子设备,如果不使用电子工程师设计的实际输入信号,就无法运行。 模拟信号链由四个主要元件组成:传感器、放大器、滤波器和模数转换器 (ADC)。这些传感器用于检测、调节模拟信号并将其转换为适合由微控制器或其他数…...
PyQt6/PySide6 的 QDialog 类
QDialog 是 PyQt6 或 PySide6 库中用于创建对话框的类。对话框是一种特殊的窗口,通常用于与用户进行短期交互,如输入信息、显示消息或选择选项等。QDialog 提供了丰富的功能和灵活性,使得开发者可以轻松地创建各种类型的对话框。下面我将详细…...
【AI日记】25.02.05 自由不是一种工具
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Backpack Prediction Challenge感想:这次比赛的数据集的一大特点是信号过弱或者噪声过大,也是一大难点,即使kaggle 官方增加了一…...
【原子工具】快速幂 快速乘
题幂算.一切即1 阴阳迭变积微著,叠浪层峦瞬息功 莫道浮生千万事,元知万象一归宗 文章目录 快速幂原始快速幂(O(logn))二分递归形式非递归形式 模下意义的快速幂(O(logn))二分递归形式非递归形式 快速乘龟速…...
2024年12月 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试
202412 Scratch 图形化(四级)真题解析 中国电子学会全国青少年软件编程等级考试 一、选择题(共10题,共30分) 第 1 题 列表存放全班同学的身高,小猫运行下列程序,下列选项说法正确的是?( &#…...
【面试宝典】机器学习:深度解析高频面试题与解答策略
目录 🍔 机器学习中特征的理解 🍔 机器学习三要素如何理解? 🍔 机器学习中,有哪些特征选择的⼯程⽅法? 🍔 机器学习中的正负样本 🍔 线性分类器与⾮线性分类器的区别及优劣 🍔…...
使用 ElementUI 和 Spring 实现稳定可靠的文件上传和下载功能
前端(ElementUI) 1. 文件上传 使用 el-upload 组件配置上传接口处理上传成功和失败<template><div><el-uploadclass="upload-demo"action="http://your-server-url/upload":on-success="handleSuccess":on-error="handle…...
Linux驱动---字符设备
目录 一、基础简介 1.1、Linux设备驱动分类 1.2、字符设备驱动概念 二、驱动基本构成 2.1、驱动模块的加载和卸载 2.2、添加LICENNSE以及其他信息 三、字符设备驱动开发步骤 3.1、分配主次设备号 3.1.1 主次设备号 3.1.2静态注册设备号 3.1.3动态注册设备号 3.1.4释…...
FastReport.NET控件篇之交叉表控件
认识交叉表 上面是交叉表的原型,关键的三个单元格。 单元格①:用于扩展行数据,譬如打印学生成绩表时,每个学生一行,那么这个地方就是以学生姓名列进行打印。 单元格②:用于扩展列数据,譬如打印…...