음식이미지는 SNS를 지배하고 여행과 음식점 선택을 유도하지만, 여전히 엄청난 양의 이미지 때문에 정리가 되지 않고 있다.
음식이미지 분류를 올바르게 활용하면 음식 추천, 다이어트를 위한 음식 선택 같은 것 처럼 전반적으로 음식에 대한 경험을 향상시킬 수 있다.
이 논문에서는CNN으로 음식이미지 분류를 할 때의 문제를 탐구한다.
scratch 학습, pretrained model을 통한 transfer learning을 사용하여 61.4% 정확도, 85.2%의 top-5 정확도를 달성했다.
Introduction
흔히 우리는 “눈으로 먹는다”라고 말한다. 인스타그램같은 SNS가 매우 커짐에 따라 우리의 디지털 경험은 더 사진 중심이 되고, 이 중 3억 6천만장 이상의 음식 사진이 있다.
한 2015년 설문조사에서 88% 이상이 음식을 여행의 목적지를 선택할 때 결정적인 요소로 고려했다. 그만큼 음식 이미지가 중요하다는 것을 계속 시사하는 것 같다.
이 프로젝트의 목표는 음식 이미지가 인풋으로 주어질 때 올바른 라벨 분류를 하는 것이다.
Related Work
Food 101 dataset을 사용할 것이기 때문에 food 101 dataset의 논문에서 소개하는 초기의 Randon forest 기반 분류 방법부터 2016년의 DeepFood 논문까지 소개하고 있다.
음식 분류 연구는 비교적 희소하기 때문에 ImageNet 연구도 살펴봤다고 한다.
2012년 AlexNet, 2014년 VGGNet, InceptionNet, Resnet 순으로 특징을 살펴본 내용을 말해준다.
Data
Food-101 데이터셋에 대해 소개한다.
101,000개의 이미지
101개 클래스
클래스당 이미지는 1000장이며, training 750장 test 250장으로 구성되어있다.
ImageNet에서는 상대적으로 뚜렷한 10개의 클래스로 구성되었지만 Food-101 데이터셋에는 라멘과 쌀국수 같이 내용이나 표현이 유사한 데이터가 있다.
그리고 학습 데이터는 밝기, 색깔, 크기가 매우 달랐으며 레이블링이 잘못된 경우도 있었다.
학습성능을 높이기 위해 ImageNet 가중치를 사용했다.
transfer learning을 위해 모델 사양에 맞게 이미지를 128x128 또는 256x256으로 정규화했고, 과적합 방지를 위해 rotation, shifting, horizontal flip 같은 augmentation을 사용했다.
Methods
Setup
AWS EC2 instance에서 모델을 학습했음
모델은 Tensorflow, Keras로 작성했음
모델은 각 epoch마다 저장
이미지크기 조정 및 전처리
class들의 subset을 랜덤하게 선택하여 모델을 테스트할 수 있도록 하였으며, 성능이 낮은 모델을 더 빨리 폐기함으로써 model design iterations를 가속화 할 수 있음
모든 모델의 loss는 cross-entropy 사용
Training from Scratch
baseline model은 4층의 convolution layer, 2층의 FC layer로 64x64 이미지를 학습했음
적은 epoch에서 validation set에서 가장 높은 28.2% 정확도가 나왔지만 그때부터 overfitting이 되어 정확도가 계속 감소했음
MNIST와 SIGNS dataset의 낮은 이미지 해상도는 음식 이미지를 수별하는 모델에 충분한 세부정보를 제공하지 못할 것이라는 가설을 세웠음
이미지 해상도와 모델 복잡도를 높여 정확도를 36.3%까지 증가시켰지만 다시 모델은 학습 데이터에 overfitting 되었음
Baseline model을 최적화 해본 후에, 여러 image classification 논문에서 제안된 모델을 찾아봤고, 적용해보았지만 Imagenet과 Food-101 데이터셋의 class 수가 다르기 때문에 성능 향상이 없었음.
Overfitting 해결을 위해 AlexNet을 구현하고 Data augmentation을 적용해보았는데, augmentation 때문에 overfitting이 되기 전에 더 많은 epoch를 학습할 수 있었고 32.8% 정확도를 달성했음.
Transfer Learning
ImageNet 데이터셋으로 훈련된 다양한 모델(VGG16, ResNet50, InceptionV3)로부터 transfer learning을 하기로 결정했다
ImageNet weight를 불러와 base layer를 freeze하고 top layer(FC)를 Food-101 클래스에 맞게 구현하여 학습했다
VGG16은 학습속도가 너무 느렸고, ResNet50을 사용해서 정확도 42.84%를 달성했다.
InceptionV3 모델을 사용하며 base layer를 unfreeze하고 실험한 결과 top 쪽에 몇 레이어를 unfreeze하면(feature extractor에서 FC쪽에 가까운 CNN layer를 말하는듯) top layer만 고정하는 것 보다 성능이 더 좋았다.
그리고 전체 layer를 unfreeze하면 학습이 너무 느렸다.
앞선 방법을 사용하여 성능을 61.35%까지 올렸다.
Results and Discussion
서로 헷갈릴 가능성이 높은 음식 클래스를 살펴보면, 시각적으로 매우 유사하게 표현된 음식 클래스때문에 top5 정확도가 높은 것이 분명하다.
Conclusion and Future Work
여러 실험을 해봤을 때, AlexNet, VGG16, ResNet50, InceptionV3 중에InceptionV3 ImageNet pretrained model, stage에서 top layer를 unfreeze 해서?( FC에 가까운 feature extractor stage를 unfreeze 했다고 말하는 것 같음)transfer learning을 하였을 때 61.4% 정확도로 가장 좋았다.
이전에 음식이미지를 식별하는데 필요한 일반적인 feature를 미리 잘 학습했기 때문에 transfer learning이 가장 좋았다.
Future work로는 transfer learning 중에 어떤 layer를 freeze할지, 학습가능하게 할지 같은 모델 측면과 하이퍼파라미터 최적화가 포함된다.
bouning box를 추가하면 모델의 성능이 더 향상될 수 있다. Food-101 데이터셋은 음식이미지만 crop하지 않고 다른 noisy한 이미지를 포함하기 때문이다.
또 다른 가능성은 모델의 하위집합을 학습하는 것이다.많은 오류가 유사한 음식을 혼란스러워했기 때문이다. (티라미수 vs. 초콜릿케이크)
예를 들면, 음식 위치의 메뉴? 또는 요리의 정의 같은 이미지가 아닌 정보를 이용하여 top-1 정확도를 높일 수 있을 것이다.
Food-101 dataset을 여러 논문의 모델 또는 scratch 모델로 실험한 논문이다.오분류분석을 하면서 문제가 있을만한 것들을 언급하고 있기 때문에CNN으로 음식 이미지를 이용해 모델링하는 사람들이 왜 잘 안되는지 고민해볼 때 읽으면 도움이 될 논문인 것 같다.