訂閱
糾錯(cuò)
加入自媒體

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

由于絕大多數(shù)胸部X光片都是PA型視圖,所以這是用于訓(xùn)練模型的視圖選擇類型。定義用于訓(xùn)練DL模型的環(huán)境理想的做法是從一個(gè)新的Python環(huán)境開(kāi)始,為此,使用Terminal定義一個(gè)工作目錄(例如:X-Ray_Covid_development),然后在那里用Python創(chuàng)建一個(gè)環(huán)境(例如:TF_2_Py_3_7):mkdir X-Ray_Covid_developmentcd X-Ray_Covid_developmentconda create — name TF_2_Py_3_7 python=3.7 -yconda activate TF_2_Py_3_7進(jìn)入環(huán)境后,安裝TensorFlow 2.0:pip install — upgrade pippip install tensorflow從這里開(kāi)始,安裝訓(xùn)練模型所需的其他庫(kù)。例如:conda install -c anaconda numpyconda install -c anaconda pandasconda install -c anaconda scikit-learnconda install -c conda-forge matplotlibconda install -c anaconda pillowconda install -c conda-forge opencvconda install -c conda-forge imutils創(chuàng)建必要的子目錄:notebooks10_dataset —            |_ covid  [here goes the dataset for training model 1]           |_ normal [here goes the dataset for training model 1]20_dataset —            |_ covid  [here goes the dataset for training model 2]           |_ pneumo [here goes the dataset for training model 2]input -       |_ 10_Covid_Imagens _       |                   |_ [metadata.csv goes here]      |                   |_ images [Covid-19 images go here]      |_ 20_Chest_Xray -                       |_ test _                               |_ NORMAL    [images go here]                               |_ PNEUMONIA [images go here]                       |_ train _                                |_ NORMAL    [images go here]                                |_ PNEUMONIA [images go here]modeldataset_validation _                   |_ covid_validation          [images go here]                   |_ non_covidcovid_validation [images go here]                   |_ normal_validation         [images go here]數(shù)據(jù)下載下載數(shù)據(jù)集1(Covid-19),并將metadata.csv文件保存在/input/10_Covid_Images/和/input/10_Covid_Images/Images/下。下載數(shù)據(jù)集2(肺炎和正常),并將圖像保存在/input/20_Chest_Xray/下(保持原始測(cè)試和訓(xùn)練結(jié)構(gòu))。第2部分-模型1-Covid/正常數(shù)據(jù)準(zhǔn)備從GitHub下載Notebook:https://github.com/Mjrovai/covid19Xray/blob/master/10_X-Ray_Covid_development/notebooks/10_Xray_Normal_Covid19_M(jìn)odel_1_Training_Tests.ipynb,將其存儲(chǔ)在 subdirectory /notebooks中。進(jìn)入Notebook后,導(dǎo)入庫(kù)并運(yùn)行支持函數(shù)。構(gòu)建Covid標(biāo)簽數(shù)據(jù)集從輸入數(shù)據(jù)集(/input/10_Covid_Images/)創(chuàng)建用于訓(xùn)練模型1的數(shù)據(jù)集,該數(shù)據(jù)集將用于Covid和normal(正常)標(biāo)簽定義的圖像分類。input_dataset_path = ‘../input/10_Covid_images’metadata.csv文件將提供有關(guān)/images/文件中的圖像信息。csvPath = os.path.sep.join([input_dataset_path, “metadata.csv”])df = pd.read_csv(csvPath)df.shapemetadat.csv文件有354行28列,這意味著在subdirectory /notebooks中有354個(gè)X光圖像。讓我們分析它的一些列,了解這些圖像的更多細(xì)節(jié)。

通過(guò)df.modality,共有310張X光圖像和44張CT圖像。CT圖像我們丟棄。COVID-19          235Streptococcus      17SARS               16Pneumocystis       15COVID-19, ARDS     12E.Coli              4ARDS                4No Finding          2Chlamydophila       2Legionella          2Klebsiella          1從可視化角度看,COVID-19的235張確認(rèn)圖像,我們有:PA               142AP                39AP Supine         33L                 20AP semi erect      1如引言中所述,只有142張PA型圖像(后-前)用于模型訓(xùn)練,因?yàn)樗鼈兪切仄凶畛R?jiàn)的圖像(最終數(shù)據(jù)框:xray_cv)!皒ray_cv.patiendid”列顯示,這142張照片屬于96個(gè)病人,這意味著在某些情況下,同一個(gè)病人拍攝了多張X光片。由于所有圖像都用于訓(xùn)練(我們對(duì)圖像的內(nèi)容感興趣),因此不考慮此信息。根據(jù)xray_cv.date,2020年3月拍攝的最新照片有8張,這些圖像被分離在一個(gè)列表中,從模型訓(xùn)練中刪除,因此以后這將用作最終模型的驗(yàn)證。imgs_march = [ ‘2966893D-5DDF-4B68–9E2B-4979D5956C8E.jpeg’, ‘6C94A287-C059–46A0–8600-AFB95F4727B7.jpeg’, ‘F2DE909F-E19C-4900–92F5–8F435B031AC6.jpeg’, ‘F4341CE7–73C9–45C6–99C8–8567A5484B63.jpeg’, ‘E63574A7–4188–4C8D-8D17–9D67A18A1AFA.jpeg’, ‘31BA3780–2323–493F-8AED-62081B9C383B.jpeg’, ‘7C69C012–7479–493F-8722-ABC29C60A2DD.jpeg’, ‘B2D20576–00B7–4519-A415–72DE29C90C34.jpeg’]下一步將構(gòu)建指向訓(xùn)練數(shù)據(jù)集(xray_cv_train)的數(shù)據(jù)框,該數(shù)據(jù)框應(yīng)引用134個(gè)圖像(來(lái)自Covid的所有輸入圖像,用于稍后驗(yàn)證的圖像除外):xray_cv_train = xray_cv[~xray_cv.filename.isin(imgs_march)]xray_cv_train.reset_index(drop=True, inplace=True)而最終的驗(yàn)證集(xray_cv_val )有8個(gè)圖像:xray_cv_val = xray_cv[xray_cv.filename.isin(imgs_march)]xray_cv_val.reset_index(drop=True, inplace=True)為COVID訓(xùn)練圖像創(chuàng)建文件要記住,在前一項(xiàng)中,只有數(shù)據(jù)框是使用從原始文件metada.csv中獲取的信息創(chuàng)建的。我們知道了哪些圖像要存儲(chǔ)在最終的訓(xùn)練文件中,現(xiàn)在我們需要“物理地”將實(shí)際圖像(以數(shù)字化格式)分離到正確的子目錄(文件夾)中。為此,我們將使用load_image_folder support()函數(shù),該函數(shù)將元數(shù)據(jù)文件中引用的圖像從一個(gè)文件復(fù)制到另一個(gè)文件:def load_image_folder(df_metadata,                       col_img_name,                       input_dataset_path,                      output_dataset_path):
   img_number = 0    # 對(duì)COVID-19的行進(jìn)行循環(huán)    for (i, row) in df_metadata.iterrows():        imagePath = os.path.sep.join([input_dataset_path, row[col_img_name]])        if not os.path.exists(imagePath):            print('image not found')            continue        filename = row[col_img_name].split(os.path.sep)[-1]        outputPath = os.path.sep.join([f"{output_dataset_path}", filename])        shutil.copy2(imagePath, outputPath)        img_number += 1    print('{} selected Images on folder {}:'.format(img_number, output_dataset_path))按照以下說(shuō)明,134個(gè)選定圖像將被復(fù)制到文件夾../10_dataset/covid/。input_dataset_path = '../input/10_Covid_images/images'output_dataset_path = '../dataset/covid'dataset = xray_cv_traincol_img_name = 'filename'load_image_folder(dataset, col_img_name,                  input_dataset_path, output_dataset_path)為正常圖像創(chuàng)建文件夾對(duì)于數(shù)據(jù)集2(正常和肺炎圖像),不提供包含元數(shù)據(jù)的文件,因此你只需將圖像從輸入文件復(fù)制到末尾,為此我們創(chuàng)建load_image_folder_direct()函數(shù),該函數(shù)將許多圖像(隨機(jī)選擇)從une文件夾復(fù)制到另一個(gè)文件夾:def load_image_folder_direct(input_dataset_path,                             output_dataset_path,                             img_num_select):    img_number = 0    pathlist = Path(input_dataset_path).glob('**/*.*')    nof_samples = img_num_select    rc = []    for k, path in enumerate(pathlist):        if k < nof_samples:            rc.a(chǎn)ppend(str(path))  # 路徑不是字符串形式            shutil.copy2(path, output_dataset_path)            img_number += 1        else:            i = random.randint(0, k)            if i < nof_samples:                rc[i] = str(path)    print('{} selected Images on folder {}:'.format(img_number,  output_dataset_path))在../input/20_Chest_Xray/train/NORMAL文件夾重復(fù)同樣的過(guò)程,我們將隨機(jī)復(fù)制用于訓(xùn)練的相同數(shù)量圖像 (len (xray_cv_train)),134個(gè)圖像,這樣用于訓(xùn)練模型的數(shù)據(jù)集是平衡的。input_dataset_path = '../input/20_Chest_Xray/train/NORMAL'output_dataset_path = '../dataset/normal'img_num_select = len(xray_cv_train)load_image_folder_direct(input_dataset_path, output_dataset_path,                         img_num_select)以同樣的方式,我們分離出20個(gè)隨機(jī)圖像,以供以后在模型驗(yàn)證中使用。input_dataset_path = '../input/20_Chest_Xray/train/NORMAL'output_dataset_path = '../dataset_validation/normal_validation'img_num_select = 20load_image_folder_direct(input_dataset_path, output_dataset_path,                         img_num_select)盡管我們沒(méi)有用顯示肺炎癥狀的圖像(Covid-19)來(lái)訓(xùn)練模型,但是觀察最終模型如何與肺炎癥狀一起工作是很有趣的,因此我們還分離了其中的20幅圖像,以供驗(yàn)證。input_dataset_path = '../input/20_Chest_Xray/train/PNEUMONIA'output_dataset_path = '../dataset_validation/non_covid_pneumonia_validation'img_num_select = 20load_image_folder_direct(input_dataset_path, output_dataset_path,                         img_num_select)下面的圖片顯示了在這個(gè)步驟結(jié)束時(shí)應(yīng)該如何配置文件夾(無(wú)論如何在我的Mac上),此外紅色標(biāo)記的數(shù)字顯示文件夾中包含的x光圖像的相應(yīng)數(shù)量。

繪制數(shù)據(jù)集由于文件夾中的圖像數(shù)量不多,因此可以對(duì)其進(jìn)行可視化檢查,為此使用 plots_from_files():def plots_from_files(imspaths,                     figsize=(10, 5),                     rows=1,                     titles=None,                     maintitle=None):    """Plot the images in a grid"""    f = plt.figure(figsize=figsize)    if maintitle is not None:        plt.suptitle(maintitle, fontsize=10)    for i in range(len(imspaths)):        sp = f.a(chǎn)dd_subplot(rows, ceildiv(len(imspaths), rows), i + 1)        sp.a(chǎn)xis('Off')        if titles is not None:            sp.set_title(titles[i], fontsize=16)        img = plt.imread(imspaths[i])        plt.imshow(img)def ceildiv(a, b):    return -(-a // b)然后,定義將在訓(xùn)練中使用的數(shù)據(jù)集的路徑和帶有要查看的圖像名稱的列表:dataset_path = '../10_dataset'normal_images = list(paths.list_images(f"{dataset_path}/normal"))covid_images = list(paths.list_images(f"{dataset_path}/covid"))通過(guò)調(diào)用可視化支持函數(shù),可以顯示以下圖像:plots_from_files(covid_images, rows=10, maintitle="Covid-19 X-ray images")

plots_from_files(normal_images, rows=10, maintitle="Normal X-ray images")

圖像看起來(lái)不錯(cuò)。預(yù)訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò)模型該模型的訓(xùn)練是使用預(yù)定義的圖像進(jìn)行的,應(yīng)用了稱為“遷移學(xué)習(xí)”的技術(shù)。遷移學(xué)習(xí)是一種機(jī)器學(xué)習(xí)方法,其中為一個(gè)任務(wù)開(kāi)發(fā)的模型被重用為第二個(gè)任務(wù)中模型的起點(diǎn)。Keras應(yīng)用程序是Keras的深度學(xué)習(xí)庫(kù)模塊,它為幾種流行的架構(gòu)(如VGG16、ResNet50v2、ResNet101v2、Xception、MobileNet等)提供模型定義和預(yù)訓(xùn)練的權(quán)重。使用的預(yù)訓(xùn)練模型是VGG16,由牛津大學(xué)視覺(jué)圖形組(VGG)開(kāi)發(fā),并在論文“Very Deep Convolutional Networks for Large-Scale Image Recognition”中描述。除了在開(kāi)發(fā)公共的圖像分類模型時(shí)非常流行外,這也是Adrian博士在其教程中建議的模型。理想的做法是使用幾個(gè)模型(例如ResNet50v2、ResNet101v2)進(jìn)行測(cè)試(基準(zhǔn)測(cè)試),甚至創(chuàng)建一個(gè)特定的模型(如Zhang等人在論文中建議的模型:https://arxiv.org/pdf/2003.12338.pdf),但由于這項(xiàng)工作的最終目標(biāo)只是概念上的驗(yàn)證,所以我們僅探索VGG16。

VGG16是一種卷積神經(jīng)網(wǎng)絡(luò)(CNN)體系結(jié)構(gòu),盡管在2014年已經(jīng)開(kāi)發(fā)出來(lái),但今天仍然被認(rèn)為是處理圖像分類的最佳體系結(jié)構(gòu)之一。VGG16體系結(jié)構(gòu)的一個(gè)特點(diǎn)是,它們沒(méi)有大量的超參數(shù),而是專注于卷積層上,卷積層上有一個(gè)3x3濾波器(核)和一個(gè)2x2最大池層。在整個(gè)體系結(jié)構(gòu)中始終保持一組卷積和最大池化層,最后該架構(gòu)有2個(gè)FC(完全連接的層)和softmax激活輸出。VGG16中的16表示架構(gòu)中有16個(gè)帶權(quán)重的層。該網(wǎng)絡(luò)是巨大的,在使用所有原始16層的情況下,有將近1.4億個(gè)訓(xùn)練參數(shù)。在我們的例子中,最后兩層(FC1和FC2)是在本地訓(xùn)練的,參數(shù)總數(shù)超過(guò)1500萬(wàn),其中大約有590000個(gè)參數(shù)是在本地訓(xùn)練的(而其余的是“frozen(凍結(jié)的)”)。

需要注意的第一點(diǎn)是,VNN16架構(gòu)的第一層使用224x224x3的圖像,因此我們必須確保要訓(xùn)練的X光圖像也具有這些維度,因?yàn)樗鼈兪蔷矸e網(wǎng)絡(luò)的“第一層”的一部分,因此當(dāng)使用原始權(quán)重(weights=“imagenet”)加載模型時(shí),我們不保留模型的頂層(include_top=False),而這些層將被我們的層(headModel)替換。baseModel = VGG16(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))接下來(lái),我們必須定義用于訓(xùn)練的超參數(shù)(在下面的注釋中,將測(cè)試一些可能的值以提高模型的“準(zhǔn)確性”):INIT_LR = 1e-3         # [0.0001]EPOCHS = 10            # [20]BS = 8                 # [16, 32]NODES_DENSE0 = 64      # [128]DROPOUT = 0.5          # [0.0, 0.1, 0.2, 0.3, 0.4, 0.5]MAXPOOL_SIZE = (4, 4)  # [(2,2) , (3,3)]ROTATION_DEG = 15      # [10]SPLIT = 0.2            # [0.1]然后構(gòu)建我們的模型,將其添加到基礎(chǔ)模型中: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被放置在基礎(chǔ)模型之上,成為模型的一部分,進(jìn)行實(shí)際訓(xùn)練(確定最佳權(quán)重)。model = Model(inputs=baseModel.input, outputs=headModel)重要的是要記住一個(gè)預(yù)訓(xùn)練過(guò)的CNN模型,如VGG16,被訓(xùn)練了成千上萬(wàn)的圖像來(lái)分類普通圖像(如狗、貓、汽車和人),我們現(xiàn)在需要做的是根據(jù)我們的需要定制它(分類X光圖像)。理論上,模型的第一層簡(jiǎn)化了圖像的部分,識(shí)別出其中的形狀,這些初始信息非常通用(如直線、圓和正方形),因此我們不用再訓(xùn)練它們,我們只想訓(xùn)練網(wǎng)絡(luò)的最后一層。下面的循環(huán)在基礎(chǔ)模型的所有層上執(zhí)行,“凍結(jié)”它們,以便在第一個(gè)訓(xùn)練過(guò)程中不會(huì)更新它們。for layer in baseModel.layers:    layer.trainable = False此時(shí),模型已經(jīng)準(zhǔn)備好接受訓(xùn)練,但首先,我們必須為模型的訓(xùn)練準(zhǔn)備數(shù)據(jù)(圖像)。數(shù)據(jù)預(yù)處理我們先創(chuàng)建一個(gè)包含存儲(chǔ)圖像的名稱(和路徑)列表:imagePaths = list(paths.list_images(dataset_path))那么對(duì)于列表中的每個(gè)圖像,我們必須:提取圖像標(biāo)簽(在本例中為covid或normal)將BGR(CV2默認(rèn)值)的圖像通道設(shè)置為RGB將圖像大小調(diào)整為224x 224(VGG16的默認(rèn)值)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)數(shù)據(jù)和標(biāo)簽被轉(zhuǎn)換成數(shù)組,每個(gè)像素的值從0到255改成從0到1,便于訓(xùn)練。data = np.a(chǎn)rray(data) / 255.0labels = np.a(chǎn)rray(labels)標(biāo)簽將使用一個(gè)one-h(huán)ot編碼技術(shù)進(jìn)行數(shù)字編碼。lb = LabelBinarizer()labels = lb.fit_transform(labels)labels = to_categorical(labels)此時(shí),訓(xùn)練數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集(訓(xùn)練80%,測(cè)試20%):(trainX, testX, trainY, testY) = train_test_split(data,                                                  labels,                                                  test_size=SPLIT,                                                  stratify=labels,                                                  random_state=42)最后但并非不重要的是,我們應(yīng)該應(yīng)用“數(shù)據(jù)增強(qiáng)”技術(shù)。數(shù)據(jù)增強(qiáng)如Chowdhury等人所建議,在他們的論文中,三種增強(qiáng)策略(旋轉(zhuǎn)、縮放和平移)可用于為COVID-19生成額外的訓(xùn)練圖像,有助于防止“過(guò)度擬合”:https://arxiv.org/pdf/2003.13145.pdf。

<上一頁(yè)  1  2  3  4  下一頁(yè)>  
聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

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

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