2022. 2. 14. 15:33ㆍ작업/ComputerVision
일단 내가 이 음식 분류 서비스 데모를 테스트해보는 이유는, 우리 팀이 이번에 음식 이미지를 보고 무슨 음식인지 분류해내어 영양관리서비스 또는 외국인들에게 레시피를 제공하는 서비스로 개발을 해나가고 싶기 때문이다.
1안 영양관리서비스
2안 외국인 K음식 레시피제공 서비스
1안
https://aihub.or.kr/aidata/27674/download
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
이 데이터셋은 우리가 원래 1안에서 사용하기로 했던 데이터셋(건강관리 데이터셋) 이 아닌, 성민님이 처음 찾으신 데이터셋 중 하나이다. 2안으로 진행하게 되면 영양성분이 필요 없고, 한국사람들이 자주 먹는 한식위주의 이미지만 있어도 되므로 이를 사용하기도 하고, 아래서 사용할 AI모델이 이 데이터셋으로 training을 진행했길래 이를 채용한다.
그리고 사용할 AI모델 GitHub으로 다음을 선정
https://github.com/djagusgh/EMO
우리와 비슷한 주제로 2019년에 진행하신 EMO라는 팀의 프로젝트이다.
+ tensorflow를 활용해 내가 예전에 해봤던 training 도 pytorch보다 훨씬 쉬울 것 같고, M1칩을 사용하시는 컴퓨터에서도 잘 돌아갈 것으로 보인다. 그리고 데이터 전처리부터 채용한 모델의 이유와 정확도 개선 과정이 매우 친절하게 ipynb에 설명되어있어서 코드를 실행하고 이해하기도 쉬워보인다.
또한, 1안의 aihub같은 경우는 데이터가 좀 json 파일이며 yolo파일이며 복잡하게 구성되어 있는데 이는 단순 classfication에 집중하여 training, test, validation을 split하기도 매우 간편하다.
우리는 여기에 더해서 레시피까지 찾아주는 걸 해볼까 한다.
아래 링크는 만개의 레시피에서 jpg 음식 이미지들을 크롤링 해오는 링크인데 혹시 필요할까봐 첨부해보았다.
https://yong0810.tistory.com/7?category=959340
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. 만개의 레시피
추천순으로 가장 맨 첫 번째에 있는 레시피로 들어가서
이렇게 selenium으로 직접 크롤링을 짜도 될 것 같고
아래는 만개의 레시피에서 레시피들을 크롤링 해오는 법에 대한 링크이다.
2. 유튜브 링크
유튜브 링크는 딱히 크롤링은 필요없고 관련성 필터로 가장 위에 있는 동영상 링크를 가져오면 될 것 같다
대신 외국인도 봐야 하므로 검색 쿼리를 '가지볶음+Eng' 으로 검색한다
3. 번역기
걱정되는 점이 레시피를 일반 사람들이 작성하는 것이다 보니 특수문자나 줄임말(아빠숟갈, 존맛 등..) 이 있으면 어떻게 번역을 할 것인가 였는데, 레시피에 저런 줄임말을 적는 경우는 뭐 어쩔 수 없는 것 같고, 일단 대부분의 레시피의 경우 구글번역기 상에서는 잘 번역되는 것 같다.
일단 만개의 레시피를 잘 해석하는 것 같긴 하다.
구글번역기에 돌렸을 때 괜찮다는 것을 확인하였으니 아래는 이 구글 번역기를 python 에서 사용하는 방법에 대한 링크이다.
https://blockdmask.tistory.com/540
4. 구매사이트 크롤링
이제 외국인들에게 식자재를 검색해줘야 한다.
- 아마존
근데 문제는 한국 식재료가 amazon에는 검색결과가 음식이 아닌 경우도 있었다.
이럴 경우, cutlassfish 대신할만한 물고기를 대신 검색해주는.. 기능도 필요할 것으로 보인다.
식자재의 현지화가 필요할 것으로 보인다. 비슷한 식감, 맛의 음식으로 우리가 수작업으로 대체!
-> 그러나 메뉴가 150개밖에 되지 않으므로.. 일단 하나하나 우리가 다 대체해줘도 될 것 같다.
아무튼, 외국인들에게 식자재를 아마존.com에서 제공하는 게 나쁘지 않다고 생각되었다.
그럼 아마존의 검색결과를 어떻게 제공할 것인가. 두 가지 가능한 사안이 있다.
a. 위에 검색한 것처럼 쿼리 하나하나 직접 크롤링 -> 그러나 이도.. 150개 메뉴뿐이고.. 일단 추가는 우리가 직접 하면 되니까 나쁘지 않다고 생각한다.
b. 아래 링크 활용해서 파이썬용 아마존 API 이용
https://python-amazon-product-api.readthedocs.io/en/latest/
오.. 아마존 검색결과 API를 파이썬 언어로 제공한다고 하니 이걸 사용하면 음식 식재료 크롤링은 하지 않아도 될 것 같다. 매우 좋다!
5. 실제 외국인들이 넣을 만한 음식 사진
그럼 이제 실제로 외국인들이 어떤 음식들을 넣을 지에 대한 경우를 생각해보자
두 가지 경우가 있다. a,b
a. 한국에 여행 와서 식당에 들어가서 음식을 촬영해서 업로드함
외국인 David가 음식 먹기 전 사진을 찍음, 또는 여행 도중, 또는 고국에 돌아가고 나서 한번 먹어본 음식에 대해 너무 맛있어서 폰에 저장해놨던 음식 사진을 우리 서비스에 업로드함
b. 한국 드라마,영화를 보고 스크린샷을 찍어서 첨부함
또는 그냥 저 스크린샷만 찍어줘도 우리 모델이 알아서 그릇들을 detection해서 여러 음식이 들어있는 사진을 업로드해도 알아서 음식을 나눠주는 기능까지 추가하면 좋을 것 같다.
역시 드라마 속 장면이므로 외국인들에게 음식만 crop해서 업로드해달라고 가이드라인을 잡아줘야할 것 같다.
6. 서비스 플로우
외국인이 한식 사진을 업로드 -> 우리가 가진 150개의 메뉴(가지무침,갈치구이...) 중에서 짜장면인지 갈비찜인지 갈치구이인지 분류 -> 만개의 레시피에서 식재료와 레시피를 번역해서 제공 -> 아마존에서 갈치를 구하긴 힘드니까 정말 레시피에 적용할 수 있는 대체할만한 식재료(정어리,고등어 등)으로 우리가 아마존 구매링크와 정보를 제공해줌.
'작업 > ComputerVision' 카테고리의 다른 글
22.02.09 윈도우에서 pf-afn 환경설정 + 인공지능 가상 옷 피팅 (Virtual Try On) demo 돌려보기 (0) | 2022.02.09 |
---|---|
22.02.06 교통표지판 이미지 분류 프로젝트 공부 (0) | 2022.02.07 |
22.01.30 윈도우에 tensorflow GPU까지 연결해서 환경설정하기(cuDNN, CUDA, tensorflow, 1050Ti) (0) | 2022.01.30 |
22.01.28(중요) Tensorflow로 배우는 CNN 핵심정리 (0) | 2022.01.29 |
22.01.19 CNN(Convolutional Neural Network) (0) | 2022.01.22 |