1.研究背景与意义
项目参考AAAI Association for the Advancement of Artificial Intelligence
研究背景与意义:
肺炎是一种常见的呼吸系统感染疾病,其主要病因包括细菌、病毒和真菌等。肺炎的早期诊断对于患者的治疗和预后至关重要。传统的肺炎诊断方法主要依赖于医生的经验和肺部影像学的观察,这种方法存在主观性强、诊断效率低等问题。随着计算机科学和人工智能的快速发展,基于卷积神经网络的肺炎影像分类分割智能诊断系统逐渐成为研究的热点。
卷积神经网络(Convolutional Neural Network,CNN)是一种模仿人类视觉系统的深度学习算法,具有自动学习和特征提取的能力。通过对大量的肺部影像数据进行训练,CNN可以自动识别和提取肺部影像中的特征,从而实现对肺炎的自动诊断。
基于卷积神经网络的肺炎影像分类分割智能诊断系统具有以下几个方面的意义:
-
提高诊断准确性:传统的肺炎诊断方法主要依赖于医生的经验和肺部影像学的观察,存在主观性强、诊断效率低等问题。而基于卷积神经网络的肺炎影像分类分割智能诊断系统可以通过自动学习和特征提取,提高诊断的准确性和可靠性。
-
提高诊断效率:传统的肺炎诊断方法需要医生对大量的肺部影像进行观察和分析,耗费时间和精力。而基于卷积神经网络的肺炎影像分类分割智能诊断系统可以实现对大量肺部影像的自动分析和诊断,大大提高诊断的效率。
-
辅助医生决策:基于卷积神经网络的肺炎影像分类分割智能诊断系统可以为医生提供辅助决策的依据。通过对肺部影像进行自动分析和诊断,系统可以提供患者的病情评估、治疗建议等信息,帮助医生做出更准确的诊断和治疗方案。
-
促进医学研究和教育:基于卷积神经网络的肺炎影像分类分割智能诊断系统可以对大量的肺部影像数据进行分析和挖掘,从而为医学研究提供宝贵的数据资源。同时,系统还可以作为教学工具,帮助医学生和医生进行肺炎诊断的学习和培训。
综上所述,基于卷积神经网络的肺炎影像分类分割智能诊断系统具有重要的研究意义和应用价值。通过提高肺炎诊断的准确性和效率,该系统可以为医生提供辅助决策的依据,促进医学研究和教育的发展,最终提高肺炎患者的治疗效果和生存质量。
2.图片演示
3.视频演示
基于卷积神经网络的肺炎影像分类分割智能诊断系统_哔哩哔哩_bilibili
4.系统流程图
通过第一节理论的介绍,本文已经对深度学习和CT图像原理有了基本的了解。而接下来本文要做的是对于已经得到CT图像进行分析研究,本章将对于原始CT图像进行分类。肺炎图像分类指新冠肺炎、非新冠肺炎的二分类和新冠肺炎、普通肺炎、健康的三分类,根据不同的需要进行任务选择。而对于专业的医生来说,对于给定的一张CT 图像,需要仔细观察病变的区域和区域的大小,根据一定的专业知识和经验,才能进行相应的判断。显然这是相当费时和费力的过程,也存在很大的错误概率。由于患者的人数庞大,很多患者无法得到及时诊治,错过了治疗的最佳时机,使得病情加重。
本文致力于使用深度学习的方法,快速、高效地做出分类预测,为医生提供宝贵的意见。本章将使用深度学习的技术在公开的数据集上进行算法研究,实现肺部CT图像的分类。整个流程是端到端的,只需要输入CT图像即可得到最终的预测类别。肺部CT图像分类的流程图如下图所示,由于公开获取的数据集质量有高有低,所以预处理是必要的。由于深度学习是大数据驱动的算法,数据的增广也是必不可少的。接着就是网络的设计,鉴于目前很多卷积神经网络已经证明在各大数据集上得到了较好的结果,因此本文训练了多个经典的分类网络模型来进行效果比较,并将传统卷积方法和Transformer方法进行对比,对ViT 网络进行改进,从多方面对比各个网络模型的效果。训练后的模型用于对图像的分类预测,即可实现端到端的分类算法。下面首先介绍分类网络的设计。
本文提出了一种基于改进的 ViT和YOLO等的肺炎分类方法,实现了对于CT 图像类别的分析,准确率可以达到93%以上,可以实现对病情的定性分析。但是一个类别的信息并不能够全面的辅助医生的诊断,还需要对病变区域定量分析。图像中仍有大量信息需要提取,因此,本文提出对于新冠肺炎的CT图像进行分割,提取出图像中的肺野、病变等区域信息,更加多方面的辅助医生进行判断,准确地对病情进行分析诊断。本章继续使用深度学习的方法,将Transformer和卷积神经网络进行融合,最终实现肺野、病变的分割,并与现有的优秀分割网络进行对比。分割任务类似于分类的任务,仍然需要数据集的获取和预处理,需要数据量的支撑,因此图像的增广也必不可少。网络的设计和改进是本文的主要目标,接着训练模型和计算指标值。最终本章能够实现端到端的分割,对于输入图像可以输出肺野分割结果、病变分割结果或者两者都含有的四类别分割结果。分割的流程图如下图所示:
5.核心代码讲解
5.1 Classifier.py
class ImageClassifier:
def __init__(self, weights_path, data_path, img_size=(224, 224), device=''):
self.device = select_device(device)
self.model = DetectMultiBackend(weights_path, device=self.device, data=data_path)
self.names = self.model.names
self.img_size = img_size
self.model.warmup(imgsz=(1, 3, *img_size))
def classify(self, image):
image_tensor = torch.Tensor(image).to(self.device)
image_tensor = image_tensor.float()
if len(image_tensor.shape) == 3:
image_tensor = image_tensor[None]
results = self.model(image_tensor)
pred = F.softmax(results, dim=1)
max_i = pred.argmax(dim=1).item() # 使用 argmax 找到最大置信度的索引
max_confidence = float(pred[0][max_i]) # 获取最大置信度的值
return self.names[max_i], max_confidence
def load_image(image_path, img_size):
dataset = LoadImages(image_path, img_size=img_size, transforms=classify_transforms(img_size[0]))
return next(iter(dataset))[1]
if __name__ == '__main__':
weights_path = './best.pt'
data_path = './data/coco128.yaml'
image_path = './test/1.jpg'
classifier = ImageClassifier(weights_path, data_path)
image = load_image(image_path, classifier.img_size)
results = classifier.classify(image)
print(results)
将以上代码封装为一个名为ImageClassifier的类,该类具有以下方法和属性:
__init__(self, weights_path, data_path, img_size=(224, 224), device='')
: 初始化方法,接收模型权重路径、数据路径、图像尺寸和设备类型作为参数。在初始化过程中,会选择设备、加载模型、获取类别名称和设置图像尺寸。classify(self, image)
: 对输入的图像进行分类,返回预测的类别名称和置信度。img_size
: 图像尺寸属性。
另外,还有一个辅助函数load_image(image_path, img_size)
,用于加载图像并进行预处理。
在if __name__ == '__main__':
部分,创建了一个ImageClassifier对象,加载图像并进行分类,最后打印结果。
这个程序文件名为Classifier.py,它包含了一个名为ImageClassifier的类和一个名为load_image的函数。
ImageClassifier类有以下几个方法:
__init__(self, weights_path, data_path, img_size=(224, 224), device='')
:初始化方法,接受权重路径、数据路径、图像大小和设备参数。在初始化过程中,它会调用select_device
函数选择设备,创建一个DetectMultiBackend
模型实例,并将模型的类别名称保存在self.names
中。classify(self, image)
:分类方法,接受一个图像作为输入。它将图像转换为张量,并将其传递给模型进行推理。最后,它使用softmax函数计算预测结果的概率分布,并返回预测结果的类别名称和最大置信度值。
load_image函数有以下功能:
load_image(image_path, img_size)
:加载图像的函数,接受图像路径和图像大小作为输入。它使用LoadImages
类加载图像数据集,并返回第一个图像的张量表示。
在程序的主函数中,定义了权重路径、数据路径和图像路径,并创建了一个ImageClassifier实例。然后,使用load_image函数加载图像,并调用ImageClassifier的classify方法对图像进行分类。最后,打印分类结果。
5.2 export.py
def export_formats():
# YOLOv5 export formats
x = [
['PyTorch', '-', '.pt', True, True],
['TorchScript', 'torchscript', '.torchscript', True, True],
['ONNX', 'onnx', '.onnx', True, True],
['OpenVINO', 'openvino', '_openvino_model', True, False],
['TensorRT', 'engine', '.engine', False, True],
['CoreML', 'coreml', '.mlmodel', True, False],
['TensorFlow SavedModel', 'saved_model', '_saved_model', True, True],
['TensorFlow GraphDef', 'pb', '.pb', True, True],
['TensorFlow Lite', 'tflite', '.tflite', True, False],
['TensorFlow Edge TPU', 'edgetpu', '_edgetpu.tflite', False, False],
['TensorFlow.js', 'tfjs', '_web_model', False, False],
['PaddlePaddle', 'paddle', '_paddle_model', True, True],]
return pd.DataFrame(x, columns=['Format', 'Argument', 'Suffix', 'CPU', 'GPU'])
def try_export(inner_func):
# YOLOv5 export decorator, i..e @try_export
inner_args = get_default_args(inner_func)
def outer_func(*args, **kwargs):
prefix = inner_args['prefix']
try:
with Profile() as dt:
f, model = inner_func(*args, **kwargs)
LOGGER.info(f'{
prefix} export success ✅ {
dt.t:.1f}s, saved as {
f} ({
file_size(f):.1f} MB)')
re