저번 겨울방학 때 채식탁 프로젝트를 진행했었고, 지금도 쭉 진행중인 프로젝트인데,
이 기능 안에 Segmentation 모델이 들어가 있습니다.
그때 여차저차 모델 학습까지 완료했었고,
데모까지 가서 app 환경에서 잘 돌아가는거 까지 확인했었는데, 사실 아쉬운 부분이 좀 있었습니다.
짜피 추가 Develop 기간이고, 이왕 하는거 좀 제대로 만들자.
좀 더 보완해보자 마음먹어서
누군가 구성해놓은 음식 재료 데이터를 찾게 되었습니다.
일본 전자통신대학에서 구축한 음식 이미지 데이터셋이고,
음식 Segmentation을 위한 목적으로 공개된 데이터입니다.
서론이 좀 길었는데,
아무쪼록 이번 내용은 Segmentation 학습 할 때, 데이터가 어떤식으로 구성되어 있는지,
어떻게 접근하면 되는지에 대한 내용입니다.
위 데이터셋을 다운받고 나면,
/test/mask
/test/img
/train/mask
/train/img
로 구성되어 있습니다.
이 폴더 안의 데이터셋은 전부 이미지 파일로 구성되어 있고,

이건 mask 이미지 파일입니다.
그간 Segmentation 모델 학습 할 때, 레이블 파일 봐보면
각 픽셀값들이 txt 형식으로 저장되어 있는걸 줄곧 봐왔는데,
저한테는 좀 특이한 형식이었습니다.
뭐 물론 이 mask 이미지 파일의 픽셀 위치 좌표값 따로 따와서 txt 파일 저장 후,
학습에 활용해도 되지만,
이렇게 쓰라고 준 것, 그냥 이대로 최대한 형식 안 바꾸고 활용해보도록 합시다.
from PIL import Image
mask_path = '1.png'
img = Image.open(mask_path)
print('이미지 형식: ', img.mode)
channel_count = len(img.getbands())
print('채널 수 확인: ', channel_count)
이 코드를 통해서 mask 이미지를 살펴보면,
4채널의 'RGBA' 형식인걸 확인할 수 있습니다.
우리가 흔히 알고 있는 RGB에 알파 채널이 섞여 들어가있는 것이고,
R채널, G채널, B채널은 0~255 값으로 표현되는 빛의 기본 세가지 색상.
그리고 A채널(알파채널)은 동일하게 0~255값으로 표현하며,
0에 가까우면 투명, 255에 가까우면 불투명과 같은 투명도를 나타냅니다.
그러면 알파채널이 왜 들어가있는가?
1. 검정 배경에 검정 물체 구별 위함.
2. 포토샵 같은거에서 PNG 저장 시, 기본 설정.
하지만 우리 육안으로 봤을 때, RGB 컬러 스페이스로도 충분히 색상 표현 가능하며,
작업 시, 컬러 스페이스 분리해서 자세히 살펴보는 경우가 아닌 이상
사실상 알파채널은 개발 작업 시 쓸모가 없습니다.
즉, 여기서는 고려하지 않아도 되는 채널 입니다.
그러면 이제 어떤 채널을 활용하면 되는지 살펴보도록 하겠습니다.
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img = Image.open(mask_path).convert('RGBA')
img_array = np.array(img)
colors = ['red', 'green', 'blue', 'gray']
plt.figure(figsize=(16, 4))
for i in range(4):
plt.subplot(1, 4, i + 1)
plt.hist(img_array[:, :, i].flatten(), bins = 256, color = colors[i], alpha = 1)
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.grid(True)
plt.tight_layout()
plt.show()
위 코드 실행시키면,

왼쪽부터 차례로
R,G,B,A 채널의 빈도수 입니다.
Red 채널에 약 40, 100에 막대가 위치해 있는게 보이며,
나머지 채널은 0에만 위치해 있는게 보입니다.
이는 R채널을 제외한 모든 채널은 클래스 판별에 아무런 의미를 갖지 않는다는 것을 의미합니다.
또한, Red 채널의 히스토그램은 연속적인 형태가 아니고, 이산적인 형태로 나타납니다.
이를 통해서 얻을 수 있는 결론은
Red 채널의 픽셀값에 클래스 정보가 담겨있다
입니다.
다른 채널로 구성할 수 있으나, 여기서는 Red 채널을 활용한게 보입니다.
추가적으로, 클래스 id는 category.txt 파일에 담겨있습니다.
이런식으로 Segmentation 데이터셋 구성하게 되면
데이터셋 구성 후, 레이블을 좌표값으로 보내는 것과 달리,
mask 파일 하나로 각 객체 구분을 빠르게 할 수 있기 때문에
사람들과 같이 라벨링 작업 해야 할 때
참 좋은 방식인 것 같습니다.
굉장히 보편적인 형식인거 같은데,
왜 이제 알았나 싶습니다 ㅎㅎ
다음에는 위 데이터셋 활용해서 채식탁 프로젝트 segmentation 모델 보강 내용 다루도록 하겠습니다.
감사합니당 ~ 🦾