KT에이블스쿨

[KT AIVLE] 미니프로젝트 4차

qkrgusqls 2024. 5. 18. 16:55
0308 - 0312
미니프로젝트 4차

1일차, 2일차 

주제 : 차랑 파손 분류 

 

https://keras.io/api/applications/

 

Keras documentation: Keras Applications

Keras Applications Keras Applications are deep learning models that are made available alongside pre-trained weights. These models can be used for prediction, feature extraction, and fine-tuning. Weights are downloaded automatically when instantiating a mo

keras.io

 

데이터셋 : 이미지가 normal, abnormal로 분류되어 들어가 있는 상태

 

데이터 전처리 

  • 모델링을 위한 데이터 구조 만들기
    • X : 이미지를 array로 변환하기
    • Y : 이미지 갯수만큼 normal - 0, abnormal - 1 로 array를 만들기

원본 사이즈로는 모델링이 너무 오래걸려서 이미지 사이즈(128,128)도 조절했다.

전처리 할 때 shape를 확인하고 모델링을 할 수 있도록 reshape하는 과정이 아직까지도 어렵다.  

 

모델링

3가지 방법으로 모델링을 진행하였다.

 

모델링을 하기 위해서 이미지(Training set, Validation set, Test set)를 배열로 변환하였다.

def x_preprocessing(img_list) :
    bin_list = []

    for img in tqdm(img_list) :
        img = keras.utils.load_img(img, target_size=(128,128), keep_aspect_ratio=True)
        img = keras.utils.img_to_array(img)
        bin_list.append(img)

    return np.array(bin_list)
x_train_arr = x_preprocessing(x_train)
x_valid_arr = x_preprocessing(x_val)
x_test_arr = x_preprocessing(x_test)

print(x_train_arr.shape)
print(x_valid_arr.shape)
print(x_test_arr.shape)

 

 

model

activation → swish , relu보다 성능이 좋았다.

 

모델링 코드 살펴보기

TransferLearning : Inception

base_model = InceptionV3(include_top=False,
                         weights='imagenet',
                         input_shape=(128,128,3)
                         )
base_model.trainable = False

 

aug = keras.layers.Rescaling(1./255)(i_l)
aug = keras.layers.RandomFlip()(aug)
aug = keras.layers.RandomRotation(0.2)(aug)

 

Image Augmentation Layer를 통해 데이터를 증강시킨다. 

  • Rescaling : 입력 이미지의 픽셀 값을 0~1 사이로 정규화한다. (과적합 방지)
  • RandomFlip: 입력 이미지를 무작위로 수평 또는 수직으로 뒤집는다. 
  • RandomRotation : 입력이미지를 최대 20도 범위에서 회전시킨다.

 

모델을 학습을 시키고 높은 accuracy를 도출하고 마무리했다.

 

KT 밥

 

 

 

밥을 먹고 팀원들과 함께 근처 메가커피에 가서 아샷추를 포장해왔다. 대면으로 하니까 점심시간이 빨리가긴 즐거웠다.

 

 

KT에서 팀원들과 함께 회식 장소까지 걸어갔다! 벚꽃이 피어있는 탄천을 걸어서 기분이 좋았다.  

 

 

 

1-2반 처음으로 있었던 회식이었다. 반장님들께서 여러 에이블러님들과 친해질 수 있는 기회를 마련해주셨다. 미니프로젝트 하면서 뵀던 팀원분들도 많았고 뿐만 아니라 새로운 분들을 많이 만날 수 있어서 좋았다. 

재밌게 놀고 실수로 버스 거꾸로 타서..... 집에 새벽에 들어갔던 기억이 난다. 

 

3일차

주제 : 쿨루프 여부 판별 

파손 차량 판별에 이어서 쿨루프 여부를 판별하는 실습을 진행했다. 

두번째 시각지능 실습이라 그런지 조금 더 여유가 생겼고, 막히는 부분에서 팀원 분의 도움을 받아 해결할 수 있었다! 

 

데이터 

쿨루프와 일반지붕으로 위성 사진으로 지붕 상태를 파악한다.

우리집 지붕도 데이터로 넣어보았다. 

 

데이터 스플릿 & 파일 이동

  1. 재현을 위한 난수 고정 : 2024
  2. 테스트셋 데이터 20%
  • 위 설정에 맞게 데이터를 나누고, 위 과정에서 생성한 폴더에 이동

train데이터와 test데이터 폴더로 나누고 이미지를 셔플 한 후, 라벨을 이미지에 맞게 옮겼다.

 

import yaml

# 클래스 레이블 및 해당 클래스에 대한 정보 정의
data = {
    'train': '../train/images',
    'test' : '../test/images',
    'names' : {0: 'cool_roof', 1: 'generic_roof'},
    'nc' : 2,
}

# YAML 파일 경로
yaml_file_path = "/content/dataset/yolo_classes.yaml"

# YAML 파일 작성
with open(yaml_file_path, 'w') as file:
    yaml.dump(data, file)

print("YAML 파일이 생성되었습니다.")

 

yaml 파일을 만들었고 일반 지붕을 1로 설정하였다. (쿨루프 시공이 필요한 타겟값이기 때문이다.)

 

model = YOLO(model ='/content/dataset/yolo_classes.yaml', task='detect')

 

학습 후 우리집 지붕은 쿨루프라는 것을 확인했다.