Databricksで医療画像データDICOMを活用する方法（1/2）

株式会社NTTデータ [Data & Intelligence事業部](https://enterprise-aiiot.nttdata.com/) の [nttd-saitouyun](https://qiita.com/nttd-saitouyun) です。
本記事は長文になってしまったため、２回に分けてお伝えします。


# はじめに
私は[Databricks](https://enterprise-aiiot.nttdata.com/service/databricks)のエバンジェリストとして活動しております。
その活動の中でお客様のデータ活用の課題や要望をお伺いすることが多いのですが、「DICOMデータを活用したい」とご要望をいただいた際に、私の不勉強でお役立てできなかったため、今回は勉強も兼ねて、**「DICOM」と「DICOMをDatabricksで活用する方法」** について調べた結果をご紹介します。

本記事では、「DICOM」と DICOMデータをPythonで扱うライブラリである「PyDicom」の基本操作と大規模環境における課題を説明します。[後編](https://qiita.com/nttd-saitouyun/items/971d9a17a31303cdc4c9)では、「DICOMをDatabricksで活用する方法」をご説明します。


# DICOMとは
[Wikipedia](https://ja.wikipedia.org/wiki/DICOM)で調べると次のように書かれています。

>名称は Digital Imaging and COmmunications in Medicine（医療におけるディジタル画像と通信） の略である。米国放射線学会（英語版）とアメリカ電機工業会が制定した規格で、異なる製造業者の医用画像機器間で画像転送を可能とすることを目的としている。

要するに、**医療用の画像データ**のようです。拡張子は「dcm」。
ダブルクリックして開けるようなものではなく、「DICOMビューア」というツールを使って画像を表示する必要があるようです。
下記画像は、口述するPyDicomに含まれるサンプルデータ（CT_small.dcm）を表示したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/ab141aa8-ce8f-6b9f-df96-1416bbd76930.png)


また、画像データだけではなく、患者、撮影装置、医療機関の情報などの**メタデータ[^1]を1つのファイルに格納しています**。
※メタデータの一覧は[こちら](https://dicom.nema.org/medical/dicom/current/output/chtml/part06/chapter_6.html)を参照してください。
※本書では分かりやすさを重視し、画像データの付随情報をメタデータと呼びます。正確には、DICOMでは画像データもメタデータの一種として定義されています。

[^1]: 本書では分かりやすさを重視し、画像データの付随情報をメタデータと呼びます。正確には、DICOMでは画像データもメタデータの一種として定義されています。また、「[DICOM File Meta Information](https://dicom.nema.org/dicom/2013/output/chtml/part10/chapter_7.html)」という言葉もあるため混同しないようご注意ください。

よって、**DICOMデータは準構造化データ寄りの「非構造化データ」** と呼べるのではないでしょうか。

さらに、このメタデータには、患者名，ID番号，生年月日，撮影日，撮影施設 などの**個人情報に関わるデータが含まれているため、セキュリティの考慮も必要です。** アクセス制御だけでなく、匿名化も場合においては必要で、DICOM用の匿名化ツールなどもあるようです。

以上のような特性もあり、**オブジェクトストレージにファイルだけ蓄積するのはややリスクがありそうです。**
元データと合わせてメタデータの管理を実施していく必要がありそうですが、非構造化データのメタデータ管理って地味に大変ですよね・・・

<br>
<br>
<br>
ここからは、どのようにDICOMデータを処理していくかを見ていきます。

# PyDicomとは
PyDicomは、**PythonでDICOMデータを取り扱うライブラリです。** 先ほど記載した画像のようなサンプルデータも含まれています。

## PyDicomの基本操作
インストールは、ベーシックに `pip install pydicom` です。
サンプルデータは site-packages 配下の`/pydicom/data/test_files/`にあります。

### ファイル読み込み
以下のように実施します。
```python
import pydicom

path = "・・・/site-packages/pydicom/data/test_files/CT_small.dcm"
dataset = pydicom.filereader.dcmread(path)
```

### メタデータの一覧表示
メタデータは以下のコードを実行すると取得できます。
```python
print(dataset.dir())
```
出力結果は以下のようになります。患者情報（PatientXXXなど）、撮影装置（Manufacturer、ManufactureModelName、SoftwareVersionsなど）、医療機関（InstitutionNameなど）がメタデータとしてあることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/6db998a3-d9b1-e1b2-6e8d-133a6590cc5d.png)

### メタデータの取得
いくつかメタデータの値を取得してみます。
```python
print(dataset.PatientID)
print(dataset.PatientName)
print(dataset.PatientWeight)
print(dataset.StationName)
print(dataset.StudyDate)
print(dataset.StudyDescription)
```
以下のような出力が得られました。サンプルデータだからか適当な値が入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/31e4eeb7-3725-42e1-8342-01984c445b90.png)

### 画像データの取得
画像データは、PixelData というキーワードでアクセスできます。
```python
print(dataset.PixelData)
```
以下のようにバイナリ形式でデータが保存されていることがわかります。このデータを使い、画像ファイルを保存することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/0d391e09-8df4-fcce-f3dc-62de0362b644.png)

### 画像データの表示
この画像を表示するには、`matplotlib`を使って以下のコードを実行します。PixelDataではなく、pixel_array キーワードを使っていることにご注意ください。
```python
import matplotlib.pyplot as plt
plt.imshow(dataset.pixel_array, cmap=plt.cm.gray)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118781/79949497-289a-b337-be23-7655ad4bd1d2.png)


ということで、基本的なDICOMデータの扱い方をご紹介しました。
より詳しい記事を書いている方もいらっしゃるので、詳細は調べてみてください。

## Pydicomの課題
Pydicomはシングルノードで動くことを前提にしたライブラリになります。よって、**DICOMデータが増えてくるとデータを処理しきれない可能性があります。** また、Amazon S3などの**オブジェクトストレージに蓄積したデータをサーバにダウンロードして処理するのも大変です。**

では、Apache Sparkを活用して、オブジェクトストレージにデータを配置したまま、大量のデータを処理する方法はあるのでしょうか？
調べてみると、[**Databricks ソリューションアクセラレータ**](https://www.databricks.com/jp/solutions/accelerators)で公開されていることがわかりました。


# おわりに
[後編](https://qiita.com/nttd-saitouyun/items/971d9a17a31303cdc4c9)では、大規模環境においても DICOMデータを扱えるようにするためのソリューションを「DICOMをDatabricksで活用する方法」としてご紹介します。


# 仲間募集中！
NTTデータ [Data&Intelligence事業部](https://enterprise-aiiot.nttdata.com/) では、以下の職種を募集しています。

<details>
<summary>
1. 「クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)」の募集
</summary>
クラウド/プラットフォーム技術の知見に基づき、ITアーキテクトまたはPMとして、DWH、BI、ETL領域における、ソリューション開発の推進や、コンサルティング工程のシステムグランドデザイン策定時におけるアーキテクト観点からの検討を行う人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=808

</details>

<details>
<summary>
2. AI／データ活用を実践する「クラウド・ソリューションアーキテクト」の募集
</summary>
AI／データ活用を実践する「クラウド・ソリューションアーキテクト」として、クラウド先進テクノロジーを積極活用し、お客様のビジネス価値創出活動を実践。AI／データ活用の基本構想立案コンサルティングからクラウドプラットフォーム提供・活用を支援しています。お客様のAI・データ活用を支援するクラウド・ソリューション提案、アーキテクチャ設計・構築・継続活用支援（フルマネージドサービス提供）、および最新クラウドサービスに関する調査・検証で、クラウド分析基盤ソリューションのメニュー拡充を実施する人材を募集します。

https://nttdata.jposting.net/u/job.phtml?job_code=807

</details>

<br>
<br>
また、取り扱う主なソリューションについては、以下のページも参照ください。

# ソリューション紹介
<details>
<summary>Trusted Data Foundation について</summary>
～データ資産を分析活用するための環境をオールインワンで提供するソリューション～
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

https://enterprise-aiiot.nttdata.com/tdf/

</details>