본문 바로가기
딥러닝

AI 모델로 한식 구별하기 - 딥러닝으로 한식 도감 만들기

by 짱태훈 2024. 11. 14.
728x90

1. 프로젝트 목표

  1. 프로젝트 목표
  2.  데이터셋의 전반적인 구성

2. 기대 효과

  1. 한식에 대한 접근성 향상
  2. 한식 관련 서비스와 응용 프로그램에 활용
  3. 관광 산업과 연계한 경제적 효과

3. 요약

  1. 프로젝트 흐름도
  2. 결과

4. 분석 대상 확인

  1. 이미지 샘플 확인

5. 모델 훈련

  1. VGG19
  2. GoogleNet(InceptionResNetV2)
  3. EfficientNetB3 - 미세 조정1
  4. EfficientNetB3 - 미세 조정2
  5. 종합

6. 결론


1. 프로젝트 목표

1. 프로젝트 목표

출처 freepik, https://kr.freepik.com/vectors/%ED%95%9C%EC%8B%9D

이 프로젝트의 목표는 외국인의 한국 음식에 대한 접근성과 이해도를 높이는 것을 목표로 한다. 한식 이미지 데이터셋을 기반으로 딥러닝 모델을 개발하여, 145개 카테고리로 분류된 한식을 자동으로 식별하는 것이다. 한국 음식은 한국인에게는 익숙하고 구분하기 쉬운 반면, 외국인에게는 생소하고 구별이 어려울 수 있다. 따라서, 한식에 관심이 있거나 한식을 처음 접하는 외국인들이 사진만으로도 해당 음식이 어떤 종류인지 쉽게 파악하고 이해할 수 있도록 돕는 모델을 만드는 것을 목표로 한다. 이를 통해 한식에 대한 외국인의 이해를 돕고 관심을 높이는 데 기여하고자 한다.

 

2. 데이터셋의 전반적인 구성

프로젝트에 사용된 이미지 데이터셋은 Ai-hub에서 다운로드 받았다. 데이터셋의 구성은 다음과 같다.

구이         ... 기타    
갈비구이 갈치구이 고등어구이 ... 경단 꿀떡 ... 과메기 양념치킨 ...

총 25개의 대분류로 구분되며, 145개의 소분류로 구분된다. 각각의 소분류마다 1000장의 이미지를 가지고 있어 총 145,000개의 이미지 데이터셋이다. 이때 기본적으로 각각의 소분류 음식에서 5%를 validation 데이터로 사용했다. 결과적으로 유효하지 않은 이미지를 제거한 후 142,642개의 이미지 데이터를 이용했으며, train: 135,450장, validation: 7,192장의 이미지로 구분했다.

total train validation
142,642 135,450 7,192

 

2. 기대 효과

1. 한식에 대한 접근성 향상

외국인들이 한식의 다양한 종류를 쉽게 구분하고 이해할 수 있게 도와줄 수 있다. 특히, 한국 음식의 생김새와 이름이 낯선 외국인에게, 이미지를 통해 간편하게 해당 음식의 정보를 제공함으로써 한식을 친숙하게 느낄 수 있도록 도와줄 수 있다.

예를 들어, 한식 메뉴를 사진으로 인식하여 음식을 추천하거나 설명할 수 있는 애플리케이션을 통해 외국인 관광객들이 레스토랑이나 시장에서 접하는 한식에 대해 더 쉽게 정보를 얻을 수 있게 되어,  음식 선택에 대한 자신감을 줄 수 있다.

 

2. 한식 관련 서비스와 응용 프로그램에 활용

외국인을 대상으로 한식 소개, 레시피 제공, 맛집 추천 등 다양한 서비스와 어플리케이션에 활용될 수 있다.

예를 들어, 한식의 이미지를 인식하여 음식의 이름과 관련 정보를 제공하는 어플리케이션은 외국인의 편의를 높이고 한식에 대한 이해를 도울 수 있다.

 

3. 관광 산업과 연계한 경제적 효과

외국인 관광객을 대상으로 한식에 대한 정보와 추천을 제공하여 한국의 관광 산업 활성화에 기여할 수 있다. 한식을 쉽게 이해하고 경험할 수 있는 가이드로 활용되면서 관광객의 만족도를 높이고, 한식 체험 프로그램을 포함한 한식 관광 상품의 질을 향상시킬 수 있다.

 

3. 요약

1. 프로젝트 흐름도

 

2. 결과

 

기준점이 없기 때문에 VGG19 모델을 기준으로 상식 수준의 기준점을 임의로 설정했다. 미세 조정의 경우 앞부분 60%에 해당하는 것만 동결을 한 후 다른 층에 대해서는 동결을 하지 않았다. VGG19 모델의 결과는 train-accuracy: 0.6462, train-loss: 1.2476, validation-accuracy: 0.4166, validation-loss: 2.5885의 결과가 나왔다.

train-accuracy train-loss validation-accuracy validation-loss
0.6462 1.2476 0.4166 2.5885

뿐만 아니라 직접 수집한 이미지를 기반으로 예측을 진행했을 때  정확도가 69.70%가 나왔다. 직접 수집한 이미지는 '제육볶음', '조기구이', '콩나물국', '떡볶이', '훈제오리', '후라이드치킨', '육회', '떡꼬치', '파김치', '족발', '된장찌개' 총 11개의 소분류로 구성되어 있으며 각각 세 장의 이미지를 수집해 총 33장의 이미지를 예측에 사용했다. 아래의 사진은 예측에 실패한 음식 사진이다.

 

사진1, 출처: 네이버 이미지

가장 좋은 성능을 보여준 모델은 EfficientNetB3이다. EfficientNetB3 모델을 이용해 두 개의 버전으로 나누어 학습을 진행했다. 그 중 가장 좋은 성능을 보여준 것은 두 번째 버전으로 미세 조정을 위해 앞 50개의 층을 동결한 후 각 소분류 마다 validation 비율 0.02%, batch size: 32, BatchNormalization층의 경우 동결을 하고 학습을 진행했다. 결과적으로 train-accuracy: 0.8988, train-loss: 0.3264, validation-accuracy: 0.8424, validation-loss: 0.5925의 결과가 나왔다.

train-accuracy train-loss validation-accuracy validation-loss
0.8988 0.3264 0.8424 0.5925

직접 수집한 이미지를 기반으로 예측을 진행했을 때  정확도가 100.00%가 나왔다. 아래의 사진은 예측한 음식 사진이다.

사진2, 출처: 네이버 이미지

 

4. 분석 대상 확인

1. 이미지 샘플 확인

[한국과학기술연구원, "한국 이미지(음식)", Aihub, 2019년 12월 수정, 2024년 11월 접속,
https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&dataSetSn=79]

 

AI-Hub

샘플 데이터 ? ※샘플데이터는 데이터의 이해를 돕기 위해 별도로 가공하여 제공하는 정보로써 원본 데이터와 차이가 있을 수 있으며, 데이터에 따라서 민감한 정보는 일부 마스킹(*) 처리가 되

www.aihub.or.kr

이미지는 앞에서 확인했 듯 유효한 이미지는 총 142,642개로 구성되어 있다. 음식 사진은 다음과 같다.

사진3

모델의 성능을 확인해 보고 직접 수집한 아래의 사진들을 모델을 이용해 예측해보고자 한다. 총 33개의 음식 사진으로 구성되어 있다.

사진4, 출처: 네이버 이미지

 

5. 모델 훈련

이번 프로젝트에서는 데이터 증강 기법을 적용하지 않았다. 이유는 각 소분류마다 1,000개의 이미지가 존재하며, 대부분의 이미지가 중앙에 위치한 고화질 사진이기 때문이다. 일반적으로 음식 사진은 피사체가 중앙에 선명하게 위치하도록 촬영되므로, 증강 기법으로 이미지를 변형하는 과정이 오히려 모델의 성능에 부정적인 영향을 줄 가능성이 있다고 판단했다.

또한, 한국 음식 이미지는 이미지넷에 포함되지 않은 데이터이기 때문에 사전 훈련된 모델의 가중치를 이미지넷으로 설정했으며, 일부 앞부분만 동결하고 나머지 레이어는 동결하지 않았다. 이를 통해 모델이 한국 음식의 특성에 맞게 더 잘 학습할 수 있도록 유연성을 부여했다.

 

1. VGG19

IMAGE_SIZE: 224, BATCH_SIZE: 64

accuracy: 0.6462 - loss: 1.2476 - val_accuracy: 0.4166 - val_loss: 2.5885

learning_rate는 0.001로 진행했으며, Pretrained 모델을 이용했기 때문에 Fine Tuning 즉, 미세 조정의 경우 앞부분 60%에 해당하는 것만 동결을 한 후 다른 층에 대해서는 동결을 하지 않았다. include_top은 False로 진행했다. 특히, VGG19 모델의 경우 프로젝트에 사용된 이미지 데이터셋을 이용한 기준점이 없기 때문에 상식 수준의 기준점을 임의로 만들기 위해 가장 처음에 사용한 방법이다. 따라서 다른 모델에 비해 훈련 성능, 검증 성능 모두 낮은 결과를 보여준다. 하지만 예상했던 성능보다 좋은 성능을 보여주었기 때문에 기준점으로의 활용으로 적합했다고 생각한다.

직접 수집한 11개의 소분류 음식 사진을 대상으로 예측을 진행했을 때 사진5를 통해 33개의 테스트 이미지에서 10개의 이미지를 예측하는데 실패한 것을 확인할 수 있다. 즉, 정확도는 69.70%라고 볼 수 있다. 한가지 아쉬운 점은 제육볶음을 불고기로 예측한 점이다. VGG19의 구조가 다른 모델에 비해 상대적으로 깊지 않고, 한국 음식처럼 이미지넷 데이터셋과 특성이 다른 데이터를 학습하는 데 최적화되지 않아 기대에 비해 낮은 성능을 보여주었다고 판단하고 있다.

사진5, 출처: 네이버 이미지

 

2. GoogleNet(InceptionResNetV2)

IMAGE_SIZE: 300, BATCH_SIZE: 64

accuracy: 0.8651 - loss: 0.4469 - val_accuracy: 0.7781 - val_loss: 0.8275

learning_rate는 0.001로 진행했으며, Pretrained 모델을  이용했다. 특히, Fine Tuning 즉, 미세 조정의 경우 앞부분 30%에 해당하는 것만 동결을 한 후 다른 층에 대해서는 동결을 하지 않았다. 또한, learning rate scheduler를 사용해 학습 초기에는 높은 학습률로 빠르게 학습하다가 후반부로 갈수록 낮춰주는 방식을 적용했다. 추가적으로 ModelCheckpoint를 이용해 EarlyStopping을 사용하지 않고 최고 성능을 보여주는 지점에서 모델 파일을 저장을 했다. InceptionResNetV2의 경우 VGG19 보다 수치상으로 더 좋은 성능을 보여주고 있다. 하지만 사진6을 보면 검증 정확도는 초기에는 상승하다가 일정 수준에서 정체되거나 미세하게 하락하고 있다.. 이는 모델이 훈련 데이터에 과도하게 맞춰졌지만, 검증 데이터에서는 일반화가 잘 되지 않고 있다고 볼 수 있다. 또한, 검증 손실은 초기에는 감소하다가 이후 다시 상승하고 있다. 검증 손실이 더 이상 줄어들지 않고 상승하는 것은 과적합이라고 볼 수 있다.

사진6

직접 수집한 11개의 소분류 음식 사진을 대상으로 예측을 진행했을 때 33개의 테스트 이미지에서 5개의 이미지를 예측하는데 성공한 것을 확인할 수 있다. 즉, 정확도는 15.15%라고 볼 수 있다. 학습의 결과로 비교적 좋은 성능을 보여주었지만 실제 사용에서의 성능은 가장 좋지 않았다.

 

3. EfficientNetB3 - 미세 조정1

IMAGE_SIZE: 300, BATCH_SIZE: 64

accuracy: 0.9878 - loss: 0.0369 - val_accuracy: 0.8771 - val_loss: 0.7107

EfficientNetB3 모델을 이용해 두 개의 버전으로 나누어 학습을 진행했다. 그 중 첫 번째 버전으로 미세 조정을 위해 앞 50개의 층을 동결한 후 각 소분류 마다 validation 비율 5%, batch size: 64, BatchNormalization층의 경우 동결하지 않고 학습을 진행했다. 결과적으로 train-accuracy: 0.9878, train-loss: 0.0369, validation-accuracy: 0.8771, validation-loss: 0.7107의 결과가 나왔다. 또한, learning rate scheduler를 사용해 학습 초기에는 높은 학습률로 빠르게 학습하다가 후반부로 갈수록 낮춰주는 방식을 적용했다. 추가적으로 ModelCheckpoint를 이용해 EarlyStopping을 사용하지 않고 최고 성능을 보여주는 지점에서 모델 파일을 저장했다. EfficientNetB3 미세 조정1의 경우 이전 모델에 비해 좋은 성능을 보여주었지만, 사진7을 보면 알 수 있듯이 훈련 손실이 매우 낮은 반면, 검증 손실이 높아 과적합을 보여주고 있다.

사진7

직접 수집한 11개의 소분류 음식 사진을 대상으로 예측을 진행했을 때 사진7를 통해 33개의 테스트 이미지에서 9개의 이미지를 예측하는데 실패한 것을 확인할 수 있다. 즉, 정확도는 72.73%이라고 볼 수 있다.

사진8, 출처: 네이버 이미지

 

4. EfficientNetB3 - 미세 조정2

IMAGE_SIZE: 300, BATCH_SIZE: 32

# ModelCheckpoint - epoch 8
accuracy: 0.8988 - loss: 0.3264 - val_accuracy: 0.8424 - val_loss: 0.5925

# 최종
accuracy: 0.9602 - loss: 0.1257 - val_accuracy: 0.8555 - val_loss: 0.7016

EfficientNetB3 모델을 이용해 두 개의 버전으로 나누어 학습을 진행했다. 그 중 가장 좋은 성능을 보여준 것은 두 번째 버전으로 미세 조정을 위해 앞 50개의 층을 동결한 후 각 소분류 마다 validation 비율 2%, batch size: 32, BatchNormalization층의 경우 동결을 하고 학습을 진행했다. 특히, BathNormalization층을 동결하는 것이 학습에 더 좋은 영향을 준다는 것은 케라스 문서를 통해 확인할 수 있었다.

https://keras.io/examples/vision/image_classification_efficientnet_fine_tuning/

 

Keras documentation: Image classification via fine-tuning with EfficientNet

► Code examples / Computer Vision / Image classification via fine-tuning with EfficientNet Image classification via fine-tuning with EfficientNet Author: Yixing Fu Date created: 2020/06/30 Last modified: 2023/07/10 Description: Use EfficientNet with weig

keras.io

 

결과적으로 train-accuracy: 0.8988, train-loss: 0.3264, validation-accuracy: 0.8424, validation-loss: 0.5925의 결과가 나왔다. 미세 조정2 역시 learning rate scheduler를 사용해 학습 초기에는 높은 학습률로 빠르게 학습하다가 후반부로 갈수록 낮춰주는 방식을 적용했다. 추가적으로 ModelCheckpoint를 이용해 EarlyStopping을 사용하지 않고 최고 성능을 보여주는 지점에서 모델 파일을 저장했다.

EfficientNetB3 미세 조정1의 경우 이전 모델에 비해 매우 좋은 성능을 보여 주었다. 하지만 사진9를 보면 최종적으로는 훈련 정확도가 0.96으로 매우 높고 검증 정확도는 0.85 수준에서 수렴했으며, 검증 손실이 ModelCheckpoint 시점에 비해 다소 상승한 것을 확인할 수 있다. 따라서 학습이 진행되면서 모델이 훈련 데이터에 과적합되었을 가능성이 있다. 직접 수집한 사진을 대상으로 성능은 정확도가 100.00%가 나왔으며, 예측한 사진의 경우 앞에서 이미 설명했기 때문에 생략하겠다.(사진2 참조)

사진9
사진10

하지만 사진10을 보면 성능이 높은 클래스들에서는 높은 점수를 보여주고 있다. 성능이 낮은 클래스에 대해서는 비교적 낮은 점수를 보여준다는 점에서 한계점을 가지고 있다.

 

5. 종합

앞의 결과를 통해 EfficientNetB3의 미세 조정2가 가장 좋은 성능을 보여주었다. 이전 모델을 진행하면서 미세 조정뿐만 아니라 train, validation size, batch size 등에 대한 정보를 축적하면서 진행했었기에 좋은 성능을 가진 모델을 만들 수 있었다고 판단하고 있다. 하지만 아쉬운 점은 앞에서 봤던 사진10과 같이 성능이 낮은 클래스들에서는 낮은 f1-score를 보여준다. 이 부분에 대해서는 추후 정규화와 데이터 증강 기법을 적용해 보완하고자 한다.

추가적으로 EfficientNetB3의 미세 조정2의 성능을 시험해보기 위해 소분류 음식 9종을 추가해 총 60장의 음식 이미지를 대상으로 예측을 진행했다. 특히, 추가한 소분류는 사진10에서 나온 성능이 높은 클래스, 성능이 낮은 클래스를 추가했다. 또한, 파김치와 부추김치, 떡국과 수제비와 같이 헷갈릴 것 같은 음식을 추가했다. 결과는 정확도가 100.00%가 나왔다. 예측 결과는 아래와 같다.

사진11, 출처: 네이버 이미지

6. 결론

본 프로젝트는 한식의 다양한 이미지를 이용하여 외국인들이 한식을 더 쉽게 이해하고 접근할 수 있도록 딥러닝 모델을 개발하는 데 목표를 두었다. Ai-Hub에서 제공된 145,000개의 한식 이미지 데이터셋을 사용하여 다양한 모델(VGG19, GoogleNet, EfficientNetB3)을 적용하고 미세 조정을 수행했다.

 

프로젝트 진행 과정에서 데이터셋의 대량 이미지 수집은 큰 어려움이 없었으나, 이미지 전처리 과정에서 일부 유효하지 않은 이미지를 제거해야 했기 때문에 오랜 시간이 걸렸다. 결과적으로 총 142,642개의 한식 이미지를 학습에 이용했다.

또한, 이미지넷과는 다른 특성의 한국 음식 이미지를 사용하면서, 모델이 음식의 고유한 특성을 학습하기 위해 시간과 자원이 추가로 요구되었다. 그럼에도 이전 모델 학습 결과를 토대로 방향성을 잡을 수 있었고 배치 크기 조정 및 일부 레이어 동결 등의 조치를 취했다. 그 결과로서 최적의 성능을 EfficientNetB3 모델(미세 조정 2)에서 얻을 수 있었다.

 

EfficientNetB3 모델을 기반으로 최종 평가를 진행한 결과, 직접 수집한 음식 이미지에 대해서는 예측 정확도 100%를 기록하였으며, 실질적으로 높은 수준의 분류 정확도를 달성했다. 그러나 성능이 낮은 클래스에 대해 낮은 f1-score를 보여주는 한계점이 있었다. 이는 향후 데이터 증강 및 정규화를 통해 개선할 것이다.

이 모델이 상용화된다면, 외국인 관광객을 대상으로 한 한식 정보 제공 및 추천 애플리케이션, 식별 애플리케이션 등 다양한 서비스에서 활용 가능할 것이다. 이를 통해 한식에 대한 이해도를 높이고 한국 관광 산업 활성화에 기여할 수 있을 것으로 기대된다.

728x90