私的AI研究会 > NCAppVol6
OpenVINO™ ツールキットの学習済みモデルとサンプルプログラムを参考に Neural Compute Application を製作してみる。
顔認識の推論モデルを使って「メガネ」「帽子」の試着アプリケーションを作成してみる。
# アイテム座標(EyePoint_left基準) item_x_EPL = item.width/2 - EPL_x item_y_EPL = item.height/2 - EPL_y
# アイテム座標(左目基準) item_x_eyeleft = item_x_EPL * item_scale item_y_eyeleft = item_y_EPL * item_scale
math.atan2(b, a)戻り値の角度の単位は度(degree)ではなく、radian。
# atan2 確認コード import math angle = math.atan2(1.00, 1.73) print(math.degrees(angle))
# 目の角度
eye_angle = math.atan2(eye_right_y - eye_left_y, eye_right_x - eye_left_x)
# EyePointの角度 EP_angle = math.atan2(EPR_y - EPL_y, EPR_x - EPL_x)最初からEyePointが傾いている場合は、eyeに対して足りない角度だけ対応する。コードで書くと単純な引き算。
# アイテムの回転角度 item_angle = eye_angle - EP_angle
import cv2 import numpy as np from pngoverlay import PNGOverlay # 白画の生成 img = np.zeros((600, 800, 3), np.uint8) + 255 # PNGOverlayインスタンス生成 item = PNGOverlay('image/6629_trim_small.png') # 透過PNGを描画 item.rotate(60) item.show(img, 400 , 300) cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows()
# (x1, y1)をitem_angle回転させた座標 x2 = x1 * math.cos(theta) - y1 * math.sin(theta) y2 = x1 * math.sin(theta) + y1 * math.cos(thetae)(x1, y1) は(item_x_eyeleft, item_y_eyeleft)に相当するので、コードの中の「アイテム座標(左目基準)」と「アイテム座標」の間で計算する必要がある。
コマンドオプション | デフォールト設定 | 意味 |
-h, --help | - | ヘルプ表示 |
-item, --itemindex | 0 | 試着アイテム種別 (0-9) |
-i, --image | cam | カメラ(cam)または動画・静止画像ファイル |
-m_dt, --m_detector | 必須指定 | IR フォーマットの顔検出モデル |
-m_lm, --m_landmarks | 必須指定 | IR フォーマット特徴点抽出モデル |
-d, --device | 必須指定 | デバイス指定 (CPU/MYRIAD) |
-t, --title | y | タイトル表示 (y/n) |
-s, --speed | y | スピード計測表示 (y/n) |
-o, --out | non | 処理結果を出力する場合のファイルパス |
$ python3 virtual_fitting.py -h --- Virtual Fitting --- 4.5.2-openvino OpenVINO inference_engine: 2.1.2021.3.0-2787-60059f2c755-releases/2021/3 usage: virtual_fitting.py [-h] [-item ITEMINDEX] [-i IMAGE_FILE] [-m_dt M_DETECTOR] [-m_lm M_LANDMARKS] [-d DEVICE] [-t TITLE] [-s SPEED] [-o IMAGE_OUT] optional arguments: -h, --help show this help message and exit -item ITEMINDEX, --itemindex ITEMINDEX Item Index number (0-9) -i IMAGE_FILE, --image IMAGE_FILE Absolute path to image file or cam for camera stream. -m_dt M_DETECTOR, --m_detector M_DETECTOR Detector Path to an .xml file with a trained model.Default value is /home/mizutu/model/intel/FP32/face-detection- retail-0005.xml -m_lm M_LANDMARKS, --m_landmarks M_LANDMARKS Landmarks Path to an .xml file with a trained model.Default value is /home/mizutu/model/intel/FP32/landmarks-regression- retail-0009.xml -d DEVICE, --device DEVICE Optional. Specify a target device to infer on. CPU, GPU, FPGA, HDDL or MYRIAD is acceptable. The demo will look for a suitable plugin for the device specified. Default value is CPU -t TITLE, --title TITLE Program title flag.(y/n) Default value is 'y' -s SPEED, --speed SPEED Speed display flag.(y/n) Default calue is 'y' -o IMAGE_OUT, --out IMAGE_OUT Processed image file path. Default value is 'non'
$ python3 virtual_fitting.py -item 0 -i ~/Images/photo.jpg --- Virtual Fitting --- 4.5.2-openvino OpenVINO inference_engine: 2.1.2021.3.0-2787-60059f2c755-releases/2021/3 virtual_fitting.py:161: DeprecationWarning: 'inputs' property of IENetwork class is deprecated. To access DataPtrs user need to use 'input_data' property of InputInfoPtr objects which can be accessed by 'input_info' property. input_blob_face = next(iter(net_face.inputs)) Virtual Fitting: Starting application... - Item File : ../../Images/parts/glass01.png - Image File : /home/mizutu/Images/photo.jpg - m_detect : /home/mizutu/model/intel/FP32/face-detection-retail-0005.xml - m_recognition: /home/mizutu/model/intel/FP32/landmarks-regression-retail-0009.xml - Device : CPU - Program Title: y - Speed flag : y - Processed out: non FPS average: 47.50 Finished.
$ python3 virtual_fitting.py -item 3 -i ~/Images/photo4.jpg --- Virtual Fitting --- 4.5.2-openvino OpenVINO inference_engine: 2.1.2021.3.0-2787-60059f2c755-releases/2021/3 virtual_fitting.py:161: DeprecationWarning: 'inputs' property of IENetwork class is deprecated. To access DataPtrs user need to use 'input_data' property of InputInfoPtr objects which can be accessed by 'input_info' property. input_blob_face = next(iter(net_face.inputs)) Virtual Fitting: Starting application... - Item File : ../../Images/parts/glass04.png - Image File : /home/mizutu/Images/photo4.jpg - m_detect : /home/mizutu/model/intel/FP32/face-detection-retail-0005.xml - m_recognition: /home/mizutu/model/intel/FP32/landmarks-regression-retail-0009.xml - Device : CPU - Program Title: y - Speed flag : y - Processed out: non FPS average: 44.50 Finished.
$ cd ~/workspace/apps◦ CPU
$ python3 virtual_fitting.py -item 0 -i ~/Images/photo.jpg
$ python3 virtual_fitting.py -item 0 -i ~/Videos/emotion2.mp4
$ python3 virtual_fitting.py -item 0 -i ~/Videos/emotion3.mp4
$ python3 virtual_fitting.py -item 0 -i ~/Videos/head_pose.mp4
$ python3 virtual_fitting.py -item 0 -i cam◦ NCS2(MYRIAD)
$ python3 virtual_fitting.py -item 0 -m_dt ~/model/intel/FP16/face-detection-retail-0005.xml -m_lm ~/model/intel/FP16/landmarks-regression-retail-0009.xml -d MYRIAD -i ~/Images/photo.jpg
$ python3 virtual_fitting.py -item 0 -m_dt ~/model/intel/FP16/face-detection-retail-0005.xml -m_lm ~/model/intel/FP16/landmarks-regression-retail-0009.xml -d MYRIAD -i ~/Videos/emotion2.mp4
$ python3 virtual_fitting.py -item 0 -m_dt ~/model/intel/FP16/face-detection-retail-0005.xml -m_lm ~/model/intel/FP16/landmarks-regression-retail-0009.xml -d MYRIAD -i ~/Videos/emotion3.mp4
$ python3 virtual_fitting.py -item 0 -m_dt ~/model/intel/FP16/face-detection-retail-0005.xml -m_lm ~/model/intel/FP16/landmarks-regression-retail-0009.xml -d MYRIAD -i ~/Videos/head_pose.mp4
$ python3 virtual_fitting.py -item 0 -m_dt ~/model/intel/FP16/face-detection-retail-0005.xml -m_lm ~/model/intel/FP16/landmarks-regression-retail-0009.xml -d MYRIAD -i cam