말도 안 되는 이미지 분류기 만들어 보기(9) 추론

카탈로그

  • 말도 안 되는 이미지 분류기 만들기 (1) 서장
  • 거친 이미지 분류기 만들기 (2) 데이터 수집 중 하나
  • 말도 안 되는 이미지 분류기 만들기 (3) 데이터 수집의 2
  • 말도 안 되는 이미지 분류기 만들기 (4) 데이터 수집 3
  • 거친 이미지 분류기 만들기 (5) 데이터 관리 1
  • 말도 안 되는 이미지 분류기 만들기 (6) 데이터 관리 2
  • 거친 이미지 분류기 만들어 보기(7) 학습 중 하나
  • 거친 이미지 분류기 만들어 보기(8) 학습2
  • 말도 안 되는 이미지 분류기 만들어 보기(9) 추론(본 보도)
  • 번외편:
  • EfficientNet B0~B7에서 학습 이미지 분류기 옮기기
  • EfficientNet B0의 Keeras 모델을 ONX 모델로 변환하여 추론
  • 유사한 이미지 검색 도구 만들기 (1) 서장
  • 드디어 keshikaran.py를 구했다


    저번는'EfficientNet B0'의 이미지 분류 모델을 사용해 약 2만장의 이미지를 학습해 85%의 정밀도를 얻었다.
    "테스트 데이터의 정밀도는 85%입니다!"그렇게 말하지만 현실의'말도 안 되는 이미지'를 분류하지 못하면 의미가 없다.
    이번에는 추론(Inference,Predict)의 스크립트를 쓰기 위해 얻은 이미지 분류 모델을 사용합니다.
    네, 드디어 첫글망상keshikaran.py을 받을 때가 됐어요!

    모형의 읽기에 조금 빠져있어요.


    학습 스크립트train.py, 학습 완료 모델model.save("model.h5")의 느낌으로 파일로 작성.
    이 모델 파일model.h5을 읽고 추론합니다.
    ···갑자기 모델을 읽기 시작해서 조금 반했어요.
    import tensorflow as tf
    model = tf.keras.models.load_model("model.h5")
    
    같은 코드로 모델을 읽으면 ValueError: Unknown layer: KerasLayer가 발생한다.
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/saving/save.py", line 206, in load_model
        return hdf5_format.load_model_from_hdf5(filepath, custom_objects,
      File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/saving/hdf5_format.py", line 183, in load_model_from_hdf5
        model = model_config_lib.model_from_config(model_config,
      File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/saving/model_config.py", line 64, in model_from_config
        return deserialize(config, custom_objects=custom_objects)
      File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/layers/serialization.py", line 173, in deserialize
        return generic_utils.deserialize_keras_object(
      File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/utils/generic_utils.py", line 354, in deserialize_keras_object
        return cls.from_config(
      File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/engine/sequential.py", line 492, in from_config
        layer = layer_module.deserialize(layer_config,
      File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/layers/serialization.py", line 173, in deserialize
        return generic_utils.deserialize_keras_object(
      File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/utils/generic_utils.py", line 346, in deserialize_keras_object
        (cls, cls_config) = class_and_config_for_serialized_keras_object(
      File "/usr/local/lib/python3.8/dist-packages/tensorflow/python/keras/utils/generic_utils.py", line 296, in class_and_config_for_serialized_keras_object
        raise ValueError('Unknown ' + printable_module_name + ': ' + class_name)
    ValueError: Unknown layer: KerasLayer
    
    조금 조사한 결과 hub.KerasLayer를 사용하면 읽을 때 사용자 정의 도면층에 대한 정보가 필요합니다.
    다음과 같이 지정custom_objects하면 모델을 읽을 수 있습니다.
    import tensorflow as tf
    import tensorflow_hub as hub
    model = tf.keras.models.load_model("model.h5", custom_objects={"KerasLayer": hub.KerasLayer})
    
    참조:
  • [TF2.0] KerasLayer cannot be loaded from .h5 · Issue #26835 · tensorflow/tensorflow
  • keshikaran.py 설치


    모형의 읽기에 성공했으니 바로 설치해 보세요keshikaran.py.규격은 아래와 같다.
  • 이미지의 파일 이름을 명령행 매개변수로 전송합니다.
  • 는 0~1의 실수 출력 기준으로'불공평한 정도'(어쨌든 색정 정도)를 출력한다.
  • 실제 스크립트는 다음과 같습니다.짧다.
    keshikaran.py
    #!/usr/bin/env python3
    
    import numpy as np
    import PIL.Image
    import sys
    import tensorflow as tf
    import tensorflow_hub as hub
    
    image_path = sys.argv[1]
    
    image = PIL.Image.open(image_path).convert("RGB").resize((224, 224))
    image = np.array(image) / 255
    image = np.expand_dims(image, 0)
    
    model = tf.keras.models.load_model("model.h5", custom_objects={"KerasLayer": hub.KerasLayer})
    
    predictions = model.predict(image)
    print(predictions[0][0])
    

    추론해 보다


    그럼 실제 이미지를 입력하여 추론을 진행합시다.아래의 그림은 야채 수프에서 빌려온 것이다.
    우선 이쪽개의 초상화부터 추론하겠습니다.양 같기도 하고 귀엽네요.

    $ python3 keshikaran.py dog.jpg
    0.29267535
    
    생각보다 수치가 높지만 중간(0.5) 수치가 생각보다 낮아'용서할 수 없는 이미지'로 볼 수 있다.
    다음은 내가 이곳을 추론해 보겠다약간 섹시한 여자 사진..

    $ python3 keshikaran.py woman.jpg
    0.824198
    
    강아지 사진보다 수치가 훨씬 커요.말도 안 되는 그림'이다.
    더욱 실천(?)원하는 이미지를 입력합니다.aHR0cHM6Ly9ibG9nLWltZ3MtMTQ1LmZjMi5jb20vcy91L20vc3Vtb21vY2hhbm5lbC92cl9ha2lyYWVsbHlfMTAyNTgtMDAyLmpwZw==에서 받은 그림을 입력해 보세요(링크가 무서워서 기본적으로 64번 URL을 인코딩했습니다).
    $ python3 keshikaran.py sexy.jpg
    0.9372734
    
    쳇!아이고, 이건 말도 안 돼.
    마지막으로 한 장 더 입력하세요. 피부색이 더 많아요이쪽 그림..

    $ python3 keshikaran.py man_and_dog.jpg
    0.34251067
    
    이 분은 "용서할 수 없는 그림"입니다.강력히 동의하다.

    이번에는 여기까지.


    마침내 망상을 실현했다keshikaran.py.여기는 단지 몇 장의 그림만 시험해 보았을 뿐, 기본적으로 동작이 매우 좋다.
    솔직히 어디에 쓸 수 있는지 모르겠는데 재밌는 생각 있으면 말해주세요.지난번에도 썼는데 요청이 있으면 이미 배운 모형을 공개할 거예요.
    도중에 해시태그 등을 붙이는 재료를 건너뛰었기 때문에 추가가 되면 거기도 쓸 수 있으면 좋겠다고 생각했어요.오늘은 여기까지!
    추기: 번외편 "EfficientNet B0~B7에서 학습 이미지 분류기 옮기기"을 썼다.

    좋은 웹페이지 즐겨찾기