⚡⚡PythonとHoraを使用して、非常に高速な顔認識システムを作成します⚡⚡


![WX20210730-203541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81421/0f977698-9a87-8762-200c-cbfd29e3b314.png)


CVは人工知能の頂点であり、顔認識はその広範なアプリケーションとして、日常生活のあらゆる側面に登場しています。

今日、私たちは`Python`と`hora`を使用して顔認識アプリケーションを作成しています

## 1. dependencyをダウンロードします

```bash
pip install -U flask numpy face_recognition Pillow horapy
```

## 2. 既存の顔datasetを埋め込む必要があります
ここで、デモの顔データベースは [dataset](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html) であり、[face_recognition](https://github.com/ageitgey/face_recognition)を使用して埋め込み、その最下層は微調整された [model](http://dlib.net/) です。

その中で、顔認識アプリケーションのコアである`hora.HNSWIndex`を初期化し、誇張された速度で隣人を検索して、最も一致する顔写真を見つけます。

```Python
# -*- coding: utf-8 -*-
import numpy as np
from horapy import HNSWIndex
import face_recognition
from os import listdir
from os.path import isfile, join
from flask import Flask, request, abort, jsonify
from PIL import Image

image2vector = dict()        # image to vector map
f = 128                      # vector dimension
index = HNSWIndex(f, "str")  # init Hora index instance
app = Flask(__name__)        # wep app instance


def img2vector():
    # encode all image into vector
    face_image_path = ""  # here write you image file path

    images = [f for f in listdir(face_image_path)
              if isfile(join(face_image_path, f))]

    for f in images:
        image = face_recognition.load_image_file(face_image_path + "/" + f)
        embedding = face_recognition.face_encodings(image)
        if embedding and len(embedding) > 0:
            image2vector[f] = embedding[0]
            index.add(embedding[0], f)

    index.build("euclidean")
```

## 3. web application

このようにして、基本データがロードされ、残りは`index`を提供するだけで済みます。
今回は、比較的 `flask` で明確なフラスコをWeb applicationのframeworkとして選択しました。

```Python
@app.route("/match", methods=['GET'])
def image_match():
    # image match main function
    image = request.args.get('image', '')  # get request image query
    if image not in image2vector:          # if thers is not image in the map, return 404
        abort(404)
    response = list()
    for similar_image_idx in index.search(image2vector[image], 10):
        response.append({
            "image": similar_image_idx,
            "image_embedding": image2vector[similar_image_idx].tolist()
        })
    return jsonify(response)

@app.route("/search", methods=['POST'])
def image_search():
    img = Image.open(request.files['file'].stream)  # get request image query
    image = np.array(img)
    embedding = face_recognition.face_encodings(image) # encode incomming image into vector
    response = list()
    for similar_image_idx in index.search(embedding, 10):
        response.append({
            "image": similar_image_idx,
            "image_embedding": image2vector[similar_image_idx].tolist()
        })
    return jsonify(response)

if __name__ == "__main__":
    img2vector()
    app.run(debug=True)

```

今、私たちは`bash`に入ります

```bash
python app.py
```

私たちの顔認識アプリケーションが稼働しています
`terminal` で入力できます

```bash
curl  http://localhost:5000/match\?image\={your image}
```

見ることができます

```bash
[
{{
{{
"image"： "123.jpg"、
"image_encoding"：[
..。
]
}、
{{
"image"： "124.jpg"、
"image_encoding"：[
..。
]
}、
{{
"image"： "125.jpg"、
"image_encoding"：[
..。
]
}
}
]
```

これで顔認識アプリケーションが完成しました

詳細については、**[Hora](https://horasearch.com/)** をクリックしてください。

github: [https://github.com/hora-search/hora](https://github.com/hora-search/hora)
Python Library: [https://github.com/hora-search/horapy](https://github.com/hora-search/horapy)
homepage: [https://horasearch.com/](https://horasearch.com/)


![WX20210730-203610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81421/5ffe18a0-9d2c-a8dd-c8ca-b6ef3c02f842.png)