FC2カウンター FPGAの部屋 Vitis-AI
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vitis-AI 2.5 の Custom OP Workflow のクイックスタートを使って、TensorFlow + Keras で学習した MNIST を XMDEL にする

Vitis-AI 2.5 の Custom OP Workflow のクイックスタートをやってみる2”の続き。

前回は、たぶん MNIST の量子化を行ってコンパイルして XMODL を生成した。今回は、私が自分で学習した MNIST の h5 ファイルを使用して、XMODEL を作成してみよう。

TensorFlow + Kerasを使ってみた3(以前使用したCNNを使った学習)”で学習した MNIST 用 CNN の h5 ファイルを使用する。
なお、Tensorflow のバージョンは 1.8.0 で、Keras のバージョンは 2.1.6 だった。

mnist_cnn5_model.h5 ファイルを Vitis-AI/tf2_custom_op_demo ディレクトリにコピーした。
Custom_OP_Workflow_16_221204.png

量子化は quantize.py で実行されているので、quantize.py をコピーして quantize_mnist.py に名前を変更した。
quantize_mnist.py のハードコードされているモデルの名前と量子化して出力するファイル名を変更した。
Custom_OP_Workflow_17_221204.png

quantize_mnist.py を実行した。
python quantize_mnist.py
Custom_OP_Workflow_18_221204.png
Custom_OP_Workflow_19_221204.png

(vitis-ai-tensorflow2) Vitis-AI /workspace/tf2_custom_op_demo > python quantize_mnist.py 
2022-11-29 00:49:09.449636: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /opt/xilinx/xrt/lib:/usr/lib:/usr/lib/x86_64-linux-gnu
2022-11-29 00:49:09.449656: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2.8.0
2.8.0
2022-11-29 00:49:11.139032: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /opt/xilinx/xrt/lib:/usr/lib:/usr/lib/x86_64-linux-gnu
2022-11-29 00:49:11.139049: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)
2022-11-29 00:49:11.139099: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:163] no NVIDIA GPU device is present: /dev/nvidia0 does not exist
2022-11-29 00:49:11.139418: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d_1 (Conv2D)           (None, 24, 24, 5)         130       
                                                                 
 activation_1 (Activation)   (None, 24, 24, 5)         0         
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 12, 12, 5)        0         
 2D)                                                             
                                                                 
 flatten_1 (Flatten)         (None, 720)               0         
                                                                 
 dense_1 (Dense)             (None, 100)               72100     
                                                                 
 activation_2 (Activation)   (None, 100)               0         
                                                                 
 dense_2 (Dense)             (None, 10)                1010      
                                                                 
 activation_3 (Activation)   (None, 10)                0         
                                                                 
=================================================================
Total params: 73,240
Trainable params: 73,240
Non-trainable params: 0
_________________________________________________________________
[VAI INFO] Start CrossLayerEqualization...
10/10 [==============================] - 1s 56ms/step
[VAI INFO] CrossLayerEqualization Done.
[VAI INFO] Start Quantize Calibration...
313/313 [==============================] - 3s 6ms/step
[VAI INFO] Quantize Calibration Done.
[VAI INFO] Start Post-Quant Model Refinement...
[VAI INFO] Start Quantize Position Ajustment...
[VAI INFO] Quantize Position Ajustment Done.
[VAI INFO] Start Getting Shape Information...
[VAI INFO] Getting model layer shape information
[VAI INFO] Getting Shape Information Done.
[VAI INFO] Post-Quant Model Refninement Done.
[VAI INFO] Start Model Finalization...
[VAI INFO] Model Finalization Done.
[VAI INFO] Quantization Finished.
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.

***************** Summary *****************
Quantized model is saved in  ./quantized/quantized_mnist_cnn5.h5


./quantized/quantized_mnist_cnn5.h5 ファイルが出力された。

コンパイルを行った。
vai_c_tensorflow2 -m ./quantized/quantized_mnist_cnn5.h5 -a ../kv260_myarch.json -o ./ -n tf2_mnist_cnn5
Custom_OP_Workflow_20_221204.png
Custom_OP_Workflow_21_221204.png

(vitis-ai-tensorflow2) Vitis-AI /workspace/tf2_custom_op_demo > vai_c_tensorflow2 -m ./quantized/quantized_mnist_cnn5.h5 -a ../kv260_myarch.json -o ./ -n tf2_mnist_cnn5
**************************************************
* VITIS_AI Compilation - Xilinx Inc.
**************************************************
[INFO] Namespace(batchsize=1, inputs_shape=None, layout='NHWC', model_files=['./quantized/quantized_mnist_cnn5.h5'], model_type='tensorflow2', named_inputs_shape=None, out_filename='/tmp/tf2_mnist_cnn5_0x101000017010406_org.xmodel', proto=None)
[INFO] tensorflow2 model: /workspace/tf2_custom_op_demo/quantized/quantized_mnist_cnn5.h5
[INFO] keras version: 2.8.0
[INFO] Tensorflow Keras model type: sequential
/opt/vitis_ai/conda/envs/vitis-ai-tensorflow2/lib/python3.7/site-packages/xnnc/translator/tensorflow_translator.py:2537: H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead.
  layer['config']['shape'] = h5f['optimizer_weights'][name+':0'].value.tolist()
[INFO] parse raw model     :100%|█| 10/10 [00:00<00:00, 12139.81it/s]           
[INFO] infer shape (NHWC)  :100%|█| 18/18 [00:00<00:00, 1657.50it/s]            
[INFO] perform level-0 opt :100%|█| 2/2 [00:00<00:00, 476.87it/s]               
[INFO] perform level-1 opt :100%|█| 2/2 [00:00<00:00, 1887.63it/s]              
[INFO] generate xmodel     :100%|█| 18/18 [00:00<00:00, 1958.13it/s]            
[INFO] dump xmodel: /tmp/tf2_mnist_cnn5_0x101000017010406_org.xmodel
[UNILOG][INFO] Compile mode: dpu
[UNILOG][INFO] Debug mode: function
[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA1_B3136_0101000017010406
[UNILOG][INFO] Graph name: sequential, with op num: 26
[UNILOG][INFO] Begin to compile...
[UNILOG][INFO] Total device subgraph number 3, DPU subgraph number 1
[UNILOG][INFO] Compile done.
[UNILOG][INFO] The meta json is saved to "/workspace/tf2_custom_op_demo/./meta.json"
[UNILOG][INFO] The compiled xmodel is saved to "/workspace/tf2_custom_op_demo/.//tf2_mnist_cnn5.xmodel"
[UNILOG][INFO] The compiled xmodel's md5sum is 2ef83615a04046e55ee9e1fcecdff9e7, and has been saved to "/workspace/tf2_custom_op_demo/./md5sum.txt"



tf2_minist_cnn5.xmodel が生成された。
Custom_OP_Workflow_22_221204.png

netronで XMODEL の構成を見た。
Custom_OP_Workflow_23_221204.png
Custom OP Workflow と同じ MNIST なので、うまく行ったようだ。
  1. 2022年12月04日 04:30 |
  2. Vitis-AI
  3. | トラックバック:0
  4. | コメント:0

Vitis-AI 2.5 の Custom OP Workflow のクイックスタートをやってみる1

Vitis-AI 2.5 の Custom OP Workflow のクリックスタートをやる前に Custom OP Workflow について見ていく。
Vitis-AI 2.5 の英語版の Custom OP Workflow と、日本語版のカスタム OP ワークフローについてのリンクを示す。

Vitis-AI 日本語版のカスタム OP ワークフローから”図 カスタム OP ワークフロー”を引用する。
Custom_OP_Workflow_1_221202.png

Vitis-AI 日本語版のカスタム OP ワークフローから”図 カスタム OP ワークフロー”の説明文を引用する。

このワークフローの手順は次のとおりです。
 1. OP を XIR にとって未知のカスタム OP として定義し、モデルを量子化します。
 2. 量子化済みモデルをコンパイルします。
 3. カスタム OP を登録して実装します。
 4. graph_runner API を使用してモデルを運用します。
手順 3 では、カスタム OP の実装および登録用に C++ と Python の両方がサポートされます。Vitis AI ライブラリでサポートされる一般的な OP は 50 以上あります。一般的な OP のソース コードは、https://github.com/Xilinx/Vitis-AI/tree/master/src/Vitis-AI-Library/cpu_task/ops にあります。


この手順をクイックスタートで確認してみよう。
まずは、Vitis-AI 2.5 の ディレクトリに移動して Docker を起動する。
cd <Vitis-AI ディレクトリ>
./docker_run.sh xilinx/vitis-ai-cpu:2.5

Custom_OP_Workflow_2_221202.png
Custom_OP_Workflow_3_221202.png

tf2_custom_op_demo.tar.gz をダウンロードする。
wget https://www.xilinx.com/bin/public/openDownload?filename=tf2_custom_op_demo.tar.gz -O tf2_custom_op_demo.tar.gz
Custom_OP_Workflow_4_221202.png

tf2_custom_op_demo.tar.gz を解凍して、tf2_custom_op_demo に移動して、vitis-ai-tensorflow2 を conda activate する。
tar -xzvf tf2_custom_op_demo.tar.gz
cd tf2_custom_op_demo
conda activate vitis-ai-tensorflow2

Custom_OP_Workflow_5_221202.png

1_run_train.sh を実行して学習する。
bash 1_run_train.sh
Custom_OP_Workflow_6_221202.png
Custom_OP_Workflow_7_221202.png

(vitis-ai-tensorflow2) Vitis-AI /workspace/tf2_custom_op_demo > bash 1_run_train.sh
2022-11-29 00:23:46.284602: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /opt/xilinx/xrt/lib:/usr/lib:/usr/lib/x86_64-linux-gnu
2022-11-29 00:23:46.284672: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2.8.0
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 1s 0us/step
11501568/11490434 [==============================] - 1s 0us/step
2022-11-29 00:24:06.121607: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /opt/xilinx/xrt/lib:/usr/lib:/usr/lib/x86_64-linux-gnu
2022-11-29 00:24:06.121670: W tensorflow/stream_executor/cuda/cuda_driver.cc:269] failed call to cuInit: UNKNOWN ERROR (303)
2022-11-29 00:24:06.125895: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:163] no NVIDIA GPU device is present: /dev/nvidia0 does not exist
2022-11-29 00:24:06.133826: I tensorflow/core/platform/cpu_feature_guard.cc:151] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 28, 28, 1)]       0         
                                                                 
 conv2d (Conv2D)             (None, 22, 22, 32)        1600      
                                                                 
 batch_normalization (BatchN  (None, 22, 22, 32)       128       
 ormalization)                                                   
                                                                 
 conv2d_1 (Conv2D)           (None, 16, 16, 32)        50208     
                                                                 
 batch_normalization_1 (Batc  (None, 16, 16, 32)       128       
 hNormalization)                                                 
                                                                 
 max_pooling2d (MaxPooling2D  (None, 8, 8, 32)         0         
 )                                                               
                                                                 
 conv2d_2 (Conv2D)           (None, 4, 4, 64)          51264     
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 2, 2, 64)         0         
 2D)                                                             
                                                                 
 custom_layer (Mylayer)      (None, 2, 2, 64)          256       
                                                                 
 flatten (Flatten)           (None, 256)               0         
                                                                 
 dense (Dense)               (None, 10)                2570      
                                                                 
=================================================================
Total params: 106,154
Trainable params: 106,026
Non-trainable params: 128
_________________________________________________________________
Epoch 1/10
 1/32 [..............................] - ETA: 1:01 - loss: 1.0781 - accuracy: 0. 3/32 [=>............................] - ETA: 1s - loss: 0.6279 - accuracy: 0.21 5/32 [===>..........................] - ETA: 1s - loss: 0.4962 - accuracy: 0.26 7/32 [=====>........................] - ETA: 0s - loss: 0.4312 - accuracy: 0.31 9/32 [=======>......................] - ETA: 0s - loss: 0.3897 - accuracy: 0.3311/32 [=========>....................] - ETA: 0s - loss: 0.3583 - accuracy: 0.3713/32 [===========>..................] - ETA: 0s - loss: 0.3323 - accuracy: 0.4115/32 [=============>................] - ETA: 0s - loss: 0.3097 - accuracy: 0.4517/32 [==============>...............] - ETA: 0s - loss: 0.2956 - accuracy: 0.4819/32 [================>.............] - ETA: 0s - loss: 0.2765 - accuracy: 0.5221/32 [==================>...........] - ETA: 0s - loss: 0.2634 - accuracy: 0.5523/32 [====================>.........] - ETA: 0s - loss: 0.2572 - accuracy: 0.5525/32 [======================>.......] - ETA: 0s - loss: 0.2477 - accuracy: 0.5727/32 [========================>.....] - ETA: 0s - loss: 0.2428 - accuracy: 0.5829/32 [==========================>...] - ETA: 0s - loss: 0.2328 - accuracy: 0.6031/32 [============================>.] - ETA: 0s - loss: 0.2252 - accuracy: 0.6132/32 [==============================] - 3s 35ms/step - loss: 0.2249 - accuracy: 0.6190
Epoch 2/10
 1/32 [..............................] - ETA: 1s - loss: 0.1315 - accuracy: 0.84 3/32 [=>............................] - ETA: 1s - loss: 0.1153 - accuracy: 0.84 5/32 [===>..........................] - ETA: 0s - loss: 0.1036 - accuracy: 0.85 7/32 [=====>........................] - ETA: 0s - loss: 0.1060 - accuracy: 0.85 9/32 [=======>......................] - ETA: 0s - loss: 0.1018 - accuracy: 0.8511/32 [=========>....................] - ETA: 0s - loss: 0.1005 - accuracy: 0.8513/32 [===========>..................] - ETA: 0s - loss: 0.0948 - accuracy: 0.8715/32 [=============>................] - ETA: 0s - loss: 0.0947 - accuracy: 0.8617/32 [==============>...............] - ETA: 0s - loss: 0.0931 - accuracy: 0.8719/32 [================>.............] - ETA: 0s - loss: 0.0909 - accuracy: 0.8721/32 [==================>...........] - ETA: 0s - loss: 0.0925 - accuracy: 0.8723/32 [====================>.........] - ETA: 0s - loss: 0.0907 - accuracy: 0.8725/32 [======================>.......] - ETA: 0s - loss: 0.0910 - accuracy: 0.8727/32 [========================>.....] - ETA: 0s - loss: 0.0919 - accuracy: 0.8729/32 [==========================>...] - ETA: 0s - loss: 0.0911 - accuracy: 0.8731/32 [============================>.] - ETA: 0s - loss: 0.0889 - accuracy: 0.8732/32 [==============================] - 1s 35ms/step - loss: 0.0889 - accuracy: 0.8760
Epoch 3/10
 1/32 [..............................] - ETA: 1s - loss: 0.0707 - accuracy: 0.93 3/32 [=>............................] - ETA: 0s - loss: 0.0797 - accuracy: 0.88 5/32 [===>..........................] - ETA: 0s - loss: 0.0752 - accuracy: 0.90 7/32 [=====>........................] - ETA: 0s - loss: 0.0721 - accuracy: 0.90 9/32 [=======>......................] - ETA: 0s - loss: 0.0679 - accuracy: 0.9111/32 [=========>....................] - ETA: 0s - loss: 0.0677 - accuracy: 0.9013/32 [===========>..................] - ETA: 0s - loss: 0.0663 - accuracy: 0.9115/32 [=============>................] - ETA: 0s - loss: 0.0669 - accuracy: 0.9117/32 [==============>...............] - ETA: 0s - loss: 0.0650 - accuracy: 0.9219/32 [================>.............] - ETA: 0s - loss: 0.0634 - accuracy: 0.9221/32 [==================>...........] - ETA: 0s - loss: 0.0637 - accuracy: 0.9223/32 [====================>.........] - ETA: 0s - loss: 0.0635 - accuracy: 0.9225/32 [======================>.......] - ETA: 0s - loss: 0.0634 - accuracy: 0.9227/32 [========================>.....] - ETA: 0s - loss: 0.0635 - accuracy: 0.9229/32 [==========================>...] - ETA: 0s - loss: 0.0620 - accuracy: 0.9231/32 [============================>.] - ETA: 0s - loss: 0.0623 - accuracy: 0.9232/32 [==============================] - 1s 35ms/step - loss: 0.0625 - accuracy: 0.9280
Epoch 4/10
 1/32 [..............................] - ETA: 1s - loss: 0.0618 - accuracy: 0.90 3/32 [=>............................] - ETA: 1s - loss: 0.0520 - accuracy: 0.93 5/32 [===>..........................] - ETA: 0s - loss: 0.0512 - accuracy: 0.93 7/32 [=====>........................] - ETA: 0s - loss: 0.0547 - accuracy: 0.93 9/32 [=======>......................] - ETA: 0s - loss: 0.0533 - accuracy: 0.9311/32 [=========>....................] - ETA: 0s - loss: 0.0514 - accuracy: 0.9313/32 [===========>..................] - ETA: 0s - loss: 0.0514 - accuracy: 0.9315/32 [=============>................] - ETA: 0s - loss: 0.0506 - accuracy: 0.9417/32 [==============>...............] - ETA: 0s - loss: 0.0512 - accuracy: 0.9419/32 [================>.............] - ETA: 0s - loss: 0.0511 - accuracy: 0.9421/32 [==================>...........] - ETA: 0s - loss: 0.0512 - accuracy: 0.9323/32 [====================>.........] - ETA: 0s - loss: 0.0504 - accuracy: 0.9325/32 [======================>.......] - ETA: 0s - loss: 0.0507 - accuracy: 0.9327/32 [========================>.....] - ETA: 0s - loss: 0.0501 - accuracy: 0.9329/32 [==========================>...] - ETA: 0s - loss: 0.0499 - accuracy: 0.9331/32 [============================>.] - ETA: 0s - loss: 0.0501 - accuracy: 0.9332/32 [==============================] - 1s 35ms/step - loss: 0.0501 - accuracy: 0.9400
Epoch 5/10
 1/32 [..............................] - ETA: 1s - loss: 0.0497 - accuracy: 0.93 3/32 [=>............................] - ETA: 1s - loss: 0.0456 - accuracy: 0.92 5/32 [===>..........................] - ETA: 0s - loss: 0.0398 - accuracy: 0.95 7/32 [=====>........................] - ETA: 0s - loss: 0.0381 - accuracy: 0.95 9/32 [=======>......................] - ETA: 0s - loss: 0.0357 - accuracy: 0.9511/32 [=========>....................] - ETA: 0s - loss: 0.0346 - accuracy: 0.9613/32 [===========>..................] - ETA: 0s - loss: 0.0351 - accuracy: 0.9615/32 [=============>................] - ETA: 0s - loss: 0.0355 - accuracy: 0.9617/32 [==============>...............] - ETA: 0s - loss: 0.0355 - accuracy: 0.9619/32 [================>.............] - ETA: 0s - loss: 0.0364 - accuracy: 0.9621/32 [==================>...........] - ETA: 0s - loss: 0.0392 - accuracy: 0.9523/32 [====================>.........] - ETA: 0s - loss: 0.0390 - accuracy: 0.9625/32 [======================>.......] - ETA: 0s - loss: 0.0412 - accuracy: 0.9527/32 [========================>.....] - ETA: 0s - loss: 0.0409 - accuracy: 0.9529/32 [==========================>...] - ETA: 0s - loss: 0.0403 - accuracy: 0.9531/32 [============================>.] - ETA: 0s - loss: 0.0400 - accuracy: 0.9532/32 [==============================] - 1s 35ms/step - loss: 0.0398 - accuracy: 0.9570
Epoch 6/10
 1/32 [..............................] - ETA: 1s - loss: 0.0359 - accuracy: 0.93 3/32 [=>............................] - ETA: 1s - loss: 0.0360 - accuracy: 0.93 5/32 [===>..........................] - ETA: 0s - loss: 0.0337 - accuracy: 0.95 7/32 [=====>........................] - ETA: 0s - loss: 0.0311 - accuracy: 0.96 9/32 [=======>......................] - ETA: 0s - loss: 0.0302 - accuracy: 0.9611/32 [=========>....................] - ETA: 0s - loss: 0.0292 - accuracy: 0.9613/32 [===========>..................] - ETA: 0s - loss: 0.0302 - accuracy: 0.9615/32 [=============>................] - ETA: 0s - loss: 0.0288 - accuracy: 0.9617/32 [==============>...............] - ETA: 0s - loss: 0.0283 - accuracy: 0.9619/32 [================>.............] - ETA: 0s - loss: 0.0275 - accuracy: 0.9721/32 [==================>...........] - ETA: 0s - loss: 0.0294 - accuracy: 0.9623/32 [====================>.........] - ETA: 0s - loss: 0.0306 - accuracy: 0.9625/32 [======================>.......] - ETA: 0s - loss: 0.0306 - accuracy: 0.9627/32 [========================>.....] - ETA: 0s - loss: 0.0311 - accuracy: 0.9629/32 [==========================>...] - ETA: 0s - loss: 0.0307 - accuracy: 0.9631/32 [============================>.] - ETA: 0s - loss: 0.0309 - accuracy: 0.9632/32 [==============================] - 1s 35ms/step - loss: 0.0308 - accuracy: 0.9700
Epoch 7/10
 1/32 [..............................] - ETA: 1s - loss: 0.0136 - accuracy: 1.00 3/32 [=>............................] - ETA: 1s - loss: 0.0248 - accuracy: 0.96 5/32 [===>..........................] - ETA: 0s - loss: 0.0267 - accuracy: 0.98 7/32 [=====>........................] - ETA: 0s - loss: 0.0254 - accuracy: 0.98 9/32 [=======>......................] - ETA: 0s - loss: 0.0241 - accuracy: 0.9811/32 [=========>....................] - ETA: 0s - loss: 0.0253 - accuracy: 0.9813/32 [===========>..................] - ETA: 0s - loss: 0.0246 - accuracy: 0.9815/32 [=============>................] - ETA: 0s - loss: 0.0231 - accuracy: 0.9817/32 [==============>...............] - ETA: 0s - loss: 0.0231 - accuracy: 0.9819/32 [================>.............] - ETA: 0s - loss: 0.0231 - accuracy: 0.9821/32 [==================>...........] - ETA: 0s - loss: 0.0236 - accuracy: 0.9823/32 [====================>.........] - ETA: 0s - loss: 0.0238 - accuracy: 0.9825/32 [======================>.......] - ETA: 0s - loss: 0.0239 - accuracy: 0.9827/32 [========================>.....] - ETA: 0s - loss: 0.0243 - accuracy: 0.9729/32 [==========================>...] - ETA: 0s - loss: 0.0246 - accuracy: 0.9731/32 [============================>.] - ETA: 0s - loss: 0.0256 - accuracy: 0.9732/32 [==============================] - 1s 35ms/step - loss: 0.0256 - accuracy: 0.9760
Epoch 8/10
 1/32 [..............................] - ETA: 1s - loss: 0.0199 - accuracy: 0.96 3/32 [=>............................] - ETA: 1s - loss: 0.0191 - accuracy: 0.98 5/32 [===>..........................] - ETA: 1s - loss: 0.0166 - accuracy: 0.99 7/32 [=====>........................] - ETA: 0s - loss: 0.0179 - accuracy: 0.99 9/32 [=======>......................] - ETA: 0s - loss: 0.0181 - accuracy: 0.9911/32 [=========>....................] - ETA: 0s - loss: 0.0180 - accuracy: 0.9913/32 [===========>..................] - ETA: 0s - loss: 0.0182 - accuracy: 0.9915/32 [=============>................] - ETA: 0s - loss: 0.0186 - accuracy: 0.9917/32 [==============>...............] - ETA: 0s - loss: 0.0191 - accuracy: 0.9919/32 [================>.............] - ETA: 0s - loss: 0.0184 - accuracy: 0.9921/32 [==================>...........] - ETA: 0s - loss: 0.0190 - accuracy: 0.9923/32 [====================>.........] - ETA: 0s - loss: 0.0188 - accuracy: 0.9925/32 [======================>.......] - ETA: 0s - loss: 0.0186 - accuracy: 0.9927/32 [========================>.....] - ETA: 0s - loss: 0.0183 - accuracy: 0.9929/32 [==========================>...] - ETA: 0s - loss: 0.0181 - accuracy: 0.9931/32 [============================>.] - ETA: 0s - loss: 0.0180 - accuracy: 0.9932/32 [==============================] - 1s 35ms/step - loss: 0.0180 - accuracy: 0.9940
Epoch 9/10
 1/32 [..............................] - ETA: 1s - loss: 0.0098 - accuracy: 1.00 3/32 [=>............................] - ETA: 1s - loss: 0.0124 - accuracy: 1.00 5/32 [===>..........................] - ETA: 0s - loss: 0.0132 - accuracy: 0.99 7/32 [=====>........................] - ETA: 0s - loss: 0.0135 - accuracy: 0.98 9/32 [=======>......................] - ETA: 0s - loss: 0.0140 - accuracy: 0.9811/32 [=========>....................] - ETA: 0s - loss: 0.0134 - accuracy: 0.9913/32 [===========>..................] - ETA: 0s - loss: 0.0143 - accuracy: 0.9815/32 [=============>................] - ETA: 0s - loss: 0.0143 - accuracy: 0.9817/32 [==============>...............] - ETA: 0s - loss: 0.0145 - accuracy: 0.9819/32 [================>.............] - ETA: 0s - loss: 0.0137 - accuracy: 0.9921/32 [==================>...........] - ETA: 0s - loss: 0.0136 - accuracy: 0.9923/32 [====================>.........] - ETA: 0s - loss: 0.0140 - accuracy: 0.9925/32 [======================>.......] - ETA: 0s - loss: 0.0138 - accuracy: 0.9927/32 [========================>.....] - ETA: 0s - loss: 0.0135 - accuracy: 0.9929/32 [==========================>...] - ETA: 0s - loss: 0.0134 - accuracy: 0.9931/32 [============================>.] - ETA: 0s - loss: 0.0140 - accuracy: 0.9832/32 [==============================] - 1s 36ms/step - loss: 0.0139 - accuracy: 0.9900
Epoch 10/10
 1/32 [..............................] - ETA: 1s - loss: 0.0125 - accuracy: 1.00 3/32 [=>............................] - ETA: 1s - loss: 0.0104 - accuracy: 1.00 5/32 [===>..........................] - ETA: 1s - loss: 0.0084 - accuracy: 1.00 7/32 [=====>........................] - ETA: 0s - loss: 0.0098 - accuracy: 1.00 9/32 [=======>......................] - ETA: 0s - loss: 0.0101 - accuracy: 1.0011/32 [=========>....................] - ETA: 0s - loss: 0.0109 - accuracy: 0.9913/32 [===========>..................] - ETA: 0s - loss: 0.0106 - accuracy: 0.9915/32 [=============>................] - ETA: 0s - loss: 0.0102 - accuracy: 0.9917/32 [==============>...............] - ETA: 0s - loss: 0.0104 - accuracy: 0.9919/32 [================>.............] - ETA: 0s - loss: 0.0110 - accuracy: 0.9921/32 [==================>...........] - ETA: 0s - loss: 0.0106 - accuracy: 0.9923/32 [====================>.........] - ETA: 0s - loss: 0.0110 - accuracy: 0.9925/32 [======================>.......] - ETA: 0s - loss: 0.0107 - accuracy: 0.9927/32 [========================>.....] - ETA: 0s - loss: 0.0106 - accuracy: 0.9929/32 [==========================>...] - ETA: 0s - loss: 0.0103 - accuracy: 0.9931/32 [============================>.] - ETA: 0s - loss: 0.0104 - accuracy: 0.9932/32 [==============================] - 1s 36ms/step - loss: 0.0104 - accuracy: 0.9990
  1/313 [..............................] - ETA: 43s - loss: 0.0422 - accuracy: 0  7/313 [..............................] - ETA: 2s - loss: 0.0441 - accuracy: 0. 15/313 [>.............................] - ETA: 2s - loss: 0.0598 - accuracy: 0. 22/313 [=>............................] - ETA: 2s - loss: 0.0662 - accuracy: 0. 30/313 [=>............................] - ETA: 2s - loss: 0.0671 - accuracy: 0. 38/313 [==>...........................] - ETA: 1s - loss: 0.0685 - accuracy: 0. 46/313 [===>..........................] - ETA: 1s - loss: 0.0730 - accuracy: 0. 54/313 [====>.........................] - ETA: 1s - loss: 0.0746 - accuracy: 0. 61/313 [====>.........................] - ETA: 1s - loss: 0.0751 - accuracy: 0. 67/313 [=====>........................] - ETA: 1s - loss: 0.0762 - accuracy: 0. 74/313 [======>.......................] - ETA: 1s - loss: 0.0754 - accuracy: 0. 82/313 [======>.......................] - ETA: 1s - loss: 0.0751 - accuracy: 0. 89/313 [=======>......................] - ETA: 1s - loss: 0.0742 - accuracy: 0. 97/313 [========>.....................] - ETA: 1s - loss: 0.0737 - accuracy: 0.104/313 [========>.....................] - ETA: 1s - loss: 0.0738 - accuracy: 0.112/313 [=========>....................] - ETA: 1s - loss: 0.0737 - accuracy: 0.120/313 [==========>...................] - ETA: 1s - loss: 0.0750 - accuracy: 0.128/313 [===========>..................] - ETA: 1s - loss: 0.0752 - accuracy: 0.135/313 [===========>..................] - ETA: 1s - loss: 0.0760 - accuracy: 0.143/313 [============>.................] - ETA: 1s - loss: 0.0758 - accuracy: 0.150/313 [=============>................] - ETA: 1s - loss: 0.0758 - accuracy: 0.158/313 [==============>...............] - ETA: 1s - loss: 0.0756 - accuracy: 0.166/313 [==============>...............] - ETA: 1s - loss: 0.0743 - accuracy: 0.175/313 [===============>..............] - ETA: 0s - loss: 0.0722 - accuracy: 0.183/313 [================>.............] - ETA: 0s - loss: 0.0712 - accuracy: 0.191/313 [=================>............] - ETA: 0s - loss: 0.0714 - accuracy: 0.198/313 [=================>............] - ETA: 0s - loss: 0.0699 - accuracy: 0.207/313 [==================>...........] - ETA: 0s - loss: 0.0691 - accuracy: 0.215/313 [===================>..........] - ETA: 0s - loss: 0.0685 - accuracy: 0.223/313 [====================>.........] - ETA: 0s - loss: 0.0673 - accuracy: 0.231/313 [=====================>........] - ETA: 0s - loss: 0.0662 - accuracy: 0.239/313 [=====================>........] - ETA: 0s - loss: 0.0651 - accuracy: 0.247/313 [======================>.......] - ETA: 0s - loss: 0.0643 - accuracy: 0.255/313 [=======================>......] - ETA: 0s - loss: 0.0637 - accuracy: 0.263/313 [========================>.....] - ETA: 0s - loss: 0.0635 - accuracy: 0.271/313 [========================>.....] - ETA: 0s - loss: 0.0627 - accuracy: 0.278/313 [=========================>....] - ETA: 0s - loss: 0.0614 - accuracy: 0.286/313 [==========================>...] - ETA: 0s - loss: 0.0609 - accuracy: 0.294/313 [===========================>..] - ETA: 0s - loss: 0.0602 - accuracy: 0.301/313 [===========================>..] - ETA: 0s - loss: 0.0597 - accuracy: 0.309/313 [============================>.] - ETA: 0s - loss: 0.0602 - accuracy: 0.313/313 [==============================] - 2s 7ms/step - loss: 0.0602 - accuracy: 0.9154

***************** Summary *****************
Trained float model accuracy:  0.9154000282287598
Trained float model is saved in  ./my_model.h5


my_model.h5 が生成された。
Custom_OP_Workflow_8_221202.png
  1. 2022年12月02日 04:49 |
  2. Vitis-AI
  3. | トラックバック:0
  4. | コメント:0

”Deploying the Dobble Challenge on the Ultra96-V2”をやってみる3

”Deploying the Dobble Challenge on the Ultra96-V2”をやってみる2”の続き。

前回は、”Deploying the Dobble Challenge on the Ultra96-V2”を見ながら、パソコンでの作業が終了するまでやってみた。つまり、フリーズグラフの量子化、量子化モデルの評価、量子化モデルのコンパイル、ボード上で実行するために必要なすべてのファイルを./build/targetフォルダにコピーを行った。
今回は、”Deploying the Dobble Challenge on the Ultra96-V2”の残り、 ./build/targetフォルダの内容を Ultra96V2 にコピーして、Ultra96V2 に接続した USB カメラで Dobble を認識してみよう。

Ultra96V2 の MicroSD カードは””Vitis-AI 1.3 Flow for Avnet VITIS Platforms”をやってみる1”で作った MicroSD カードで問題ない。つまり、今まで使ってきた MicroSD カードを使用できる。

Ultra96V2 をブートして、パソコンのUbuntu 18.04 の端末からログインした。
ssh <IPアドレス> -X -l root
今回の Dobble 用の環境設定ファイル initset2.sh を作成する。
Dobble_57_210713.png

initset2.sh を作成した。
Dobble_58_210713.png

dmesg -D
cd dpu_sw_optimize/zynqmp
./zynqmp_dpu_optimize.sh
export DISPLAY=:0.0
xrandr --output DP-1 --mode 640x480


initset2.sh を実行した。
source initset2.sh
Dobble_59_210713.png

パソコンの ./build/targetフォルダの内容を Ultra96V2 にコピーするために、USB-LAN アダプタでネットワーク接続されているので、FileZilla を使って SFTP で Ultra96V2 にアップロードした。
Dobble_60_210713.png

コピーされた target_B2304_LR ディレクトリに入って、 app_mt.py を実行して、精度を確かめた。
python3 app_mt.py
Dobble_61_210713.png

精度は 97 % で 75.88 FPS だった。

app_mt.py を 5 スレッドで実行する。
python3 app_mt.py -t 5
Dobble_62_210713.png

精度は同じ 97 % で 96.46 FPS だった。 FPS が向上している。

USB カメラを使用して、実際に Dobble を認識してみよう。
Dobble は””The Dobble Challenge”をやってみる2”でダウンロードした dobble_dataset ディレクトリの dobble_deck01.png を拡大印刷して切り取ったものを使用した。

python3 dobble_detect_live.py
を実行すると、 USB カメラがアクティブになって、カメラの内容がウインドウに表示された。
先程印刷して、一枚一枚切り取った紙片をカメラに近づけると認識した。
Dobble_63_210713.png
Dobble_64_210713.png
Dobble_65_210713.jpg

27 番と認識された。合っている。
なお、当然だが、距離により誤認識することがあるが、この大きさだと安定している。

もう 1 つ認識させてみた。
Dobble_66_210713.jpg

15 番と認識された。これも合っている。成功した。

ここまで、Keras のモデルを作成して、Keras のモデルを TensorFlow のモデルに変換し、量子化した。それを Ultra96V2 に持っていって実機で動作させるという一連の Vitis-AI の実装方法を体験できたのは良かった。
一連のチュートリアルに感謝したい。
  1. 2021年07月15日 04:56 |
  2. Vitis-AI
  3. | トラックバック:0
  4. | コメント:0

”Deploying the Dobble Challenge on the Ultra96-V2”をやってみる2

”Deploying the Dobble Challenge on the Ultra96-V2”をやってみる1”の続き。

前回は、”Deploying the Dobble Challenge on the Ultra96-V2”をやり始めて、Vitis-AI を Docker で起動し、環境設定、Keras のモデルから TensorFlow互換のフリーズグラフに変換、TensorFlow互換のフリーズグラフを評価し、99.42 % の精度があることを確認できた。
今回は、前回の続きからで、”Deploying the Dobble Challenge on the Ultra96-V2”を見ながら、パソコンでの作業が終了するまでやってみよう。つまり、フリーズグラフの量子化、量子化モデルの評価、量子化モデルのコンパイル、ボード上で実行するために必要なすべてのファイルを./build/targetフォルダにコピーを行う。

フリーズグラフの量子化を行う。
Deploying the Dobble Challenge on the Ultra96-V2”によると、DPUアクセラレータIPは、すべての計算を8ビット整数形式で実行するため、浮動小数点の凍結グラフを量子化する必要があるそうだ。
”Step 4: Quantizing the Frozen Graph”の一部の Google 翻訳結果を引用する。

キャリブレーションで使用するために生成される画像の数は、0_setenv.shスクリプトのCALIB_IMAGES環境変数によって設定されます。キャリブレーションの反復回数(--calib_iter)にキャリブレーションバッチサイズ(image_input_fn.pyスクリプトで設定)を掛けたものが、使用可能なイメージの総数(CALIB_IMAGES)を超えないように注意する必要があります。

量子化が完了すると、。/ files / build / quantizeフォルダーに量子化されたデプロイメントモデル(deploy_model.pb)と評価モデル(quantize_eval_model.pb)が作成されます。


さて、フリーズグラフの量子化をやってみる。
source ./4_quant.sh
Dobble_50_210713.png
Dobble_51_210713.png

ログを示す。

(vitis-ai-tensorflow) Vitis-AI /workspace/dobble_classification_on_ultra96v2/files > source ./4_quant.sh
-----------------------------------------
QUANTIZE STARTED..
-----------------------------------------
Making calibration images..
Using TensorFlow backend.
Command line options:
 --image_dir    :  ./build/quantize/images
 --calib_list   :  calib_list.txt
 --dataset      :  train
 --max_images   :  1000
Calib images generated
Vai_q_tensorflow v1.2.0 build for Tensorflow 1.15.2 git version
heads/1.3-0-gc680f744
100% (10 of 10) |########################| Elapsed Time: 0:04:41 Time:  0:04:41
INFO: Checking Float Graph...
INFO: Float Graph Check Done.
INFO: Calibrating for 10 iterations...
INFO: Calibration Done.
INFO: Generating Deploy Model...
INFO: Deploy Model Generated.
********************* Quantization Summary *********************      
INFO: Output:       
  quantize_eval_model: ./build/quantize/quantize_eval_model.pb       
  deploy_model: ./build/quantize/deploy_model.pb
-----------------------------------------
QUANTIZE COMPLETED
-----------------------------------------


量子化されたファイルを示す。
Dobble_67_210714.png

量子化モデルの評価を行う。
source ./5_eval_quant.sh
Dobble_52_210713.png
Dobble_53_210713.png

精度は 99.67 % だった。

量子化モデルのコンパイルを行う。
Deploying the Dobble Challenge on the Ultra96-V2”の”Step 6: Compiling the Quantized Model”の文章を一部 Google 翻訳して貼っておく。

DPU IPはソフトコアIPであり、その唯一の機能は畳み込みニューラルネットワークの実行を加速することです。これは、独自の命令セットを持つコプロセッサーです。これらの命令は、Xmodelファイル形式でDPUに渡されます。

Vitis AIコンパイラは、量子化された展開モデルを一連のマイクロ命令に変換し、可能な場合は最適化してから、Xmodelファイルに出力します。

生成される命令は、DPUの特定の構成に固有です。DPUのパラメーターは、ターゲットボードごとに作成する必要があるarch.jsonファイルに含まれています。詳細については、VitisAIユーザーガイドを参照してください。


source ./6_compile.sh
Dobble_69_210714.png
Dobble_70_210714.png

出力されたファイルを示す。
Dobble_54_210713.png

ログを貼っておく。

(vitis-ai-tensorflow) Vitis-AI /workspace/dobble_classification_on_ultra96v2/files > source ./6_compile.sh
-----------------------------------------
COMPILE STARTED..
-----------------------------------------
[INFO] parse raw model     :  0%|          | 0/33 [00:00<?, ?it/s]              
[INFO] parse raw model     :100%|██████████| 33/33 [00:00<00:00, 18611.27it/s]               
[INFO] infer shape (NHWC)  :  0%|          | 0/38 [00:00<?, ?it/s]              
[INFO] infer shape (NHWC)  :100%|██████████| 38/38 [00:00<00:00, 14147.31it/s]               
[INFO] infer shape (NHWC)  :  0%|          | 0/35 [00:00<?, ?it/s]              
[INFO] infer shape (NHWC)  :100%|██████████| 35/35 [00:00<00:00, 5574.99it/s]                
[INFO] generate xmodel     :  0%|          | 0/35 [00:00<?, ?it/s]              
[INFO] generate xmodel     :  9%|▊         | 3/35 [00:00<00:05,  5.49it/s]      
[INFO] generate xmodel     :100%|██████████| 35/35 [00:00<00:00, 63.60it/s]                  
[INFO] Namespace(inputs_shape=None, layout='NHWC', model_files=['./build/quantize/quantize_eval_model.pb'], model_type='tensorflow', out_filename='./build/compile_B2304_LR/dobble_org.xmodel', proto=None)
[INFO] tensorflow model: build/quantize/quantize_eval_model.pb
[INFO] generate xmodel: /workspace/dobble_classification_on_ultra96v2/files/build/compile_B2304_LR/dobble_org.xmodel
[UNILOG][INFO] The compiler log will be dumped at "/tmp/vitis-ai-user/log/xcompiler-20210713-134253-298"
[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA0_B2304_MAX_BG2
[UNILOG][INFO] Compile mode: dpu
[UNILOG][INFO] Debug mode: function
[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA0_B2304_MAX_BG2
[UNILOG][INFO] Graph name: quantize_eval_model, with op num: 55
[UNILOG][INFO] Begin to compile...
[UNILOG][INFO] Total device subgraph number 3, DPU subgraph number 1
[UNILOG][INFO] Compile done.
[UNILOG][INFO] The meta json is saved to "/workspace/dobble_classification_on_ultra96v2/files/./build/compile_B2304_LR/meta.json"
[UNILOG][INFO] The compiled xmodel is saved to "/workspace/dobble_classification_on_ultra96v2/files/./build/compile_B2304_LR/dobble.xmodel"
[UNILOG][INFO] The compiled xmodel's md5sum is 5cc2ffa0cc1e1c45e439fdc62268f1ae, and been saved to "/workspace/dobble_classification_on_ultra96v2/files/./build/compile_B2304_LR/md5sum.txt"
**************************************************
* VITIS_AI Compilation - Xilinx Inc.
**************************************************
-----------------------------------------
COMPILE COMPLETED
-----------------------------------------


ボード上で実行するために必要なすべてのファイルを./build/targetフォルダにコピーする。
source ./7_make_target.sh
Dobble_55_210713.png

./build/target_B2304_LR フォルダのファイルを示す。
Dobble_56_210713.png
  1. 2021年07月14日 04:57 |
  2. Vitis-AI
  3. | トラックバック:0
  4. | コメント:0

”Deploying the Dobble Challenge on the Ultra96-V2”をやってみる1

”Training The Dobble Challenge”をやってみる2”の続き。

前回は、 ”Training The Dobble Challenge”の残りを行って、Dobble の画像を増やして学習し、テスト・データでの精度が向上するのを確認できた。
今回は、”Deploying the Dobble Challenge on the Ultra96-V2”をやってみることにする。

なお、書いてないと思うのだが、”Deploying the Dobble Challenge on the Ultra96-V2”をやる前に、スクリプトがあるリポジトリ https://github.com/AlbertaBeef/dobble_classification_on_ultra96v2.git を git clone する必要があった。これが分かるまでに 2 時間くらい悩んでしまった。。。

最初に Vitis-AI を git clone した。
git clone https://github.com/Xilinx/Vitis-AI.git
Dobble_34_210712.png

Vitis-AI に入って、スクリプトがあるリポジトリを git clone した。
cd Vitis-AI
git clone https://github.com/AlbertaBeef/dobble_classification_on_ultra96v2.git

Dobble_35_210712.png

Vitis-AI/dobble_classification_on_ultra96v2/files のファイルを示す。スクリプトが並んでいる。
Dobble_36_210712.png

docker 仕様の Vitis-AI を起動する。
./docker_run.sh xilinx/vitis-ai:1.3.411
Dobble_37_210712.png

ライセンスに聞かれるが Enter キーを押していく。
Dobble_38_210712.png

この後、初回では、パッケージをダウンロードしまくった。
Vitis-AI が起動した。
Dobble_39_210712.png

/workspace/dobble_classification_on_ultra96v2/files ディレクトリに cd した。
ファイルが見える。
Dobble_40_210712.png

環境を設定するスクリプトの 0_setenv.sh を実行した。
source 0_setenv.sh
Dobble_41_210712.png

次の学習はパスして、学習済みモデルを使用することにした。
keras_model.zip に学習済みモデルが入っている。
Dobble_42_210712.png

/workspace/dobble_classification_on_ultra96v2/files/build/keras_model ディレクトリに dobble_model.h5 を入れた。
Dobble_43_210712.png

Keras のモデルから TensorFlow互換のフリーズグラフに変換する。
Vitis-AI で取り扱うには、TensorFlow互換のフリーズグラフにする必要があるそうだ。
source ./2_keras2tf.sh
Dobble_44_210712.png
Dobble_45_210712.png

/workspace/dobble_classification_on_ultra96v2/files/build/freeze ディレクトリに frozen_graph.pb が生成された。
Dobble_46_210712.png

TensorFlow互換のフリーズグラフを評価する前に””The Dobble Challenge”をやってみる2”で書いた dobble_dataset ディレクトリを dobble_classification_on_ultra96v2/files ディレクトリにコピーした。
Dobble_47_210712.png

TensorFlow互換のフリーズグラフを評価する。
source ./3_eval_frozen.sh
Dobble_48_210712.png
Dobble_49_210712.png

モデルの精度は 99.42 % だったようだ。精度が高い。

ログを貼っておく。

(vitis-ai-tensorflow) Vitis-AI /workspace/dobble_classification_on_ultra96v2/files > source ./3_eval_frozen.sh
-----------------------------------------
EVALUATING THE FROZEN GRAPH..
-----------------------------------------
Using TensorFlow backend.
100% (12 of 12) |########################| Elapsed Time: 0:00:10 Time:  0:00:10

------------------------------------
TensorFlow version :  1.15.2
3.6.12 |Anaconda, Inc.| (default, Sep  8 2020, 23:10:56) 
[GCC 7.3.0]
------------------------------------
Command line options:
 --graph      :  ./build/freeze/frozen_graph.pb
 --input_node :  conv2d_1_input
 --output_node:  activation_2/Softmax
 --batchsize  :  100
 --gpu        :  0
------------------------------------


TEST DATA SETS:
Shape of test data (X) is : (1267, 224, 224, 3)
Shape of test data (y) is : (1267, 58)
Graph accuracy with validation dataset: 0.9942
-----------------------------------------
EVALUATION COMPLETED
-----------------------------------------

  1. 2021年07月13日 04:01 |
  2. Vitis-AI
  3. | トラックバック:0
  4. | コメント:0

”License Plate Recognition with Vitis-AI”をやってみる

”Head-Pose Estimation on Ultra96-V2”をやってみる”の続き。

前回は、、”Step 3 – Modifying the examples”の”Head-Pose Estimation on Ultra96-V2”をやってみて、顔認識と顔の向き、顔パーツの位置認識を行うことができた。今回は、その次の”License Plate Recognition with Vitis-AI”をやってみよう。

今回は車のナンバープレートの位置を推定して、その中のナンバーを認識するというお題だ。

まず最初の”Step 1 - Create the SD card”はすでに MicroSD カードを作成済みだ。

”Step 2 - Clone the source code repository”も前回 vitis_ai_cpp_examples を git clone してある。

”Step 3 - Overview of the platedetect example”からやってみよう。

その前に、 initset.sh を起動する。
./initset.sh
Vitis-AI_55_210706.png

~/Vitis-AI/demo/Vitis-AI-Library/samples/platedetect ディレクトリに移動して、test_jpeg_platedetect をやってみよう。
cd ~/Vitis-AI/demo/Vitis-AI-Library/samples/platedetect
./test_jpeg_platedetect sample_platedetect.jpg

Vitis-AI_56_210706.png

エラーになってしまった。

もう一度、ビルドしてみた。
./build.sh
Vitis-AI_57_210706.png

それぞれの実行形式ファイルが更新されたところで、もう一度、 test_jpeg_platedetect をやってみた。
Vitis-AI_58_210706.png

./test_jpeg_platedetect sample_platedetect.jpg
Vitis-AI_59_210706.png

やはりダメだった。これは諦めて次行ってみよう。

Step 4 - Creating the license plate recognition application
静止画の車の写真から車のナンバープレートを認識して、テキストで示す。

最初にビルドを行う。
cd ~/vitis_ai_cpp_examples/platerecognition
chmod +x build.sh
./build.sh

Vitis-AI_60_210706.png

test_video_platerecognition ができた。

sample_platedetect.jpg を現在のディレクトリにコピーして test_video_platerecognition を実行する。
cp ~/Vitis-AI/demo/Vitis-AI-Library/samples/platedetect/sample_platedetect.jpg .
export PLATERECOGNITION_DEBUG=TRUE
./test_jpeg_platerecognition sample_platedetect.jpg

Vitis-AI_61_210706.png

ナンバープレートの認識結果を貼っておく。

  SSD : label=1 x,y,w,h=2,1,272,304 confidence=0.906937
    PlateDetect : x,y,w,h=103,257,63,21 confidence=0.99977
      PlateNum : size=288,96 color=Blue number=[jingQ2P6J2]


sample_platedetect.jpg を引用する。
Vitis-AI_62_210706.jpg

こうやってテキストででてくるのが良い。これだと実際に使えそうだ。
画像出力結果の sample_platedetect_result.jpg を示す。
Vitis-AI_65_210706.jpg

次に動画中の車のナンバープレートを認識する。
cd ~/vitis_ai_cpp_examples/platerecognition
unset PLATERECOGNITION_DEBUG
./test_video_platerecognition ./video/plate_recognition_video.mp4

Vitis-AI_63_210706.png

動画のナンバープレート認識画像を示す。
Vitis-AI_64_210706.jpg
  1. 2021年07月07日 05:02 |
  2. Vitis-AI
  3. | トラックバック:0
  4. | コメント:0

”Head-Pose Estimation on Ultra96-V2”をやってみる

”Vitis-AI 1.3 Flow for Avnet VITIS Platforms”をやってみる2”の続き。

前回は、”Vitis-AI 1.3 Flow for Avnet VITIS Platforms”を参照しながら、Vitis-AI 1.3 の続きを行った。今回は、”Step 3 – Modifying the examples”の”Head-Pose Estimation on Ultra96-V2”をやってみよう。

Vitis-AI 1.3 Flow for Avnet VITIS Platforms”の MicroSD カードでできそうなので、そのまま使用する。

Ultra96V2 を起動して、git clone した。
git clone https://github.com/AlbertaBeef/vitis_ai_cpp_examples
Vitis-AI_44_210705.png

git clone https://github.com/AlbertaBeef/vitis_ai_python_examples
Vitis-AI_45_210705.png

環境構築を行った。
initset.sh を起動した。(””Vitis-AI 1.3 Flow for Avnet VITIS Platforms”をやってみる1”を参照)
Vitis-AI_46_210705.png

~/Vitis-AI/demo/Vitis-AI-Library/samples/facedetect ディレクトリの facedetect を行う。
cd ~/Vitis-AI/demo/Vitis-AI-Library/samples/facedetect

test_video_facedetect を実行するが、test_video_facedetect.cpp はとってもシンプルで、行数は少ない。
Head-Pose Estimation on Ultra96-V2”にブロック図が載っているが、FaceDetect クラスを Create して Run しているようだ。
test_video_facedetect を実行してみよう。
./test_video_facedetect densebox_640_360 0
Vitis-AI_48_210705.png

ssh で入った端末で実行すると、 CH-0 ウインドウが開いてカメラ画像を表示し、顔の位置に青い四角が表示された。
Vitis-AI_47_210705.jpg

FPS は約 30 fps になっているが、結構更新が早い。
なお、カメラは Ultra96V2 の USB ポートに Logicool の Web カメラ C920n を接続して使用している。

次に、 ~/vitis_ai_cpp_examples/facedetectwithheadpose/ ディレクトリに移動して、 test_video_facedetectwithheadpose.cpp をビルドしよう。
なお、 build.sh は実行権限が入っていなかったので、実行権限を入れた。
やはり、”Head-Pose Estimation on Ultra96-V2”にブロック図が載っている。
test_video_facedetect は FaceDetect クラスだけだったが、 facedetectwithheadpose では FaceDetect クラスに加えて、 FaceDetectWithHeadPose クラスも Create しているようだ。
cd ~/vitis_ai_cpp_examples/facedetectwithheadpose/
chmod +x build.sh
./build.sh

test_video_facedetectwithheadpose が生成された。
Vitis-AI_49_210705.png

test_video_facedetectwithheadpose を実行した。
./test_video_facedetectwithheadpose 0
Vitis-AI_50_210705.jpg

顔見えちゃているけど仕方ないか。。。
顔の目と鼻、口の両端、顎に特徴点が表示されて、青い棒で顔の向きが表示されているようだ。フレームレートも約 30 fps でている。

顔の向きを変えても追従する。
Vitis-AI_51_210705.jpg

面白い。。。
これで顔が何処向いているかの判定ができるかも知れないな。。。

次に python のサンプルを動かしてみよう。
cd ~/vitis_ai_python_examples/face_applications
python3 face_headpose.py

Vitis-AI_52_210705.png

imutils が無いと言われてしまったので、インストールしてみる。
pip install imultils
成功した。
Vitis-AI_53_210705.png

もう一度、 python3 face_headpose.py を実行したが、やはり、imutils が無いと言われてしまう。
Vitis-AI_54_210705.png
  1. 2021年07月06日 04:01 |
  2. Vitis-AI
  3. | トラックバック:0
  4. | コメント:0
»