본문 바로가기
이미지 처리

초음파 영상 분류, BPD 만으로는 부족했다

by kkodecaffeine 2025. 2. 22.

시작하며;

현재 ResNet18 모델을 활용하여 초음파 영상을 프레임 단위로 추출해서 각 프레임을 특정 카테고리(클래스)로 분류하는 작업을 진행하고 있다. 작업 초기에는 초음파 영상에서 BPD(Biparietal Diameter, 양두정경)UNKNOWN(알 수 없는 경우) 두 가지로만 분류했다. 이 방식은 단순하면서도 빠르게 결과를 도출할 수 있었고, 실제로도 내가 의도한 대로 BPD 이미지가 상당히 잘 분류되었다. 하지만 점차 데이터가 쌓이고 모델의 예측 결과를 면밀히 분석하면서 문제가 보이기 시작했다.
 
복부 둘레(AC, Abdominal Circumference)머리 둘레(HC, Head Circumference) 등이 BPD 로 잘못 분류되는 경우가 많았다. 이들 역시 초음파 영상에서 BPD 처럼 십자가 모양의 마커가 포함된 경우가 많았기 때문에, 모델이 동일한 특징을 가진 이미지로 인식하고 있었던 것이다. 결국 단순히 BPD 와 UNKNOWN 으로 나누는 기존의 분류 체계로는 한계가 있다는 것을 깨달았다.
 
"그렇다면 정말 내가 원하는 정확한 BPD 이미지를 획득하기 위해서는 어떻게 해야 할까?"


분류 체계 재정비;

이 문제를 해결하기 위해 가장 먼저 고민한 것은 이미지 전처리 과정의 세분화였다. 기존의 단순한 분류 방식을 버리고, 초음파 영상에서 자주 등장하는 주요 측정 지표들을 기반으로 새로운 클래스를 추가하기로 했다. 기존에는 BPD 가 아니면 모두 UNKNOWN 으로 분류했지만, 이제는 보다 세부적인 클래스 체계를 도입했다.
 
새롭게 추가된 클래스는 다음과 같다:

  • BPD (Biparietal Diameter, 양두정경)
  • AC (Abdominal Circumference, 복부 둘레)
  • CRL (Crown-Rump Length, 머리엉덩이길이)
  • HC (Head Circumference, 머리 둘레)
  • UNKNOWN (알 수 없는 경우)
  • THREE_D (입체 초음파)

특히, 최근에는 입체 초음파 이미지까지 분류 대상으로 포함시키면서, 총 6개의 클래스로 구분하는 작업을 진행했다.


입체 초음파 분류, 다시-다시-다시;

입체 초음파 데이터를 다루면서 또 다른 문제가 발생했다. 기존에는 3D 초음파에서 제대로 분석이 어려운 영상을 UNKNOWN 으로 분류했지만, 점점 더 많은 데이터를 다루다 보니 입체 초음파 역시 세분화가 필요하다는 것을 깨달았다.
 
입체 초음파에는 다음과 같은 주요 패턴이 존재했다:

  • 눈, 코, 입이 뚜렷하게 보이는 경우
  • 이미지가 흐릿하거나 잡음이 많은 경우
  • 얼굴의 각도가 정면인지 아닌지

입체 초음파의 경우 색상으로 잘 구분이 되는지 인식도가 높았다. 하지만 테스트를 지속할 수록 눈, 코, 입이 뭉게진 이미지들도 높은 신뢰도로 인식되는 경우가 많았다. 그래서 눈, 코, 입이 잘 보이는 이미지흐릿한 이미지를 따로 구분하는 새로운 클래스(three_d_noise)를 추가하기로 했다.


UNKNOWN 클래스의 역할 변화;

그동안 UNKNOWN 클래스는 내가 의도하지 않은 모든 이미지를 퉁치는 용도로 사용해왔다. 예를 들어 BPD, AC, HC 등 주요 부위가 아니면 전부 UNKNOWN 으로 분류해버리는 단순한 기준이었다. 하지만 이제는 그 역할을 다시 정의할 필요가 생겼다.
 
이제 UNKNOWN 은 당장 세분화하지 않을 항목을 위한 클래스로 한정하고, 분류 대상이 아닌 이미지는 별도의 클래스로 분리하기로 했다. 예를 들어 심박수나 (Heart Rate) 혈액량과 (Blood Volume) 같은 측정 항목들은 아직 분석 대상이 아니기 때문에 UNKNOWN 으로 유지했다. 반면, 노이즈나 촬영 오류로 생긴 잘못된 영상처럼 아예 검출 대상이 아닌 경우는 새로운 노이즈 클래스를 만들어 다른 분류 클래스들과 명확히 구분하도록 했다.


어라?;

이러한 과정을 거쳐, 기존의 단순한 BPD vs UNKNOWN 모델보다 세밀한 분류 체계를 구축할 수 있었다. 그런데 클래스를 세분화할수록 학습 모델의 평가가 더 어려워지는 것 같다. 이제는 AC, CRL, HC 등 세분화된 클래스 간 차이를 구별해야 하기 때문인 것 같다. 각 클래스의 결정 경계를 찾아야 하기 때문에 모델이 더 많은 데이터와 학습 시간이 필요하다.
 
학습 시간을 더 최적화할 수 있는 고민을 다시 하게 되었다. 🫠
예전에는 epoch 30 이면 얼추 끝났는데.. 70 으로 높였다.. 🔥

리포트추출된 이미지

"같은 초음파 영상" 에서 AI 모델이 자동으로 분류한 경우;

사용자가 수동으로 선택한 입체 초음파 (7번 시도)
사람이 수동으로 분류했을 때
분류 모델이 자동으로 분류한 경우 (가장 신뢰도가 높은 이미지)
분류 모델이 자동으로 분류한 경우 (가장 신뢰도가 높은 이미지)

실전;

지금까지 진행했던 삽질을 경험한 것으로 그치지 않고 이 내용을 토대로 운영 환경에 직접 반영해보려고 한다. 실전이다.


return;