axinc-ai / ailia-models

The collection of pre-trained, state-of-the-art AI models for ailia SDK
2.04k stars 325 forks source link

ADD age-gender-recognition-retail #560

Closed kyakuno closed 3 years ago

kyakuno commented 3 years ago

https://github.com/openvinotoolkit/open_model_zoo/tree/master/models/intel/age-gender-recognition-retail-0013 Apache

kyakuno commented 3 years ago

License https://github.com/openvinotoolkit/open_model_zoo/blob/master/LICENSE

kyakuno commented 3 years ago

変換ツール https://github.com/PINTO0309/openvino2tensorflow

ooe1123 commented 3 years ago

サンプルコードがないので、他のサンプルコードを参考に実装

import sys, os
import cv2
import numpy as np

from openvino.inference_engine import IECore

img_file = "age-gender-recognition-retail-0001.jpg"

ie = IECore()

# モデルの読み込み 
net = ie.read_network(model='age-gender-recognition-retail-0013.xml', weights='age-gender-recognition-retail-0013.bin')
exec_net = ie.load_network(net, 'CPU')

inblobs =  (list(net.inputs.keys()))
outblobs = (list(net.outputs.keys()))
print(inblobs, outblobs)

# 入力画像読み込み 
img = cv2.imread(img_file)

# 入力データフォーマットへ変換
h, w = 62, 62
img = cv2.resize(img, (w, h))   # サイズ変更 
in_img = img.transpose((2, 0, 1))    # HWC > CHW 
in_img = np.expand_dims(in_img, axis=0) # 次元合せ

# 推論実行 
res = exec_net.infer(inputs={'data': in_img})
print(res)
ooe1123 commented 3 years ago

https://github.com/openvinotoolkit/open_model_zoo/blob/master/models/intel/age-gender-recognition-retail-0013/assets/age-gender-recognition-retail-0001.jpg の画像に対して、推論結果が公式の情報と合わない。 公式の情報: age=18.97 推論結果: age=25.19

こちらで報告されている問題と同じ?公式の情報が間違いなだけ? https://community.intel.com/t5/Intel-Distribution-of-OpenVINO/age-gender-recognition-retail-0013-output/m-p/1141530

ooe1123 commented 3 years ago

以下のコマンドでONNXエクスポート可能

openvino2tensorflow \
 --model_path age-gender-recognition-retail-0013.xml \
 --output_saved_model --output_pb \
 --output_onnx \
 --onnx_opset 11
kyakuno commented 3 years ago

OpenVinoの公式のサンプル実装は下記となります。 https://github.com/openvinotoolkit/open_model_zoo/blob/master/demos/interactive_face_detection_demo/cpp/face.cpp

ビデオモードの場合、複数フレームで平滑化するようです。

void Face::updateAge(float value) {
    _age = (_age == -1) ? value : 0.95f * _age + 0.05f * value;
}

void Face::updateGender(float value) {
    if (value < 0)
        return;

    if (value > 0.5) {
        _maleScore += value - 0.5f;
    } else {
        _femaleScore += 0.5f - value;
    }
}
kyakuno commented 3 years ago

1フレーム前の顔のbounding boxのiouが0.5以上であれば同じ顔と認識して平滑化、とかできるとデモとしては良さそうです。

kyakuno commented 3 years ago

Ageは100倍しているだけみたいで、現在の実装で問題なさそうです。

AgeGenderDetection::Result r = {ageBlobMapped.as<float*>()[idx] * 100,