이전 장에서 HDF5 및 메모리에 맞지 않는 너무 큰 데이터 세트로 작업하는 방법을 배웠습니다. 이를 위해 이미지의 입력 데이터 세트를 가져 와서 고효율 HDF5 데이터 세트로 직렬화하는 데 사용할 수있는 Python 유틸리티 스크립트를 정의했습니다. HDF5 데이터 세트에서 이미지 데이터 세트를 표현하면 I/O 지연 문제를 피할 수 있으므로 훈련 프로세스의 속도를 높일 수 있습니다.

예를 들어 디스크에서 이미지를 순차적으로 로드하는 데이터 집합 생성기를 정의한 경우 각 이미지에 대해 하나씩 N 개의 읽기 작업이 필요합니다. 그러나 이미지 데이터 세트를 HDF5 데이터 세트에 배치하면 단일 읽기를 사용하여 이미지 배치를로드 할 수 있습니다. 이 작업을 통해 I/O 호출 수를 크게 줄이고 매우 큰 이미지 데이터 세트로 작업 할 수 있습니다.
이 장에서는 작업을 확장하고 Keras로 Convolutional Neural Networks를 훈련하는 데 적합한 HDF5 데이터 세트용 이미지 생성기를 정의하는 방법을 배웁니다. 이 생성기는 HDF5 데이터 세트를 열고 학습 할 네트워크에 대한 이미지 배치 및 관련 학습 레이블을 생성하고 모델이 충분히 낮은 손실/높은 정확도에 도달 할 때까지 계속 진행합니다. 이 프로세스를 수행하기 위해 먼저 분류 정확도를 높이기 위해 설계된 세 가지 새로운 이미지 전 처리기 (평균 빼기, 패치 추출 및 자르기 (또는 오버 샘플링이라고도 함))를 살펴 보겠습니다. 새로운 전 처리기 세트를 정의한 후에는 실제 HDF5 데이터 세트 생성기 정의로 넘어갈 것입니다.
여기에서 Krizhevsky 등의 2012 년 논문 인 ImageNet Classification with Deep Convolutional Neural Networks의 AlexNet 아키텍처를 구현할 것입니다. AlexNet을 구현하여 Kaggle Dogs vs. Cats 챌린지에 대한 학습을 시작하게 됩니다. 학습 된 모델이 주어지면 테스트 세트에서 성능을 평가 한 다음 오버 샘플링 방법을 사용하여 분류 정확도를 더욱 높일 것입니다. 결과에서 알 수 있듯이, 네트워크 아키텍처 + 자르기 방법을 통해 Kaggle Dogs vs. Cats 챌린지에서 상위 25 위 순위에 진입 할 수 있습니다.
이 섹션에서는 두 개의 새로운 이미지 전처리기를 구현할 것입니다.
1. 입력 이미지 (데이터 정규화의 한 형태)에서 데이터 세트 전체의 평균 빨강, 녹색 및 파랑 픽셀 강도를 빼도록 설계된 평균 빼기 전 처리기 ).
2. 훈련 중 이미지에서 M × N 픽셀 영역을 무작위로 추출하는 데 사용되는 패치 전 처리기.
3. 입력 이미지의 5 개 영역 (네 모서리 + 중앙 영역)을 해당 수평 뒤집기와 함께 샘플링하기 위해 테스트 시간에 사용되는 오버 샘플링 전 처리기 (총 10 회 자르기). 오버 샘플링을 사용하면 CNN을 통해 10 가지 크롭을 전달한 다음 10 가지 예측을 평균하여 분류 정확도를 높일 수 있습니다.
30.1.1 평균값 전처리
평균 전 처리기부터 시작하겠습니다. 29 장에서 이미지 데이터 세트를 HDF5 형식으로 변환하는 방법을 배웠습니다. 이 변환의 일부는 전체 데이터 세트의 모든 이미지에서 평균 빨강, 녹색 및 파랑 픽셀 강도를 계산하는 것입니다. 이제 이러한 평균을 얻었으므로 데이터 정규화의 한 형태로 입력 이미지에서 이러한 값을 픽셀 단위로 뺄 것입니다. 입력 이미지 I와 R, G, B 채널이 주어지면 다음을 통해 평균 감산을 수행 할 수 있습니다.
• R = R− µR
• G = G− µG
• B = B− µB
여기서 µR, µG 및 µB는 이미지 데이터 셋은 HDF5 형식으로 변환됩니다. 아래 그림에는 입력 이미지에서 평균 RGB 값을 빼는 시각화가 포함되어 있습니다. 빼기가 픽셀 단위로 수행되는 방식을 확인하십시오.

R = 124.96, G = 115.97, B = 106.13 픽셀 단위를 빼서 입력 이미지 (왼쪽)에 평균 빼기를 적용하여 출력 이미지 (오른쪽)를 생성하는 예입니다. 평균 빼기는 분류 중 조명 변화의 영향을 줄이는 데 사용됩니다.
이 개념을 좀 더 구체적으로 만들기 위해 계속해서 MeanPreprocessor 클래스를 구현해 보겠습니다.

전처리 하위 모듈에 meanpreprocessor.py라는 새 파일을 배치 한 방법에 주목하십시오. 이 위치는 MeanPreprocessor 클래스가있는 곳입니다. 이제 이 클래스를 구현해 보겠습니다.
# import the necessary packages
import cv2
class MeanPreprocessor:
def __init__(self, rMean, gMean, bMean):
# store the Red, Green, and Blue channel averages across a
# training set
self.rMean = rMean
self.gMean = gMean
self.bMean = bMean
5 행은 MeanPreprocessor에 대한 생성자를 정의합니다. 여기에는 세 개의 인수 (전체 데이터 세트에서 계산 된 각각의 빨간색, 녹색 및 파란색 평균)가 필요합니다. 이 값은 8-10 행에 저장됩니다. 다음으로, 이미지 처리 파이프 라인에 적용하려는 모든 전처리기에 필요한 함수 인 전처리 방법을 정의 해 보겠습니다.

15 행은 cv2.split 함수를 사용하여 입력 이미지를 각각의 RGB 구성 요소로 분할합니다. OpenCV는 RGB 가 아닌 BGR 순서로 이미지를 나타내므로 반환 튜플에 (R, G가 아닌 (B, G, R) 서명이있는 이유는 , B). 또한 OpenCV 이미지는 일반적으로 부호없는 8 비트 정수로 표시되므로 이러한 채널이 부동 소수점 데이터 유형인지 확인합니다 (이 경우 음수 값을 가질 수 없으며 대신 모듈로 산술이 수행됨).
17-20 행은 입력 이미지의 RGB 채널에서 각각의 평균 RGB 값을 빼면서 평균 빼기를 수행합니다. 그런 다음 23 행은 정규화 된 채널을 다시 병합하고 결과 이미지를 호출 함수에 반환합니다.