pydicomでDICOM headerからSOP classを判定

SOP class UIDはDICOM画像を生成してくれた機器の種類を表す値。

具体的にはこんな具合の数字の羅列。

# CT
1.2.840.10008.5.1.4.1.1.2

# MRI
1.2.840.10008.5.1.4.1.1.4

詳しくはNEMAのサイトに一覧があるので参照されたい。

dicom.nema.org

pydicomで簡単にSOP class UIDを扱う

pydicomではSOP class UIDを扱うための関数とクラスが用意されている。これを利用すればより意図が明確なコードが書ける。

import pydicom

dcm_file_path = ''
dcm = pydicom.read_file(dcm_file_path)

uid = pydicom.uid.UID(dcm.SOPClassUID)
# -> '1.2.840.10008.5.1.4.1.1.7'

class_name = uid.name
# -> 'Secondary Capture Image Storage'

公式ドキュメントも参照ください。

pydicom.github.io

pyfftwをM1 macにインストール

さすがのM1 macといえどFFTはできれば速くしたい処理の1つですよね。そこでpyfftwをインストールしようとしたら躓いたのでシェアしたいと思います。

環境

  • Macbook pro, M1, macOS Monterey (12.3.1)
  • python 3.9
  • Cython 0.29.30
  • fftw 3.3.10 (hombebrewでインストール)
  • pyfftw 0.13.0

現象

homebrewでfftwをインストールした後、

brew install fftw

必要ライブラリをインストールして、

pip install numpy cython

pyfftwをインストールしようとすると以下の様なエラーでインストールできませんでした。

...
      DEBUG:__main__:Checking with includes ['fftw3.h']...no
      error: Could not find the FFTW header 'fftw3.h'
...

どうやらhomebrewでインストールしたfftwを見つけられないようです。

Workaround

下記のコマンドでインストールに成功しました。

PYFFTW_LIB_DIR="/opt/homebrew/lib" PYFFTW_INCLUDE="/opt/homebrew/include" CFLAGS="-Wno-error=implicit-function-declaration" pip install pyfftw

環境変数PYFFTW_LIB_DIRPYFFTW_INCLUDEでhomebrewでインストールしたfftwのヘッダーファイルの場所を与えてやります。

CFLAGSを追加しているのは下記のエラーを回避するためです。(Building on Python 3.9 / macOS 10.15.6 fails without -Wno-error=implicit-function-declaration · Issue #303 · pyFFTW/pyFFTW

error: implicit declaration of function 'fftwl_plan_dft' is invalid in C99

Macでフォーマットするときのアロケーションユニットサイズ

MacでUSBやSDカードをフォーマットする際、標準のdiskutilが便利ですよね。

SDカードに小さな容量のファイルを大量に配置したいケースがあり、アロケーションユニットサイズが気になりました。

diskutilだとフォーマット形式は選べるもののアロケーションユニットサイズは選べません。

デフォルトだとどの様な値になるのか簡単に調査してみました。

調査環境

SDHCカード, 16GB

フォーマット方法:Disk Utility.appを使用

結果

Format type Allocation unit size (byte)
FAT32 32768
exFAT 32768

いずれのフォーマット形式でも32kBのようです。

ディスク容量によってもアロケーションユニットサイズは異なるかもしれません。

今回の結果は参考程度にしてください。

サイコンの自作事例

サイクリングを盛り上げてくれるサイコン。ガーミンやブライトンなどから様々なモデルが販売されていますが、世の中には自作するという猛者もちらほら。

どんな方々がいるのか、ざっと先行事例を調査してみました。

Qiita - @hishiさん

サイクルコンピューターをガチで作ってみたら、割とできてしまったという話 - Qiita

https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F100741%2F843c2848-5191-5264-bc4b-1c9d3d47a836.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&w=1400&fit=max&s=f7033528cf6e59d0565e929a8eaceb72

  • Raspberry pi zero Wを使った多機能サイコン。市販サイコンに迫る性能。
  • GPS記録、strava用ファイル書き出し、ANT+/BL連携(ケイデンス、速度、パワーメータ)
  • 市販サイコンと比較検討もして精度もそれなりのよう。
  • モニタに反射型カラー液晶を使っているのが独特。が、凝っているため再現するのは大変。
  • githubソースコードあり。
  • ナビも作成されているよう。

モッパーの日記

サイコン自作プロジェクト再始動: モッパーの日記

  • Nucleo F303K8
  • 製作途中?

インクルードマニュアル

Arduinoでサイクルコンピュータを作る(3)Androidでデータ表示 - Arduinoサイクルコンピュータ

Instructable circuits - HarshadB9

DIY Cycle Speedometer : 6 Steps (with Pictures) - Instructables

https://content.instructables.com/ORIG/FD2/I82O/JS5C7EVR/FD2I82OJS5C7EVR.jpg?auto=webp&frame=1&width=800&height=1024&fit=bounds&md=527d6c47966c1e698daabbf2fd9da8dd

  • ホールセンサを使った速度センサ+LEDリアライト。
  • arduino nano
  • 消費電力がひくすぎてモバイルバッテリーが自動的に給電停止してしまうので、高機能すぎないモバイルバッテリーを使用したとのこと。

My First Blog 実験中 自転車関係の工作をしてます

My First Blog 実験中 自転車関係の工作をしてます: ANT+対応サイコンの自作(ソフトウェア編)

https://2.bp.blogspot.com/-1OfeVBcJyaE/WQmRZCy-QlI/AAAAAAAAAL4/RwGYJZL8Vn4s42QuYKeLSuP4-j9c1F7zACK4B/s320/lcd18.png

RIGHT STUFF

RIGHT STUFF, Inc.

  • 電子回路設計から行っているよう。
  • 開発中?

CAMI & Co - 実績紹介・BLOG

自転車の後方センサーを超音波センサーで自作する | 株式会社CAMI&Co.

  • 後方の車両接近を検出するセンサー、システムの開発例。
  • 一般的なサイコンとは少し方向性が異なっていて興味深い。

X-TRACK

FASTSHIFT/X-TRACK: A GPS bicycle speedometer that supports offline maps and track recording

https://github.com/FASTSHIFT/X-TRACK/raw/main/Images/地图.jpg

  • 中国の事例
  • ほぼ製品レベルのクオリティのよう。ケースからプログラムから自作している。
  • UIのクオリティが高い。
  • GPX形式での記録出力が可能。

まとめ

事例によってサイコンを再現するもの、独自機能を加えるものなどありますね。あなたの気になったものはあれば是非コメント欄で教えてください。

JSMRM2021 注目された演題たち

日本の医学MRI研究における大きな学会である日本磁気共鳴医学会大会。今年はハイブリット開催となりました。

www.c-linkage.co.jp

現地参加の方にMRIレゴの抽選があったり、大会側から学会の楽しみ方や注目演題のピックアップがあったりと、例年よりも運営側のメッセージが伝わってくるいい大会だったように感じました。

個人的にはシンポジウムも何だろうと思うものから、私のような素人を対象にしたものもあって非常に楽しめ大満足でしたが、皆さんはいかがでしたでしょうか?

今回はJSMRMの抄録システムを利用して、注目された演題などの解析を行ってみました。

演題登録数

はじめに登録されていた演題を種類別にまとめました。

  • 特別講演:3
  • 教育講演:28
  • シンポジウム:74
  • Jointシンポジウム:8(ASMRM/JSMRM-KSMRM/JPC Joint Symposium)
  • ハンズオンセミナー:5
  • 口演発表:142
  • ポスター発表:166
  • モーニングセミナー:2
  • ランチョンセミナー:24
  • イブニングセミナー:7
  • スポンサードセミナー:2

口演発表がシンポジウムの2倍くらいとなっていたのは思ったよりも少ないなという印象でした。例年と比較すると今年は演題登録自体が少ないんでしょうか。

スケジュール数

演題毎のスケジュール数です。これは抄録システム上でスケジュール登録しておくと、自分用のタイムスケジュールが作れるという機能で、参加者が注目した演題をある程度反映していると考えられます。

トップ10は以下の通り。

スケジュール数 演題番号 筆頭演者 演題名
1 102 SY4-2 畑 純一 MRIノイズはどこまで許容されるのか? ~特性と評価法の理解~
2 100 SY4-1 尾藤 良孝 MRIシステムにおける信号と雑音
3 98 SL2 押尾 晃一 パルスシーケンス開発の本質
4 95 SY14-5 坂井 上之 頭部と整形外科領域のMRI検査
4 95 SY4-3 町田 好男 高速撮像法の進歩と画質評価
6 94 SS-1 村山 和宏 臨床に役立つ脳血管障害の画像診断:血管壁イメージングの活用法
6 94 SY14-2 鈴木 秀郷 早い,簡単,でもよく分かる!頭部MRAと心臓MRI
8 92 SY14-1 鍛治 尚利 条件付きMRI対応デバイス植込み患者の頭部MRI検査
9 91 SY14-4 高橋 沙奈江 MR conditional デバイス挿入患者における当院の取り組み
10 89 SY14-3 小見 正太郎 MR conditionalデバイスを使用している患者のMRI: GE社MRI装置を用いた頭部および腹部の検査について

MRIノイズやシーケンス開発、体内デバイス使用時検査に関する演題が目立ちますね。JSMRMは技師さんの参加が多いと聞きますので、基礎検討や実際の検査の際に役立つ演題が注目されたのでしょうか。

学術講演に絞って見るとスケジュール数が少し減って以下の通り。

スケジュール数 演題番号 筆頭演者 演題名
1 59 O2-026 安里 昌竜 頭部領域におけるVariable flip angleを用いたFLAIRの検討
2 56 O2-025 竹井 直行 同時収集3D T1強調,T2強調,FLAIRのマルチコントラストイメージングの検討
3 55 O2-073 矢部 邦宏 条件付MRI対応デバイスのリスクはどこまで周知されているか,に関する調査
4 53 O2-074 有田 圭吾 MRIにおける金属アーチファクト低減効果の基礎検討
5 51 O2-071 矢部 邦宏 医療機器植込み型患者の安全な撮像条件の蓄積・管理システム
6 49 O2-001 永井 康宏 3T-MRIによる心臓MR拡散強調画像における最適なtrigger delayの検討
6 49 O2-002 藤川 博司 後処理を必要としない複数回呼吸停止下で撮像する複数加算の拡散強調画像の考案
8 48 O2-046 塩谷 優 頸動脈プラーク評価におけるMP2RAGEの有用性の検討
10 47 O2-004 加賀 徹郎 Echo-planar imaging with compressed SENSE (EPICS)法で撮像した腹部拡散強調像の画質及びADC値評価
10 47 O2-005 渡部 勝浩 1.5T MRIにおけるDWIBS のためのCompressed SENSE 併用Single-shot EPI (EPICS)のSNR検討
10 47 O2-045 澤野 美樹 HyperCUBEと HyperSenseを用いた高速 T2 CUBEによる椎骨脳底動脈の評価:2D-BPAS法との比較

やはり安全系の演題が食い込んできますね。シンポジウムと合わせて注目のトピックですね。オンデマンドで10/20まで配信していますので、まだの方は是非チェックしてみて下さい。

抄録本文の自然言語解析

おまけとして抄録本文の自然言語解析を行い、頻出単語の抽出を行ってみました。

全460演題から4051英単語が抽出され、上位200個を頻度で重み付けして画像化しました。

f:id:akcharine:20211013161451p:plain
word cloud (JSMRM2021)

feature, model, learning, DLあたりはdeep learningやradiomicsに関連しそうなキーワードですね。

T1とT2を比べると若干T2の方が大きいですね。定量のしやすい差を反映しているのでしょうか...?興味深いです。

個人的にはMRE(おそらくMR enterographyではなくてelastography)がある程度の大きさなのは注目したいです。国際的にはアメリカ、ドイツの発表が多い印象がありますが、日本でも精力的に研究されているのは嬉しいですね。

さいごに

みなさんの注目した演題は入っていましたでしょうか?

こんな演題良かったよ、などありましたら是非コメントやtwitterhttps://twitter.com/akcharine)で教えていただけると嬉しいです。

Macでdicom画像をquicklookした話

Summary

  • Macのfinderでdicom画像を素早く確認したい。
  • homebrewでquicklook pluginをインストールする。

homebrew

公式からインストール

macOS用パッケージマネージャー — Homebrew

osirix-quicklook

brew cask install osirix-quicklook

インストール後、finderを再起動すれば有効になる。

注意点

  • .xxxみたいな隠しファイルが生成されることがある
  • glob利用した処理やmatlabスクリプトで上記生成ファイルの気がつかずに苦労した。

ラズパイで心電図を作ってみた

はじめに

Raspberry pi(ラズパイ)を使って職場の環境モニタリングを行っていますが、もっと別のことにもラズパイを使えないかということで心電図モニタを作ってみることにしました。

概ねArduinoを使った既報と類似していますが、以下の点が新しい視点となっています。

  • Raspberry Piから値を取得するためにADCを導入
  • processingでssh接続のシリアルプロッタを作成

f:id:akcharine:20190421010732p:plain

ECGとパルスオキシメーター

 今回、作ったのは心電図(ECG: electrocardiogram)です。ラズパイでの紹介記事が多いパルスオキシメータとは異なりますので注意して下さい。心拍センサとして販売されているラズパイ部品の多くはパルスオキシメーターです。

  • ECG: 心臓の電気的活動を捉えるもの。電極を体に付ける。検診で手足や胸にヒヤッとやつを付ける。
  • パルスオキシメーター: 動脈血酸素飽和度を捉えるもの。指にクリップを挟む。

注意

  • 本記事で紹介したデバイスを医療目的で使用しないで下さい。
  • 心電図による診断は、薬機法で認められた医療機器を用いて医師により行われるものです。

仕様

  • 心電図
    • 1つの誘導だけ測定できる
    • 時間分解能: 0.01 s
  • 出力
    • バイナリファイル
    • シリアルプロッタ(processingで作成)

f:id:akcharine:20190427215525j:plain

コード

ソースコードgithubで公開しています。

akchan/ecg_plotter

材料

接続

下図の要領でラズパイとデバイスを接続しました。

f:id:akcharine:20190427224735p:plain

今回使用した心電図センサ(AD8232)はアナログ出力で、そのままではラズパイで読めないため、間にADC(ADS1015)をおいて値を取得することにしました。

状態表示用の有機ELモニタは、ラズパイ-ADC間の通信品質を保つため、I2CではなくSPI接続のものを使用しています。ピンアサインはpythonライブラリ luma.oledのリファレンスを参照しました。

Raspberry Pi Zeroのセットアップ

次の記事を参考にしてmacbook proからusb接続でセットアップをしました。初期設定後はAPに接続させてwifiでアクセスできるようにしています。

qiita.com

RTC (DS3231)セットアップ

モバイルでも利用できるよう、RTCのセットアップを行います。

まずはI2C接続を有効にしてモジュールを読み込みます。

# まずI2C接続を有効化する。
$ sudo raspi-config
# 以下のように進む。
# '5 Interfacing Options' -> 'P5 I2C' -> 'Yes'

# モジュールを読み込むようにする。
$ sudo vi /boot/config.txt
# 以下を追加
dtoverlay=i2c-rtc,ds3231

# 再起動
$ sudo reboot

# アドレス68がUUになっていることを確認
$ i2cdetect -y 1

# モジュールが読み込まれていることを確認する。
$ modprobe -c|grep 3231

# 時刻が表示されるのを確認する。
$ sudo hwclock -r

次にRTCが内蔵されていないraspberry piでRTC代わりにインストールされているfake-hwclockをアンインストールします。

$ sudo apt purge fake-hwclock

RTCを日本標準時に合わせるため、NTPクライアントとしてchronyをインストール。

$ sudo apt install chrony

# 参照先ntpサーバを追加
$ sudo vim /etc/chrony/chrony.conf
#以下を追加
pool ntp.nict.jp
pool ntp.jst.mfeed.ad.jp

# 同期状況を確認
$ chronyc sources

心電図について

値の取得

心電図センサからの出力はアナログなのでI2C接続のADC(ADS1015, adafruit)を使って値を取得しました。

ADCからの値取得はadafruitが提供しているpythonモジュールを使用しました。

adafruit/Adafruit_Python_ADS1x15: Python code to use the ADS1015 and ADS1115 analog to digital converters with a Raspberry Pi or BeagleBone black.

GAINはデフォルトのままで問題なく動作しました。

時間分解能

通常、心電図の記録用紙は0.04秒ごとに目盛りが刻まれています。

実際に動作させてみると1回の値取得あたり約3msかかる様でした。

そこで今回はマージンを付けて、サンプリングレートは0.01秒(=10ms)になるようコードを作成しました。ADCのサンプリングレートは最も低速の128に設定しています。

電極のつなぎ方

用意した心電図ケーブルは臨床使用されている心電図ケーブルと色が異なるので注意が必要です。

  • 黒: 肢誘導の赤に相当。今回は胸骨角部に装着。
  • 青: 肢誘導の黄に相当。今回は第5肋間鎖骨中線(12誘導の茶色[C4])に装着
  • 赤: 肢誘導の黒に相当。今回は右側側腹部に装着。

測定時の注意

楽な体勢で測定する

力が入っていると骨格筋の電位を拾ってしまいます。

新しい電極パッドを使う

電極を使い回すとパッドの性能が低下して心電図が正確に測れなくなってきます。

四肢を床から離す

理由は分かりませんが、両足を素足でフローリングに付けていると測定できませんでした。臥位以外で測定する場合は注意が必要です。今回は両足を座布団の上に置いて、椅子に座って測定しました。

シリアルプロッタを作る

表示部をどうするかが一番の問題でした。

Arduinoだと標準でシリアルプロッタが添付されているため心電図記録の表示が簡単に行えるのですが、ラズパイの場合は自分で用意する必要があります。Google先生に聞いてみると、matplotlibを使ったものやwebsocketを利用したものがありましたが、どれも満足のいくフレームレートが出ませんでした。

そこで今回はssh接続で取ってきた値をprocessing (java)を使って表示するシリアルプロッタを自作しました。

youtu.be

最後に

Raspberry Pi Zeroを使って心電図モニタを作りました。今回はシリアルプロッタでリアルタイム表示するまでですが、モバイルバッテリーでも動くraspberry pi zeroを使っているので日常での心電図測定にも応用できそうです。