iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
AI & Data

PyTorch 生態鏈實戰運用系列 第 4

[Day04] Data Preparation for MedMNIST

  • 分享至 

  • xImage
  •  

前言

前一日我們將原始影像檔案都抓下來到資料夾內了,本日將接續繼續進行資料的處理。依照個人的習慣主要會建立一個對應的長表格(long table or narrow data, 可參考wiki)進行管理,主要優點有下列兩點:

  1. 利於對每一個data point進行管理
  2. 資料視覺化方便

ChestMNIST 介紹

延續前一日的我們抓取來使用的ChestMNIST,資料集的詳細都可以透過該套件的函式得到,如下:

>>> from medmnist.info import INFO
>>> INFO['chestmnist']
{'python_class': 'ChestMNIST',
 'description': 'The ChestMNIST is based on the NIH-ChestXray14 dataset, a dataset comprising 112,120 frontal-view X-Ray images of 30,805 unique patients with the text-mined 14 disease labels, which could be formulized as a multi-label binary-class classification task. We use the official data split, and resize the source images of 1×1024×1024 into 1×28×28.',
 'url': 'https://zenodo.org/record/6496656/files/chestmnist.npz?download=1',
 'MD5': '02c8a6516a18b556561a56cbdd36c4a8',
 'task': 'multi-label, binary-class',
 'label': {'0': 'atelectasis',
  '1': 'cardiomegaly',
  '2': 'effusion',
  '3': 'infiltration',
  '4': 'mass',
  '5': 'nodule',
  '6': 'pneumonia',
  '7': 'pneumothorax',
  '8': 'consolidation',
  '9': 'edema',
  '10': 'emphysema',
  '11': 'fibrosis',
  '12': 'pleural',
  '13': 'hernia'},
 'n_channels': 1,
 'n_samples': {'train': 78468, 'val': 11219, 'test': 22433},
 'license': 'CC BY 4.0'}

看到輸出後可以得知,這主要是一個總共112,120個樣本的資料集,且具有下列性質的任務:

  • Multi-Label:一個樣本可能同時存在多個不同的Label
  • Binary Class:每一種Label是二元分類

而這些類別則分別是:

  • atelectasis:肺膨脹不全
  • cardiomegaly:心臟肥大
  • effusion:滲出液
  • infiltration:浸潤
  • mass:腫塊
  • nodule:結節
  • pneumonia:肺炎
  • pneumothorax:氣胸
  • consolidation:(肺)實變化
  • edema:肺水腫
  • emphysema:氣腫
  • fibrosis:纖維化
  • pleural thickening:胸膜增厚 (這個要回去查NIH Chest X-rays才會知道...)
  • hernia:疝氣

先讓大家有個初步的認識,翻譯全部是透過GOOGLE再個人挑選,有錯誤請指正,感謝!

輸出csv

基本上後續的工作就是根據資料的不同狀況,進行一些理解再整理,也可以一併進行抽樣。
此部份會很根據實際的樣本情形。

本文案例的話,由於MedMNIST已經整理的差不多了,基本上進行以下的小處理就可以得到結果

df = pd.read_csv('data/chestmnist.csv', header = None)
cols = ['split', 'img'] + list(INFO['chestmnist']['label'].values())
df = df.rename(columns={ i: col for i, col in enumerate(cols)})
df['img'] = df['img'].apply(lambda x: os.path.join('data/chestmnist/', x))

此外,整段可以參考該commit的src/make_dataset.py,一樣在workspace執行就可以了!

python src/make_dataset.py

執行以後就可以得到該csv囉

Data Exploration

在實際進入真正的建模之前,還是先多解資料一點吧!

先畫個圖理解一下概況,大概可以掌握有幾類是比較好發於資料集中的疾病

import pandas as pd
import plotnine as p9

df = pd.read_csv('data/dataset.csv')
df_long = pd.melt(df, id_vars=['split', 'img'])
df_long = df_long[df_long['value'] != 0]
(p9.ggplot(df_long) 
+ p9.geom_bar(p9.aes(x='variable', fill = 'split'))
+ p9.theme(axis_text_x=p9.element_text(angle=45))
)

另外也可以看一下各個切分的樣本分佈是不是夠接近,以免發生分佈差異,而預測不准的常見問題。

看起來是還好,應該可以安心的進入下一步囉!

本日小節

  • 拿到資料以後,今天進行了簡單的資料整理跟分析
  • 長資料有利於分析與管理的方便性
  • 先大概知道資料再往下走

上一篇
[Day03] MedMNIST 資料集
下一篇
[Day05] Dataloader with PyTorch and MONAI
系列文
PyTorch 生態鏈實戰運用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言