22.02.13 인공지능 음식 분류 서비스 데모 테스트 및 기획

2022. 2. 14. 15:33작업/ComputerVision

일단 내가 이 음식 분류 서비스 데모를 테스트해보는 이유는, 우리 팀이 이번에 음식 이미지를 보고 무슨 음식인지 분류해내어 영양관리서비스 또는 외국인들에게 레시피를 제공하는 서비스로 개발을 해나가고 싶기 때문이다.

 

1안 영양관리서비스

2안 외국인 K음식 레시피제공 서비스


1안

https://aihub.or.kr/aidata/27674/download

 

건강관리를 위한 음식 이미지 다운로드 | AI 허브

당뇨병 환자의 식단 관리를 위한 주재료 및 칼로리 정보가 포함된 음식 이미지 데이터

aihub.or.kr

1안에서 사용할 데이터셋이다. aihub의 위의 음식 분류 이미지 데이터셋과 모델을 사용하기로 했다.

영양정보와 3000종의? 음식사진이 있다. 그런데 용량이 너무 커서.. validation 데이터만 사용해야 하고, 이를 또 train, test, vali로 새로 split해야 한다. 그 과정은 아직 모른다.

 

일단 관련 코드를 다운받고 위와 같은 파일 구성을 마친다.

이 데이터 모델은 EfficientNet과 YOLO v4를 사용했으며, annotation을 수행하여 훈련 데이터를 구성하게 된다.

학습:검증:평가 를 8:1:1로 진행하는 게 제일 좋으나, 훈련시 학습:검증을 9:1로 하는 것이 이 모델의 최적 방법이라고 한다.

 

아래는 위 ai hub에서 제공한 가이드라인이다.. 그런데 무슨 말인지 잘 모르겠다..

 

- 데이터 준비

1 이미지의 위치는 상관 없으나, json파일이 같은 폴더 안에 구성되어야 한다. json -> yolo 파일 포맷 (class_id, center_x, center_y, width, height)의 tuple로 저장한다

2 데이터가 준비되면 training data: validation data의 비율에 따라 train.txt, val.txt에 나누어 목록을 만든다.

3 class/label/category를 나타내는 목록은 ./yolo/data/food/food-classes.names에 넣어져야 한다.

 

- training

1 데이터가 준비되면 ./yolo/config/food-darknet-v1.data 에 훈련에 사용할 train list, validation list, 클래스 정의 및 본인의 환경에 맞게 정해주면 된다.

2 docker 를 통해 미리 만들어진 container로 들어간다

(sudo docker run --gpus all -it -v ~/workspace:/workspace --ipc=host sangkny/darknet:yolov4 /bin/bash

3 docker 내에서 training을 수행한다. 

 

- inference

위와 같은 방법으로 학습을 진행하였으면 훈련된 모델에 대한 테스트를 conda 가상환경에서 진행해라.

inference test는 food_classifier_yolo.py 코드를 실행시키면 된다.

설명해준 이 영상속 GitHub를 들어가봐도 없는 링크라고 뜬다...ㅠ


무슨 말인지 잘 모르겠어서 2안인 K음식.. 한식을 외국인들에게 분류, 레시피를 제공한다는 서린님 아이디어로 진행해보자!

 

2안

https://aihub.or.kr/aidata/13594

 

한국 이미지(음식)

한국 음식 150종(종별 약 1천 장)의 데이터를 구축한 이미지 데이터 제공

aihub.or.kr

이 데이터셋은 우리가 원래 1안에서 사용하기로 했던 데이터셋(건강관리 데이터셋) 이 아닌, 성민님이 처음 찾으신 데이터셋 중 하나이다. 2안으로 진행하게 되면 영양성분이 필요 없고, 한국사람들이 자주 먹는 한식위주의 이미지만 있어도 되므로 이를 사용하기도 하고, 아래서 사용할 AI모델이 이 데이터셋으로 training을 진행했길래 이를 채용한다.

 

그리고 사용할 AI모델 GitHub으로 다음을 선정

 

https://github.com/djagusgh/EMO

 

GitHub - djagusgh/EMO: 한식 분류 딥러닝 모델을 활용해 한국 내 외국인들에게 맞춤형 정보를 제공하

한식 분류 딥러닝 모델을 활용해 한국 내 외국인들에게 맞춤형 정보를 제공하는 안드로이드 앱 - GitHub - djagusgh/EMO: 한식 분류 딥러닝 모델을 활용해 한국 내 외국인들에게 맞춤형 정보를 제공하

github.com

우리와 비슷한 주제로 2019년에 진행하신 EMO라는 팀의 프로젝트이다.

 

+ tensorflow를 활용해 내가 예전에 해봤던 training 도 pytorch보다 훨씬 쉬울 것 같고, M1칩을 사용하시는 컴퓨터에서도 잘 돌아갈 것으로 보인다. 그리고 데이터 전처리부터 채용한 모델의 이유와 정확도 개선 과정이 매우 친절하게 ipynb에 설명되어있어서 코드를 실행하고 이해하기도 쉬워보인다.

또한, 1안의 aihub같은 경우는 데이터가 좀 json 파일이며 yolo파일이며 복잡하게 구성되어 있는데 이는 단순 classfication에 집중하여 training, test, validation을 split하기도 매우 간편하다.

 

우리는 여기에 더해서 레시피까지 찾아주는 걸 해볼까 한다.

 

아래 링크는 만개의 레시피에서 jpg 음식 이미지들을 크롤링 해오는 링크인데 혹시 필요할까봐 첨부해보았다.

https://yong0810.tistory.com/7?category=959340 

 

머신러닝을 사용한 음식 분류 프로젝트 (1)

프로젝트 내용 음식 사진이 주어지는 경우 어떤 음식인지 분류한다. 프로젝트 기간 2020.08.10 (월) ~ 2020.11.09 (월) 프로젝트 진행 과정 데이터 크롤링 데이터 라벨링 데이터 전처리 머신러닝 결과

yong0810.tistory.com

 

 

 

git clone해와서 돌려보려고 하는데 jupyter notebook 커널이 가상환경에 없어서

생성한 가상환경에

pip install jupyter notebook

pip install ipykernel 를 설치한다

training을 위한 16GB짜리 데이터 split

 

대분류
소분류

대분류 12개 x 소분류 150개

EMO GitHub에서 오픈소스로 제공한 tensorflow기반의 음식 분류 ipynb 파일을 돌리니 경로만 잘 내 pc로 설정해서 해준다면 잘 돌아갈 것 같고 training 시키는 것도 더 간단할 것 같다!

음식분류 모델은 이걸로 해결하면 될 것 같고

 

이제 필요한 건 레시피 크롤링이다.

EMO 팀에서 제공해준 코드만 실행하면 이와 같이 데이터셋을 8:1:1로 잘 나누어지고

train, test 모두 ㄱ~ㅎ순으로 다음과 같은 150개의 (소분류)음식종류들이 똑같이 잘 존재하고 있다.

우리는 일단 외국인들에게 딱 여기 존재하는 메뉴들만(150개의 메뉴) 만 음식 분류를 할 것이고,

여기 있는 메뉴들로만 레시피와 유튜브, 식재료 구매 링크 등을 제공해보자

그리고 성공하면, 그 다음에 추가로 데이터셋에 메뉴를 추가한 후 training을 해보고 그 정확도를 확인해보면

메뉴를 더 다양하게 늘릴 수 있을 것 같다.

 

이 폴더명을 기준으로 레시피 크롤링을 진행하면 될 것 같다

1. 만개의 레시피

추천순으로 가장 맨 첫 번째에 있는 레시피로 들어가서

재료 크롤링 div태그
조리순서 크롤링 태그

 

이렇게 selenium으로 직접 크롤링을 짜도 될 것 같고

아래는 만개의 레시피에서 레시피들을 크롤링 해오는 법에 대한 링크이다.

https://da-nika.tistory.com/9

 

 

PYTHON 크롤링을 이용한 만개의 레시피 크롤링 - 1

크롤링 공부를 하면서 항상 숙지해야 할 점이 크롤링 하는 것은 자유지만 타인의 콘텐츠를 무단으로 사용하면 안된다는 것이다. 상업적인 용도로 사용할 때에는 저작권자의 허락을 받아야 한

da-nika.tistory.com

 

 

 

2. 유튜브 링크

유튜브 링크는 딱히 크롤링은 필요없고 관련성 필터로 가장 위에 있는 동영상 링크를 가져오면 될 것 같다

대신 외국인도 봐야 하므로 검색 쿼리를 '가지볶음+Eng' 으로 검색한다

 

 

3. 번역기

걱정되는 점이 레시피를 일반 사람들이 작성하는 것이다 보니 특수문자나 줄임말(아빠숟갈, 존맛 등..) 이 있으면 어떻게 번역을 할 것인가 였는데, 레시피에 저런 줄임말을 적는 경우는 뭐 어쩔 수 없는 것 같고, 일단 대부분의 레시피의 경우 구글번역기 상에서는 잘 번역되는 것 같다.

일단 만개의 레시피를 잘 해석하는 것 같긴 하다.

 

구글번역기에 돌렸을 때 괜찮다는 것을 확인하였으니 아래는 이 구글 번역기를 python 에서 사용하는 방법에 대한 링크이다.

https://blockdmask.tistory.com/540

 

[python] 파이썬 구글 번역 api 사용하기 (최신버전)

안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 구글 번역 api인 googletrans를 사용하는 방법에 대해서 이야기해보려 합니다. <목차> 1. 구글 번역 api 설치 2. 구글 번역 api 예제와 설명 3. google translat

blockdmask.tistory.com

4. 구매사이트 크롤링

이제 외국인들에게 식자재를 검색해줘야 한다.

 - 아마존

가지볶음에 필요한 재료들
번역 진행
가지 식자재 검색결과
고춧가루 식자재 검색결과
갈치 검색결과

근데 문제는 한국 식재료가 amazon에는 검색결과가 음식이 아닌 경우도 있었다.

이럴 경우, cutlassfish 대신할만한 물고기를 대신 검색해주는.. 기능도 필요할 것으로 보인다.

예를 들어 갈치 대신 고등어
갈치 대신 고등어 / 또는 외국인들이 많이 먹는 정어리로

식자재의 현지화가 필요할 것으로 보인다. 비슷한 식감, 맛의 음식으로 우리가 수작업으로 대체!

-> 그러나 메뉴가 150개밖에 되지 않으므로.. 일단 하나하나 우리가 다 대체해줘도 될 것 같다.

 

아무튼, 외국인들에게 식자재를 아마존.com에서 제공하는 게 나쁘지 않다고 생각되었다.

 

그럼 아마존의 검색결과를 어떻게 제공할 것인가. 두 가지 가능한 사안이 있다.

 a. 위에 검색한 것처럼 쿼리 하나하나 직접 크롤링 -> 그러나 이도.. 150개 메뉴뿐이고.. 일단 추가는 우리가 직접 하면 되니까 나쁘지 않다고 생각한다.

 

 b. 아래 링크 활용해서 파이썬용 아마존 API 이용

https://chicpro.dev/python-%ec%95%84%eb%a7%88%ec%a1%b4-%ec%83%81%ed%92%88-%ea%b2%80%ec%83%89%ed%8e%98%ec%9d%b4%ec%a7%80%ec%97%90%ec%84%9c-asin-%ec%a0%95%eb%b3%b4-%ec%88%98%ec%a7%91%ed%95%98%ea%b8%b0/

 

[Python] 아마존 API를 이용한 ASIN 정보 수집 – CHICPRO

 

chicpro.dev

아래 링크는 파이썬용 아마존 API링크이다.

https://python-amazon-product-api.readthedocs.io/en/latest/

 

 

python-amazon-product-api — python-amazon-product-api 0.3-dev documentation

 

python-amazon-product-api.readthedocs.io

오.. 아마존 검색결과 API를 파이썬 언어로 제공한다고 하니 이걸 사용하면 음식 식재료 크롤링은 하지 않아도 될 것 같다. 매우 좋다!

 

 

5. 실제 외국인들이 넣을 만한 음식 사진

그럼 이제 실제로 외국인들이 어떤 음식들을 넣을 지에 대한 경우를 생각해보자

두 가지 경우가 있다. a,b

 

 a. 한국에 여행 와서 식당에 들어가서 음식을 촬영해서 업로드함

이런 식으로 외국인들이 한국에 여행왔다고 가정

외국인 David가 음식 먹기 전 사진을 찍음, 또는 여행 도중, 또는 고국에 돌아가고 나서 한번 먹어본 음식에 대해 너무 맛있어서 폰에 저장해놨던 음식 사진을 우리 서비스에 업로드함

삼겹살 업로드
우리 모델이 그것을 인식
한정식집
한정식 집에서 찍은 사진 업로드
우리 모델이 저 음식을 인식

 b. 한국 드라마,영화를 보고 스크린샷을 찍어서 첨부함 

드라마 속 한식 장면
외국인 유저들에게 이렇게 첨부해달라고 부탁
또는 아예 한 음식만

또는 그냥 저 스크린샷만 찍어줘도 우리 모델이 알아서 그릇들을 detection해서 여러 음식이 들어있는 사진을 업로드해도 알아서 음식을 나눠주는 기능까지 추가하면 좋을 것 같다.

그리괴 우리의 데이터셋에는 웬만한 한국 음식들이 다 있는 것 같다.

역시 드라마 속 장면이므로 외국인들에게 음식만 crop해서 업로드해달라고 가이드라인을 잡아줘야할 것 같다.

넷플릭스 다큐 중 음식 장면
기생충 속 짜파게티 요리 스크린샷 -> 이것 역시 크롭해서 찍어달라고 부탁할지 우리가 알아서 detection해줄지는 더 개선해보면 될듯

6. 서비스 플로우

외국인이 한식 사진을 업로드 -> 우리가 가진 150개의 메뉴(가지무침,갈치구이...) 중에서 짜장면인지 갈비찜인지 갈치구이인지 분류 -> 만개의 레시피에서 식재료와 레시피를 번역해서 제공 -> 아마존에서 갈치를 구하긴 힘드니까 정말 레시피에 적용할 수 있는 대체할만한 식재료(정어리,고등어 등)으로 우리가 아마존 구매링크와 정보를 제공해줌.