前提・実現したいこと
宜しくお願い致します。
私のPCはWindows10
Google Colaboratoryを使用中です。
私自身は、Pythonのかなりの初心者です。
(初心者ではありますが、以前にRandom Forestによるデータ解析を見よう見まねで行い、論文を書いた経験はあります)
(その次が、いきなりこんな課題に取り組んでいて自分ながらに愚かだとは思っております)
医療関係の研究を行っております。
CTで撮影した構造物に対して、radiomicsの特徴数値を、
(https://en.wikipedia.org/wiki/Radiomics)
pythonで解析したいと思っています。
(https://www.radiomics.io/)
(https://www.radiomics.io/pyradiomics.html)
基本的にはDICOMファイルにラベルをつけた状態のファイルを準備する必要があります。
サンプルコードは下記に紹介されています。
https://qiita.com/tatsunidas/items/7e0bee8c63c2bf2f2428
しかし、私の手元にはすでにSTLファイルとして出力されたデータが500個あり、
できればこれを活用したいのです。
このファイルは、ラベルの対象となる構造物を、DICOMファイルを扱うアプリケーションの中で
半自動的にラベリングできるため、そのままボタンを押せばSTLファイルとして出力して
くれるという機能を利用したものになります。
参考までに。
上記のpngファイルは、Google Laboratoryの環境で、下記のコードで表示させました。
(radiomicsのコードも冒頭に中途半端に混ざっている状態で失礼します)。
========================================
!pip install pyradiomics
import os
from radiomics import featureextractor
import radiomics
from radiomics import firstorder, getTestCase, glcm, glrlm, glszm, imageoperations, shape, shape2D
import numpy as np
import six
import SimpleITK as sitk
import matplotlib.pyplot as plt
!pip install numpy-stl
from stl import mesh
from mpl_toolkits import mplot3d
figure = pyplot.figure()
axes = mplot3d.Axes3D(figure)
your_mesh = mesh.Mesh.from_file('/content/drive/MyDrive/Colab Notebooks/20210811PVICT_STL/20191002-66694.stl')
def mesh_location_zero(your_mesh):
midPosRel = (your_mesh.max_ - your_mesh.min_)/2
your_mesh.x = your_mesh.x - (midPosRel[0] + your_mesh.min_[0])
your_mesh.y = your_mesh.y - (midPosRel[1] + your_mesh.min_[1])
your_mesh.z = your_mesh.z - (midPosRel[2] + your_mesh.min_[2])
return your_mesh
mesh_location_zero(your_mesh)
axes.add_collection3d(mplot3d.art3d.Poly3DCollection(your_mesh.vectors))
scale = your_mesh.points.flatten()
axes.auto_scale_xyz(scale, scale, scale)
pyplot.show()
========================================
発生している問題・エラーメッセージ
https://qiita.com/tatsunidas/items/7e0bee8c63c2bf2f2428
このページで紹介されているコードをなぞっていく中で、
上記のSTLファイルを使おうとすると、下記のメッセージが出ます。
RuntimeError: Exception thrown in SimpleITK ImageFileReader_Execute: /tmp/SimpleITK/Code/IO/src/sitkImageReaderBase.cxx:105:
sitk::ERROR: Unable to determine ImageIO reader for "/content/drive/MyDrive/Colab Notebooks/20210811PVICT_STL/20191002-66694.stl"
該当のソースコード
もともとは、
imageName, maskName = getTestCase('lung2')
image = sitk.ReadImage(imageName)
mask = sitk.ReadImage(maskName)
というコードが使用されている部分ですが、
ここに、
imagePath = "/content/drive/MyDrive/Colab Notebooks/20210811PVICT_STL/20191002-66694.stl"
maskPath = "/content/drive/MyDrive/Colab Notebooks/20210811PVICT_STL/20191002-66694copy.stl"
image = sitk.ReadImage(imagePath)
mask = sitk.ReadImage(maskPath)
というコードを代用して入れてみた結果です。
上記のエラーコードは、
image = sitk.ReadImage(imageName)
に対して出ているようです。
試したこと
試したことは上記になります。
現在の問題点は2つあると考えています。
1)image = sitk.ReadImage(imageName)というコマンドによって、
stlファイルを読み込むことができない。
つまり、
sitk.ReadImage(ファイル名)
というコマンドで取り扱えるファイル形式がわからない、という問題に直面していると
考えております。
2)上記の「代用コード」は、同じファイルをコピーして「image」と「label」の
両方に適用することで、該当する構造物が解析対象であることを認識させられないか、
と愚考した試みでした。
果たして、このまま前に進んで、radiomicsの解析が行えるのか、そこの勝算もない状況です。
補足情報(FW/ツールのバージョンなど)
Google Colaboratoryの環境で作業しております。
pyradiomics
numpy-stl
はとくにバージョンを指定せずにインストールしています。
https://qiita.com/tatsunidas/items/7e0bee8c63c2bf2f2428
このページで紹介されているコードを、一通り以下に転記致します。
========================================
!pip install pyradiomics==2.1.0
import os # needed navigate the system to get the input data
from radiomics import featureextractor # This module is used for interaction with pyradiomics
import radiomics
from radiomics import firstorder, getTestCase, glcm, glrlm, glszm, imageoperations, shape, shape2D
import numpy as np
import six
http://simpleitk.github.io/SimpleITK-Notebooks/01_Image_Basics.html
import SimpleITK as sitk
import matplotlib.pyplot as plt
brain1, brain2, breast1, lung1,lung2,(prostate_phantom)
imageName, maskName = getTestCase('lung2')
image = sitk.ReadImage(imageName)
mask = sitk.ReadImage(maskName)
ndImg = sitk.GetArrayFromImage(image)
ndLbl = sitk.GetArrayFromImage(mask)
plt.imshow(ndImg[24])
plt.show()
plt.imshow(ndLbl[24])
plt.show()
settings = {}
settings['binWidth'] = 25
If enabled, resample image (resampled image is automatically cropped.
settings['resampledPixelSpacing'] = None # [3,3,3] is an example for defining resampling (voxels with size 3x3x3mm)
settings['interpolator'] = sitk.sitkBSpline
settings['label'] = 1
bb, correctedMask = imageoperations.checkMask(image, mask)
if correctedMask is not None:
mask = correctedMask
image, mask = imageoperations.cropToTumorMask(image, mask, bb)
firstOrderFeatures = firstorder.RadiomicsFirstOrder(image, mask, **settings)
firstOrderFeatures.enableFeatureByName('Mean', True)
firstOrderFeatures.enableAllFeatures()
print('Will calculate the following first order features: ')
for f in firstOrderFeatures.enabledFeatures.keys():
print(' ', f)
print(getattr(firstOrderFeatures, 'get%sFeatureValue' % f).doc)
print('Calculating first order features...')
results = firstOrderFeatures.execute()
print('done')
print('Calculated first order features: ')
for (key, val) in six.iteritems(results):
print(' ', key, ':', val)
========================================
このコードの冒頭の
brain1, brain2, breast1, lung1,lung2,(prostate_phantom)
imageName, maskName = getTestCase('lung2')
image = sitk.ReadImage(imageName)
mask = sitk.ReadImage(maskName)
でつまづいている状況になります。
私の手持ちのデータファイル(STL形式)を用いて進めていけるかについて、
アドバイスをいただけましたら幸いです。
宜しくお願い致します。
あなたの回答
tips
プレビュー