Flask에서 기계 학습 웹 앱을 만들어 보았습니다.

개요



OpenCV의 Haar-like 특징 분류기로 얼굴 영역을 추출하고, OpenCV의 얼굴 추정기(LBPH)에 학습하고, 테스트 데이터의 얼굴 이미지와 얼마나 유사한지를 계산하는 모델을 작성합니다.
Flask에서 만든 모델 Load하고 로컬 브라우저에서 얼굴 이미지를 선택하면 유사도가 반환되는 앱을 만듭니다.
유사도가 0에 가까워지면 비슷하다는 것입니다.



웹 서비스와 기계 학습 모델의 상호 작용은 다음 그림과 같이 수행됩니다.


이 기사의 코드는 여기

트리 구조



flask_api/
├── haarcascade_frontalface_alt.xml
├── sample_model.yml
├── save_model.ipynb
├── server.py
├── templates
| ├── flask_api_index.html
|    ├── layout.html
|    └── result.html
└── train_images

알고리즘



LBPH(Local Binary Patterns Histogram)란?
얼굴을 작은 셀로 분할하고 각 영역의 히스토그램을 비교합니다.
얼굴의 크기와 모양이 다르더라도 정확하게 검출할 수 있다는 특징이 있습니다.

유사도 검출에는 세 가지 알고리즘이 있습니다.
  • 히스토그램 비교
    히스토그램 비교는 먼저 이미지의 색상이 어떻게 분포되어 있는지 히스토그램을 만듭니다.
    그리고 두 이미지의 히스토그램을 비교하여 비슷한 분포라면 두 이미지는 "닮았다"는 것입니다.
    따라서 이미지를 캡처할 때는 회색조로 통합해야 합니다.
    이번에는 이 알고리즘을 사용하겠습니다.

  • 특징점 매칭
    특징점 매칭이란, 화상끼리의 특징점의 거리를 측정해, 가까우면 유사도가 높다고 간주하는 수법입니다.
    사람으로 말하면, 윤곽이나 눈 코 서, 눈의 크기 등입니다.
    특징점을 추출하는 방법 알고리즘은 주로 다음 두 가지입니다.
  • ORB (Oriented FAST and Rotated BRIEF)
  • AKAZE (Accelerated KAZE)

  • 템플릿 매칭
    이미지 중에서 유사도가 높은 부분만을 매칭시키는 방법입니다.
    여기는 어떤 물체와 같은 어느 정도 모양이 정해진 것을 검출하는데 최적입니다.

  • 1. Flask install



    Flask documentation
    아래의 명령을 입력하면 k입니다!
    그런 다음 기계 학습에 필요한 모듈을 install하십시오.
    $ pip install Flask
    

    2. 기계 학습 모델



    교육용 이미지는 파이썬에서 Google Custom Search API를 사용하여 이미지를 수집했습니다.을 보고 모아보세요!

    htps : // 기주 b. 코 m / 오렌지 cv / 오페인 cv / t 레에 / 마 s r / data / 에서 Haar-like 특징 분류기에서 사용할 파일을 다운로드하세요.
    교육 데이터의 얼굴 이미지 유사도를 계산하는 기계 학습 모델을 만들고 저장합니다.

    save_model.py
    # モデルの保存
    import cv2
    import os
    import numpy as np
    from PIL import Image
    import re
    import os.path
    
    # フォルダ内の画像を習得
    def get_images_and_labels():
    
        print('モデル保存中...')
    
        # トレーニング画像
        train_path = './train_images'
    
        # Haar-like特徴分類器
        cascadePath = './haarcascade_frontalface_alt.xml'
        faceCascade = cv2.CascadeClassifier(cascadePath)
        recognizer= cv2.face.LBPHFaceRecognizer_create()
    
        # 画像を格納する配列
        images = []
        # ラベルを格納する配列
        labels = []
        for f in os.listdir(train_path):
            # 画像のパス
            image_path = os.path.join(train_path, f)
            # 白黒で読み込み
            image_pil = Image.open(image_path).convert('L')
            # Numpyの配列に格納
            image = np.array(image_pil, 'uint8')
            # Haar-like特徴分類器で顔を検知
            faces = faceCascade.detectMultiScale(image)
            # 検出した画像の処理
            for(x, y, w, h) in faces:
                # 200×200にリサイズ
                roi = cv2.resize(image[y: y + h, x: x + w],
                                 (200, 200), interpolation=cv2.INTER_LINEAR)
                # 画像を配列に格納
                images.append(roi)
                int_number = re.findall("\d+", f)
                for number in int_number:
                    labels.append(int(number))
        # トレーニング実施
        recognizer.train(images, np.array(labels))
    
        # モデルの保存
        recognizer.write('sample_model.yml')
    
        print('モデルの保存が完了しました。')
    

    스크래핑으로 이미지를 수집한 후 다음 코드를 실행합니다.
    $ python save_model.py
    
    sample_model.yml 가 작성되면 OK입니다!

    3. HTML 파일 만들기



    그런 다음 HTML 파일을 만듭니다.

    layput.html
    <!DOCTYPE html>
    <html lang="ja">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>API Sample</title>
      </head>
      <body>
        {% block content %}{% endblock %}
      </body>
    </html>
    

    result.html
    {% extends "layout.html" %}
    {% block content %}
    
    <h3>類似度</h3>
    {{ predict_Confidence }}
    
    {% endblock %}
    

    flask_api_index.html
    {% extends "layout.html" %}
    {% block content %}
    
    <form action="/result" method="post" enctype="multipart/form-data">
      <input type="file" name="image" accept="image/png, image/jpeg, image/jpg">
      <button type="submit">submit</button>
    </form>
    
    {% endblock %}
    

    이 세 파일을 templates 디렉토리에 넣으십시오.

    4. 서버 만들기



    서버측

    server.py
    from flask import Flask, render_template, request, redirect, url_for, send_from_directory
    import numpy as np
    import cv2
    from datetime import datetime
    import os
    import string
    from PIL import Image
    
    
    app = Flask(__name__)
    
    def load_model():
        global recognizer
        print(" * Loading pre-trained model ...")
        cascadePath = './haarcascade_frontalface_alt.xml'
        faceCascade = cv2.CascadeClassifier(cascadePath)
        recognizer = cv2.face.LBPHFaceRecognizer_create()
        # recognizer = cv2.face.createLBPHFaceRecognizer()
        # recognizer = cv2.face.LBPHFaceRecognizer.create()
        recognizer.read('./sample_model.yml')
    
        print(' * Loading end')
    
    @app.route('/')
    def index():
        return render_template('./flask_api_index.html')
    
    @app.route('/result', methods=['POST'])
    def result():
        # submitした画像が存在したら処理する
        if request.files['image']:
            # 白黒画像として読み込み
            image_pil = Image.open(request.files['image']).convert('L')
            image = np.array(image_pil, 'uint8')
            # 類似度を出力
            label, predict_Confidence = recognizer.predict(image)
            predict_Confidence = str(predict_Confidence)
            # render_template('./result.html')
            return render_template('./result.html', title='類似度', predict_Confidence=predict_Confidence)
    
    if __name__ == '__main__':
        load_model()
        app.debug = True
        app.run(host='localhost', port=5000)
    

    이 파일을,
    $ python server.py
    

    에서 실행하고 localhost : 5000으로 연결하십시오.



    이런 화면이 되면 실제로 실행해 봅시다.



    이와 같이 유사도가 표시되면 OK입니다!

    참고



    OpenCV에서 노기자카 46 아키모토 한여름과 은샤리 장어 와히로의 유사도를 조사해 보았다
    Flask로 간단하게 만드는, 화상 처리한 결과를 보기만 하는 웹 서비스

    좋은 웹페이지 즐겨찾기