머준
기억보단 기록하는 Devlog
머준
전체 방문자
오늘
어제
  • IT Devlog (52) N
    • KT AIVLE (30)
      • AI Track(교육) (30)
    • 패스트캠퍼스 (3) N
      • 데일리 미션 (3) N
    • 대외활동 (2)
      • 공모전 (2)
      • 미래 내일 일 경험 (0)
      • 기타 (0)
    • News (4)
      • AI 뉴스 (4)
      • 경제 뉴스 (0)
    • Coding Study (10)
      • BOJ (0)
      • Programmers (10)
    • 기타 (3)

인기 글

최근 글

hELLO · Designed By 정상우.
글쓰기 / 관리자
머준

기억보단 기록하는 Devlog

[AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 시각지능 딥러닝(CNN) -7주차-
KT AIVLE/AI Track(교육)

[AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 시각지능 딥러닝(CNN) -7주차-

2023. 3. 14. 23:00

 5주차 딥러닝 강의에서는 ANN을 배웠고, 이번 7주차 시각 딥러닝 강의에서는 CNN을 배운다. 학교에서 아마 CNN 모델링을 하는 실습을 한 기억이 있는데 그때는 코드 이해도 못하고 주어진 코드를 돌려서 좋은 성능이 나오는 파라미터를 찾아 계속 노가다 했었던 것 같다. 이번 시각 딥러닝 강의에서 CNN을 제대로 배워보도록 할 것 이다.


시각 딥러닝(1)

더보기

 5주차 딥러닝 강사님과 같은 강사님이셨다. 코드가독성 좋게, 깔끔하게 를 작성하셔서 되게 인상 깊었던 강사님이셨는데 이번 시각 딥러닝도 같은 강사님이여서 내심 좋았다. 오전에는 5주차 딥러닝 때 배웠던 전체적인 복습을 진행했다. 오후에는 Convolution Neural Network (CNN)에 대한 이론 수업과 실습을 하였다. 다소 이해하기 어려운 부분도 많았다. 복습이 필수일 것 같다.

 

- Tensorflow

  -> keras

    1. sequential API

         : 순차적으로 레이어 연결

    2. functional API

         : 사슬처럼 레이어를 조절해가며 연결

             -> Locally Connected

              (1) concatenate

              (2) add

 

- 전처리

 1. reshape -> flatten

 2. one-hot encoding -> to_categorical

 3. scaling -> MinMaxScaling, STDScaling

 

 

- 회귀 / 이진분류 / 다중클래스

  회귀 이진분류 다중클래스
Loss mse, mae binary_crossentropy categorical_crossentropy
Metrics - accuracy accuracy
optimizer adam adam adam
output layer activation - sigmoid softmax

 

 

< Convolutional Neural Network (CNN) >

 

- CNN

 : flatten으로 하면이미지 구조를 없애버려서 정확도가 올리는데 한계가 있으니까

   flatten을 하기 전에 Convolution layer를 설정해 구조를 유지시켜서 학습하려고 하는 과정

 

- Dropout(rate)

  : 과적합을 피하기 위해 layers를 랜덤으로 죽임 -> 좀 더 general한 모델을 만들어줌

model.add(keras.layers.Dropout(rate))

 

- BatchNormalization

 : 정규화 후 데이터들 중 일부씩 선택하다보니 그 중 데이터 전체를 반영하지 못하는 결과를 낳음

     -> 미니 배치 간에도 정규화를 해보자.

model.add(keras.layers.BatchNormalization())

 

- hidden layers

 : 앞의 노드들의 뭐지 모를 간단한 특징을 따냄.

   그 다음 히든 레이어는 앞 레이어의 특징들 보다 깊은 특징을을 따냄

 

 

- Convolution layer

  : n*n*depth의 필터 n개로 n개의 feature maps를 만드는 과정

model.add( Conv2D(filters=64,           # 필터 갯수 => Conv2D를 통해 제작하려는 Feature map의 갯수
		  padding='same',       # 크기 유지 => filter가 훑기 전에 상하좌우로 픽셀을 덧붙임
		  kernel_size=(3, 3),   # 필터 크기
		  strides = (1,1),      # filter가 얼마나 촘촘히 훑을 것 인가 (sliding window)
		  activation='relu') )

 

- stride

 : n일 때 n칸 이동하여 훑음

   stride 때문에 필터가 사진 이미지의 데이터를 다 못 훑게 되면 오류 발생

 

 

 

- zero pad the border (zero padding)

 : 크기유지, 정보손실 방지를 위함

   필터가 지나가면서 경계 값들은 필터가 1번 밖에 훑지 않음

   -> 따라서 0으로 이루어진 테두리를 넣어줌

   경계 값을 훑는 횟수가 1번에서 4번으로 늘어남

 

 

- pooling

  : 가로 세로를 줄여서 연산량을 줄이고자 하는 목적 / depth에 영향은 x

   1. max polling

       : filter로 영향을 가장 많이 주는 값만 추출함

   2. mean polling

      : filter로 평균 값만 추출함

 

- tip

# y에 대한 전처리가 없어도 알아서 해줌
model.compile(loss=keras.losses.sparse_categorical_crossentropy, metrics=['accuracy'], optimizer='adam' )

 


시각 딥러닝(2)

더보기

 오전에는 어제 했던 내용들을 전체적으로 복습을 하고, 실습 3개를 진행했다. 코드를 익히는데에 중점을 둔 오전 수업이었다.

 

- Data Augmentation

 : 저작권 이슈 또는 수집 고난이도 이슈로 부족한 데이터로 학습

# 필요 라이브러리 불러오기
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 데이터 제너레이터 선언
datagen = ImageDataGenerator(rotation_range = 20,
                             zoom_range = 0.2,
                             width_shift_range = 0.1,
                             height_shift_range = 0.1,
                             horizontal_flip = True,
                             vertical_flip = True)

# 어떤 데이터를 바탕으로 제너레이팅 할 것인지 미리 알려줌 필수.
datagen.fit(x_train)

# 학습할때 마다 실시간으로 데이터 생성(뻥튀기 autmentation)하여 학습에 활용, 버리고를 반복할 준비
train_gen = datagen.flow(x_train, y_train, batch_size = 128,
                         # save_to_dir = '/content/temp',
                         # save_prefix = 'temp',
                         # save_format = 'jpg'
                         )

시각 딥러닝(3)

더보기

 오전에는 Data Augmentation 을 사용한 모델링 실습을 진행했다. 오후에는 YOLO 네트워크를 활용한 전이 학습 기반 Object Detection 실습을 했다. 직접 모은 데이터로 테스트도 해보았다.

 

- Convolution Neural Network

: 이미지의 구조를 유지한 채로 부분에서 특징을 뽑음

 

- Data Augmentation

 : ImageDataGenerator -> 높이조절/좌우조절/반전(각도)/비스듬히 비틀기

 

- np.expand_dims

# x : 흑백을 명시하기 위한 reshape
train_x = np.expand_dims(train_x, axis=-1)
test_x = np.expand_dims(test_x, axis=-1)

 

- model.save 와 checkpoint 차이

 model.save는 해당 시점에서 model 변수에 들어있는 모델을 저장하는 거고(학습이 종료된 후의 모델) checkpoint는 모델 성능이 갱신될 때마다 가장 좋은 모델을 저장한다. EarlyStopping 콜백을 주어 학습을 마쳤을 경우에 model 변수에는 가장 좋은 모델이 들어있기에 학습 종료 후 model.save했을 때 저장되는 모델과 checkpoint 콜백으로 자동 저장된 모델이 모두 가장 좋은 성능의 모델로 똑같다.

mcp = ModelCheckpoint(filepath='경로', # 모델 저장 경로
		      monitor='val_loss', # 모델 저장의 관심 대상
		      verbose=1,
		      save_best_only=True, # 최고 성능 모델만 저장
		      save_weights_only=False) # 가중치만 저장

 

- Google colab과 Google Drive 데이터 접근 방법

# 구글 연결하기
from google.colab import drive
drive.mount('/content/drive')

# 경로 바꾸기
cd /content/drive/MyDrive/my_data

# 이미지 불러오기
import glob
files = glob.glob('/content/drive/MyDrive/my_data/img1/*')

 

- Transfer Learning (전이 학습)

 : 특정 분야에서 학습된 신경망의 일부 능력을 유사하거나 전혀 새로운 분야에서 사용되는 신경망의 학습에 이용하는 것을 의미

  -> 신경망의 특징 추출 능력을 그대로 이용하고, 마지막 출력 계층으로써 주로 선형(Affine; 가중치와 편향에 대한 행렬 연산) 레이어만을 변경하여 이 변경된 레이어만을 재학습시키는 것이 전이 학습이다.

 

 

- GlobalAveragePooling2D

: feature map 마다 전체 평균을 추출

 

 

- pretrained Model & Transfer Learning

  1. pretrained Model : 만들어진 모델을 쓰는 것

  2. Transfer Learning : 우리 문제에 맞춰서 구조를 살짝 바꾸는 것

 

 

- object detection (객체 감지)

  : Object Detection = Classification + Localization

    = Multi-Labeled Classification + Bounding Box Regression

    1. Localization: 단 하나의 object 위치를 bounding box로 지정하여 찾음

    2. object detection: 여러 개의 Object들의 위치를 Bounding Box로 지정하여 찾음

 


시각 딥러닝(4)

더보기

- UltraLytics YOLO v3 Image Detection 따라하기

# utltraLytics git에 복사하기
!git clone https://github.com/ultralytics/yolov3.git

# yolov3 폴더 이동 및 requirements.txt 내부 패키지 설치
!cd yolov3; pip install –r /content/yolov3/requirements.txt

# 예제 이미지 다운로드
!wget –O 경로/이미지이름.jpg 이미지주소

# pretrained weights 다운로드
!wget –O 경로/pretrained명 pretrained주소

# —weights # 학습이 완료된 weight파일 경로
# —source # 테스트 이미지 또는 폴더 경로
# —project # box 그려진 이미지를 저장할 상위폴더
# —name # 이미지를 저장할 하위폴더
# —img # 이미지 크기 resize (클수록 정확도는 올라가지만, 속도가 떨어진다.)
# —conf-thres # 정해준 confidence score가 넘는 bounding box만 그리기
# —iou-thres # NMS IOU threshold : conf score 내림차순을 한 뒤에 서로 비교하려 특정기준 이상이면 버림
# —line-thickness # bounding box 두께
# —exist-ok # 실행할 때 덮어쓰기(이걸 안 쓰면 실행할때마다 새 파일 생성)
# —batch # 한번에 많은 배치 적용하면 메모리 터짐
# —epoch # 몇 번 학습
# Confidense threshold가 높을수록, IoU threshold가 낮을수록 더 많은 bounding box가 제거된다

# detect.py 실행
!cd yolov3; python detect.py \
	--weights pretrained model 경로 \
	--source 이미지파일 경로 \
	--project '/content/yolov3/detected' \
	--name 'images' \
	--img 640 \
	--conf-thres 0.5 \
	--iou-thres 0.4 \
	--line-thickness 2 \
	--exist-ok \
	#—-device CPU
 
# detect image 보기
from google.colab import files
from IPython.display import Image

Image(filename='이미지경로/파일명', width=640)

 

- Intersection over Union (IoU)

 

 : IoU = 교집합 영역 넓이 / 합집합 영역 넓이

두 box의 크기가 동일하다 가정하면, 두 개의 box가 적어도 2/3는 겹쳐줘야 0.5의 값이 나오기 때문에 여러 곳에서 IoU의 threshold 값을 0.5로 잡아서 사용하는 듯 하다.

 

 

- Non Maximum Suppression (NMS)

1. 모든 Bounding box는 자신이 해당 객체를 얼마나 잘 잡아내지 나타내는 confidence score를 가진다. 모든 bounding box에 대하여 threshold 이하의 confidence score를 가지는 Bounding Box는 제거한다. Confidence score가 일정 수준 이하인 bounding box들에 대해 일차적으로 필터링을 거치는 과정이다.

 

2. 남은 Bounding Box들을 Confidence score 기준 모두 내림차순 정렬합니다.

 

3. 맨 앞에 있는 Bounding box 하나를 기준으로 잡고, 다른 bounding box와 IoU 값을 구한다. IoU가 threshold 이상인 Bounding box들은 제거한다. Bounding box끼리 IoU가 높을수록, 즉 많이 겹쳐질수록 같은 물체를 검출하고 있다고 판단하기 때문이다.

 

4. 해당 과정을 순차적으로 시행하여 모든 Bounding box를 비교하고 제거한다.

 

5. Confidense threshold가 높을수록, IoU threshold가 낮을수록 더 많은 bounding box가 제거한다.

< 요약 >
1. object가 있다고 판단되는 박스를 모두 그림
2. confidence-thres 보다 confidence-score가 높은 박스만 남김
3. 박스 중 confidence score가 가장 높은 박스를 선정
4. 나머지 모든 박스와 IoU값을 계산하여 iou-thres보다 높은 박스를 제거

 confidence – bounding box에 object가 있나 없나를 확신하는 정도

 IoU – bounding box 간 겹치는 정도

 

 

- Precision – Recall Curve

: precision과 recall을 모두 감안한 지표

 

- Average Precision (AP)

: Precision – Recall Curve 그래프 아래의 면적

 

- mAP (mean Average Precision)

: 각 클래스 별 AP를 합산하여 평균을 낸 것


시각 딥러닝(5)

더보기

 어느새 시각 딥러닝 마지막 날 이다. CNN 구현 방법에 대해 5일 동안 쉴틈없이 배워왔다. 한 번에 많은 양이 머릿속으로 들어와서 혼란스럽기만 하다. 강사님이 매일 아침마다 정리를 해주시는데 그 정리 덕분에 겨우 틀을 잡아 공부했던 것 같다. 전체적인 정리도 따로 올려 공부해야겠다.

 오늘은 YoloV5를 사용 한 Custom Data Image Detection 이론 수업 및 실습을 했다. pretrained Model을 사용하여 직접 수집한 데이터와 yaml 파일을 train하여 best weights를 도출해내어 test picture에 적용해 성능을 확인해보는 실습이었다.

 

- Annotation

 : 이미지의 Detection 정보를 별도의 설명 파일로 제공되는 것을 의미

   Object의 Bounding Box 위치나 Object 이름 등을 특정 포맷으로 제공한다.

 

 

- YoloV5를 사용한 Custom Data Image Detection

 1. UltraLytics YOLO v5 설치

 2. 본인이 사전에 작업한 yaml 파일 넣기

 3. pretrained weights 다운로드

 4. train.py 실행 (python train.py) => best.pt 파일 생김

 5. 테스트용 이미지 넣기

 6. detect.py 실행

 7. 결과 확인

 

 

- yaml 파일 양식

path: dataset 경로
train: images/train
val: images/train

nc: 클래스 개수
names: ['클래스1‘, ’클래스2‘, ... ]

 

- train.py

# --data yaml_path
# --cfg yolov5.yaml 경로
# -- weight 다운받은 weights 경로
# --project 폴더명
# --name 하위폴더명

!cd yolov5; python train.py \
	--data '/content/yolov5/data/street_object.yaml' \
	--cfg '/content/yolov5/models/yolov5s.yaml' \
	--weights '/content/yolov5/pretrained/yolov5s.pt' \
	--epochs 1000 \
	--patience 7 \
	--img 640 \
	--project 'trained' \
	--name 'train_street' \
	--exist-ok
	--device cpu

 

 

- detect.py

# --data yaml_path
# --cfg yolov5.yaml 경로
# -- weight 다운받은 weights 경로
# --project 폴더명
# --name 하위폴더명
 

!cd yolov5; python detect.py \
	--weights '/content/yolov5/trained/train_street/weights/best.pt' \
	--source '/content/yolov5/data/images/' \
	--project '/content/yolov5/detected' \
	--name 'images' \
	--img 640 \
	--conf-thres 0.5 \
	--iou-thres 0.1 \
	--line-thickness 2 \
	--exist-ok
	--device CPU

 

반응형
    'KT AIVLE/AI Track(교육)' 카테고리의 다른 글
    • [AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 언어지능 딥러닝RNN, LSTM, GRU -9주차-
    • [AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 3차 미니프로젝트 -8주차-
    • [AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 2차 미니프로젝트 -6주차-
    • [AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 딥러닝 -5주차-
    머준
    머준

    티스토리툴바