0. CNN
DNN(Deep Neural Network)의 문제점 : DNN은 기본적으로 1차원 형태의 데이터를 사용하기 때문에 이미지의 공간적/지역적 정보(spatial/topological information) 손실, 추상화과정 없이 바로 연산과정으로 넘어가 버리기 때문에 학습시간과 능률의 효율성 저하
CNN : 이미지를 날것(raw input) 그대로 받음으로써 공간적/지역적 정보를 유지한 채 특성(feature)들의 계층을 빌드업 특징 : 이미지 전체보다는 부분을 보는 것, 이미지의 한 픽셀과 주변 픽셀들의 연관성 유지
- Fully-Connected layer : 이전 레이어의 출력을 평탄화하여 다음 스테이지의 입력이 될 수 있는 단일 벡터로 변환
- 기능 : 이미지를 정의된 라벨로 분류하는데 사용
- 단점 : 위치 정보의 손실, 일반 DNN의 문제점
- Convolutional layer : 필터는 이미지를 통과하여 한번에 (n*m)을 스캔하고 Feature Map을 만듦
- 기능 : 위치정보를 유지하면서 특징(Feature) 추출
- Polling Layer : 가장 중요한 정보를 유지하는 동시에, 각 Feature의 정보량 줄임
1. 코드
- Conv2D : 2차원 합성곱을 연산 층, 이미지에서 Feature을 추출
- filters - 출력 필터의 수
- kernel_size - 필터의 높이와 너비
- strides - 필터의 보폭
- padding - (valid) 출력이미지가 입력이미지보다 작아짐, (same) 이미지 크기 같음
- MaxPooling2D : 주어진 영역에서 최대값을 취하여 이미지의 크기를 줄임 -> 연산 감소
- pool_size - Pooling을 수행할 영역의 크기
- strides - 영역 보폭 ( 일반적으로 pool_size와 같음 )
- BatchNormalization : 학습 과정 중 각 배치마다 입력 데이터의 평균과 분산을 조정하여 학습 속도, 안정성 향상
- Dropout : 학습과정 중 무작위로 일부 뉴런을 비활성화
- Flatten : 2차원 형태 데이터를 1차원으로 변환해 주는 역할
model.add(Conv2D(filters = 32,
kernel_size=(3, 3),
strides = (1, 1),
padding='same',
activation='relu' ))
model.add(MaxPool2D(pool_size=(2, 2),
strides = (2, 2)))
model.add(BatchNormalization())
model.add(Dropout(.25))
model.add(Flatten())
model.add(Dense(10, activation='softmax'))
- EarlyStopping : 모델의 성능이 개선되지 않을 때 조기에 멈추는 콜백 함수
- monitor - 모니터링할 지표(기본 'val_loss')
- patience - 성능 향상을 기다릴 epoch 수
- restore_best_weights - True면 종료되기 전 가장 좋은 성능을 보였던 가중치로 복원
from keras.callbacks import EarlyStopping
es = EarlyStopping(monitor = 'val_loss',
min_delta=0,
patience=3,
verbose=1,
restore_best_weights= True
)
hist = model.fit(train_x, train_y,
validation_split= .2,
epochs = 10, verbose=1,
callbacks = [es])
2. Image Data Augmentation
데이터의 양을 늘리기 위해 변환을 통해 개수를 증가시키는 기법(수집한 것만이라도 이용해서 성능을 높이자!)
2.1 코드
- RandomRotation : 이미지를 무작위로 회전
- factor - 회전 각도의 범위를 설정
- RandomTranslation : 이미지를 무작위로 이동
- height_factor - 새로 방향 이동범위
- width_factor - 가로 방향 이동범위 설정
- RandomZoom : 이미지를 무작위로 확대, 축소
- height_factor - 세로 방향 확대, 축소 범위
- width_factor - 가로방향 확대, 축소 범위
- RandomFlip : 상화좌우 반전
- mode - 'horizontal' 좌우반전, 'vertical' 상하반점, 'horizontal_and_vertical' 무작위 좌우 상하 반전
al = keras.layers.RandomRotation(factor=(-0.3,0.3))(il)
al = keras.layers.RandomTranslation(height_factor=(-0.3,0.3), width_factor=(-0.3,0.3))(al)
al = keras.layers.RandomZoom(height_factor=(-0.2,0.2), width_factor=(-0.2,0.2))(al)
al = keras.layers.RandomFlip(mode='horizontal_and_vertical')(al)
3. Transfer Learning
어떤 목적을 이루기 위해 학습된 모델을 다른 작업에 이용하는 것
- Pretrained Model : 학습된 모델( VGG, ResNet, Inception, MobileNet, BERT)
- Fine-Tuning : 학습된 모델을 기반으로 새로운 목적에 맞게 변형하고 모델 Weights로 부터 학습을 업데이트하는 방법
3.1 전략
- 데이터 수집이 많고, 문제와 학습모델이 유사 : 모델의 뒷부분 위주로 재학습
- 데이터 수집이 많고, 문제와 학습모델이 다름 : 모델 전체 재학습
- 데이터 수집이 적고, 문제와 학습모델이 유사 : 모델의 뒷부분 중의 뒷부분만 재학습
- 데이터 수집이 적고, 문제와 학습모델이 다름 : 모델의 뒷부분 위주로 재학습
3.2 코드
- InceptionV3 : CNN모델, 작은 크기의 데이터셋에서도 효과적으로 학습
- weights - 특정 데이터로 학습된 가중치 불러오기(imagenet, ..)
- include_top - 모델 아웃풋 레이어 제외하고 불러오기
- input_shape - 입력데이터의 형태
keras.backend.clear_session()
base_model = InceptionV3(weights='imagenet', # ImageNet 데이터를 기반으로 미리 학습된 가중치 불러오기
include_top=False, # InceptionV3 모델의 아웃풋 레이어는 제외하고 불러오기
input_shape= (299,299,3)) # 입력 데이터의 형태
new_output = GlobalAveragePooling2D()(base_model.output)
new_output = Dense(3, # class 3개 클래스 개수만큼 진행한다.
activation = 'softmax')(new_output)
model = keras.models.Model(base_model.inputs, new_output)
model.summary()
4. Object Detection
물체를 식별하고 이미지나 비디오에서 물체의 위치를 찾는 것
- Bounding Box : 물체의 위치를 표현(x, y, width, height)
- Class Classification : bounding box 내에 포함된 물체의 클래스를 식별하는 작업(분류 문제)
- Confidence Score : bounding box 내에 예측된 클래스의 확신의 정도(점수가 높을수록 예측이 신뢰할 수 있음)
- IOU : 예측된 bounding box, 와 실제 물체의 bounding box 사이의 겹치는 영역 비율(IOU가 높을 수록 예측 정확함)
- NMS(Non-Maximum Suppression) : 겹치는 bounding box를 제거하여 중복된 예측을 제거하는 기술
- 평가지표 : 모델이 어느 정도의 성능을 보이는지
- mAP(mean Average Precision) - 실제 object가 detected된 재현율의 변화에 따른 Precision의 값을 평균한 수치
- Annotation : 학습 데이터셋에서 각 이미지에 대한 실제 물체의 위치와 클래스 정보를 나타내는 작업
- boundig box + 클래스 레이블(ex. txt)
4.1 코드
from ultralytics import YOLO
model_scratch = YOLO(model='yolov8n.yaml', task='detect')
model_scratch.train(data='/content/futbol-players-7/data.yaml',
epochs=100,
patience=5,
seed=2024,
pretrained=False,
)
model_scratch.predict(source=image_path, stream=False, save=True)
'KT에이블스쿨' 카테고리의 다른 글
[KT에이블스쿨] 12주 (0) | 2024.05.12 |
---|---|
[KT에이블스쿨] 4주 (0) | 2024.03.31 |
[KT에이블스쿨] 5주, 6주 (0) | 2024.03.31 |