Computer Vision 99

26. 객체 탐지

하나의 이미지에서 여러 물체를 분류하고 위치를 추정하는 작업을 객체 탐지(object dection)이라고 한다. 몇 년 전까지 널리 사용되던 방법은 하나의 물체를 분류하고 위치를 찾는 분류기를 훈련한 다음 그림 14-24처럼 이미지를 모두 훑는 것이다. 이 예에서는 이미지를 6x8 격자로 나누고 하나의 CNN(굵은 검정 사각형)이 모든 3x3 영역을 지나간다. 이 CNN이 이미지 왼쪽 상단을 지나갈 때 가장 왼쪽에 있는 장미꽃의 일부를 감지한다. 그다음 오른쪽으로 한 스텝 이동해서 같은 꽃을 다시 감지한다. 그다음 스텝에서 가장 위쪽에 있는 장미꽃을 감지하기 시작한다. 다시 오른쪽으로 한 스텝 이동해서 같은 꽃을 감지한다. 이런 식으로 CNN이 전체 이미지를 슬라이딩하면서 모든 3x3 영역을 본다. 또..

25. 분류와 위치 추정

사진에서 물체의 위치를 추정하는 것은 회귀 작업으로 나타낼 수 있다. 물체 주위의 바운딩 박스(bounding box)를 예측하는 일반적인 방법은 물체 중심의 수평, 수직 좌표와 높이, 너비를 예측하는 것이다. 즉 네 개의 숫자를 예측해야 한다. 이 때문에 모델을 크게 바꿀 필요는 없다. (일반적으로 전역 평균 풀링 층 위에) 네 개의 유닛을 가진 두 번째 밀집 출력 층을 추가하고 MSE 손실을 사용해 훈련한다. base_model=keras.applications.xception.Xception(weights='imagenet',include_top=False) avg=keras.layers.GlobalAveragePooling2D()(base_model.output) class_output=keras..

24. 사전훈련된 모델을 사용한 전이 학습

충분하지 않은 훈련 데이터로 이미지 분류기를 훈련하려면 사전훈련된 모델의 하위층을 사용하는 것이 좋다. 예를 들어 사전훈련된 Xception 모델을 사용해 꽃 이미지를 분류하는 모델을 훈련해보겠다. import tensorflow_datasets as tfds dataset,info=tfds.load('tf_flowers',as_supervised=True,with_info=True) dataset_size=info.splits['train'].num_examples #3670 class_names=info.features['label'].names #['dandelion','daisy',...] n_classes=info.features['label'].num_classes # 5 with_info=T..

23. 케라스를 사용해 ResNet-34 CNN 구현

먼저 ResidualUnit 층을 만든다. class ResidualUnit(keras.layers.Layer): #잔차 유닛 def __init__ (self,filters,strides=1,activation='relu',**kwargs): super(). __init__(**kwargs) self.activation=keras.activations.get(activation) self.main_layers=[ keras.layers.Conv2D(filters,3,strides=strides, padding='same',use_bias=False), keras.layers.BatchNormalization(), self.activation, keras.layers.Conv2D(filters,3,str..

22. ResNet, Xception

잔차 네트워크(residual network)를 사용한다. 152개 층으로 구성된 극도로 깊은 CNN을 사용했다. 더 적은 파라미터를 사용해 점점 더 깊은 네트워크로 모델을 구성하는 일반적인 트렌드를 만들었다 이런 네트워크를 훈련시킬 수 있는 핵심 요소는 스킵 연결(skip-connetcion)이다. 어떤 층에 주입되는 신호가 상위 층의 출력에도 더해진다. 일반적인 신경망을 초기화할 때는 가중치가 0에 가깝기 때문에 네트워크도 0에 가까운 값을 출력한다. 스킵 연결을 추가하면 이 네트워크는 입력과 같은 값을 출력한다. 즉 초기에는 항등함수를 모델링한다. 목적 함수가 항등 함수에 가깝다면(대부분의 경우에 해당) 훈련 속도가 매우 빨라질 것이다. 또한 스킵 연결을 많이 추가하면 일부 층이 아직 학습되지 않았..

21. LeNet-5, AlexNet, GoogleNet

LeNet-5 구조는 아마도 가장 널리 알려진 CNN 구조일 것이다. 이 구조는 더 크고 깊을 뿐 LeNet-5와 비슷하며, 처음으로 합성곱 층 위에 풀링 층을 쌓지 않고 바로 합성곱 층끼리 쌓았다. 과대 적합을 줄이기 위해 두 가지 규제 기법을 사용했다. 첫 번째는 훈련하는 동안 F9와 F10의 출력에 드롭아웃을 50%비율로 적용했다. 두 번째는 훈련 이미지를 랜덤하기 여러 간격으로 이동하거나 수평으로 뒤집고 조명을 바꾸는 식으로 데이터 증식(data augmentation)을 수행했다. AlexNet은 또 C1과 C3 층의 ReLU 단계 후에 바로 LRN(local response normalization) 이라 부르는 경쟁적인 정규화 단계를 사용했다. 가장 강하게 활성화된 뉴런이 다른 특성 맵에 있..

20. CNN 구조

전형적인 CNN 구조는 합성곱 층을 몇개 쌓고 (각각 ReLU층을 그 뒤에 놓고), 그 다음에 풀링층을 쌓고, 그다음에 또 합성곱 층(+ReLU)을 몇 개 더 쌓고, 그 다음에 다시 풀링 층을 쌓는 식이다. 네트워크를 통과하여 진행할수록 이미지는 점점 작아지지만, 합성곱 층 때문에 일반적으로 점점 더 깊어진다. (즉, 더 많은 특성 맵을 가진다) 맨 위층에는 몇 개의 완전 연결 층(+ReLU)으로 구성된 일반적인 피드포워드 신경망(feedforward neural network)이 추가되고 마지막 층(예를 들면 클래스 확률을 추정하기 위한 소프트맥스 층)에서 예측을 출력한다. 다음 코드는 패션 MNIST 데이터셋 문제를 해결하기 위한 간단한 CNN이다. model= keras.models.Sequenti..

19. 풀링 층

풀링 층의 목적은 계산량과 메모리 사용량, (과대적합의 위험을 줄이기 위한) 파라미터수를 줄이기 위해 입력 이미지의 부표본(즉, 축소본)을 만드는 것이다. 합성곱 층에서와 마찬가지로 풀링 층의 각 뉴런은 이전 층의 작은 사각 영역의 수용장 안에 있는 뉴런의 출력과 연결되어 있다. 이전과 동일하게 크기, 스트라이드, 패딩 유형을 지정해야 한다. 하지만 풀링 뉴런은 가중치가 없다. 즉 최대나 평균 같은 합산 함수를 사용해 입력값을 더하는 것이 전부이다. 다음 그림은 아주 널리 사용되는 풀링 층인 최대 풀링 층을 보여준다. 이 예에서는 2x2 풀링 커널(pooling kernel)과 스트라이드 2를 사용하며 패딩은 없다. 각 수용장에서 가장 큰 입력값이 다음 층으로 전달되고 다른 값은 버려진다. 계산량, 메모..

18. 합성곱 신경망을 사용한 컴퓨터 비전 - 합성곱 층

합성곱 신경망(convolutional neural network, CNN) CNN의 가장 중요한 구성 요소는 합성곱 층(convolutional layer)이다. 첫 번째 합성곱 층의 뉴런은 입력 이미지의 모든 픽셀에 연결되는 것이 아니라 합성곱 층 뉴런의 수용장 안에 있는 픽셀에만 연결된다. 이런 구조는 네트워크가 첫 번째 은닉층에서는 작은 저수준 특성에 집중하고, 그다음 은닉층에서는 더 큰 고수준 특성으로 조합해나가도록 도와준다. 이런 계층적 구조는 실제 이미지에서 흔히 볼 수 있으며, 이는 CNN이 이미지 인식에 잘 작동하는 이유 중 하나이다. 뉴런의 가중치는 수용장 크기의 작은 이미지로 표현될 수 있다. 층의 전체 뉴런에 적용된 하나의 필터는 하나의 특성 맵(feature map)을..