软件系统设计方案(自动病灶检测系统)
一、项目简介
①计算机辅助检测/诊断(CADe/CADx)在医学图像处理领域一直是非常繁荣和成功的研究领域,卷积神经网络(CNN)基于深学习算法显著优于传统的统计学习方法与手工图像特征结合执行。 但是,这些性能提升通常是以需要大量带标签的训练数据为代价的。
与一般的计算机视觉任务不同,医学图像分析当前缺乏大规模的带注释的图像数据集,这主要是因为传统的通过搜索从普通用户收集图像标签的方法不能应用于医学图像领域, 医学图像注释需要广泛的临床专业知识。
②现有的检测算法通常针对一种特定的病变类型,如皮肤病变、肺结节,肝病变,硬化性病变和结肠息肉等。虽然一些常见的病变类型受到很多关注,但大多数程序却忽略了大量不常见的病变类型。此外,一次研究一种病变类型与放射科医生通常用于阅读医学图像和汇编放射报告的方法不同。
在实践中,可以观察到多种发现,并且经常相互关联。例如,转移可以扩散到区域淋巴结或其他身体部位。通过获取并保持相关临床结果的整体图像,放射科医生将能够做出更准确的诊断。然而,开发通用或多类别算法框架仍然具有挑战性,我们要做的就是开发一个通用病灶识别系统,能够以无缝方式检测多种病变类型。
需要实现的功能有:
- 用户注册、登录
- 图像采集
- 图像显示
- 图像识别
- 网络选择
二、软件的基本结构和机制
本系统通过 Django设计并结合 Tensorflow、keras 等相关库函数通过可视化的界面布局的方式。
2.1使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式,MVC 模式使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。
MVC 优势:
- 低耦合
- 开发快捷
- 部署方便
- 可重用性高
- 维护成本低
将封装好的训练、识别、图像预处理、图像显示等主要程序放入各个模块框架内对应接口,来实现自动病灶识别检测系统的总体设计。通过这个系统对算法进行研究和优化并进行测试检验,对比不同的网络结构和图像数据下的实验结果来验证系统的性能。肺癌自动识别系统采用基于深度学习的卷积神经网络,加载预先训练好的网络权值对识别数据进行判断,并分析实验结果。
本系统主要包含四个模块:图像采集、识别、图像显示和网络设计。图像采集模块主要包括加载图像和图像的预处理;识别模块主要完成在选定网络模型后显示相应的网络参数,并装载该网络识别预处理后的图片,输出识别的结果;图像的显示模块主要实现显示载入图像,显示预处理图像,显示肺癌标注图像,显示图像缩放;网络设计模块主要是为系统提供后期维护,能够更新网络权值,并且为后续功能的开发预留接口。
三、视图 & 接口API
3.2分解视图
分解是构建软件架构模型的关键步骤,分解视图也是描述软件架构模型的关键视图,一般分解视图呈现为较为明晰的分解结构(breakdown structure)特点。分解视图用软件模块勾划出系统结构,往往会通过不同抽象层级的软件模块形成层次化的结构。由于前述分解方法中已经明确呈现出了分解视图的特征,我们这里简要了解一下分解视图中常见的软件模块术语。
3.3依赖视图
依赖视图展现了软件模块之间的依赖关系。比如一个软件模块A调用了另一个软件模块B,那么我们说软件模块A直接依赖软件模块B。如果一个软件模块依赖另一个软件模块产生的数据,那么这两个软件模块也具有一定的依赖关系。
依赖视图在项目计划中有比较典型的应用。比如它能帮助我们找到没有依赖关系的软件模块或子系统,以便独立开发和测试,同时进一步根据依赖关系确定开发和测试软件模块的先后次序。
依赖视图在项目的变更和维护中也很有价值。比如它能有效帮助我们理清一个软件模块的变更对其他软件模块带来影响范围。
3.4执行视图
执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。执行视图中的每一个执行实体,一般称为组件(Component),都是不同于其他组件的执行实体。执行实体可以最终分解到软件的基本元素和软件的基本结构,因而与软件代码具有比较直接的映射关系。在设计与实现过程中,我们一般将执行视图转换为伪代码之后,再进一步转换为实现代码。根据系统的各部分的功能实现,我们画出系统的整体流程图如下:
3.5实现视图
实现视图是描述软件架构与源文件之间的映射关系。比如软件架构的静态结构以包图或设计类图的方式来描述,但是这些包和类都是在哪些目录的哪些源文件中具体实现的呢?一般我们通过目录和源文件的命名来对应软件架构中的包、类等静态结构单元,这样典型的实现视图就可以由软件项目的源文件目录树来呈现。
实现视图有助于码农在海量源代码文件中找到具体的某个软件单元的实现。实现视图与软件架构的静态结构之间映射关系越是对应的一致性高,越有利于软件的维护,因此实现视图是一种非常关键的架构视图。
系统代码目录如下:
3.6成员工作分配视图
工作分配视图将系统分解成可独立完成的工作任务,以便分配给各项目团队和成员。工作分配视图有利于跟踪不同项目团队和成员的工作任务的进度,也有利于在个项目团队和成员之间合理地分配和调整项目资源,甚至在项目计划阶段工作分配视图对于进度规划、项目评估和经费预算都能起到有益的作用。
每个视图都是从不同的角度对软件架构进行描述和建模,比如从功能的角度、从代码结构的角度、从运行时结构的角度、从目录文件的角度,或者从项目团队组织结构的角度。
软件架构代表了软件系统的整体设计结构,它应该是所有这些视图的集合。但我们不会将不同角度的这些视图整合起来,因为不便于阅读和更新。不过我们会有意识地将不同角度的视图之间的映射关系和重叠部分了然于胸,从而深刻理解软件架构内在的一致性和完整性,这就是系统概念原型。
四、数据库设计
User
列名 | 数据类型 | 是否可为NULL | 唯一 | 数据长度 | 注释 |
id | string | N | Y | 256 | 用户ID |
username | string | N | Y | 20 | 用户名 |
password | string | N | N | 256 | 密码 |
phone_number | string | N | N | 24 | 电话号 |
string | Y | N | 256 | 邮箱 |
CT
列名 | 数据类型 | 是否可为NULL | 唯一 | 数据长度 | 注释 |
patient_ID | string | N | Y | 256 | 患者ID |
patient_name | string | N | N | 256 | 患者姓名 |
type_of_illness | string | N | N | 256 | 患病类型 |
departments | string | N | N | 256 | 所属科室 |
taged | string | N | N | 4 | 是否标注 |
Bounding box
列名 | 数据类型 | 是否可为NULL | 唯一 | 数据长度 | 注释 |
Left_top_coordinate | string | N | N | 128 | 左上坐标 |
Right_bottom_coordinate | string | N | N | 128 | 右下坐标 |
label | string | N | N | 256 | 标签 |
amount | int | N | N | 256 | BoundingBox数量 |
五、软件系统运行环境和技术说明
开发环境:Python3.6、Django2.0.1以及Tensorflow2.0
编译器: JetBrains Pycharm
技术选型:鉴于本项目做医学图像处理,因此在算法模型方面,采用VGG-16模型。该模型参加2014年的 ImageNet图像分类与定位挑战赛,取得了优异成绩:在分类任务上排名第二,在定位任务上排名第一。在特征提取方面,非常有效。在网站设计方面,Django 和python协同使用。
六、核心工作机制
用户初次登录需先注册账户,然后进入系统,后续可以直接输入用户名及密码登录系统。首先基于Deeplesion数据库,做模型训练。当模型达到一定准确度之后,将该模型嵌入到网站后端中,作为核心功能模块。然后为了方便用户使用,设计网站,简化用户操作。让用户使用的同时,存储用户的输入数据,以便训练模型,提高模型的准确度,形成良性循环。
点击模型设置可以对想要使用的模型进行选择(google net /resnet/ VGG16),选择后对CT图像进行标注,得到结果。
七、总结
本次作业要求根据自己的工程实践项目进行体系结构设计,虽然之前也有过软工的课程,但是还没有像这样把自己真正要做的东西总结一步一步的写出来过。这次要做的工程实践不仅包括了深度学习目标检测的部分还要做出通用病灶检测系统,通过这次博客的编写过程也让自己更清楚了整个项目的流程和自己要做的东西,对项目有了更深的认识,收获很多。