Fashion-How

Fashion-How

ETRI AI Contest

색상 별 분류

ETRI 자율성장 인공지능 경진대회 sub-task2 데이터 색상 분류 전처리 작업을 공유하고자 한다.

작업의 목표는 패션 데이터를 18가지의 색상 라벨로 분류시켜 정확도를 높이는 것이다. 주어진 것은 이미지 데이터와 색상 라벨, 분류해야할 의상의 Bbox 데이터이다.

바로 분류 딥러닝 모델을 적용시키기 전에 전처리 작업에 대해서 고민해보았다.
빨간색 라벨의 이미지라고 옷의 모든 픽셀이 완벽한 (255,0,0) 값을 갖는 것이 아닐 것이다. 그렇다면 미리 18가지의 라벨값의 RGB값을 훈련 데이터 이미지의 색상이 나타내는 가장 유사한 값으로 즉, 유클리디안 거리가 최소가 되는 값으로 결정하고 해당 픽셀을 유사값으로 변경하여 학습을 진행하면 어떤 결과가 나올지 궁금했다.

또한 픽셀별 색상 정보를 historgram으로 표현하여 만약 히스토그램의 가장 높은 값이 배경이나 다른 요소에 의해 라벨값과 다르다면 해당 이미지를 제외하고 초기 학습을 시켜 outlier를 제거하는 것도 계획하였다.

데이터 연산

단순히 구현을 목표로 for문을 열심히 썼다. 실시간도 아닌데 연산 시간이 얼마나 걸리겠냐는 생각이었다. 결과적으로 3중 for문에 이미지 하나를 처리하는데 연산 시간만 12초 남짓 걸렸다. 이미지를 2중 for문으로 반복하면서 각 픽셀당 18번의 라벨값과의 유클리디안 거리를 구한 후 여기서 최소값을 구하니 당연한 결과였다.

LiDAR 포인트 클라우드 처리 과정에서도 유사한 지연 현상이 있었고 numpy 병렬 처리로 시간 단축을 시켰다. 유사한 방식으로 연산 개선을 시도해 보았다. 이미지 형태를 병렬화 가능하게 변형하여 연산량을 최소화시키는 것이다. (\(width, height, 3\)) 이미지를 (\(-1, 3\)) 형태로 reshape하였다. -1은 남은 값을 계산해주니까 (\(width \times height, 3\))형태이다.
그리고 한번의 병렬 처리를 위해서 tile로 데이터를 라벨 갯수만큼 늘려준다. RGB는 나중에 유클리디안 거리를 계산할 때 사용해야하므로 열은 유지한 상태여야 한다. 따라서 (\(width \times height \times 18, 3\)) 형태가 된다.
라벨값들도 연산을 위해 (\(18, 3\))으로 만든 후 numpy repeat으로 (\(width \times height \times 18, 3\)) 형태로 만들어 준다. 각 색상이 이미지의 픽셀값만큼 복사되어 병렬 연산이 가능해진 상태이다.
병렬 연산이 가능해진 이미지와 라벨값의 유클리디안 거리를 한 번에 연산시키고 argmin으로 가장 작은 값 즉, 색상 유사도가 가장 높은 값을 선택한다.

for문을 모두 없앤 후 다시 실행하니 누르자마자 결과가 나온다.


Modified by Sungbin Shim