히비스서커스의 블로그

[Cocre] 병리 이미지 다루기 2 - Slide Level (feat. Microns Per Pixels) 본문

Theory/Bio-Medical

[Cocre] 병리 이미지 다루기 2 - Slide Level (feat. Microns Per Pixels)

HibisCircus 2022. 7. 16. 19:04
728x90

이 글은 병리 이미지 다루기 시리즈 글입니다. 병리 이미지 다루기 1 (feat. Stain Normalization), 병리 이미지 다루기 2 (feat. Microns Per Pixel), 병리 이미지 다루기 3 (feat. Multi Resolution Model) 총 3회에 걸쳐 제작 예정입니다. 이 시리즈는 모두의 연구소의 코크리 2기 회원으로서 작성한 글임을 밝힙니다. 코크리란

 

 

 

 

저번 글 병리 이미지 다루기 1 (feat. Stain Normalization) 편에서는 병리 이미지 데이터를 얻는 과정에서 생기는 배치 효과나 스캐너의 차이로 인해 발생하는 색상의 차이를 stain normalization을 통해 극복할 수 있는 방법에 대해 살펴 보았습니다. 조금은 가볍게 다룬 감이 없지 않아 있다고 느끼셨을 것 같은데요. 이번 병리 이미지 다루기 2 (feat. Microns Per Pixel) 편에서는 조금은 더 깊게 들어가 보려고 합니다. 바로 MPP(Micon Per Pixel)FOV(Field of View)에 관한 이야기 입니다. 이는 병리 이미지 데이터의 특성과 깊은 관련이 있기에 한 번 살펴보도록 하겠습니다. 

 

 

병리 전문의 분들이 슬라이드를 확인하실 때는 다음과 같은 광학 현미경을 통해 확인합니다. 다들 한 번 쯤은 보셨을 것이라 생각합니다.

 

https://www.coupang.com/

 

이때 접안렌즈의 배율은 10배이고 대물렌즈의 배율은 4배, 10배, 20배, 40배 등이 존재합니다. 이를 통해 슬라이드에서 조직이나 세포를 관찰할 때 접안렌즈의 배율과 대물렌즈의 배율을 곱한 40배, 100배, 200배, 400배의 크기로 확인이 가능하죠. 

 

MPP란?

 

디지털 스캐너를 통해 병리 슬라이드를 스캔할 때 병리 슬라이드 이미지도 배율에 따라 각각 저장되어 피라미드 형식으로 저장됩니다. 이때, 각각의 이미지의 배율은 다르더라도 보여지는 이미지는 그대로이죠. 아래의 그림을 보시면 이해가 더 빠르실 것 같습니다.

 

Dual-path network with synergistic grouping loss and evidence driven risk stratification for whole slide cervical image analysis Figure 3

 

생소해 보이는 level MPP라는 용어가 옆에 쓰여있네요. level에 대한 정확한 정의가 나와있진 않으나 level의 개수가 저장된 배율의 개수라고 할 수 있습니다.  level 0에는 가장 큰 배율의 슬라이드 이미지가 담기게 됩니다. MPP는 Micron Per Pixel의 줄임말로 픽셀 당 얼마의 micrometer 가 담기느냐를 나타내는 수치라고 이해하시면 편합니다. MPP가 작을수록 한 픽셀에 적은 micrometer의 크기가 담기므로 큰 배율을 가지게 되겠죠. 편하게 MPP와 배율은 반비례 관계라고 이해하시면 좋을 것 같습니다.

 

1 MPP = 1 μm / pixel

 

level 0의 값은 디지털 스캐너로 저장을 할 때 스캔 시 최대 배율을 얼마로 지정했냐에 따라 달라집니다. 즉, level 0에는 400배의 이미지가 담길수도 있고 200배가 담길 수도 있는 것이죠. 배율에 따른 MPP는 고정되어 있습니다. 400배는 40X로 표기한다는 점을 감안하여 아래의 표로 정리해보았습니다.

 

MPP 0.25 0.5 1 2 4
Resolution 40X 20X 10X 5X 2.5X

 

이제 그럼 코드를 통해서도 확인해보겠습니다. 저번 글에서 openslide를 통해 병리 이미지 데이터를 객체로 만든 후 level_dimensions라는 메서드를 사용하였었는데요. 이와 관련된 메스드를 통해서 저장된 슬라이드 이미지의 level과 관련된 다양한 정보들을 확인할 수 있습니다.

 

import openslide

slide_path = 'openslide_path.svs'
slide = openslide.OpenSlide(slide_path)
print(f'level count          :: {slide.level_count}')
print(f'image size per level :: {slide.level_dimensions}')
print(f'level 0 MPP          :: {slide.properties.get('openslide.mpp-x}')
level count                :: 4
image size per level :: ((94247, 75469), (23561, 18867), (5890, 4716), (2945, 2358))
level 0 MPP              :: 0.5

 

위의 슬라이드의 정보를 분석해보면 level 0, 1, 2, 3 이렇게 총 4개를 가지고 있고, 이에 대한 이미지 크기(94247, 75469), (23561, 18867), (5890, 4716), (2945, 2358)임을 확인할 수 있습니다. 또한, level 0에서의 MPP가 0.5이므로 위의 표를 통해 200 배율임을 알 수 있습니다. 또한, level 1은 level 0의 크기보다 4배 작으므로 50배, level 2는 level 1의 크기보다 4배 작으므로 12.5배, level 3의 크기는 level 2의 크기보다 2배 작으므로 6.25배 임을 구할 수 있습니다.

 

이제는 이런 특징들을 어떻게 활용할 수 있는지 살펴보겠습니다. 병리 이미즈의 크기는 매우 크기 때문패치 단위로 쪼개어 분석에 활용을 하는데요. 주로 PyHIST를 이용하여 쉽게 패치를 생성할 수 있습니다. 간단하게 사용방법을 소개하면 

 

$ git clone https://github.com/manuel-munoz-aguirre/PyHIST.git
$ cd PyHIST

 

위의 코드를 통해 PyHIST 코드를 다운받은 후

 

$ python pyhist.py \
	--save-patches \
	--content-threshold 0.05 \
	--patch-size 512 \
	--output-downsample 4 \
	--info "verbose" \
	--save-tilecrossed-image \
	--output "output_path" \
	"svs_path"

 

원하는 조건을 변수로 입력하여 그에 맞는 패치들을 "output_path"에서 얻으실 수 있습니다. 자세한 내용은 PyHIST에서 제공하는 colab에서 확인하실 수 있습니다.

 

https://pyhist.readthedocs.io/en/latest/tutorial/

 

병리 이미지를 패치단위로 쪼갤 시 배율패치의 크기도 어떻게 할 것인지도 중요한 사항 중 하나입니다.

 

 

FOV란?

 

이제 FOV(Field of View)라는 개념을 패치에 적용해봅시다. 원래의 의미는 관찰이 가능한 시료의 면적을 말하며 아래의 공식으로 나타낼 수 있습니다.

 

FOV = Field number of eyepiece / magnification of objective

 

FOV를 패치에 담긴 슬라이드의 화각이란 의미로 적용한다면 아래의 공식으로 나타낼 수 있을 겁니다.

 

FOV = Patch size / magnification of objective

 

즉, FOV는 동일한데 배율이 다른 패치들이 존재하겠죠. 예를 들어보면, 100배율의 512X512 크기의 패치를 만들었을 때 이와 동일한 FOV를 가지는 400배율의 패치의 크기는 다음과 같이 2048X2048 이 되어야 함을 아래와 같이 구할 수 있습니다.

 

 

 

MPP와 FOV의 개념을 익혀보았는데요. 이를 어떻게 활용할 수 있을지 생각해봅시다.

 

병리 이미지를 통한 연구에서 주로 이용하는 deep learning task는 classificatioin, semantic segmentation 입니다. 이 모델들의 특징은 바로 pooling layer를 거친다는 것입니다. 패치가 2x2 poolsize를 가진 pooling layer를 거치며 FOV는 그대로이지만 크기가 반으로 줄어들게 되지요. 즉, 배율이 2배 작이지는 반면 mpp가 2배 커지게 되는 것입니다. 

 

 

그렇다면 병리 이미지는 여러 배율의 이미지를 가지고 있으니 이를 딥러닝 모델에 적용해볼 수 있지 않을까요? 이런 특징을 사용한 모델들과 다양한 시도들은 다음 Multi  Resolution Model 편에서 살펴보도록 하겠습니다. 읽어주셔서 감사합니다. 

 

 

 

 

728x90