YOLO를 활용한 식재료 분류 및 요리 레시피 추천 딥러닝 프로젝트#1

테리·2024년 10월 28일
0

1인 가구가 증가하고 특히나 오늘은 무엇을 먹을지 고민하는 것들은 특히나 자취를 하는 사람들에게는 언제나 고민이 되는 부분이다. 이런 부분들을 조금 더 수월하게 해결하기 위해 냉장고 속 식재료를 YOLO 모델을 통해 인식하고 해당 재료로 만들어 먹을 수 있는 음식과 레시피를 추천하면 어떨까에 대한 생각을 가지고 프로젝트를 시작하게 되었다.

식재료 사진 수집 및 라벨링

38개의 식재료를 정했고 팀원들 각자가 7~8개의 식재료를 맡아 한개의 식재료당 약 50개의 사진을 수집하기로 했다.

식재료를 라벨링한 데이터가 있으면 프로젝트를 더 쉽게 할 수 있지만, 굳이 찾아보지는 않았다. 오히려 직접 라벨링하는 경험 또한 좋은 경험이 될 것 같아 각자가 직접 라벨링을 해보기로 했다.

labelme라는 프로그램을 활용해 라벨링 작업을 진행했다.

Anaconda prompt를 열어 conda 환경에서 설치를 진행해 아래의 명령어로 labelme 라이브러리를 설치함.

conda install -c conda-forge labelme

실행은 간단하다. 해당 프롬프트에서 설치 후 labelme를 입력하고 실행하면 된다.

라벨링하는 몇가지의 프로그램이 있지만 labelme는 단순 bounding box만 그리는 것이 아니라 해당 사물의 형태를 따라 bounding box를 그릴 수 있다.

이미지는 직접 촬영하기 어려워 여러 이커머스 사이트에서 크롤링을 하거나 구글에서 직접 가져온 이미지를 사용했다. 상업적으로 사용하는 것이 아니라 학습용으로만 사용할 거여서 문제는 없을 듯 한데... 솔직히 이 부분은 잘 모르겠다.

문제점 및 고민

[고민]
라벨링을 하기전에 한가지 걱정이 있었다.
식재료당 50개의 이미지가 충분할까? 라는 생각을 했었다.
하지만 하나의 이미지에 해당 식재료가 여러개 있는 이미지가 많아 내가 라벨링 한것만 생각하면 1000개가 넘는 것으로 보여 우선 괜찮을 것이라고 생각했다. 이후 학습을 통해 인식을 못한다면 그때 다시 보완하면 될것이라 판단했다.

[어려웠던 점]
라벨링하면 가장 힘들었던 부분은 bounding box를 수동으로 다 하는 것이었다. 사각형으로 bounding box를 그리면 수월했겠지만 재료의 모양에 맞춰 하다보니 나중에는 손목이 너무 아팠다.
그리고 또한 뭉쳐있는 재료를 다 하나씩 라벨링 해야 할지 뭉쳐있는 재료 그 자체로 라벨링 할지 고민하다 적절히 섞어가면서 해보기로 결정했다.

lebelme2yolo

YOLO를 학습시키기 위해서는

라벨의 이름(번호), center_x, center_y, width, height 로 이루어진 txt파일

로 저장되야한다.

labelme는 json 파일로 라벨링 결과가 저장되므로 lebelme2yolo를 통해 txt 파일로 변환해주면 된다.

https://github.com/rooneysh/Labelme2YOLO

  1. labelme2yolo.py를 깃허브에서 다운로드
  2. 하나의 폴더 안에 labelme2yolo.py와 이미지, json 파일이 들어있는 폴더를 만들고 labelme2yolo.py가 있는 폴더 위치에서 터미널로 아래 코드 실행

/home/username/labelme_json_dir/: 이미지 파일과 json 파일이 있는 폴더 경로

# 경로는 전체경로 말고 터미널이 있는 위치 이후의 경로 ex) ./~~/~~/
python labelme2yolo.py --json_dir /home/username/labelme_json_dir/ --val_size 0.2
  1. .yaml 파일과 images, labels로 폴더가 나눠진 것을 확인
  2. 아래와 같은 코드로 코드 실행 후 결과 확인
  3. 주의!! yaml 파일속에 있는 train, val 파일 경로나 다른 기타 파일들의 경로가 잘못되면 제대로 실행이 안되니 경로 꼭 확인 필요. 구글 코랩에서 실행시 코랩 경로에 맞게 다시 수정해야함.
from ultralytics import YOLO

# Load a model
model = YOLO("yolo11n.pt")

# Train the model
train_results = model.train(
    data="/content/drive/MyDrive/labelme_json_dir/YOLODataset/dataset.yaml",  # path to dataset YAML
    epochs=30,  # number of training epochs
    imgsz=320,  # training image size
    #device="cpu",  # device to run on, i.e. device=0 or device=0,1,2,3 or device=cpu
)

# Evaluate model performance on the validation set
metrics = model.val()

# Perform object detection on an image
results = model('/content/drive/MyDrive/labelme_json_dir/YOLODataset/images/val/hairtail_19.png')
results[0].show()

# Export the model to ONNX format
path = model.export(format="onnx")  # return path to exported model

epoch를 30으로 했는데도 각각의 갈치를 모두 인식!!
그래도 하나씩 라벨링한 보람이 있구만!

인터넷에서 새로운 이미지 다운받아서 해본 결과 갈치는 잘 분별되는 것 같다.

닭고기 이미지도 인식 확인

0개의 댓글