使用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。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒(méi)有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車,還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開(kāi)啟變現(xiàn)競(jìng)速
- 6 海信給AI電視打樣,12大AI智能體全面升級(jí)大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 10 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市