이전 글에서 데이터 준비를 마쳤고, 이제 데이터 라벨링과 학습할 차례이다. 다만 10만장에 달하는 데이터를 한번에 하는 것은 개인으로 하기에 버거웠기에, 약 3000장의 데이터로 모델을 만들어보고, 결과를 보기로 하였다.
1.roboflow 프로젝트 생성
roboflow는 데이터 학습을 서버에서 해주는 머신러닝 사이트로, 모델학습을 위해 백엔드 서버를 구축하는 번거로움이 없어 편리하다.
Xray 사진을 판독할 때 만약 암이 있다면 그 암부분을 박스나 Segmemtation으로 따로 표시하면 참 좋을것 같다는 생각을 했지만, 그것이 가능하려면 라벨링 작업을 하는 내가 어디에 암이 있는지, 다른 증상이라면 어느 부분을 보고 그렇게 판단했는지를 알아야 한다.
하지만 난 공대생이었지 의대생이 아니었기에 그런건 불가능했고, AI에 전체 사진을 보여주고 어떤 증상이 있는지 구별하도록 Classification 프로젝트로 진행하였다.
데이터 업로드
분류한 이미지들을 업로드한다. 이 단계에서 위에 Tags를 넣는다고 그 태그가 라벨링되는 것은 아니다. 하지만 증상별로 업로드하고 라벨링을 하면 라벨링 난이도가 쉬워지기 때문에 한 증상을 업로드하고, 라벨링을 마친 후 다른 증상을 업로드 하는 것이 좋은 방법인것 같다.
데이터 라벨링
Classification인 만큼 라벨링 박스나 폴리곤이 없어 라벨링 작업은 빠르다. 업로드 단계에서 증상별로 업로드를 했다면 같은 증상을 가진 이미지들을 라벨링 하는 것이므로 헷갈리거나 실수할 일도 없다. 즉 반복적인 작업이라는 뜻이고, 이는 곧 자동화가 가능한 부분이다.
3-1. 매크로
roboflow에서 여러 이미지를 한번에 라벨링하는 기능이 있었으면 좋았겠지만, 아쉽게도 그런 기능은 찾지 못했기 때문에 하나하나 라벨링을 해야한다. 하지만 같은 행위를 여러번 하는 것은 자존심 상하는 일이기 때문에 Autohotkey로 간략한 마우스 매크로를 사용해 라벨링을 했다.
^!m:: ; Ctrl + Alt + M 키로 스크립트 실행
SetMouseDelay, 100 ; 마우스 동작 간의 지연 시간을 0.1초로 설정합니다.
; 클릭할 좌표 설정
X1 := 512
Y1 := 329
X2 := 560
Y2 := 292
X3 := 1027
Y3 := 145
Loop, 1900 ; 1900번 반복
{
; 첫 번째 작업: 태그 클릭
MouseClick, left, %X1%, %Y1%
Sleep, 100 ; 0.1초 대기
; 두 번째 작업: 태그 저장
MouseClick, left, %X2%, %Y2%
Sleep, 100 ; 0.1초 대기
; 세 번째 작업: 다음 이미지로 이동
MouseClick, left, %X3%, %Y3%
Sleep, 100 ; 0.1초 대기
}
; 스크립트 종료 단축키 설정 (Ctrl+Alt+X로 설정)
^!x::ExitApp
Return
이미지의 태그도, 갯수도 알고 있기에 태그 위치에 따른 마우스 위치와 실행 횟수만 변경하면서 모든 태그를 오토핫키로 라벨링 할 수 있다. 다만 roboflow 사이트가 약 500번 라벨링 작업을 하면 응답없음 현상이 나기 때문에 간간히 새로고침을 눌러주면 된다.
학습
이미지들을 전부 라벨링했다면 학습할 차례이다.
Generate로 모델을 생성하는데, 위에서 라벨링 작업을 하고 업로드 할때 train-val-test를 7-2-1 비율이 기본설정이었을 것이다. 그 비율을 바탕으로 모델을 학습한다. 대략 1시간 정도 소요되었고 학습이 완료되면 이메일로 알림이 온다.
정확도 테스트
이제 모델에 Xray사진을 입력해 어떤 결과를 출력하는지 보자.
가장 높게 나온 No Finding 클래스는 무증상 즉 정상이라는 태그로 0.588로 다른 클래스에 비해 압도적으로 높은 수치로 나왔고, 이는 위 이미지 뿐만 아니라 다른 Xray사진에도 동일한 현상이 일어났다. No Finding 클래스가 가장 많은 이미지를 가지고 있었고, 다른 증상을 가진 이미지들과 별 차이점을 찾아내지 못했기 때문에 발생한 문제라고 생각된다.
정확도 향상 대책
가장 효과적이라 생각되는 대책은 위 이미지 처럼 각각의 증상과 부위를 Segmentation이나 Object Detection에서 폴리곤,박스로 표시하고 학습시키는 것이다. 예시로 위 폴리곤에 장기명칭과 증상을 태그하고 학습한다면 특정 장기의 위치나 크기, 주변 음영 강도에 따른 Mass검출 등 흉부사진의 구성요소간 연관성을 학습시키는 것이 가능해 정확도 상승과 증상을 발견한 부분을 강조표시 하는 것도 가능해진다.
하지만 이 방법은 라벨링 단계에서 전문적 의학지식이 필요하기 때문에 혼자서는 실행 할 수 없는 대책이다.
다른 방법은 학습 데이터의 양을 현재 3000장이 아닌 원본 10만장으로 늘리는 것이다. 3000장은 분명 학습량으로 부족하기에 의미있는 방법이지만, 이미지 전체만 보고 학습하는 Classfication 특성상 정확도는 여전히 낮을 것이라 예상된다.
https://universe.roboflow.com/doowon-lee/xray-qtqiq
위 링크에서 모델을 사용해 볼 수있다.
https://cloud.google.com/healthcare-api/docs/resources/public-datasets/nih-chest?hl=ko
위 링크는 학습에 사용된 데이터 원본이다. 흉부 Xray관련 프로젝트를 할 때 유용할 듯 하다.