음식 스타일 분류 모델 만들기

Jaykang·2021년 12월 28일
0

transfer learning, fine tuning을 공부하면서 imagenet 기반으로 학습된 모델들이 개미, 강아지를 잘 학습시키는 것은 확인했다. 하지만 실제로 imagenet 기반이 아니거나 내가 원하는 데이터에 모델을 사용하고 싶을 때 어떻게 해야할지 실제로 사용할 수 있을지 알아보고 싶다.

1. 이미지 크롤링

구글 이미지 검색을 통해서 한식, 양식 사진을 구한다. 많은 크롤링 코드들이 있지만 거의 대부분 하드코딩형태로 되어있어서 argparse로 수정해서 검색어, 이미지 개수, 저장 경로를 설정할 수 있도록 만들었다. xpath부분은 변경될 수 있으니깐 코드에 오류가 나면 xpath부분을 확인해보면 좋을 것 같다. warning으로 셀레니움 패키지 element_* 뒤에 제거해주라고하는데 제거해주니 오류가 나서 그냥 그래로 사용했다.

2. fine tuning

pretrain된 VGG16을 불러서 fine tuning해본다 transfer learning의 경우 정확도가 40% 정도로 사용할 수 없는 수준이었다.

  • python 3.10에서는 torch가 아직 호환이 안되나보다. 3.8로 다운그레이드하니깐 설치가 잘 된다.
RuntimeError: output with shape [1, 224, 224] doesn't match the broadcast shape [3, 224, 224]

이런 에러가 발생했는데 이미지에 그레이 스케일인 이미지가 포함되서 그렇다고 한다. 흑백이미지 실제로 이미지를 열어볼려하면 열 수 없는 파일이라 하는데 하나씩 삭제해준다. 삭제할 때 확인해봐도 음식사진은 아니고 이상한 사진이다. 크롤링 단계에서 해결할 문제가 많다고 느낀다.

Epoch 1/5
-------------
100%|██████████| 7/7 [00:00<00:00, 10.71it/s]
  0%|          | 0/25 [00:00<?, ?it/s]val Loss: 0.4417 Acc: 0.7900
Epoch 2/5
-------------
100%|██████████| 25/25 [00:04<00:00,  5.19it/s]
  0%|          | 0/7 [00:00<?, ?it/s]train Loss: 0.4343 Acc: 0.7975
100%|██████████| 7/7 [00:00<00:00, 11.21it/s]
  0%|          | 0/25 [00:00<?, ?it/s]val Loss: 0.4030 Acc: 0.7850
Epoch 3/5
-------------
100%|██████████| 25/25 [00:06<00:00,  4.01it/s]
  0%|          | 0/7 [00:00<?, ?it/s]train Loss: 0.3877 Acc: 0.8214
100%|██████████| 7/7 [00:00<00:00, 11.15it/s]
  0%|          | 0/25 [00:00<?, ?it/s]val Loss: 0.4062 Acc: 0.8050
Epoch 4/5
-------------
100%|██████████| 25/25 [00:04<00:00,  5.23it/s]
  0%|          | 0/7 [00:00<?, ?it/s]train Loss: 0.3541 Acc: 0.8390
100%|██████████| 7/7 [00:00<00:00, 11.16it/s]
  0%|          | 0/25 [00:00<?, ?it/s]val Loss: 0.3882 Acc: 0.8350
Epoch 5/5
-------------
100%|██████████| 25/25 [00:04<00:00,  5.10it/s]
  0%|          | 0/7 [00:00<?, ?it/s]train Loss: 0.3085 Acc: 0.8679
100%|██████████| 7/7 [00:00<00:00,  9.97it/s]
val Loss: 0.3880 Acc: 0.8250

vgg로 이미지 크롭, 정규화만 해주고 fine tuning만 해줘도 성능이 40% 정도 개선된다. 생각보다 많이 좋다.

EfficientNet

image classification에서 좋은 성능을 낸 모델중에 pretrain된 모델을 공개한게 efficentnet이고 사용하는 것도 정말 간단해서 활용해보도록한다.

from efficientnet_pytorch import EfficientNet
model = EfficientNet.from_pretrained('efficientnet-b0', num_classes = 2)

이렇게 해주면 끝이다.

우선 b0모델 transfer learning으로만 test set 정확도 90%까지 향상시키는 것을 확인했다. b7모델의 경우는 50%로 역시 모델이 크다고 무조건 좋은건 아니다.

Conclusion

간단한 fine tuning 작업을 해봤는데 무작위로 크롤링한 이미지를 90%정도 까지 맞추면 실제로 사용할 수 있을 것 같다고 느꼈다. 크롤링 작업에서는 한식, 이탈리아 음식이라고 사진을 저장해봐도 가끔 이상한 사진이 있거나 너무 여러가지 음식들이 한 이미지에 존재하는 경우가 있었다. 실제로 작업을 하게된다면 object detection이나 다른 방법으로 크롤링한 이미지에 대한 전처리를 어떻게 해주는지가 중요할 것 같다. 모델은 이미 너무 많이 고도화 된 것 같고 food101이라는 데이터셋으로 학습한 모델을 굳이 사용할 필요성을 이번에는 못느꼈다.

profile
Just Do

0개의 댓글