• mksong8

[딥러닝] CNN(Convolutional Neural Network)을 이용한 간단한 이미지 분류 예제



​ 이번 글에서는 이미지 분류 문제를 CNN으로 해결해 보도록 하겠습니다. 수천 장의 고양이와 개의 이미지를 인공신경망 모델(CNN)로 훈련하고 이 모델에 새로운 이미지를 입력하여 고양이인지 개인지 예측을 해 보도록 하겠습니다. ​



​ 파이썬으로 구현된 Keras 라이브러리를 사용하여 CNN(Convolutional Neural Network) 모델을 구축하겠습니다. ​ 모델을 구축하기 위해 이미지를 “test_set”과 “training_set” 폴더로 구분합니다. 이미지는 모두 10,000장입니다. 각각의 폴더에는 고양이와 개의 하위 폴더가 존재하여야 합니다. 트레이닝과 테스트 셋은 각각 4:1의 비율로 이미지를 배분합니다. CNN(Convolutional Neural Network) 모델을 구축하는데 위와 같은 단계는 필수입니다. ​ CNN(Convolutional Neural Network) 모델은 다음과 같은 단계로 나누어져 있습니다. ​ Step - 1 : Convolution Step - 2 : Pooling Step - 3 : Flattening Step - 4 : Full connection ​ ​ | 자, 이제 딥러닝 모델을 구현해 볼까요? ​ 파이썬 파일을 만들고 다음과 라이브러리를 추가합니다. ​ # Importing the Keras libraries and packages from keras.models import Sequential from keras.layers import Conv2D from keras.layers import MaxPooling2D from keras.layers import Flatten from keras.layers import Dense



1. 신경망 모델을 순차적 네트워크로 초기화하기 위해서 keras.models에서 Sequential 라이브러리를 가져옵니다. ​ 2. keras.layers에서 Conv2D 라이브러리를 가져왔습니다. CNN의 첫 단계인 컨볼루션을 수행합니다. 2차원 이미지를 작업할 계획이므로 Convolution 2D를 사용하고 비디오는 Convolution 3D를 사용해야 합니다. ​ 3. keras.layers에서 MaxPooling2D 라이브러리를 가져왔습니다. Min Pooling, Mean Pooling 등 다른 풀링 작업이 있으나 MaxPooling은 각 영역의 셀값의 최댓값을 채택합니다. ​ 4. keras.layers에서 Flatten 라이브러리를 가져왔습니다. 생성된 2차원 배열을 1차원의 선형 벡터로 변환하는 프로세스입니다. ​ 5. keras.layers에서 Dense 라이브러리를 가져왔습니다. ​ 다음으로, Sequential 클래스를 생성합니다. classifier = Sequential() ​ 컨볼루션을 구현해 보겠습니다. Keras 덕분에 코딩이 아주 간단해졌습니다. classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu')) ​ 위의 코드를 설명해 보겠습니다. Conv2D를 이용하여 레이어를 추가하여 3*3 필터 크기의 32개의 필터 수가 적용되었습니다. 입력 이미지는 64*64 해상도이고 이미지가 컬러이므로 RGB 값이 컬러를 의미하는 3입니다. 활성화 함수는 relu를 사용하였습니다.




이제 풀링 작업을 해야 합니다. 풀링 작업의 목표는 이미지 손실을 줄이는 것입니다. classifier.add(MaxPooling2D(pool_size = (2, 2))) ​ 풀링 레이어를 추가하고 2*2 매트릭스를 사용하여 픽셀 손실을 최소화하였습니다. ​ 풀링 된 이미지를 연속 벡터로 변환하겠습니다. 2차원 배열의 풀링 된 이미지를 1차원 단일 벡터로 변환합니다. classifier.add(Flatten()) ​ 평탄화하는 작업에서 파라미터 설정은 필요하지 않습니다. ​ 이번에는 NN 레이어를 구현하는 부분입니다. 인풋과 아웃풋 사이에 히든 레이어를 둡니다. classifier.add(Dense(units = 128, activation = 'relu')) ​ Dense로 레이어를 추가하고, units으로 레이어 노드 수를 정의합니다. 노드 수로 2의 거듭 수틀 사용하는 것이 일반적이지만 경험적으로 설정합니다. 활성화 함수는 relu를 사용하였습니다.



이진 분류 문제이기 때문에 노드가 하나인 출력 레이어를 구현합니다. classifier.add(Dense(units = 1, activation = 'sigmoid')) 노드가 하나의 출력 레이어를 구현하고 시그모이드 활성화 함수를 사용하였습니다. ​ classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) 옵티마이저로는 경사하강 알고리즘을 선택하였습니다. 로스 함수와 성능 메트릭 파라미터를 각각 설정해 주었습니다.



이제 CNN 알고리즘을 학습할 차례입니다. 과적합을 방지하기 위해 이미지를 사전처리합니다. 과적합은 트레이닝 세트의 정확도는 높으나 테스트 세트에서는 낮은 정확도를 얻는 것을 말합니다. ​ keras.preprocessing 라이브러리를 사용하여 이미지 데이터를 증폭시킵니다. 이미지의 레이블은 디렉터리 명을 따릅니다. 즉, 'cats'라는 이름의 폴더 안에 있는 모든 이미지는 고양이로 학습됩니다. ​ train_datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True) test_datagen = ImageDataGenerator(rescale = 1./255) training_set = train_datagen.flow_from_directory('training_set', target_size = (64, 64), batch_size = 32, class_mode = 'binary') test_set = test_datagen.flow_from_directory('test_set', target_size = (64, 64), batch_size = 32, class_mode = 'binary') ​ 원본 이미지를 회전, 흐리게 하여 다른 이미지를 생성해 냅니다. ​ 이제 모델을 테스트해 보겠습니다. ​ classifier.fit_generator(training_set, steps_per_epoch = 8000, epochs = 25, validation_data = test_set, validation_steps = 2000) ​ steps_per_epoch는 훈련 횟수를 의미합니다. epochs는 모델을 학습시키는 단위를 말합니다. 모든 데이터가 한번 훈련에 사용되면 한 epoch가 완료 되었다고 합니다. 모델 훈련은 하나 이상의 epoch가 실행되어야 합니다. 위의 경우 25번 실행하였습니다. ​



​| 훈련된 모델로 예측하기 ​ import numpy as np from keras.preprocessing import image test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg', target_size = (64, 64)) test_image = image.img_to_array(test_image) test_image = np.expand_dims(test_image, axis = 0) result = classifier.predict(test_image) training_set.class_indices if result[0][0] == 1: prediction = 'dog' else: prediction = 'cat' ​ 테스트해야 하는 이미지를 64*64 해상도로 준비하여 predict()로 예측값을 계산합니다. 예측 값은 0 또는 1로 표현됩니다. 예측값이 1이면 개, 0이면 고양이를 의미합니다. ​ 내가 준비한 이미지를 입력하면 학습된 모델로 고양이인지 개인지 판별할 준비가 되었습니다! 이미지 판별을 위한 딥러닝을을 고려하고있다면 유펜솔루션과 상의해 보세요. : )


조회 169회

​고객센터

Tel: 02-596-8900  Fax : 02-6930-5709

10시 - 오후 7시(토, 일요일 및 공휴일은 휴무)

개인정보관리책임자 : 황재준   상호 : 유펜솔루션   대표자 : 김재훈   사업자등록번호 : 426-86-00939
주소 : (본사)대전광역시 유성구 엑스포로446번길 38, 3층 302호 / (지사 및 연구소)서울시 성동구 연무장 15길 11, B동 2층
​ⓒ 2019 UpennSolution Co., Ltd. All rights reserved.