概要
深層学習でマルチクラスのセグメンテーションを行い、出力結果をNRRD形式で保存した際、途中のラベルが欠損していると(例:ラベル1, 2, 4が存在し、3が存在しない)、各ラベルで設定した色が3D Slicer上で番号の小さい方に詰められて表示され、色とラベルが対応しないという問題がありました。
本記事では、Pythonのpynrrdライブラリを用いて、メタデータにセグメント情報を明示的に付与することで色ずれが解消される ことが分かりました。
以下の情報は、私が使用しているデータ(.nrrd)内に含まれていたmeta dataです。
3d Slicerで表示するには、これらだけでは不十分だということがわかりました。
('type', データ型),
('dimension', 次元数),
('space', 対象の向き),
('sizes', サイズ),
('space directions',解像度やスライス厚),
('kinds', 空間データ),
('endian', バイト順序),
('encoding', 圧縮データなど),
('space origin', 原点)
改善策
pynrrdを使用する場合、以下のように項目を追加することができます。
meta["Segment0_Color"] = '0.100 0.100 0.100'
モデルの出力結果を確認するというタスク内では、以下の設定が最低限必要であると考えました。
('Segment0_ID', '1')
# 無い場合, 途中のラベルが欠損していると色が詰まって表示されてしまう.
('Segment0_LabelValue', '1')
# 無い場合, 各ラベルが同じ色になる.
('Segment0_Layer', '0')
# 無い場合, 表示されるラベルが先頭のみになる.
# 入力する値は全ラベルで同じにする.
('Segment0_Name', 'Segment_1')
# 3d Slicer上で表示されるラベル名を設定.
('Segment0_Color', '0.100 0.100 0.100')
# 各ラベルの色を設定. 遊動小数点で入力. 設定しなくてもデフォルト(?)の色で出力される.
上記の結論にたどり着くまで時間を要したので、ここに備忘録として残します。
お疲れ様でした。
--------- 追記 ---------
前処理によるラベル入れ替わりの調査
以下の前処理後にラベルが入れ替わっていないか3dスライサーで直接目視確認しました。
transforms = Compose(
[
LoadImaged(keys="label", ensure_channel_first=True, image_only=False),
SelectItemsd(keys="label"),
Spacingd(
keys="label",
pixdim=(0.34, 0.34, 1.0),
mode=("nearest"),
),
SaveImaged(
keys="label",
output_dir="/home/koto/project/internal-iliac-segmentation/Outputs/check_label/spacing_034",
output_postfix="transformed_034_f",
output_ext=".nrrd",
resample=False,
),
]
)
結果、入れ替わってはいなかったのですが、二つ注意点を記します。
-
one-hot化は含めない
one-hot化すると、背景を含む物体ごとにチャネルが分けられてデータが保存されます。
SaveImagedでかなり容量の大きなデータを保存することになるため、注意です。 -
SaveImagedのresampleはFalse
resampleは、メタ情報に含まれるアファイン行列の内容に応じてサイズをリサンプリングします。
spacingがメタ情報を元に計算、更新を行うため不要です。
でした。