ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #26. "Deep Learning Cookbook" - 9. 이미 훈련된 이미지 인식 신경망 재사용하기
    연구실 2019. 11. 8. 02:02

    - 케라스가 제공하는 5개의 사전 신경망을 로드

    - 신경망에 이미지를 입력하기 전 전처리 하는 방법

    - 전이 학습(transfer learning): 사전 훈련된 신경망을 이용해 부분적으로 변경한 뒤 새로운 데이터를 학습해 새로운 작업을 할 수 있게 하는 방식

     

    9.1 사전 훈련된 신경망 로드하기

    model = VGG16(weights='imagenet', include_top=True)
    model.summary()

    - 케라스는 다양한 신경망 모듈을 가지고 있으며, 다운로드 시 파일을 ~/.keras/models에 저장한다.

    - VGG16, VGG19, ResNet50, Inception v3, Xception을 지원한다.

        - VGG16은 16개 레이어만 사용해 분석이 쉽다.

        - Inception v3은 다른 신경망과 비교해서 많은 레이어를 가지고 있지만, 파라미터는 85% 적게 사용해 로딩 속도를 높일 수 있고 메모리 사용량을 줄일 수 있다.

     

     

    9.2 이미지 사전 처리하기

    - 이미지를 적절한 크기로 자르거나 크기를 조정하고 색을 정규화해야 한다.

    - 케라스에 있는 사전 훈련된 모든 신경망은 일정한 크기의 정사각형 이미지를 입력 데이터로 요구한다. 색상 채널도 정규화되어야 한다. 

    - PIL/Pillow를 사용해 이미지를 로드하고 center-crop을 한다.

    img = Image.open('data/cat.jpg')
    w, h = img.size
    s = min(w, h)
    y = (h - s) // 2
    x = (w - s) // 2
    img = img.crop((x, y, s, s))
    imshow(np.asarray(img))

    - 하지만 내가 넣을 이미지는 스포츠 중계 로고 이미지이기 때문에 센터 크롭을 하는 대신 나머지 부분을 채워주었다.

    - 레이어의 input_shape 속성은 레이어의 입력 크기를 담고 있다. 이 속성을 이용해  신경망의 첫번째 레이어에 해당하는 입력 크기로 이미지 크기를 조절한다.

    input_1 (InputLayer) (None, 224, 224, 3) 0

    target_size = max(x for x in model.layers[0].input_shape if x)
    img = img.resize((target_size, target_size), Image.ANTIALIAS)
    imshow(np.asarray(img))

    * Image.ANTIALIAS: 이미지 계단 현상을 부드럽게 개선해줌

     

    - 그런 다음에는 이미지를 배열로 변환하고, 차원을 확장해 적절히 배치한 다음에 색상을 정규화하는 작업을 진행한다.

    np_img = image.img_to_array(img)
    img_batch = np.expand_dims(np_img, axis=0)
    pre_processed = preprocess_input(img_batch)
    pre_processed.shape

     

    - 센터 크롭 말고 케라스의 load_img 이미지 모듈을 사용할 수도 있다. 이럴 사용해 이미지를 로드하고 크기를 조정할 수도 있다. 

     

     

    9.3 이미지 추론

    - 모델의 predict 함수를 호출해 결과를 얻을 수 있다.

    features = model.predict(pre_processed)
    features.shape

    -  각각의 이미지 예측값은 벡터로 반환된다. (1, 1000)의 shape를 가지는 numpy array 형태이다. 벡터 각 항목은 레이블과 주어진 이미지가 해당 레이블일 확률을 나타낸다.

    - 케라스의 decode_prediction 함수를 이용해 가장 높은 확률을 가진 항목의 레이블과 점수를 반환한다.

    decode_predictions(features, top=5)

    - 위 이미지의 결과는 다음과 같다:

    [[('n06359193', 'web_site', 0.33795944),

    ('n04404412', 'television', 0.13591343),

    ('n03782006', 'monitor', 0.09857248),

    ('n04149813', 'scoreboard', 0.058441147),

    ('n03196217', 'digital_clock', 0.055340357)]]

     

    - 이 신경망의 마지막 레이어는 softmax 활성화 레이어이다. softmax 함수는 모든 클래스의 activation 합계가 1이 되도록 만들어준다. 따라서 이 레이어의 출력 결과는 이미지와 각 클래스 간의 가능성으로 볼 수 있다.

    - 케라스에 포함된 사전 훈련 신경망은 천개의 라벨을 가지고 있다. ImageNet Competition에 대비한 학습을 했기 때문인데, 한가지 결과만 반환하는 제약도 가지고 있다. 

     

     

     

     

      

    '연구실' 카테고리의 다른 글

    [논문] Item2Vec: Neural Item Embedding for Collaborative Filtering(2016)  (0) 2020.03.11
    Python argsort() 함수  (0) 2020.01.11
    #25. YOLO v3 with PyTorch  (0) 2019.11.07
    #24. Neural Machine Translation  (0) 2019.10.28
    #23. Emojify  (0) 2019.10.28

    댓글

©hyunbul