Pyradiomics: Mengapa ketidakcocokan geometri terjadi saat topeng dan gambar diturunkan dari seri DICOM yang sama?

Dibuat pada 23 Apr 2019  ·  13Komentar  ·  Sumber: AIM-Harvard/pyradiomics

Hai,

Untuk konteks, saya telah berhasil menjalankan PyRadiomics dari command-line, baik untuk pasangan gambar-mask tunggal, serta menjalankan ekstraksi batch untuk puluhan pasangan gambar-mask secara bersamaan dengan berbagai konfigurasi YAML. Namun, saya mengalami masalah yang saya tahu cara menyiasatinya, tetapi saya masih penasaran mengapa hal itu terjadi.

Setup: Saya memiliki satu seri DICOM pasien dengan 158 irisan, masing-masing berdimensi 512x512 piksel. Saya memuat seri ke Slicer dan membentuk ROI (nodule) dan kemudian mengekspor peta label biner sebagai file .nrrd. Kemudian, saya menggunakan alat baris perintah dcm2niix untuk mengubah seri DICOM yang sama menjadi volume .nii.

Ketika saya menjalankan pyradiomics dari terminal menggunakan gambar .nii dan .nrrd mask, saya mendapatkan ketidakcocokan geometri seperti yang dijelaskan di bawah ini. Mengapa ini terjadi jika mask dan volume gambar diturunkan dari seri DICOM yang sama? Apakah ini kejadian yang diharapkan?

Seperti disebutkan, dua solusi adalah: (1) simpan gambar sebagai volume .nii atau .nrrd langsung dari Slicer, dan ini tampaknya berfungsi dengan baik; (2) Sesuaikan nilai toleransi (meskipun solusi ini membuat saya merasa tidak nyaman). Akhirnya, saya ingin melakukan konversi batch dari ratusan seri DICOM ke volume .nii atau .nrrd, dan saya sudah memiliki masker untuk ratusan seri ini. Jadi saya berharap untuk menggunakan alat baris perintah untuk konversi batch dari dcm >> nii atau nrrd daripada Slicer.

Terima kasih untuk bantuannya.

[2019-04-23 16:38:19] E: radiomics.script: Feature extraction failed!
Traceback (most recent call last):
  File "/anaconda3/lib/python3.6/site-packages/pyradiomics-0+unknown-py3.6-macosx-10.7-x86_64.egg/radiomics/imageoperations.py", line 192, in checkMask
    lsif.Execute(imageNode, maskNode)
  File "/anaconda3/lib/python3.6/site-packages/SimpleITK/SimpleITK.py", line 43958, in Execute
    return _SimpleITK.LabelStatisticsImageFilter_Execute(self, *args)
RuntimeError: Exception thrown in SimpleITK LabelStatisticsImageFilter_Execute: /scratch/dashboard/SimpleITK-OSX10.6-x86_64-pkg/SimpleITK-build/ITK-prefix/include/ITK-4.13/itkImageToImageFilter.hxx:241:
itk::ERROR: LabelStatisticsImageFilter(0x7fcd1e601050): Inputs do not occupy the same physical space! 
InputImage Origin: [-1.8200000e+02, 1.6933569e+02, -3.0314999e+02], InputImage_1 Origin: [-1.8200000e+02, -1.7000000e+02, -3.0314999e+02]
    Tolerance: 6.6406202e-07
InputImage Direction: 1.0000000e+00 0.0000000e+00 0.0000000e+00
0.0000000e+00 -1.0000000e+00 0.0000000e+00
0.0000000e+00 0.0000000e+00 1.0000000e+00
, InputImage_1 Direction: 1.0000000e+00 0.0000000e+00 0.0000000e+00
0.0000000e+00 1.0000000e+00 0.0000000e+00
0.0000000e+00 0.0000000e+00 1.0000000e+00

    Tolerance: 1.0000000e-06


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/anaconda3/lib/python3.6/site-packages/pyradiomics-0+unknown-py3.6-macosx-10.7-x86_64.egg/radiomics/scripts/segment.py", line 40, in extractSegment
    feature_vector.update(extractor.execute(imageFilepath, maskFilepath, label))
  File "/anaconda3/lib/python3.6/site-packages/pyradiomics-0+unknown-py3.6-macosx-10.7-x86_64.egg/radiomics/featureextractor.py", line 397, in execute
    boundingBox, correctedMask = imageoperations.checkMask(image, mask, **self.settings)
  File "/anaconda3/lib/python3.6/site-packages/pyradiomics-0+unknown-py3.6-macosx-10.7-x86_64.egg/radiomics/imageoperations.py", line 207, in checkMask
    raise ValueError('Image/Mask geometry mismatch. Potential fix: increase tolerance using geometryTolerance, '
ValueError: Image/Mask geometry mismatch. Potential fix: increase tolerance using geometryTolerance, see Documentation:Usage:Customizing the Extraction:Settings:geometryTolerance for more information
question

Semua 13 komentar

Ini karena toleransi default terlalu ketat. Cara termudah adalah mengaktifkan resampling.

@warkentinmatt Ini juga mungkin untuk diperbaiki dengan mengaktifkan correctMask . Hal ini memungkinkan untuk resampling mask (tetangga terdekat), tanpa resampling gambar. Satu-satunya persyaratan adalah bahwa ruang fisik topeng terkandung di dalam gambar.

Yang saya curigai terjadi adalah mask Anda memiliki jarak / arah yang sama dengan gambar, tetapi ukuran dan asal berbeda, karena Slicer sekarang menyimpan mask dengan memotong area dan menyesuaikan asal sesuai. Ini menghemat memori, tetapi mengharuskan Anda memberi tahu PyRadiomics bahwa tidak masalah untuk mengambil sampel ulang masker (yang, dalam kasus terakhir ini, sama dengan hanya mengisi hingga cocok dengan ukuran gambar).

PyRadiomics tidak memperbaiki mask secara default, karena ini berfungsi sebagai peringatan untuk langkah ekstra yang dilakukan PyRadiomics.

Terima kasih atas tanggapan Anda.

@JoostJM Jadi hanya untuk memastikan saya memahami komentar Anda, ketika Slicer mengekspor / menyimpan peta label NRRD, itu memotong ukuran sejauh ROI? Itu tidak mempertahankan dimensi asli dari volume input? Ketika saya menghapus adegan di Slicer, mengimpor ulang seri DICOM, dan kemudian memuat masker NRRD, masker tersebut ditumpangkan pada CT di lokasi anatomi yang tepat. Bagi saya, saya berasumsi bahwa ini berarti dimensi asli CT dipertahankan di dalam masker. Apakah Slicer cukup pintar (yaitu menggunakan meta-data yang tepat) untuk menyelaraskan mask pada CT dengan benar?

Juga, supaya saya jelas tentang apa yang dicapai dengan resampling binary mask: pemahaman saya adalah bahwa jika ROI terletak di tengah gambar (dengan demikian pusat array berisi beberapa ratus / ribu "1"), resampling itu tetangga terdekat dari topeng di perbatasan volume pada dasarnya mengisi topeng dengan 0? Apakah ini interpretasi yang benar?

Terima kasih untuk bantuannya.

Jadi hanya untuk memastikan saya memahami komentar Anda, ketika Slicer mengekspor / menyimpan peta label NRRD, ia memotong ukuran sejauh ROI?

Ya, ini dimungkinkan, karena file Nrrd juga berisi origin, yaitu lokasi fisik dari voxel pertama.
Nrrd juga berisi informasi tentang arah dan jarak, memungkinkan Anda untuk tumpang tindih bahkan segmentasi yang dibuat pada gambar dengan ukuran piksel berbeda atau bahkan yang diputar.
Ini juga alasan array numpy tidak diterima sebagai input ke PyRadiomics, karena ini tidak berisi info geometris ini.

Juga, supaya saya jelas tentang apa yang dicapai dengan resampling binary mask: pemahaman saya adalah bahwa jika ROI terletak di tengah gambar (dengan demikian pusat array berisi beberapa ratus / ribu "1"), resampling itu tetangga terdekat dari topeng di perbatasan volume pada dasarnya mengisi topeng dengan 0? Apakah ini interpretasi yang benar?

Benar

Ketika saya menghapus adegan di Slicer, mengimpor ulang seri DICOM, dan kemudian memuat masker NRRD, masker tersebut ditumpangkan pada CT di lokasi anatomi yang tepat. Bagi saya, saya berasumsi bahwa ini berarti dimensi asli CT dipertahankan di dalam masker. Apakah Slicer cukup pintar (yaitu menggunakan meta-data yang tepat) untuk menyelaraskan mask pada CT dengan benar?

Topeng bisa sesuai dengan sub-wilayah gambar ukuran kotak pembatas topeng. Tidak perlu memiliki dimensi yang sama dengan gambar. Apakah dimensi cocok atau tidak akan bergantung pada cara Anda membuat segmentasi di Pemotong, dan cara Anda mengekspornya. Jika Anda ingin detail lebih lanjut tentang cara memastikan kecocokan dimensi, beri tahu kami.

Melihat kembali kesalahannya (pertama kali saya hanya melihat sekilas telepon), inilah perbedaannya:

InputImage Origin: [-1.8200000e+02, 1.6933569e+02, -3.0314999e+02], 
InputImage_1 Origin: [-1.8200000e+02, -1.7000000e+02, -3.0314999e+02]
    Tolerance: 6.6406202e-07

InputImage Direction: 1.0000000e+00 0.0000000e+00 0.0000000e+00
0.0000000e+00 -1.0000000e+00 0.0000000e+00
0.0000000e+00 0.0000000e+00 1.0000000e+00
, 

InputImage_1 Direction: 1.0000000e+00 0.0000000e+00 0.0000000e+00
0.0000000e+00 1.0000000e+00 0.0000000e+00
0.0000000e+00 0.0000000e+00 1.0000000e+00

Jadi, Anda memiliki situasi di mana nilai absolut asal sedikit meleset (dan perbedaannya lebih besar dari toleransi default), tetapi juga orientasi satu gambar dibalik dalam Y dibandingkan dengan gambar lainnya. Ini berarti Anda tidak dapat memperbaiki masalah dengan mengurangi toleransi, dan perlu mencontoh ulang mask atau gambar. Pengambilan sampel ulang ini tidak boleh mengubah nilai piksel, ini secara efektif akan menjadi operasi orientasi ulang.

@JoostJM Terima kasih atas tanggapan Anda lagi, sangat kami hargai.

@fedorov Bagaimana resampling topeng atau gambar menyelesaikan masalah yang dibalik Y dalam satu relatif terhadap yang lain? Ini tidak jelas bagi saya. Pemahaman saya adalah bahwa resampling digunakan untuk memastikan ukuran / dimensi yang sama.

Jika Anda ingin detail lebih lanjut tentang cara memastikan kecocokan dimensi, beri tahu kami.

Ya, saya ingin informasi lebih lanjut tentang cara memastikan kecocokan dimensi. Silahkan dan terima kasih.

Sebenarnya, saya ingin sekali informasi atau sumber daya yang dapat memperkuat pemahaman saya tentang beberapa konsep yang telah kita diskusikan (yaitu jarak, arah, asal). Secara naif, saya mungkin berpikir bahwa asal gambar adalah koordinat [x, y, z] dari [0,0,0], dengan kata lain, salah satu "sudut" (right anterior superior?) Dari array gambar . Apakah nilai asal yang ditunjukkan dalam log memiliki interpretasi yang nyata (misalnya milimeter atau sesuatu)? Mewakili apakah angka-angka ini? Maafkan ketidaktahuan saya, saya otodidak tentang semua hal pencitraan / radiomik, tetapi saya ingin memahami konsep-konsep ini versus hanya menerapkan solusi untuk membuat segala sesuatunya bekerja.

@warkentinmatt jangan khawatir tentang semua pertanyaan, ini adalah kurva yang curam untuk pemula!

Bagaimana resampling mask atau gambar akan menyelesaikan masalah yang membalik Y dalam satu relatif terhadap yang lain?

Arah citra pada dasarnya merupakan transformasi yang memutar sistem koordinat larik citra (IJK) ke ruang anatomi (XYZ).

Dalam contoh 1D sederhana di bawah ini, "indeks larik" adalah sistem koordinat larik 1d Anda, dan Kiri-Kanan adalah sistem koordinat dalam ruang fisik dunia 1d. Pada Image2, urutan nilai dalam array berlawanan dengan arah sumbu sistem koordinat fisik, yaitu array voxel diorientasikan berbeda. Resampling mengambil geometri gambar yang ditentukan oleh ukuran array, arah dan asal, dan nilai sampel dari gambar lain di voxel geometri referensi.

image

Apakah ini masuk akal?

Jika Anda ingin detail lebih lanjut tentang cara memastikan kecocokan dimensi saat mengekspor label dari Pemotong 3D, beri tahu kami.
Ya, saya ingin informasi lebih lanjut tentang cara memastikan kecocokan dimensi. Silahkan dan terima kasih.

Lihat tangkapan layar di bawah tentang cara mengekspor segmen dari Pemotong 3D ke labelmap (yang secara efektif adalah gambar biner). Perhatikan bahwa meskipun Anda mengikuti prosedur ini, bukan tidak mungkin Anda masih akan mendapatkan ketidakcocokan geometri, karena nilai toleransi default terlalu ketat. Tapi orientasi larik gambar harus sama.

image

Sebenarnya, saya ingin sekali informasi atau sumber daya yang dapat memperkuat pemahaman saya tentang beberapa konsep yang telah kita diskusikan (yaitu jarak, arah, asal). Secara naif, saya mungkin berpikir bahwa asal gambar adalah koordinat [x, y, z] dari [0,0,0], dengan kata lain, salah satu "sudut" (right anterior superior?) Dari array gambar . Apakah nilai asal yang ditunjukkan dalam log memiliki interpretasi yang nyata (misalnya milimeter atau sesuatu)? Mewakili apakah angka-angka ini? Maafkan ketidaktahuan saya, saya otodidak tentang semua hal pencitraan / radiomik, tetapi saya ingin memahami konsep-konsep ini versus hanya menerapkan solusi untuk membuat segala sesuatunya bekerja.

Berikut beberapa sumber daya yang mungkin berguna:

Semoga ini membantu!

@fedorov Terima kasih banyak telah meluangkan waktu untuk menjelaskan konsep ini, itu sangat membantu. Ini jauh lebih masuk akal, dan saya menghargai kesabaran Anda.

Jadi menurut saya, pengambilan sampel ulang memiliki dua peran penting namun berbeda untuk memastikan keselarasan geometris antara dua volume:

1) Pertama, jika perlu, padukan volume yang lebih kecil sampai cocok dengan ukuran / dimensi yang sama dari volume referensi, menggunakan sesuatu seperti tetangga terdekat.

2) Kemudian, setelah ukuran sesuai, gunakan informasi asal, arah, dan jarak untuk mengambil sampel voxel sedemikian rupa sehingga memastikan bahwa dua volume yang berada dalam kesejajaran anatomis / fisik juga diindeks dengan cara yang sama (yaitu penyelarasan indeks larik ).

Apakah ini ringkasan yang adil tentang peran pengambilan sampel ulang?

Juga, terima kasih telah membagikan sumber daya ini, saya berharap dapat bekerja melaluinya untuk memperkuat pemahaman saya.

@warkentinmatt , hampir. Langkah 1 & 2 terjadi secara bersamaan. Apa yang terjadi adalah Anda menentukan kisi titik dalam ruang fisik dan kemudian mengambil sampel gambar Anda pada titik tersebut. Jika titik kisi baru tidak sama persis dengan titik kisi yang ada, nilai baru dihitung menggunakan algoritme interpolasi, berdasarkan titik (piksel) di sekitarnya (piksel) gambar.

Anda juga dapat menemukan penjelasan ekstensif di dokumen IBSI, bagian tentang interpolasi . Ini juga berisi gambar yang mengilustrasikan kisi resampling.

@fedorov @JoostJM Saya tahu masalah ini sudah ditutup, dan saya sangat menghargai semua bantuan yang telah Anda berikan berdua. Saya hanya ingin memutar kembali untuk mengklarifikasi pemahaman saya. Setelah melakukan banyak membaca sumber daya yang Anda masing-masing berikan, dan menonton beberapa video bermanfaat, saya jauh lebih nyaman dengan konsep ini.

Jadi dalam contoh yang memunculkan masalah ini, karena mask berasal dari gambar yang sama yang digunakan untuk ekstraksi fitur, jaraknya sama. Dengan kata lain, perubahan satu unit di lokasi voxel di salah satu arah x, y, z untuk topeng atau gambar membawa interpretasi perubahan fisik yang sama. Jika jarak antara mask dan gambar sama, interpolasi tidak diperlukan untuk "mengisi celah", bukan? Jadi resampling topeng hanya akan memastikan kecocokan geometris dengan gambar sehubungan dengan kedua dimensi volume, serta memastikan bahwa kedua volume yang berada dalam kesejajaran fisik juga diindeks array dengan cara yang sama (sehubungan dengan arah dan asal ). Apakah ini benar akhirnya?

Jika jarak tidak sama antara dua volume, Anda perlu menginterpolasi voxel untuk mendapatkan dua volume dalam kesejajaran geometris. Misalnya, jika jarak gambar adalah [1mm, 1mm, 1mm] dan mask [2mm, 2mm, 2mm], Anda perlu menginterpolasi voxel dalam mask untuk "mengisi celah" dalam spasi fisik.

Sekali lagi terima kasih atas semua bantuan Anda. Itu telah membuat semua perbedaan.

@warkentinmatt ya, ini masuk akal, saya pikir Anda sudah benar!

Sumber daya lain yang berguna terkait resampling adalah halaman ini: https://www.slicer.org/wiki/Registration : Resampling

@septianjoko_hebat . Sekali lagi terima kasih atas semua bantuan Anda.

Ini mungkin bukan waktu atau tempatnya, tetapi menurut pemahaman saya Anda berbasis di Boston. Saat ini, saya kandidat PhD di Toronto, tetapi saya pindah ke Boston adalah dua minggu untuk beasiswa penelitian di Departemen Biostatistik di HSPH. Saya ingin terhubung secara langsung dan mungkin melanjutkan beberapa percakapan ini, jika Anda tertarik dan punya waktu. Bagaimanapun, bantuan Anda sangat dihargai.

Tentu, senang terhubung dan pelajari lebih lanjut tentang cara Anda menggunakan pyradiomics! Kirim saja saya email (publik di profil github saya), dan kita bisa bertemu untuk minum kopi.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat