[CNN] 자동차모델분류 전이학습 (Transfer Learning) -1

서두

작년 2학기 캡스톤때 진행했던 AI기반 중고차 어플을 만들려고 거창한 계획을 세웠는데결국 다 못 만들고 모델만 만들었던 캡스톤을 드디어..... 블로그에 쓴다. 써야지 써야지 하다가 귀찮아서 못쓰고 드디어 쓴다 ㅎ 기억을 더듬어서 써본다. 학습을 하기전에 크롤링해서 모은 이미지들중 쓸 만한 이미지들을 직접 정제하는데 상당히 귀찮은 작업이었다. 그리고 원래 모델을 파인튜닝 하려고 여러가지 방법으로 해보았는데 그냥 Regnet으로 전이학습만 해도 정확도가 높아서 전이학습으로 했다 ^_^ 아무튼 내가 시작했을때 여기저기 헤매고 다녔는데 누군가는 도움을 받을 수 있길 바라며....





데이터셋

먼저 학습을 하기에 앞서 내가 원하는 데이터셋들이 없어서
직접 크롤링해서 모았다. 차종은 신형 G80, GV80, Seltos, 투싼17년식, 아반떼AD, LF쏘나타 이고
이미지는 약 3800장 정도 되고 아래 구글링크에 공유해 놓았다.
https://drive.google.com/drive/folders/1JLi6pdhH-noq2oU-8f4pDe8JVegP5_1U

아래 사진은 이미지 비율..?과 모아놓은 데이터들의 일부 입니당.






개발환경


코랩 무료버전으로 돌리다가 생각보다 시간도 오래걸리고 이게 무료버전으로는 자꾸 세션이 끊겨서 코랩 한달 구독을 해버려서 마음편하게 돌렸다 ㅎㅎ 코랩프로, 파이토치, 싸이킷런을 사용했다.
플라스크는 오픈소스를 가져와서 추론을 잘하는지 보여주기 위해서만 잠시 사용했다.




모델선정


처음에는 가볍고 성능 좋은 EfficientNet-B0과 B7을 학습시키다가 토치비전 models에 regnet_x_32gf 모델을 사용해 봤는데 조금 더 성능이 좋아서 regnet으로 사용해 보았다.
학습률도 바꿔서 해보고 배치사이즈도 바꿔보고 epoch도 바꿔보고 했지만
밑에 표와 같은 상태일때 가장 성능이 좋았당 레그넷이 살짝 더 좋다.





의문점



학습을 하기전에 약간의 의문점이었던건 내 눈에는 위에 두 차량 G80, GV80 차량이 세단이냐 SUV이냐 차이 밖에 없고 거의 똑같이 생겼는데 전체적인 이미지가 아닌 일부분의 이미지만 보여진다면 구별을 할 수 없지 않을까? 하는 의문이 있었다. 물론 그 일부분의 이미지는 사람도 구분 하지 못할 것 이다.
과연 AI는 구별 할 수 있을까?




코드 설명


#코랩에서 학습시키려고 구글 드라이브에 이미지들을 다 올려놓고 구글 드라이브와 연동해서 불러왔다.
from google.colab import drive
drive.mount('/content/drive') # 구글 드라이브와 코랩 연동시키는 작업

from __future__ import print_function, division
import torch
import torch.nn as nn #파이토치 nn모듈 임포트
import torch.optim as optim # PyTorch optim패키지 임포트
from torch.optim import lr_scheduler # 학습률 스케쥴러 임포트
import numpy as np # 넘파이 임포트
import torchvision 
from torchvision import datasets, models, transforms
import matplotlib.pyplot as plt
import time
import os
import copy

plt.ion()   # 대화형 모드

먼저 각종 필요한 라이브러리들을 임포트하는 부분이다.



pip install split-folders tqdm  # train ,val, test 데이터 분리를 위한 split-folders 설치

import splitfolders  
splitfolders.ratio('/content/drive/MyDrive/CARS', output="/content/drive/MyDrive/CARC", seed=77, ratio=(.8, 0.1, 0.1)) 
# train : val : test  8:1:1 비율로 나눠서 새로운 경로에 저장 

내가 가진 데이터들을 학습 , 검증, 테스트용 을 나누기 위해서 split-folders 라는
라이브러리를 설치 하고 이미지들을 모아놓은 경로를 설정해준다.

'/content/drive/MyDrive/CARS' 라고 적힌 부분은 자기 경로에 맞게 설정 해주면 되고 설정해주고 나서 output 에 원하는 비율로 나눠진 데이터들을 생성 할 폴더를 지정 해준다.
CARS폴더 안에는 아래 사진처럼 구성되어있고 위 코드를 실행하면 그 아래 사진처럼 생성된다.



2부 에서 계속

좋은 웹페이지 즐겨찾기