2021년 8월 24일 화요일

음식 사진을 인공신경망으로 학습

AI Hub에서 구한 음식 사진을 인공신경망 AlexNet 으로 학습시켜 자동 인식시켜 봅니다.    AI Hub에 나온 음식 사진에 대한 정보는  https://blog.naver.com/yoojchul/222462094712 에서 볼 수 있습니다.

음식 사진이 TrainingValidation으로 나누어져 있는데 Training에 속한 음식 사진의 개수가 2000개를 넘으면서 Validation에 동시에 등장하는 음식을 고르면 315종으로 줄어 듭니다. 아래 jupyter notebook 결과에도 나오지만 Training에는 1,725,576장 사진, Validation에는 216,515장 사진을 사용합니다.



사진의 크기가 들쑥날쑥인데 일정하지 않아도 그대로 학습 가능합니다만 업로드 시간을 줄이기 위해 미리 편집합니다.  각 사진의 크기를 227 X 227로 낮추면 전체 데이터 크기가 800GB에서 90GB 정도로 줄어 듭니다.  학습에 필요한 장비는 데이터 센터에서 유료로 빌려서 사용했는데 사진 크기를 줄여서 데이터 업로드 시간을 절약할 수 있습니다.   



데이터센터에서 빌린 Ubunutu 시스템에 nvidia driver, anaconda 등을 설치하고 아래와 같이 필요한 패키지를 설치합니다.   빌린 ubuntu 장비에는 NVIDIA GPURTX 2080이 있었습니다.

 

# sh NVIDIA-Linux-x86_64-470.63.01.run

# sh Anaconda3-2021.05-Linux-x86_64.sh

# conda create -n tf2

# conda activate tf2

# conda install ipykernel

# conda install jupyter

# conda install tensorflow-gpu 

# conda install matplotlib

# conda install  scikit-learn

# python -m ipykernel install --user --name tf2 --display-name "tf2"

# jupyter notebook --generate-config

Writing default config to: /home/jcyoo/.jupyter/jupyter_notebook_config.py

 

# vi /home/jcyoo/.jupyter/jupyter_notebook_config.py

c.NotebookApp.ip = '0.0.0.0'

 

# jupyter notebook

 

텐서플로 profile 기능을 이용하면 병목이 어디에 있는지 찾아 볼 수 있습니다. Profile에 필요한 tensorbard-plug-profileconda에 없어서 conda 명령어로 설치할 수 없고 pip로 설치해야 합니다.  pip 실행 전에 가상 환경 디렉토리로 이동해야 합니다.

# conda install pip

# cd /home/jcyoo/anaconda3/envs/tf2

# ./bin/pip install tensorboard-plugin-profile

# tensorboard --logdir=./log --bind_all

 

Jupyter notebook으로 진행한 학습입니다.  딥러닝 텐서플로 교과서(서지영 지음, 길벗출판사) 6장에 소개된 프로그램을 이용합니다




최종 학습 결과가 val_accuracy인데 0.2373으로 25%도 넘지 못합니다.

학습 데이터가 충분하지 않아 인식률이 좋지 않을 수도 있고 학습 모델이 음식 사진 인식에  부족해서 생긴 결과일 수 있습니다. 추가 연구가 필요합니다

GPU 사용도 효율적이지 못했습니다.  nvidia-smi로 본 GPU-Util5%에 불과합니다


텐서플로 프로파일을 보면 데이터를 읽어 오는 부분에서 지연이 생기는 것 같습니다.


 

BATCH_SIZE32에서 320으로 키워서 학습 시간은 줄였지만 GPU 활용에는 도움이 되지 못합니다.   From_from_directory() 호출에서 사용한 batch_sizeBATCH_SIZE와 같은데 batch_size을 두개 정도 늘리면 prefetch 기능을 할 수 있을 같은데 빌린 시스템의 메모리가 16GB 밖에 안되어 메모리 부족으로 실행에 제약이 있습니다.


댓글 없음:

댓글 쓰기