[KT AIVLE] DX트랙 딥러닝(9주차) 복습(딥러닝 심화: CNN, Roboflow, CIFAR-10, Annotation)

728x90

딥러닝 심화 복습

CNN(합성곱 신경망, Convolutional Neural Network)

  • 입력 이미지를 효율적으로 처리하고 특징을 추출하여 이미지 분류, 객체 감지, 객체 분할 등의 작업을 수행하는 데 사용

1. Conv2D (Convolutional Layer)

  • 합성곱 연산을 수행하는 레이어로, 입력 이미지에 필터를 적용하여 특징 맵을 생성
  • 주로 이미지 처리에서 사용되며, 각 필터는 입력 이미지를 스캔하고 특정한 특징을 감지하는 역할
      • filters = 32 (새롭게 제작하려는 feature Map의 수)
      • kernel_size =(3,3) (필터의 가로세로 사이즈)
      • Strides = (1,1) (필터의 이동 보폭)
      • padding = 'Same' (feature map의 사이즈 유지, 외각의 정보를 조금이라도 더 반영)
      • activation ='relu'

2. MaxPooling2D (MaxPooling Layer)

  • 풀링 연산을 수행하는 레이어로, 특징 맵의 크기를 줄이는 역할
  • 주로 공간 차원을 감소시켜 모델의 파라미터 수를 줄이고 계산량을 감소
    • pool_size = (2,2) (풀링 필터의 가로세로 사이즈)
    • strides = (2,2) (풀링 필터의 이동 보폭)

 

Feature Representation

  • 연결된 것으로부터 기존에 없던 feature를 재표현/생성 

 

CNN에서 Feature Representation이란?

  • 위치정보를 보존한 채로 feature를 represent 한것.
  • 이미지 구조를 살린 채로 문제 풀기: Convolutional Neural Network

 

잘학습된 CNN 특징

  • 유용한 feature를 추출
  • 위치정보를 보존

<Image Net> - object Detection 모델의 앞단에 쓰임(Backbone)

  • AlexNet
  • VGG
  • GoogleNet
  • ResNet

우리 문제(object Detection)에 맞게 레이어 추가/ 변형한 부분

  • Head

 

Roboflow

  • 컴퓨터 비전 및 머신러닝 프로젝트를 위한 플랫폼

!pip install roboflow
from roboflow import Roboflow

rf = Roboflow(api_key="api_key")
project = rf.workspace("roboflow-universe-projects").project("construction-site-safety")
version = project.version(30)
dataset = version.download("yolov8")

 

# 모델링 라이브러리 설치하기
!pip install ultralytics

# 라이브러리 불러오기
from ultralytics import YOLO, settings

# 데이터셋, YAML 파일 경로 수정
# settings의 datasets_dir은 기본적으로 '/content/datasets/'로 되어있음
settings['datasets_dir'] = '/content/'
settings.update()

import yaml               
# data.yaml 파일에서 train, val 데이터셋 경로를 ./train/images & ./valid/images로 수정

model = YOLO()

model.train(model = '/content/yolov8n.pt',
            data = '/content/Construction-Site-Safety-30/data.yaml',
            epochs = 10)
            
model.predict(source=image_path,
                       conf=0.25,
                       iou=0.7,
                       save=True,
                       )

 

CIFAR-10

  • 이미지 분류를 위한 대표적인 데이터셋 중 하나
  • 10개의 클래스로 구성된 60,000장의 32x32 크기 컬러 이미지로 이루어짐
!pip install -- upgrade keras

# 환경 설정, Pytorch, JAX도 가능
import os
os.environ['BACKEND'] = 'tensorflow'

# 라이브러리 설치
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import keras

 

# cifar-10 로드
(train_x, train_y), (test_x, test_y) = keras.datasets.cifar10.load_data()

# train_x: 32x32 크기 컬러 이미지, train_y: class 정보
train_x.shape, train_y.shape, test_x.shape, test_y.shape  # ((50000, 32, 32, 3), (50000, 1), (10000, 32, 32, 3), (10000, 1))

# 이미지 라벨링
labels = {0: 'Airplane',
          1: 'Automobile',
          2: 'Bird',
          3: 'Cat',
          4: 'Deer',
          5: 'Dog',
          6: 'Frog',
          7: 'Horse',
          8: 'Ship',
          9: 'Truck'}

 

Modeling1

from keras.utils import clear_session
from keras.models import Sequential
from keras.layers import Input, Dense, Flatten
# 1. 메모리 청소
clear_session()

# 2. 모델 선언 : 리스트 안에 추가하는 방식
model1 = Sequential([Input(shape=(32,32,3)),
                     keras.layers.Rescaling(1/255),
                     Flatten(),
                     Dense(64, activation='relu'),
                     Dense(64, activation='relu'),
                     Dense(128, activation='relu'),
                     Dense(128, activation='relu'),
                     Dense(256, activation='relu'),
                     Dense(256, activation='relu'),
                     Dense(10, activation='softmax'),
                     ])

# 3. 레이어 블록 조립 : .add() 방식
# model1.add( Input(shape=(32,32,3)) )
# model1.add( keras.layers.Rescaling(1/255) )
# model1.add( Flatten() )
# model1.add( Dense(64, activation='relu'))
# model1.add( Dense(64, activation='relu'))
# model1.add( Dense(128, activation='relu'))
# model1.add( Dense(128, activation='relu'))
# model1.add( Dense(256, activation='relu'))
# model1.add( Dense(256, activation='relu'))
# model1.add( Dense(10, activation='softmax'))

# 4. 컴파일
model1.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
               metrics=['accuracy']
               )

model1.summary()

 

  • keras.layers.Rescaling(1/255): 이미지의 픽셀 값을 [0, 255] 범위에서 [0, 1] 범위로 조정, 정규화(normalization)
  • Flatten(): 3D 이미지를 1D 벡터로 변환(평평하게 펼침)

 

모델 학습 중 조기 종료(early stopping)

from keras.callbacks import EarlyStopping

es = EarlyStopping(monitor='val_loss',        # 얼리스토핑을 적용할 관측 지표
                   min_delta=0,               # 임계값
                   patience=5,                # 성능 개선이 발생하지 않았을 때, 몇 epochs 더 지켜볼 것인지
                   verbose=1,                 # 몇 번째 epochs에서 얼리스토핑이 되었는가 알려줌
                   restore_best_weights=True  # 최적의 가중치를 가진 epoch 시점으로 가중치를 되돌림
                   )

 

model1.fit(train_x, train_y, validation_split=0.2,
           epochs=10000, verbose=1,
           callbacks=[es]
           )
           
y_pred = model1.predict(test_x)

model1.evaluate(test_x, test_y)

 

Modeling2(Conv2D, Maxpool2D)

import keras

from keras.utils import clear_session
from keras.models import Sequential
from keras.layers import Input, Dense, Flatten
from keras.layers import Conv2D, MaxPool2D
# 1. 메모리 청소
clear_session()

# 2. 모델 선언 : 리스트 안에 넣는 방식
model2 = Sequential([Input(shape=(32,32,3)),
                     keras.layers.Rescaling(1/255),
                     Conv2D(filters=64,        # 서로 다른 필터 64개를 사용하겠다.
                            kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
                            strides=(1,1),     # Conv2D 필터의 이동 보폭
                            padding='same',    # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
                            activation='relu', # 주의!
                            ),
                     Conv2D(filters=64,        # 서로 다른 필터 64개를 사용하겠다.
                            kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
                            strides=(1,1),     # Conv2D 필터의 이동 보폭
                            padding='same',    # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
                            activation='relu', # 주의!
                            ),
                     MaxPool2D(pool_size=(2,2),# pooling 필터의 가로 세로 사이즈
                               strides=(2,2)   # pooling 필터의 이동 보폭 (기본적으로 pool_size를 따름)
                               ),
                     Conv2D(filters=128,        # 서로 다른 필터 64개를 사용하겠다.
                            kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
                            strides=(1,1),     # Conv2D 필터의 이동 보폭
                            padding='same',    # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
                            activation='relu', # 주의!
                            ),
                     Conv2D(filters=128,        # 서로 다른 필터 64개를 사용하겠다.
                            kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
                            strides=(1,1),     # Conv2D 필터의 이동 보폭
                            padding='same',    # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
                            activation='relu', # 주의!
                            ),
                     MaxPool2D(pool_size=(2,2),# pooling 필터의 가로 세로 사이즈
                               strides=(2,2)   # pooling 필터의 이동 보폭 (기본적으로 pool_size를 따름)
                               ),
                     Conv2D(filters=256,        # 서로 다른 필터 64개를 사용하겠다.
                            kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
                            strides=(1,1),     # Conv2D 필터의 이동 보폭
                            padding='same',    # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
                            activation='relu', # 주의!
                            ),
                     Conv2D(filters=256,        # 서로 다른 필터 64개를 사용하겠다.
                            kernel_size=(3,3), # Conv2D 필터의 가로 세로 사이즈
                            strides=(1,1),     # Conv2D 필터의 이동 보폭
                            padding='same',    # 1.feature map 사이즈 유지 | 2.외곽 정보 더 반영
                            activation='relu', # 주의!
                            ),
                     MaxPool2D(pool_size=(2,2),# pooling 필터의 가로 세로 사이즈
                               strides=(2,2)   # pooling 필터의 이동 보폭 (기본적으로 pool_size를 따름)
                               ),
                     Flatten(),
                     Dense(10, activation='softmax')
                     ])

# 3. 컴파일
model2.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
               metrics=['accuracy']
               )

model2.summary()

 

Annotation

 

Local에서 Dataset 만들고 YOLO 모델 동작하도록 연습

  1. 이미지 수집
  2. 폴더 구조(YOLO에서 요구하는 형식으로 맞추기)
  3. YAML
    • Class 수
    • Class 이름
    • 데이터셋 경로
  4. YOLO 실행

728x90