使用Python+OpenCV+Tensorflow+Flask實現(xiàn)檢測X光中的新冠病毒
圖像看起來不錯。預(yù)訓練CNN模型及其超參數(shù)的選擇要使用的預(yù)訓練模型是VGG16,與模型1訓練相同baseModel = VGG16(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))接下來,我們必須定義用于訓練的超參數(shù)。我們與模型1的參數(shù)相同:INIT_LR = 0.0001 EPOCHS = 20 BS = 16 NODES_DENSE0 = 128 DROPOUT = 0.5 MAXPOOL_SIZE = (2, 2) ROTATION_DEG = 15 SPLIT = 0.2然后,構(gòu)建模型: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)在基礎(chǔ)模型的所有層上執(zhí)行的以下循環(huán)將“凍結(jié)”它們,以便在第一個訓練過程中不會更新它們。for layer in baseModel.layers: layer.trainable = False此時,模型已經(jīng)準備好接受訓練,但是我們應(yīng)該首先為模型準備數(shù)據(jù)(圖像)。數(shù)據(jù)預(yù)處理我們先創(chuàng)建一個包含存儲圖像的名稱(和路徑)列表,然后執(zhí)行與模型1相同的預(yù)處理: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.a(chǎn)ppend(image) labels.a(chǎn)ppend(label)data = np.a(chǎn)rray(data) / 255.0labels = np.a(chǎn)rray(labels)標簽使用one-h(huán)ot。lb = LabelBinarizer()labels = lb.fit_transform(labels)labels = to_categorical(labels)此時,我們將把訓練數(shù)據(jù)集分為訓練和測試(80%用于訓練,20%用于測試):(trainX, testX, trainY, testY) = train_test_split(data, labels, test_size=SPLIT, stratify=labels, random_state=42)最后,我們將應(yīng)用數(shù)據(jù)增強技術(shù)。trainAug = ImageDataGenerator(rotation_range=ROTATION_DEG, fill_mode="nearest")我們已經(jīng)定義了模型和數(shù)據(jù),并準備好進行編譯和訓練。模式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個階段和初始參數(shù),結(jié)果看起來非常有趣,驗證數(shù)據(jù)的精度達到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通過訓練模型(初始選擇超參數(shù)),我們得到:100%敏感度,也就是說,對于COVID-19陽性(即真正例)的患者,我們可以在100%的概率范圍內(nèi)準確地確定他們?yōu)椤癈OVID-19陽性”。96%特異性,也就是說,在沒有COVID-19(即真反例)的患者中,我們可以在96%的概率范圍內(nèi)準確地將其識別為“COVID-19陰性”。結(jié)果完全令人滿意,因為只有4%的患者沒有Covid會被誤診,但與本例一樣,肺炎患者和Covid-19患者之間的正確分類是最有益處的,因此我們至少應(yīng)該對超參數(shù)進行一些調(diào)整,再次進行訓練。第一件事,我試圖降低最初的lr一點點,然而效果并不好,所以我恢復(fù)了原值。我還減少了數(shù)據(jù)的分割,稍微增加了Covid圖像,并將最大旋轉(zhuǎn)角度更改為10度,這是在與原始數(shù)據(jù)集相關(guān)的論文中建議的: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結(jié)果看起來更好,但我們使用了很少的測試數(shù)據(jù)!讓我們保存模型,并像以前一樣用大量圖像對其進行測試。model.save("../model/covid_pneumo_model.h5")我們對390張標記為非Covid-19引起的肺炎的圖像應(yīng)用批測試功能,我們發(fā)現(xiàn)總共390張圖片中只有3張出現(xiàn)假陽性(約0.8%),此外預(yù)測精度值的平均值為0.04,并且非常集中于接近于零的值(中值僅為0.02)。總的結(jié)果甚至比以前的模型所觀察到的還要好,有趣的是,幾乎所有的結(jié)果都在前3個四分位之內(nèi),只有很少的異常值有超過20%的誤差。
在這種情況下,研究產(chǎn)生假陽性的圖像(僅3幅)也是很有意義的。用正常(健康)患者的圖像進行測試由于輸入數(shù)據(jù)集也有正;颊撸ㄎ唇(jīng)訓練)的X光圖像,讓我們應(yīng)用模型2(Covid/普通肺炎)看看結(jié)果如何
在這種情況下,結(jié)果并沒有模型1測試中看到的那么糟糕,在234幅圖像中,有45幅出現(xiàn)了假陽性(19%)。好吧,理想情況是對每種情況使用正確的模型,但是如果只使用一種,那么模型2是正確的選擇。注:在最后一次測試中,我做了一個基準測試,我嘗試改變增強參數(shù),正如Chowdhury等人所建議的,令我驚訝的是,結(jié)果并不好。第4部分-Web應(yīng)用程序測試Python獨立腳本對于web應(yīng)用的開發(fā),我們使用Flask,這是一個用Python編寫的web微框架,它被歸類為微框架,因為它不需要特定的工具或庫來運行。此外,我們只需要幾個庫和與單獨測試圖像相關(guān)的函數(shù)來完成,所以讓我們首先在一個干凈的Notebook上工作,在那里使用已經(jīng)訓練和保存的模型2執(zhí)行測試。從我的GitHub加載:https://github.com/Mjrovai/covid19Xray/blob/master/10_X-Ray_Covid_development/notebooks/30_AI_Xray_Covid19_Pneumo_Detection_Application.ipynb現(xiàn)在只導入測試前一個Notebook中創(chuàng)建的模型所需的庫。import numpy as npimport cv2from tensorflow.keras.models import load_model然后執(zhí)行加載和測試圖像的函數(shù):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.a(chǎn)rray(img) / 255.0 pred = model.predict(img) pred_neg = round(pred[0][1]*100) pred_pos = round(pred[0][0]*100)
if np.a(chǎn)rgmax(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)結(jié)果是:(‘POSITIVE’, 96.0)imagePath = '../dataset_validation/normal_validation/IM-0177–0001.jpeg'test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)結(jié)果是:(‘NEGATIVE’, 99.0)imagePath = '../dataset_validation/non_covid_pneumonia_validation/person63_bacteria_306.jpeg'test_rx_image_for_Covid19_2(covid_pneumo_model, imagePath)結(jié)果是:(‘NEGATIVE’, 98.0)到目前為止,所有的開發(fā)都是在Jupyter Notebook上完成的,我們應(yīng)該做最后的測試,讓代碼作為python腳本運行在最初創(chuàng)建的開發(fā)目錄中,名稱為:covidXrayApp_test.py。# 導入庫和設(shè)置import numpy as npimport cv2from tensorflow.keras.models import load_model# 關(guān)閉信息和警告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.a(chǎn)rray(img) / 255.0 pred = model.predict(img) pred_neg = round(pred[0][1]*100) pred_pos = round(pred[0][0]*100)
if np.a(chǎn)rgmax(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')# ---------------------------------------------------------------# 執(zhí)行測試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)讓我們直接在終端上測試腳本:
一切工作完美創(chuàng)建在Flask中運行的環(huán)境第一步是從一個新的Python環(huán)境開始,為此使用Terminal定義一個工作目錄(covid19XrayWebApp),然后在那里用Python創(chuàng)建一個環(huán)境mkdir covid19XrayWebAppcd covid19XrayWebAppconda create --name covid19xraywebapp python=3.7.6 -yconda activate covid19xraywebapp進入環(huán)境后,安裝Flask和運行應(yīng)用程序所需的所有庫: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創(chuàng)建必要的子目錄:[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復(fù)制文件并將其存儲在新創(chuàng)建的目錄中Githhub:https://github.com/Mjrovai/covid19Xray/tree/master/20_covid19XrayWebApp執(zhí)行以下步驟在服務(wù)器上負責后端執(zhí)行的python應(yīng)用程序稱為app.py,必須位于主目錄的根目錄下在/template中,應(yīng)該存儲index.html文件,該文件將是應(yīng)用程序的前端在/static中是style.css文件,負責前端(template.html)的樣式。在/static下,還有接收待分析圖像的子目錄,以及分析結(jié)果(其原始名稱以及診斷和準確性百分比)。所有文件安裝到正確的位置后,工作目錄如下所示:
在本地網(wǎng)絡(luò)上啟動Web應(yīng)用將文件放到文件夾中后,運行app.py,這是我們的web應(yīng)用程序的“引擎”,負責接收存儲在用戶計算機的圖像。python app.py在終端我們可以觀察到:
在瀏覽器上,輸入:http://127.0.0.1:5000/應(yīng)用程序?qū)⒃谀愕谋镜鼐W(wǎng)絡(luò)中運行:
使用真實圖像測試web應(yīng)用程序我們可以選擇啟動一個Covid的X光圖像,它已經(jīng)在開發(fā)過程中用于驗證。步驟順序如下:
對其中一張有肺炎但沒有Covid-19的圖片重復(fù)測試:
建議正如導言中所討論的,本項目是一個概念證明,證明了在X光圖像中檢測Covid-19的病毒的可行性。要使項目在實際情況中使用,還必須完成幾個步驟。以下是一些建議:與健康領(lǐng)域的專業(yè)人員一起驗證整個項目尋找最佳的預(yù)訓練模型使用從患者身上獲得的圖像訓練模型,患者最好是來自應(yīng)用程序?qū)⒁褂玫耐粎^(qū)域。使用Covid-19獲取更廣泛的患者圖像集改變模型的超參數(shù)測試用3個類標(正常、Covid和肺炎)訓練模型的可行性更改應(yīng)用程序,允許選擇更適合使用的模型(模型1或模型2)。本文中使用的所有代碼都可以Github倉庫下載:https://github.com/Mjrovai/covid19Xray。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
10月31日立即下載>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市