[Colab x PyTorch] 이미지 분류(Image Classification)

Yonghye Kwon·2020년 3월 15일
9
post-thumbnail
post-custom-banner

Colab met PyTorch

Introduction

Colab 과 PyTorch 를 이용하여 프로젝트를 진행 하려니 막히는 부분이 생긴다.

어떻게 나의 데이터셋을 Colab 상에서 Load 할 수 있을까?

실제로 딥 러닝을 프로젝트에 적용하기 위해서는 처리하고자 하는 데이터 혹은 데이터셋을 프로그램 상에서 Load 하고 처리 할 줄 아는 것이 중요하다.

그런데, 대부분의 예제들은 MNIST, CIFAR 10 과 같이 Library 단에서 자동으로 다운로드 해주고 Load 까지 해주는 데이터셋에 대한 학습과 처리 방법에 대해 소개한다.

본 포스트에서는 Colab 상에서 자신이 가진 데이터셋(이미지 인식)을 프로그램 상에서 Load 하고 그에 맞는 이미지 분류 모델을 학습시키는 방법을 소개한다.

Prerequisite

본 포스트를 읽기전에 Custom-CNN-based-Image-Classification-in-PyTorch 를 참고하여 PyTorch 만을 이용하여 Local PC 상에서 자신의 데이터를 Load 하고 처리하는 방법을 숙지할 것을 권한다.

Main body

먼저 본 포스트에서 예시로 사용할 데이터셋에 대해 소개한다.

Dataset

데이터 셋으로는 쿠로코 x 카가미 데이터셋을 이용한다.

쿠로코 x 카가미 데이터셋이란 만화 쿠로코의 농구의 등장 인물인 쿠로코와 카가미의 얼굴로 이루어진 데이터 셋으로 이진 분류 작업의 성능을 평가하는데 사용된다. 내가 직접 쿠로코의 농구를 시청하며 중간 중간에 캐릭터의 얼굴만 크로핑 해서 수집하였다.

데이터셋 다운로드

데이터셋은 Training 데이터 100 장(쿠로코 50장, 카가미 50장), Test 데이터 20장(쿠로코 10장, 카가미 10장)으로 구성되어 있다.

폴더 및 파일의 경로 체계는 아래와 같다.

Kuroko_X_Kagami/
  train/
    kuroko/
      *.png
    kagami/
      *.png
  test/
    kuroko/
      *.png
    kagami/
      *.png

쉬어가는 시간

vanishing drive
쿠로코의 필살기 Vanishing Drive 이다.

meteor jam

카가미의 필살기 Meteor Jam 이다.

본 포스트를 읽고나서 꼭 정주행 할 것을 권한다.

Google Drive Upload & Mount

Colab 상에서 자신의 데이터셋에 접근하기 위해서 먼저 Google Drive 에 데이터 셋을 Upload 해야한다. 이 때, 데이터셋은 압축된 채(.zip, .7z, .tar.gz)로 Upload 하는 것을 권장한다.

압축을 푼채로 업로드해도 되지만 크기가 큰 데이터셋의 경우 압축을 푼 채로 다량의 파일을 Google Drive 에 업로드 하는 경우 업로드 속도가 기하급수적으로 느려진다.

경이로운 478 시간

해결사 건욱이형의 조언

이제 데이터셋을 업로드하고 Colab 상에서 접근할 수 있도록 드라이브를 마운트하는 방법에 대해 설명한다.

1. 내 드라이브에서 dataset 이란 폴더를 생성한다.

2. dataset 폴더 안에 데이터 셋(Kuroko_X_Kagami.zip)을 업로드 한다.

3. Colab 파일을 생성한다.

4. 드라이브 마운트를 클릭한다. 성공적으로 마운트 되면 drive 란 폴더가 생기며 자신의 Goole Drive 파일에 접근 가능하게 된다.

5. 데이터 셋 파일을 우 클릭하고 경로를 복사한다.

6. 코드 셀에서 다음의 명령어를 입력하고 실행한다.

!unzip /content/drive/"My Drive"/dataset/Kuroko_X_Kagami.zip -d /content/drive/"My Drive"/dataset/

데이터 셋의 압축을 풀겠다는 의미이다. zip 이 아닌 다른 압축 파일의 경우 그에 맞는 압축 해제 명령어를 사용하자.

!unzip (압축 해제할 파일).zip -d (압축 해제 파일 저장 경로)

/content/drive/"My Drive"/dataset/Kuroko_X_Kagami.zip 은 5. 에서 복사한 경로이다. 데이터 셋의 용량이 큰 경우 압축을 풀었을 때, 구글 드라이브에 업데이트가 정상적으로 되지 않아 파일 접근이 되지 않는 경우가 발생했다. 이러한 경우 아래의 명령어를 실행하여 나의 구글 드라이브가 아닌 현재 할당된 런타임 드라이브에 압축을 풀도록 하자.

!unzip your_dataset_path/your_dataset.zip

팁. 파일 및 폴더 경로에 스페이스, 탭 등 Whitespace character 가 포함되어 있는 경우 " " 로 감싸주어야 한다.

압축 해제 과정이 끝나면 아래와 같이 파일 목록에 데이터셋 폴더(Kuroko_X_Kagami/)가 생성된 것을 확인할 수 있다. (확인되지 않는 경우 새로고침을 눌러보자)

이제 Colab 에서 데이터 셋에 접근이 가능하게 됐으니, 파일 및 폴더에 대한 경로만 안다면 Local PC 에서 파일 접근하듯이 프로그래밍 하면 된다!

데이터 셋의 준비는 마쳤으니, 학습을 진행하며 학습되는 모델의 Weight 파일을 저장할 폴더를 생성하자

마지막으로 프로그래밍 전 연결된 PC 의 하드웨어 가속기 옵션을 GPU 로 변경해주자.

Image Classifier Programming

전체적인 예제 코드는 아래의 코드를 참고하자. 아래의 코드는 직접 구성한 이미지 분류 데이터셋을 Google Drive 상에서 Load 하고 해당 데이터셋에 대해 내가 정의한 이미지 분류 모델(SuperLightMobileNet)을 학습시키는 코드이다.

아래 예제 코드를 이해하기 위해서는 Colab 에 대한 이해보다는 PyTorch 에 대한 이해가 먼저 선행되어야 한다.

예제 코드

위의 코드를 Colab 상에서 실행시키고나면 구글 드라이브내에 학습된 Weight 파일들이 저장되는 것을 확인할 수 있다.

위 코드를 참고하고 수정하여 이미지 인식 뿐만아니라, Segmentation, Detection 등 다양한 작업에 맞게 코드를 수정해보자!

profile
용혜입니다.
post-custom-banner

8개의 댓글

comment-user-thumbnail
2020년 7월 25일

안녕하세요.
Yonghye Kwon 님께서 작성하신 Git Hub를 보고 그대로 구현해보고 있습니다.
그런데 kakami_31.PNG 이미지 하나만 가져와서 검증해보고 싶은데.. 방법을 잘 모르겠습니다.
혹시 알려주시면 감사하겠습니다.

#이미지 저장하기
PATH = './model_test/test.pth'
torch.save(custom_model.state_dict(), PATH)

from PIL import Image
from matplotlib.pyplot import imshow
import numpy as np
import matplotlib.pyplot as plt

#이미지 로드하기
model = CustomConvNet(num_classes=num_classes).to(device)
model.load_state_dict(torch.load(PATH))
model.eval()

#이미지 열기
img_path = './data/test/kagami/kagami_31.PNG'
img = Image.open(img_path)
imshow(np.asarray(img))

kakami_31.PNG 이미지 하나만 가져와서 검증(정확도)하기

with torch.nograd():
correct = 0
total = 0
for item in test_loader:
images = item['image'].to(device)
labels = item['label'].to(device)
outputs = custom_model(images)
, predicted = torch.max(outputs.data, 1)
total += len(labels)
correct += (predicted == labels).sum().item()

print('Test Accuracy of the model on the {} test images: {} %'.format(total, 100 * correct / total))
1개의 답글
comment-user-thumbnail
2020년 9월 15일

안녕하세요!

블로그 보고 차근차근해서 pth파일이 생성되었습니다.

이 파일을 어떻게 사용해서 웹캠으로 물체를 인식하게 할 수있는 걸까요?

1개의 답글
comment-user-thumbnail
2020년 11월 18일

혹시 gz 데이터를 푸는 방법아시나요?

1개의 답글
comment-user-thumbnail
2023년 11월 8일

안녕하세요 이미지 하나를 입력해서 잘 분류를 하는지 보고 싶은데 코드를 어떻게 작성해야하나요?

답글 달기