訂閱
糾錯
加入自媒體

使用Python+OpenCV+Tensorflow+Flask實現(xiàn)檢測X光中的新冠病毒


圖像看起來不錯。預(yù)訓(xùn)練CNN模型及其超參數(shù)的選擇要使用的預(yù)訓(xùn)練模型是VGG16,與模型1訓(xùn)練相同baseModel = VGG16(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))接下來,我們必須定義用于訓(xùn)練的超參數(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模型放在最后,成為用于訓(xùn)練的真實模型。model = Model(inputs=baseModel.input, outputs=headModel)在基礎(chǔ)模型的所有層上執(zhí)行的以下循環(huán)將“凍結(jié)”它們,以便在第一個訓(xùn)練過程中不會更新它們。for layer in baseModel.layers:    layer.trainable = False此時,模型已經(jīng)準(zhǔn)備好接受訓(xùn)練,但是我們應(yīng)該首先為模型準(zhǔn)備數(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)標(biāo)簽使用one-h(huán)ot。lb = LabelBinarizer()labels = lb.fit_transform(labels)labels = to_categorical(labels)此時,我們將把訓(xùn)練數(shù)據(jù)集分為訓(xùn)練和測試(80%用于訓(xùn)練,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ù),并準(zhǔn)備好進行編譯和訓(xùn)練。模式2的編譯和訓(xùn)練編譯:opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["accuracy"])訓(xùn)練: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%!讓我們繪制精度圖表,評估訓(xùn)練的模型,并查看混淆矩陣:

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通過訓(xùn)練模型(初始選擇超參數(shù)),我們得到:100%敏感度,也就是說,對于COVID-19陽性(即真正例)的患者,我們可以在100%的概率范圍內(nèi)準(zhǔn)確地確定他們?yōu)椤癈OVID-19陽性”。96%特異性,也就是說,在沒有COVID-19(即真反例)的患者中,我們可以在96%的概率范圍內(nèi)準(zhǔn)確地將其識別為“COVID-19陰性”。結(jié)果完全令人滿意,因為只有4%的患者沒有Covid會被誤診,但與本例一樣,肺炎患者和Covid-19患者之間的正確分類是最有益處的,因此我們至少應(yīng)該對超參數(shù)進行一些調(diào)整,再次進行訓(xùn)練。第一件事,我試圖降低最初的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張標(biāo)記為非Covid-19引起的肺炎的圖像應(yīng)用批測試功能,我們發(fā)現(xiàn)總共390張圖片中只有3張出現(xiàn)假陽性(約0.8%),此外預(yù)測精度值的平均值為0.04,并且非常集中于接近于零的值(中值僅為0.02)?偟慕Y(jié)果甚至比以前的模型所觀察到的還要好,有趣的是,幾乎所有的結(jié)果都在前3個四分位之內(nèi),只有很少的異常值有超過20%的誤差。

在這種情況下,研究產(chǎn)生假陽性的圖像(僅3幅)也是很有意義的。用正常(健康)患者的圖像進行測試由于輸入數(shù)據(jù)集也有正;颊撸ㄎ唇(jīng)訓(xùn)練)的X光圖像,讓我們應(yīng)用模型2(Covid/普通肺炎)看看結(jié)果如何

在這種情況下,結(jié)果并沒有模型1測試中看到的那么糟糕,在234幅圖像中,有45幅出現(xiàn)了假陽性(19%)。好吧,理想情況是對每種情況使用正確的模型,但是如果只使用一種,那么模型2是正確的選擇。注:在最后一次測試中,我做了一個基準(zhǔn)測試,我嘗試改變增強參數(shù),正如Chowdhury等人所建議的,令我驚訝的是,結(jié)果并不好。第4部分-Web應(yīng)用程序測試Python獨立腳本對于web應(yīng)用的開發(fā),我們使用Flask,這是一個用Python編寫的web微框架,它被歸類為微框架,因為它不需要特定的工具或庫來運行。此外,我們只需要幾個庫和與單獨測試圖像相關(guān)的函數(shù)來完成,所以讓我們首先在一個干凈的Notebook上工作,在那里使用已經(jīng)訓(xùn)練和保存的模型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)在只導(dǎo)入測試前一個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下載訓(xùn)練模型covid_pneumo_model = load_model('../model/covid_pneumo_model.h5')然后,上傳一些圖像,并確認(rèn)一切正常: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。# 導(dǎo)入庫和設(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ù)器上負(fù)責(zé)后端執(zhí)行的python應(yīng)用程序稱為app.py,必須位于主目錄的根目錄下在/template中,應(yīng)該存儲index.html文件,該文件將是應(yīng)用程序的前端在/static中是style.css文件,負(fù)責(zé)前端(template.html)的樣式。在/static下,還有接收待分析圖像的子目錄,以及分析結(jié)果(其原始名稱以及診斷和準(zhǔn)確性百分比)。所有文件安裝到正確的位置后,工作目錄如下所示:

在本地網(wǎng)絡(luò)上啟動Web應(yīng)用將文件放到文件夾中后,運行app.py,這是我們的web應(yīng)用程序的“引擎”,負(fù)責(zé)接收存儲在用戶計算機的圖像。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ù)測試:

建議正如導(dǎo)言中所討論的,本項目是一個概念證明,證明了在X光圖像中檢測Covid-19的病毒的可行性。要使項目在實際情況中使用,還必須完成幾個步驟。以下是一些建議:與健康領(lǐng)域的專業(yè)人員一起驗證整個項目尋找最佳的預(yù)訓(xùn)練模型使用從患者身上獲得的圖像訓(xùn)練模型,患者最好是來自應(yīng)用程序?qū)⒁褂玫耐粎^(qū)域。使用Covid-19獲取更廣泛的患者圖像集改變模型的超參數(shù)測試用3個類標(biāo)(正常、Covid和肺炎)訓(xùn)練模型的可行性更改應(yīng)用程序,允許選擇更適合使用的模型(模型1或模型2)。本文中使用的所有代碼都可以Github倉庫下載:https://github.com/Mjrovai/covid19Xray。


<上一頁  1  2  3  4  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號