mini project

세 번째 미니프로젝트 - 차량 공유업체의 차량 파손여부 분류

민주82 2023. 3. 22. 18:47

차량공유업체의 차량 파손여부 분류

 

 

 

차량공유란...?

자동차의 소유권을 가지고 있는 주체가 서비스에 가입된 회원에게 시간단위로 차량의 이용권한을 제공하는 것

 

 

 

전세계 공유차량 보유대수가 가파른 성장세

→ 2040년까지 16% 증가

 

 

 

편리한 차량 대여 서비스가 인기를 얻고 있는데 , 차량 관리가 중요 !!

공유차량을 이용할 때 차량 상태를 확인하기 위해 외관을 촬영하는데 여기서 고민이 발생한다

 

 

 

: 하루 평균 7-8만장의 차량 사진을 일일히 수작업을 통해 파손된 차량을 식별하고 차량 정비를 맡기는 업무가 너무 시간이 오래걸린다

차량 이미지 사진을 통해 파손된 차량을 식별하고 알려주는 서비스가 필요하다

 

 

 

실제로 인공지능을 기반으로 하는 차량 이미지 파손여부 탐지 모델로 '엑시다'가 있다

→ AI 머신러닝을 기반으로 차량의 파손 여부를 감지하고, 고객이 차량 대여 전 앱을 통해 전송한 외관 가진을 차량 이미지 파손 여부 자동 탐지 모델 '엑시다'로 분석

 

 

 

 

 

그래서...!

차량 공유 업체의 차량 파손 여부를 분류하는 모델을 만들어 보는게 이번 미니 프로젝트다

 

중점사항 

1. Tensorflow Keras를 통한 CNN모델 설계

2. 성능개선(Data Augmentation, Transfer Learning)

 

 

▽ 활용한 Dataset

 

실제 파손된 차량 이미지는 구하기 어려운 문제로 DALL-E를 통해 이미지를 생성해서 데이터 셋을 만들었다

→ 차량의 파손 여부에 따라 abnormal(비정상, 파손있음), normal(정상, 파손없음) 폴더로 구분

→ 파일 형태 : 이미지, 파일건수 : 605개

 

 

크게 3가지 절차로 나누어진다

  1. 데이터 전처리
  2. 모델링(1)
  3. 성능 향상을 위한 모델링(2)

 

 

 

 

데이터 전처리

 

① 데이터셋 폴더 생성

 

구글 코랩을 사용하므로 드라이브와 연결

 

 

 

 

② 데이터 셋 불러오기

 

zipfile 모듈을 이용해서 정해준 경로에 압축 해제

 

내 구글 드라이브 > Datasets 폴더에  압축해제 됨

 

→ train 폴더는 압축해제 되면서 자동 생성

 

 

 

③ 이미지 저장을 위한 폴더 생성

 

os.mkdir 사용해서 디렉토리 생성

 

우선 Car_Images_test 생성후 하위 폴더인 normal / abnormal 폴더를 만듦

Car_Images_valid 도 마찬가지

여기까지는 그냥 폴더만 만든거 !

 

 

 

 

④ 데이터 분할

 

: Training set, Validation set, Test set 만들기

나는 random, shutil 모듈 사용해서 데이터 추출했다

 

test 데이터 분할

 

위와 동일한 방법으로 validation 데이터 셋도 만들어 줌

 

 

 

잘 추출 되었는지 이미지 개수 확인

 

 

 

⑤ 데이터 복사 및 이동

 

: 분할된 데이터를 복사 이동, 새로운 폴더에 저장되는 데이터는 모델링 (1)에서 사용하고 기존 폴더는 모델링 (2)의 Data Augmentation에서 사용

기존 폴더에 있는 abnormal 파일을 복사할 폴더로 옮김

 

 

 

하나의 폴더에서 abnormal, normal 데이터가 섞일 것이므로 abnormal 이미지들은 이름앞에 'ab_' 붙여 구분

 

 

 

 

 

 

 

 

위와 똑같은 방법으로 기존 폴더에 있는 normal 파일을 복사할 폴더로 옮김

copytree는 두번 사용하면 이미 있는 디렉토리라며 오류가 떠서 copyfile 사용함

 

 

마지막으로 데이터 개수를 확인해보면 

194 + 94

48 + 48

60 + 61

잘 복사된 것을 확인 !

 

 

 

모델링(1)

 

모델링을 위한 데이터 구조 만들기 : 이미지를 array로 변환하여 X를 만들고, 이미지 개수만큼 normal(0), abnormal(1)로 array 만들기

 

① 이미지들을 배열 데이터 셋으로 

 

 

 

 

train_data에 배열로 잘 담아짐

같은 방법으로 test_data, valid_data도 배열 데이터셋으로 만듦

 

 

 

 

Y클래스는 normal은 0, abnormal은 1로 지정

 

이미지 이름이 'ab'로 시작하면 1, 아니면 0

 

 

 

 

 

② 모델 여러가지 만든 후 성능 비교 (반드시 Early Stopping 사용)

 

내가 만든? 쌓은 CNN 모델은 성능이 좋다고 하긴 애매했지만... 나쁘지 않았다

 

 

 

 

이건 조금 깊게 쌓은 모델이었는데 성능이 너무 별로였다...

무조건 깊게 쌓는다고 좋은 건 아니더라

 

 

 

 

모델링(2) 

 

① Data Augmantation + Transfer Learning

 

▽ Data Augmantation

경로로 부터 이미지 불러 올 준비

 

준비 끝 :)

 

 

 

 

 

내가 만든 CNN 모델을 데이터 증강후 성능을 비교해 봤더니 0.83 → 0.86으로 향상되었다....!!!!

 

 

 

 Transfer Learning

 

 

InceptionV3

제너래이팅 전

 

 

제너레이팅 후

 

ImageDataGenerator로 데이터 제너레이팅 후 성능 비교

성능 향상 확인

 

 

 

 

▽ VGG16

 

VGG16 불러와서 Flatten, Dense 로 레이어 연결한 후 모델 summary

 

 

역시나 잘 만들어진 남의 모델은 성능이 좋다...!

 

 

 

 

데이터 증강 후 성능 향상

 

 

 

 

 

 

∨ 알아가는 것

 

∨ Validation set의 경우, 학습 과정에서 Accuracy가 50%에 수렴하는 현상이 발생하는데, 어떻게 해결할 수 있을까?

  1. EarlyStopping 함수에서 patience 파라미터 값을 모델이 맞게 준다.
  2. model.fit() 과정에서 shuffle 파라미터 값을 True로 주어 과적합을 방지한다.
  3. custom CNN 모델 설계 시 필터 수, 노드 수 감소, 풀링 등을 통해 모델의 파라미터 수를 줄인다.

 

 

∨ 모델의 성능을 높이기 위한 방법

일단 .. 이번 프로젝트에서는 데이터 셋이 매우 작다.

 

작은 데이터 셋에서는 BatchNormalization을 적용하면 과대적합 될 수 있다.

작은 데이터 셋에서는 Dropout을 적용하면 과소적합 될 수 있다.

→ BatchNormalization과 Dropout을 제외하였을 때의 성능이 가장 좋았다.

 

Flatten은 특징 맵을 1차원으로 펼치면서 정보 손실이 일어날 수 있다.

 GlobalAvgPool2D은 특징 정보를 유지하면서 파라미터를 줄이는 효과가 있다.