🚩 대외활동/KT 에이블스쿨

[KT AIVLE School] KT에이블스쿨 5기 - 4차 미니프로젝트

dlalwl_jpg 2024. 5. 24. 16:33

🗓️ 일정

4차 미니 프로젝트: 4/8 ~ 4/12

 KT에이블스쿨 미니프로젝트란?

미니 프로젝트는 이론, 실습 강의가 끝난 후 배운 강의를 토대로 실제 사례에 적용해보는 시간이다. 

해결해야 할 미션, 데이터, 도메인 정보, 가이드가 제공되면 개별 실습을 통해 스스로 문제를 해결한 후, 조별 실습을 통해 공동과제를 수행한다. 그리고 전체 발표 시간을 가져 다양한 솔루션을 공유한다.


📑 1일차

주제 및 미션

4차 미니프로젝트 1~2일차 주제 및 미션은 차량 공유업체의 차량파손분류를 위한 모델을 만드는 것이다.

1일차에는 개별 과제로 도메인을 이해하고, 각자 모델을 설계해보는 시간을 가졌다.

 

💡도메인 이해

차량 공유는 흔히 알고 있는 쏘카, 그린카 등의 카셰어링 서비스이다.

이 서비스에서는 사용자에게 대여할 차량 운영대수 및 안전한 차량 이용을 위해 차량 관리가 중요하다고 한다.

카셰어링 서비스에서 차량 공유가 이루어지는 절차를 살펴보았고, 이 과정에서 파손된 차량을 식별하는 업무의 번거로움을 덜기 위한 서비스의 필요성을 확인하였다.

 

🚀 모델링

데이터가 정상차량 이미지와 파손차량 이미지로 따로 주어졌다. 

그래서 먼저, 아래와 같이 정상차량 이미지(normal)와 파손차량 이미지(abnormal)를 각각 0과 1로 구분하였다.

파손 차량의 예시와 정상 차량과 파손차량을 구분한 결과

그 다음, 하나의 리스트로 통합하여 학습데이터와 테스트데이터, 검증데이터를 각 9:1:1로 나누었다.

데이터는 RGB로 전처리를 진행하였고, 모델은 CNN으로 Funtional API를 사용해 4 Layer로 계층을 만들어 모델을 설계하였다.

EarlyStropping을 이용하여 모델을 학습시켰고, confusion_matrix, classification_report 활용하여 성능을 평가하였다.

epoch에 따른 모델의 학습데이터, 실제값의 정확도와 오류값 진행상황

1에 가까울수록 파손 차량에 가깝고, 0에 가까울수록 정상차량에 가깝다고 판단하기 위해 즉, 0.5보다 크거나 같으면 아예 1로, 0.5보다 작으면 0으로 구분하였다.

예측 결과

테스트 데이터로 돌렸을 때 정확도는 88.52%가 나왔고, confusion_matrix, classification_report는 아래와 같이 나왔다.

confusion_matrix와 classification_report

📑 2일차

주제 및 미션

2일차에는 어제에 이어서 모델의 성능을 더 높이기 위해 다양한 시도를 하고, 팀원들끼리 아래의 다양한 모델을 사용하여 결과값을 비교하였다.

 

🚀 모델링

먼저 모델 성능을 높이기 위해 두 가지를 시도하였다. 첫 번째로 Image Preprocessing Layer, Image Augmentation Layer를 통해 이미지를 변형시켜 학습시켰다.

# Image Preprocessing Layer
preprocessing_layer = tf.keras.layers.Rescaling(1./255)  # 이미지를 0-1 범위로 조정

# Image Augmentation Layer
data_augmentation = tf.keras.Sequential([
    tf.keras.layers.RandomFlip("horizontal"),  # 랜덤으로 이미지를 수평으로 뒤집기
    tf.keras.layers.RandomRotation(0.2),       # 랜덤으로 이미지를 최대 20도 회전
    tf.keras.layers.RandomZoom(0.2),           # 랜덤으로 이미지를 최대 20% 확대 또는 축소
])

원본 사진(왼쪽) 이미지와 변형 시킨 사진(왼쪽)

그리고 1일차에 사용했던 모델에 변형시킨 이미지로 학습시킨 뒤 평가지표를 확인하니 정확도가 96.88%로 성능이 더 좋아진 것을 확인할 수 있었다.

confusion_matrix와 classification_report

 두 번째로 CNN보다 더 좋은 모델인 InceptionV3모델을 이용해서 softmax를 sigmoid로 바꿔 모델링을 진행하였다.

그리고 결과를 확인했더니 테스트 정확도가 100%가 나왔다.

모델별 성능 비교표
confusion_matrix와 classification_report

이 과정에서 파라미터 수가 많을수록 성능이 좋아지지만, 너무 많은 파라미터를 학습하면 성능이 떨어지는 것을 확인하였다.


📑 3일차

주제 및 미션

4차 미니프로젝트 3~4일차 주제 및 미션은 인공위성 데이터로 도시환경을 개선하기이다. 도시환경 개선을 위해 쿨루프(Cool Roof) 사업을 진행할 예정이고, 이에 대한 지원 대상 선정을 위해서는 옥상을 일일히 사전조사 하는 번거로움이 있다. 이를 해결하기 위해 1차적으로 시공 대상 여부를 효율적으로 식별할 수 있는 딥러닝 기반 모델을 만드는 것이다.

즉, 쿨루프 사업 담당 공무원을 대상으로 인공위성 데이터(옥상사진 이미지)로 쿨루프 시공 대상 여부 분류를 알려주는 서비스를 개발하는 것이 이번 3~4일차 주제 및 미션이다.

 

💡도메인 이해

우선 쿨루프(Cool Roof) 조성 사업에 대한 설명, 필요성, 효과에 대해 알아보았다.

그리고 사업을 진행하는 과정을 살펴보았고, 추진하는데 어떤 어려움을 겪고 있는지 확인하였다.

 

📊데이터 수집

원래 항상 미니프로젝트를 할 때 주어진 데이터로만 프로젝트를 진행했는데 이번에는 모델링을 진행하기에는 적은 수여서 직접 인공위성 이미지(옥상사진)데이터를 수집하고 roboflow를 이용해 직접 바운딩박스로 가공하였다.

네이버 지도에서 하얀색 지붕과 그 외의 지붕이 섞여있는 사진을 캡쳐해서 하얀색 지붕과 그 외 지붕(쿨루프가 필요한 지붕)을 구분하여 가공하였다. (무려 748장을 하나하나..팀원들과 같이해서 하나도 안 힘들었다..!^^)

팀원들과 roboflow에서 작업한 바운딩박스 이미지

그리고 roboflow에서 test, train, valid으로 나누어 데이터를 다운 받았다.

roboflow에서 다운받은 dataset과 cool-roof와 generic-roof 사례

🚀 모델링

먼저, 모델링은 YOLO를 사용하도록 주어져 YOLO 모델에 적용할 YAML파일을 생성했다.

우선 주어진 사진 데이터에서 하얀색 지붕(cool roof)와 쿨루프지원이 필요한 일반 지붕(generic roof)을 구별하기 위해 각각 0과 1로 class를 cool_roof와 generic_roof를 만들었다.

# 모델을 학습할 때 yaml파일을 참고해 train, test데이터가 어디있는지 등의 역할
yaml_dict = {
    "train": "학습데이터 경로",			 
    "test": "테스트데이터 경로",
    "val": "검증데이터 경로",
    "nc": 2,								# 클래스 수
    "names": ['cool roof', 'generic roof']		# 클래스 이름
}

# 쓰기모드로 연 yolo.yaml파일은 f라고 지정
with open("/yolo.yaml파일 저장할 경로/yolo.yaml", "w") as f:
    yaml.dump(yaml_dict, f)

# 읽기모드로 yolo.yaml파일 확인
with open("/yolo.yaml파일 저장할 경로/yolo.yaml", "r") as f:
    lines = yaml.safe_load(f)
    print(lines)

위 처럼 yaml파일을 만들었다. 그리고 모델을 만들었다.

아래 표는 YOLO 모델의 종류인데 아래로 갈수록 무겁고 정확한 모델이다. 시간이 많이 걸릴 것 같아 나는 s모델을 사용하였다.

YOLO모델 종류

epochs를 조절해가며 모델을 돌려본 결과 아래와 같이 나왔다.

epochs = 100


📑 4일차

주제 및 미션

3일차에 YOLO의 s모델을 이용해서 결과를 출력하는 것까지 진행하였다. 4일차에는 YOLO모델의 다양한 버전을 돌려 모델들의 성능을 비교해보았다.

 

🚀 모델링

YOLO모델 종류

어제는 YOLO모델의 s버전에 돌려봤다면 오늘은 다 돌려서 어떤 모델이 제일 좋은지 비교해보았다. 성능이 좋은 모델일 수록 시간이 매우 오래걸렸다.

또한, 모델의 성능을 높이기 위해 의논해본 결과 Data augmentation noise 영향을 받을 수 있겠다는 의견이 나왔다. 

Data augmentation noise(데이터 증강 노이즈)란 원본 데이터에 다양한 형태의 노이즈를 추가하여 인공적으로 학습 데이터를 늘리는 방법이다. 머신러닝 모델, 특히 딥러닝 모델의 일반화 성능을 향상시키기 위해 사용한다. 

이 방법을 이용하여 모델을 다시 돌려본 결과 아래 사진을 보면 왼쪽은 운동장을 지붕으로 인식하는 반면, 오른쪽 노이즈가 있는 사진은 지붕만 잘 인식하였다. 

노이즈가 없는 roof이미지(왼쪽)와 노이즈가 있는 roof이미지(오른쪽)
노이즈가 없는 데이터셋

 

하지만 잘 인식하는 경우가 너무 적었고 오히려 모델의 성능이 더 안 좋아져 노이즈를 제거한 데이터셋으로 모델을 돌렸다.

실제로 많은 연구와 실험에서 노이즈 추가와 같은 기법이 모델의 성능을 향상시킨다는 결과를 보여주고 있다고 해서 직접 해봤지만 성능이 더 안 좋아져 그 이유가 궁금해 찾아보았다.

찾아본 결과, 데이터와 문제의 특성에 따라 결과가 다를 수 있어 특정 상황에서는 노이즈가 모델 성능을 저하시킬 수도 있다고 한다. 따라서, 데이터 증강 기법의 효과는 실험을 통해 검증하는 것이 중요하다고 한다.

 

🔑 결론

모든 모델을 돌려본 결과 YOLOv8n의 성능이 제일 좋았다.

파라미터도 다양하게 조절하여 모델을 돌려본 결과 1-2일차에서 확인한 것과 마찬가지로 파라미터 수가 너무 많은 경우 오히려 예측성능이 떨어졌다. 아쉬웠던 점은 Object detection 돌리기 전, 위성 사진 분류해주는 모델을 돌리는 것이 좋을 것 같은데 시간이 부족해서 수행하지 못했던 것이다.


💭4차 미니프로젝트를 마치고

항상 주어진 데이터만 가지고 모델링을 진행하다가 직접 수집한 데이터로 모델링은 진행한 것은 처음이었는데 직접 수집하고 가공해보니 실제 현업에서도 데이터를 수집하는데 가장 시간이 오래걸리고, 힘들겠다는 생각이 들었다.

또한, 모델의 성능이 제일 좋다고 해서 결과가 가장 좋은 것도 아니었다. 파라미터 수, 데이터의 양 등 다양한 요소가 모델의 결과에 영향을 미친다는 것을 느꼈다.

아무래도 시각적인 것을 구분해주는 모델링이었어서 그런지 지금까지 했던 모델링 중에서 제일 재미있고 흥미로웠다. 나중에 시각지능 딥러닝을 접목한 프로젝트를 직접 만들어보고 싶다는 생각이 들었다.

탄천 산책로/^0^/

kt분당본사타워를 이용하시게 된다면 다른 팀원들과 점심시간에 탄천 산책로에서 산책하고 들어가기 추천합니다~!