드디어 인공지능 수업중에 제일 궁금했던 컴퓨터 비전에 대한 수업을 듣게 되었다!!
dalle와 같은 이미지 생성 모델은 봐도봐도 익숙해지는게 아니라 신기하기만 하다.
그리고 이번에 그러한 모델을 만드는데에 필요한
⭐컴퓨터 비전⭐ 기술에 대해 배울 수 있어서 넘 좋았다!
진짜 어려웠지만!
재밌었다!
진짜 어려웠지만!
cnn을 사용해 피처맵을 생성하려면 다음과 같은 하이퍼파라미터가 필요하다.
📍 근데 그와중에 잠깐상식
parameter vs hyperparameter
parameter
: 모델 스스로가 학습을 통해 찾아내는 값
ex) 가중치, 편향
hyperparameter
: 학습 시작 전, 사람이 수동으로 설정하여 모델 구조나 학습 알고리즘을 결정하는 값
filters: feature map의 수
kernel_size: 필터 사이즈
padding: 데이터의 가장자리 정보를 여러번 사용하기 위해 픽셀 덧붙임
- 생성된 feature map 크기 공식
strides(sliding, window): 얼마나 촘촘히 훑을지
feature map
= (기존 패딩 공식 / s) + 1 = ((n + 2p - f) / s + 1) * ((n + 2p - f) / s + 1)
⭐ activation: 출력 데이터에 적용할 함수 선택
👉 (보통) activation = 'relu'
실습에서는 CNN 모델을 사용해 MNIST, Fashion_MNIST, CIFAR-10 데이터를 분류했다.
위와 같은 데이터는 그 개수가 충분히 많아서 데이터 분류에 크게 어려움이 없었지만, 실전을 그렇지 않다!! 데이터가 부족한 경우가 다반사라고 하셨다!
그럼 우짜지?
해결 방법이 무려 세 가지!
적은 데이터셋을 회전시키고 자르는 등의 과정을 통해 그 개수를 늘려주는 방법이다.
from tensorflow.keras.preprocessing.image import ImageGenerator
위 코드를 통해 ImageGenerator를 임포트하여 사용할 수 있다.
ImageGenerator에 넣을 수 있는 하이퍼파라미터는 다음과 같다.
constant 모드: 새로운 픽셀을 지정된 값으로 채움, cval 인수를 사용하여 값 지정
nearest 모드: 새로운 픽셀을 기존 픽셀과 가장 가까운 값으로 채움
reflect 모드: 기존 픽셀을 반사하여 새로운 픽셀을 채움
wrap 모드: 이미지의 경계를 넘어서면 이미지를 반복하여 새로운 픽셀을 채움
이미지를 증강시켰는데도 훈련이 힘들다면 추가 해결방법이 두 가지 더 있다.
남들이 미리 훈련시켜놓은 모델을 냅다! 전부! 그대로! 가져다 쓰는 방법이다.
이 방법에 사용할 수 있는 CNN 모델 몇 가지를 말하자면 다음과 같다.
이 또한 마찬가지로, 남들이 잘 만들어놓은 모델을 사용하는 방법이다.
pretrained model: 모델을 그대로 사용
transfer learning: fine tuning을 통해 내가 해결하려는 문제에 맞게 기존 모델의 파라미터를 미세 조정
사전 학습된 모델을 쓰려는데 우리가 풀려는 문제와 유사하더라~
👉 output layer 부분 근처만 손보기
아니다 꽤나 다르더라~
👉 input layer 근처부터 재학습
그리고 이제 물체 분류는 다 햇다.
물체 탐지에 대한 내용으로 들어간다~~
하나의 object가 포함되어 있는 최소 크기 박스
💡 따라서, 딥러닝에서 지도학습을 통해 1, 2가 일치할 수 있도록 error(값의 차이)를 줄여나가는 방향으로 가중치를 update 해야함
어떤 클래스인지 알려주는 과정
Label이 cat이다.
👉 cat = 1, dog = 0, human = 0
예측한다.
👉 cat = 0.55, dog = 0.3, human = 0.01 ⭕성공!
👉 cat = 0.3, dog = 0.55, human = 0.01 ❌실패..
object가 진짜 bounding box안에 있는가?
이미지가 들어오고 처리되는 과정을 다음 세 개로 구분할 수 있다.
이미지를 feature map으로 변형한다.
❓어 이거 어디서 들어봤다.
💡 맞다! convolution layer를 통해 featuremap을 생성하는 CNN이 백본에 해당한다.
VGG16, ResNet, Inception등이 백본 역할을 한다.
❓object detection에서 CNN은 어떤 역할을 하나요?
💡backborn과 head역할을 합니다!
이러한 backborn, neck, head가 한 개씩 있는 모델을 one-stage detector라고 한다.
(두개 있으면 two-stage detector!)
실습 시간에는 yolov3을 사용하였다.
실습은 아래와 같은 순서로 이루어졌다.
👉 딥러닝 모델을 학습시키기 위해서는 Annotation된 데이터가 필요!!
따라서, yaml 파일에서는
📍 데이터가 어디 있는지
📍 클래스의 개수와 이름이 무엇인지
알 수 있다~~~
(1) 빈 메모장 생성
(2) 아래의 코드 입력
# 이미지 데이터
path: /content/drive/MyDrive/my_data/datasets/
train: images/train
val: images/train
# Classes
nc: 3
# ⭐⭐⭐ annotation에서 사용했던 클래스 순서와 같아야함!!!
names: ['Dog', 'Person', 'Tree']
# 라벨 데이터
path: /content/drive/MyDrive/my_data/datasets/
train: labels/train
val: labels/train
# Classes
nc: 3
names: ['Dog', 'Person', 'Tree']
(3) 파일 이름을 000.yaml로 지정
이 yaml 파일을 사용해 yolo로 object detection이 가능하다!! 아! 너무 힘들다!!