이번 주에는 'Teaching Notebook for Total Imaging Newbies' 커널을 필사하면서 '2018 Data Science Bowl'에서 세포 핵 탐지를 자동화하는 알고리즘 코드를 통해 object segmentation에 대해 공부했습니다.
https://www.kaggle.com/stkbailey/teaching-notebook-for-total-imaging-newbies
본 대회는 핵 탐지를 자동화하는 알고리즘을 만드는 것을 목표로 한 대회입니다.
nucleus detection, 즉 핵 탐지를 자동화함으로써 희귀 질환에서 일반 감기에 이르기까지 치료제를 더 빨리 개발하여 상용화할 수 있습니다.
가장 먼저, 필요한 라이브러리를 불러왔습니다.
그리고 데이터를 불러오는 과정에서, zip 파일로 되어있어서 zip을 풀어주고 난 후 위의 사진의 과정을 거쳐 데이터를 불러왔습니다.
데이터를 어떻게 받았냐에 따라, 데이터셋에 있는 이미지가 RGB, RGBA and grayscale format일 수 있습니다. Color images의 경우, R, G, B 3개의 채널을 인코딩하는 3차원이 있을 수 있기 때문에, 좀 더 심플하게 데이터를 다루기 위해 scikit-image에 있는 rgb2gray function을 사용하여 이 모든 이미지를 그레이스케일로 변환하였습니다.
이제 이 문제를 접근하는 방법 중 가장 간단한 것은, 이미지에 2개의 클래스가 있다고 가정하는 것입니다. 이 2 클래스는, 저희의 관심 대상인 object와 배경입니다. 이러한 가정 하에 데이터가 2가지 형태의 강도 분포로 분류될 것이라 볼 수 있습니다. 그래서 최적의 분리 값을 찾으면 배경 데이터를 "마스크"한 다음 남은 개체를 셀 수 있습니다. 저희는 이 분계점을 찾기 위해 이미지를 이원 분포로 모델링하고 최적의 분리 값을 찾기에 유용한 "Otsu" method를 이용하였습니다.
이 대회에서 저희는 각각의 nucleus, 즉 핵마다 별도의 mask를 받아야 합니다. 이를 위한 방법으로, 마스크에서 연결된 모든 개체를 찾아 ndimage.label을 사용하여 각 개체에 번호를 할당하였습니다. 그런 다음 각 label_id를 loop하여 반복하여 list같은 반복 가능한 항목에 추가하였습니다. 그래서 label_arrays라는 리스트 안에 하나씩 더해, 총 76개의 object를 확인할 수 있었습니다.
76개를 직접 보기 위해, 즉 object가 어떻게 나뉘었는지 확인하기 위해 다음 코드를 사용하였습니다.
마지막으로, 저희는 각각의 label mask를 "run line encoded" string 로 인코딩해야합니다. 그래서 array를 살펴본 후, 어떤 마스크의 일부인 픽셀을 발견하면 인덱스를 작성하고 그 마스크의 일부인 나머지 픽셀 수를 계산합니다. 이 방식을 새로운 픽셀 시작점을 볼 때마다 이것을 반복합니다.
'3-1기 스터디 > 캐글 필사' 카테고리의 다른 글
[8주차] TensorFlow Speech Recognition Challenge (0) | 2021.12.23 |
---|---|
[7주차] Statoil/C-CORE Iceberg Classifier Challenge (0) | 2021.12.04 |
[6주차] Zillow House Value Prediction (0) | 2021.11.29 |
[5주차] Dynamics of New York city - Animation (0) | 2021.11.17 |
[4주차] Costa Rican Household Poverty Level Prediction (0) | 2021.11.14 |
댓글