使用Python+OpenCV+Tensorflow+Flask实现检测X光中的新冠病毒
图像看起来不错。预训练CNN模型及其超参数的选择要使用的预训练模型是VGG16,与模型1训练相同baseModel = VGG16(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))接下来,我们必须定义用于训练的超参数。我们与模型1的参数相同:INIT_LR = 0.0001 EPOCHS = 20 BS = 16 NODES_DENSE0 = 128 DROPOUT = 0.5 MAXPOOL_SIZE = (2, 2) ROTATION_DEG = 15 SPLIT = 0.2然后,构建模型:headModel = baseModel.outputheadModel = AveragePooling2D(pool_size=MAXPOOL_SIZE)(headModel)headModel = Flatten(name="flatten")(headModel)headModel = Dense(NODES_DENSE0, activation="relu")(headModel)headModel = Dropout(DROPOUT)(headModel)headModel = Dense(2, activation="softmax")(headModel)将headModel模型放在最后,成为用于训练的真实模型。model = Model(inputs=baseModel.input, outputs=headModel)在基础模型的所有层上执行的以下循环将“冻结”它们,以便在第一个训练过程中不会更新它们。for layer in baseModel.layers: layer.trainable = False此时,模型已经准备好接受训练,但是我们应该首先为模型准备数据(图像)。数据预处理我们先创建一个包含存储图像的名称(和路径)列表,然后执行与模型1相同的预处理:imagePaths = list(paths.list_images(dataset_path))data = []labels = []for imagePath in imagePaths: label = imagePath.split(os.path.sep)[-2] image = cv2.imread(imagePath) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image = cv2.resize(image, (224, 224)) data.append(image) labels.append(label)data = np.array(data) / 255.0labels = np.array(labels)标签使用one-hot。lb = LabelBinarizer()labels = lb.fit_transform(labels)labels = to_categorical(labels)此时,我们将把训练数据集分为训练和测试(80%用于训练,20%用于测试):(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=SPLIT, stratify=labels, random_state=42)最后,我们将应用数据增强技术。trainAug = ImageDataGenerator(rotation_range=ROTATION_DEG, fill_mode="nearest")我们已经定义了模型和数据,并准备好进行编译和训练。模式2的编译和训练编译:opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"])训练:H = model.fit( trainAug.flow(trainX, trainY, batch_size=BS), steps_per_epoch=len(trainX) // BS, validation_data=(testX, testY), validation_steps=len(testX) // BS, epochs=EPOCHS)使用20个阶段和初始参数,结果看起来非常有趣,验证数据的精度达到100%!让我们绘制精度图表,评估训练的模型,并查看混淆矩阵:
precision recall f1-score support covid 0.96 1.00 0.98 27 pneumo 1.00 0.96 0.98 27 accuracy 0.98 54 macro avg 0.98 0.98 0.98 54weighted avg 0.98 0.98 0.98 54混淆矩阵[[27 0] [ 1 26]]acc: 0.9815sensitivity: 1.0000specificity: 0.9630通过训练模型(初始选择超参数),我们得到:100%敏感度,也就是说,对于COVID-19阳性(即真正例)的患者,我们可以在100%的概率范围内准确地确定他们为“COVID-19阳性”。96%特异性,也就是说,在没有COVID-19(即真反例)的患者中,我们可以在96%的概率范围内准确地将其识别为“COVID-19阴性”。结果完全令人满意,因为只有4%的患者没有Covid会被误诊,但与本例一样,肺炎患者和Covid-19患者之间的正确分类是最有益处的,因此我们至少应该对超参数进行一些调整,再次进行训练。第一件事,我试图降低最初的lr一点点,然而效果并不好,所以我恢复了原值。我还减少了数据的分割,稍微增加了Covid图像,并将最大旋转角度更改为10度,这是在与原始数据集相关的论文中建议的:INIT_LR = 0.0001 EPOCHS = 20 BS = 16 NODES_DENSE0 = 128 DROPOUT = 0.5 MAXPOOL_SIZE = (2, 2) ROTATION_DEG = 10 SPLIT = 0.1因此,我们有:
precision recall f1-score support covid 1.00 1.00 1.00 13 pneumo 1.00 1.00 1.00 14 accuracy 1.00 27 macro avg 1.00 1.00 1.00 27weighted avg 1.00 1.00 1.00 27以及混淆矩阵:[[13 0] [ 0 14]]acc: 1.0000sensitivity: 1.0000specificity: 1.0000结果看起来更好,但我们使用了很少的测试数据!让我们保存模型,并像以前一样用大量图像对其进行测试。model.save("../model/covid_pneumo_model.h5")我们对390张标记为非Covid-19引起的肺炎的图像应用批测试功能,我们发现总共390张图片中只有3张出现假阳性(约0.8%),此外预测精度值的平均值为0.04,并且非常集中于接近于零的值(中值仅为0.02)。总的结果甚至比以前的模型所观察到的还要好,有趣的是,几乎所有的结果都在前3个四分位之内,只有很少的异常值有超过20%的误差。
在这种情况下,研究产生假阳性的图像(仅3幅)也是很有意义的。用正常(健康)患者的图像进行测试由于输入数据集也有正常患者(未经训练)的X光图像,让我们应用模型2(Covid/普通肺炎)看看结果如何
在这种情况下,结果并没有模型1测试中看到的那么糟糕,在234幅图像中,有45幅出现了假阳性(19%)。好吧,理想情况是对每种情况使用正确的模型,但是如果只使用一种,那么模型2是正确的选择。注:在最后一次测试中,我做了一个基准测试,我尝试改变增强参数,正如Chowdhury等人所建议的,令我惊讶的是,结果并不好。第4部分-Web应用程序测试Python独立脚本对于web应用的开发,我们使用Flask,这是一个用Python编写的web微框架,它被归类为微框架,因为它不需要特定的工具或库来运行。此外,我们只需要几个库和与单独测试图像相关的函数来完成,所以让我们首先在一个干净的Notebook上工作,在那里使用已经训练和保存的模型2执行测试。从我的GitHub加载:https://github.com/Mjrovai/covid19Xray/blob/master/10_X-Ray_Covid_development/notebooks/30_AI_Xray_Covid19_Pneumo_Detection_Application.ipynb现在只导入测试前一个Notebook中创建的模型所需的库。import numpy as npimport cv2from tensorflow.keras.models import load_model然后执行加载和测试图像的函数:def test_rx_image_for_Covid19_2(model, imagePath): img = cv2.imread(imagePath) img_out = img img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (224, 224)) img = np.expand_dims(img, axis=0) img = np.array(img) / 255.0 pred = model.predict(img) pred_neg = round(pred[0][1]*100) pred_pos = round(pred[0][0]*100)
if np.argmax(pred, axis=1)[0] == 1: prediction = 'NEGATIVE' prob = pred_neg else: prediction = 'POSITIVE' prob = pred_pos cv2.imwrite('../Image_Prediction/Image_Prediction.png', img_out) return prediction, prob下载训练模型covid_pneumo_model = load_model('../model/covid_pneumo_model.h5')然后,上传一些图像,并确认一切正常:imagePath = '../dataset_validation/covid_validation/6C94A287-C059-46A0-8600-AFB95F4727B7.jpeg'test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)结果是:(‘POSITIVE’, 96.0)imagePath = '../dataset_validation/normal_validation/IM-0177–0001.jpeg'test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)结果是:(‘NEGATIVE’, 99.0)imagePath = '../dataset_validation/non_covid_pneumonia_validation/person63_bacteria_306.jpeg'test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)结果是:(‘NEGATIVE’, 98.0)到目前为止,所有的开发都是在Jupyter Notebook上完成的,我们应该做最后的测试,让代码作为python脚本运行在最初创建的开发目录中,名称为:covidXrayApp_test.py。# 导入库和设置import numpy as npimport cv2from tensorflow.keras.models import load_model# 关闭信息和警告import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
def test_rx_image_for_Covid19_2(model, imagePath): img = cv2.imread(imagePath) img_out = img img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (224, 224)) img = np.expand_dims(img, axis=0) img = np.array(img) / 255.0 pred = model.predict(img) pred_neg = round(pred[0][1]*100) pred_pos = round(pred[0][0]*100)
if np.argmax(pred, axis=1)[0] == 1: prediction = 'NEGATIVE' prob = pred_neg else: prediction = 'POSITIVE' prob = pred_pos cv2.imwrite('./Image_Prediction/Image_Prediction.png', img_out) return prediction, prob# 载入模型covid_pneumo_model = load_model('./model/covid_pneumo_model.h5')# ---------------------------------------------------------------# 执行测试imagePath = './dataset_validation/covid_validation/6C94A287-C059-46A0-8600-AFB95F4727B7.jpeg'prediction, prob = test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)print (prediction, prob)让我们直接在终端上测试脚本:
一切工作完美创建在Flask中运行的环境第一步是从一个新的Python环境开始,为此使用Terminal定义一个工作目录(covid19XrayWebApp),然后在那里用Python创建一个环境mkdir covid19XrayWebAppcd covid19XrayWebAppconda create --name covid19xraywebapp python=3.7.6 -yconda activate covid19xraywebapp进入环境后,安装Flask和运行应用程序所需的所有库:conda install -c anaconda flaskconda install -c anaconda requestsconda install -c anaconda numpyconda install -c conda-forge matplotlibconda install -c anaconda pillowconda install -c conda-forge opencvpip install --upgrade pippip install tensorflowpip install gunicorn创建必要的子目录:[here the app.py]model [here the trained and saved model]templates [here the .html file]static _ [here the .css file and static images] |_ xray_analysis [here the output image after analysis] |_ xray_img [here the input x-ray image]从我的GitHub复制文件并将其存储在新创建的目录中Githhub:https://github.com/Mjrovai/covid19Xray/tree/master/20_covid19XrayWebApp执行以下步骤在服务器上负责后端执行的python应用程序称为app.py,必须位于主目录的根目录下在/template中,应该存储index.html文件,该文件将是应用程序的前端在/static中是style.css文件,负责前端(template.html)的样式。在/static下,还有接收待分析图像的子目录,以及分析结果(其原始名称以及诊断和准确性百分比)。所有文件安装到正确的位置后,工作目录如下所示:
在本地网络上启动Web应用将文件放到文件夹中后,运行app.py,这是我们的web应用程序的“引擎”,负责接收存储在用户计算机的图像。python app.py在终端我们可以观察到:
在浏览器上,输入:http://127.0.0.1:5000/应用程序将在你的本地网络中运行:
使用真实图像测试web应用程序我们可以选择启动一个Covid的X光图像,它已经在开发过程中用于验证。步骤顺序如下:
对其中一张有肺炎但没有Covid-19的图片重复测试:
建议正如导言中所讨论的,本项目是一个概念证明,证明了在X光图像中检测Covid-19的病毒的可行性。要使项目在实际情况中使用,还必须完成几个步骤。以下是一些建议:与健康领域的专业人员一起验证整个项目寻找最佳的预训练模型使用从患者身上获得的图像训练模型,患者最好是来自应用程序将要使用的同一区域。使用Covid-19获取更广泛的患者图像集改变模型的超参数测试用3个类标(正常、Covid和肺炎)训练模型的可行性更改应用程序,允许选择更适合使用的模型(模型1或模型2)。本文中使用的所有代码都可以Github仓库下载:https://github.com/Mjrovai/covid19Xray。
最新活动更多
-
11月28日立即报名>>> 2024工程师系列—工业电子技术在线会议
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
-
即日-12.26火热报名中>> OFweek2024中国智造CIO在线峰会
-
即日-2025.8.1立即下载>> 《2024智能制造产业高端化、智能化、绿色化发展蓝皮书》
-
精彩回顾立即查看>> 2024 智能家居出海论坛
-
精彩回顾立即查看>> 【在线会议】多物理场仿真助跑新能源汽车
推荐专题
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论