본문 바로가기
🖊️Data Analysis/📌 DL)개와 고양이 이미지 분석

[Python] 개와 고양이 이미지 분석

by 빛나고요 2021. 7. 12.
BIG

Study. 개와 고양이 이미지 분석

[스스로 정리한 코드 분석과 흐름]

 

5. CNN
  1. CNN : Convolutional Neural Network
  2. 이미지를 CNN이 어떻게 구분하냐면 여러 가지 필터들이 돌아다니면서 feature extraction 해서 이미지를 추출함
  3. 2차원의 이미지를 1차원으로 바꿔주는 작업도 해야한다.
  4. feature extraction이 끝나면 classification 작업을 한다.
  5. 여러 개를 분리할 때는 softmax 함수를 사용하여 산출물을 낸다.

 

6. Tensorflow 사용하여 model층 쌓기
  1. model.add(Conv2d(128,(3,3), activation='relu', input_shape=(300,300,3))) ⇒ 첫 번째 층은 Conv2d라고 하는 층으로 필터는 128개이며 필터의 크기는 3X3으로 해서 feature를 추출하고 활성화 함수는 relu이고 들어오는 자료는 300X300 크기에 color이라서 3으로 준다.
  2. 그다음은 컨볼루션 층을 통해서 이미지를 추출했지만 여전히 데이터가 크고 복잡해서 축소하는 작업(pooling)을 해야 하기 때문에 pooling 작업을 한다.
  3. 쌓는 방법은 model.add()로 한다.
  4. model.add(MaxPool2D(pool_size(2, 2))) ⇒ model.add() 방법으로 pooling 층을 사이즈 2 by 2로 쌓아준다. 그러나 노드와 층이 많아진다고 성능이 좋아지는 것이 아니다! 그러므로 가 적합을 효과적으로 피하는 게 성능을 올리는 방법 중 하나이기 때문에 은닉층의 노드를 임의로 하나 꺼주는(drop out) 방법을 사용해서 학습 데이터가 지나치게 가 적합하는 것을 방지하기 위해 추가해준다.  
  5. model.add(Dropout(0.5)) ⇒ 절반은 임의로 꺼준다. 
  6. 이제 필터의 개수를 절반씩 줄이면서 feature extraction(특징 추출)을 해준다. input_shape는 필요 없다.
  7. 그리고 dense(계산)하는 층으로 바꿔준다.
  8. 그러려면 2차원에서 1차원으로 바꿔줘야 하기 때문에 flatten을 사용한다.
  9. 그렇게 층을 바꿔주고 dense 층을 쌓아줬다. 
  10. model.summary() ⇒ cnn을 만든다.
  11. model.fit_generator(train_generator, validation_data=valid_generator, epcoh=1) ⇒ model을 실행한다.

7. 전이 학습
  1. 외부 기관에서 층을 여러 개 쌓아 논문화 시켜서 성능을 검증받은 모형을 가지고 와서 사용하는 것이다.  왜 사용하냐면, 기존에 학습되어 있는 결과를 가져와 유사한 프로젝트에 사용하면 데이터가 부족한 상황에서는 조금 더 효과적으로 학습을 시킬 수 있고, 딥러닝 기계가 미리 기초적인 작업을 마친 결과를 가져오면 우리는 기초작업을 생략하고 중요한 feature 만 추출해서 추가적인 작업이 가능하고 형태를 구분하는 학습은 이미 되어 있기 때문에 작업 시간을 줄일 수 있어서 유용하다. 또한 성능이 이미 검증되어 있기 때문에 층을 쌓아서 성능이 나오도록 고생하기보다는 전이 학습을 통해 검증된 모형 학습을 가져와 수정해서 하는 것이 오히려 효과적이다. 
  2. 종류가 매우 다양하기 때문에 하나만 해보면 종류만 바꿔서 사용하면 된다.

 

8. VGG16
  1. tensorflow에서 제공하고 있는 VGG16 모형을 라이브러리로 불러온다
  2. VGG에서 이미지 학습으로 되어있는 것을 가져오고 마지막 부분의 레이어는 가져오지 않고 우리가 붙일 것이기 때문에 include_top을 False로 지정하고 input_shape는 300X300에 color기 때문에 3을 해주고 새로 불러온 부분이 학습하는 것이 아니기 때문에 transfer_model.trainable=False를 해준다. 
  3. summary를 불러온 후 나온 값들을 활용한다. 
  4. model2를 해서 층으로 쌓아서 모델을 만들어준다.
  5. 마지막 부분이 2차원으로 되어있기 때문에 1차원으로 바꿔준다.
  6. 계산층 dense를 넣어주고 개와 고양이 softmax 층을 넣어준다. 
  7. 마지막으로 model2.fit_generator(train_generator, validation_data=valid_generator, epochs=1)를 해서 실행한다.

 

9. InceptionResNetV2
  1. VGG와 동일한 방법으로 성능이 더 좋은 인셉션 레지넷이라는 것으로 사용해본다.
  2. model3.add(transfer_model2) ⇒ 인셉션 레지넷을 가져온다.
  3. model3.add(Flatten()) ⇒ 1차원으로 바꿔줌
  4. model3.add(Dense(64, activation='relu')) ⇒ 계산하는 dense 층 추가
  5. model3.add(Dense(2, activation='softmax')) ⇒ 개, 고양이 분류하는 softmax 층 추가
  6. 그 후 네트워크 모델을 생성한다. 
  7. 마지막으로 model3을 실행한다.

 

10. 마무리
  1. result = model3.predict_generator(test_generator, verbose=1, workers=2) ⇒ 예측된 결과값 출력

댓글