Flask와 TensorFlow를 이용한 얼굴 이미지 추론

소개


  • TensorFlowMNIST CNN 튜토리얼을 개조하여 얼굴 이미지를 학습하고 추론했습니다.
  • 이번은 Flask 로부터 추론을 실시해, 결과를 표시해 보겠습니다.
  • 소스 세트는 여기 입니다.

  • 개요


  • 설정 파일로 지정하고 있는 클래스마다, 테스트 화상에 의한 추론을 실시하고 있습니다.
  • 각 이미지의 결과는 파란색은 정답, 빨간색은 실수라는 의미입니다.
  • 각각, 어느 클래스로 분류되었는지를, 알 수 있도록(듯이) 했습니다.



  • Flask



    학습 모델 가져오기


  • 마지막으로 만든 face_deep.py를 가져옵니다.
  • import face_deep
    

    추론


  • 학습 이미지와 테스트 이미지로 추론을 할 수 있도록 하고 있습니다.
  • 폴더 내의 .jpeg 모두를 추론 대상으로 하고 있습니다.
  • @app.route('/predict/<folder>/<item>')
    def predict(folder, item):
        """画像の推論."""
    
        if folder not in ['train', 'test']:
            abort(404)
    
        filename_list = sorted(glob.glob(os.path.join(DATA_PATH, folder, item, '*.jpeg')))
    
  • 각 이미지는 Pillow 로 로드하고 크기 조정, 회색조 및 값을 0-255 에서 0-1 로 변경합니다.
  •     image_list = []
        for filename in filename_list:
    
            face = Image.open(filename)
            face = face.resize((IMG_ROWS, IMG_COLS), Image.LANCZOS)
            face = face.convert('L')
            face = np.array(face, dtype=np.float32) / 255.0
            face = np.ravel(face)
            image_list.append(face)
    
  • 각 이미지를 모아서 face_deep.pypredict 에 입력합니다.
  • 추론 결과는 [ 99 0 0 0 0 0 0 0 0 0] 와 같은 확률을 포함한 배열이 이미지분 반환됩니다.
  •     percent_list = face_deep.predict(image_list, dtype='int')
    
  • 템플릿에 대한 수정을 수행합니다.
  • color 는 대상 이미지의 추론 결과가 올바르면 True 잘못되면 False 로 주어집니다.
  • filename 에서 템플릿에서 이미지 링크를 만들 수 있습니다.
  • percent 에서 템플릿에서 이미지의 클래스별 확률을 표시합니다.
  •     rows = []
        for filename, percent in zip(filename_list, percent_list):
            color = CLASSES.index(item) in [index for index, value in enumerate(percent) if value == max(percent)]
            row = {'filename': os.path.basename(filename), 'percent': percent, 'color': color}
            rows.append(row)
    
        return render_template('predict.html', folder=folder, item=item, headers=CLASSES, rows=rows)
    

    템플릿


  • 상기의 color 에 의해, 정답의 경우는 청색의 table-primary 실수의 경우는 적색의 table-danger 를 설정하고 있습니다.
  •           {% if row.color %}
              <tr class="table-primary">
              {% else %}
              <tr class="table-danger">
              {% endif %}
    
  • 파일명 등에 근거해, 얼굴 화상의 링크를 작성하고 있습니다.
  • 저장된 이미지는 크거나 작습니다. size에서 동적으로 변경되었습니다.
  •             <td>
                    <figure class="figure">
                      <img src="/data/{{ folder }}/{{ item }}/{{ row.filename }}?size=100" />
                      <figcaption class="figure-caption">{{ row.filename }}</figcaption>
                    </figure>
                </td>
    
  • 각 이미지의 클래스별 확률을 표시합니다.
  •             {% for percent in row.percent %}
                <td scope="row">{{ percent }}%</td>
    
    

    결론


  • Flask 를 사용하여 얼굴 이미지의 추론 결과를 표시했습니다.
  • 추론 결과의 일람, 클래스마다의 확률을 표시할 수 있으므로, 부적절한 화상등의 확인등이 하기 쉬워졌습니다.
  • 다음에, 다양한 화상을 업로드 할 수 있는 Web 어플리케이션을 작성하고 싶습니다.
  • 좋은 웹페이지 즐겨찾기