FC2カウンター FPGAの部屋 2022年12月11日
fc2ブログ

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

FPGAの部屋

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

自作の白線間走行用 CNN を Vitis-AI の Custom OP Flow で実行する5

自作の白線間走行用 CNN を Vitis-AI の Custom OP Flow で実行する4”の続き。

自作の白線間走行用 CNN を Vitis-AI の Custom OP WorkFlow で実行する1”のソースコードだが、”白線間走行用CNNをKerasで学習する”を見ると、配列の次元の位置を変えるには transpose じゃなくて reshape のようだったので、ソースコードを変更した。

変更した train_eval_line.py を貼っておく。

# Copyright 2019 Xilinx Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# train_eval_line.py
# 2022/12/05 : modified by marsee
# 2022/12/08 : modified by marsee

import os, sys
import numpy as np
import tensorflow as tf
import argparse

print(tf.__version__)

os.environ["CUDA_VISIBLE_DEVICES"] = "0"

from curve_dataset import load_mnist
from tensorflow.keras import utils as np_utils

parser = argparse.ArgumentParser(description='tensorflow 2 custom op example.')
parser.add_argument('--eval_only', type=bool, default=False, help='if only evaluate model')
parser.add_argument('--quant', type=bool, default=False, help='if evluate quantized model')

args = parser.parse_args()


class Mylayer(tf.keras.layers.Layer):
  def __init__(self, name="custom_layer", **kwargs):
    super().__init__(name=name, **kwargs)
    self.prelu = tf.keras.layers.PReLU()

  def call(self, inputs, training=None, mask=None):
    x = self.prelu(inputs)
    return x

custom_objects = {"Mylayer": Mylayer}

def build_model():
  inputs = tf.keras.Input((10, 56, 1))
  x = tf.keras.layers.Conv2D(2, (5, 5), activation='relu')(inputs)

  x = tf.keras.layers.MaxPooling2D((2, 2), (2, 2))(x)

  my_model = Mylayer()
  x = my_model(x)

  x = tf.keras.layers.Flatten()(x)
  x = tf.keras.layers.Dense(100, activation='relu')(x)
  x = tf.keras.layers.Dense(3, activation='softmax')(x)

  model = tf.keras.Model(inputs=inputs, outputs=x)
  return model

def main():
  #################################
  ###### build dataset
  #################################
  (x_train, y_train), (x_test, y_test) = load_mnist(normalize=False, flatten=False)
  trainzip = list(zip(y_train, x_train))
  np.random.shuffle(trainzip)
  y_train, x_train = zip(*trainzip)
  x_train = np.asarray(x_train)
  y_train = np.asarray(y_train)

  testzip = list(zip(y_test, x_test))
  np.random.shuffle(testzip)
  y_test, x_test = zip(*testzip)
  x_test = np.asarray(x_test)
  y_test = np.asarray(y_test)

  x_train = x_train.reshape(x_train.shape[0], 10, 56, 1)
  x_test = x_test.reshape(x_test.shape[0], 10, 56, 1)
  
  x_train = x_train.astype('float32')
  x_test = x_test.astype('float32')
  x_train /= 255
  x_test /= 255

  y_train = y_train.astype('int32')
  y_test = y_test.astype('int32')
  y_train = np_utils.to_categorical(y_train, 3)
  y_test =  np_utils.to_categorical(y_test, 3)

  #################################
  ##### evaluate model
  #################################
  if args.eval_only:
    if args.quant:
      from tensorflow_model_optimization.quantization.keras import vitis_quantize
      # quantized_model = tf.keras.models.load_model("./quantized/quantized.h5",
      #         custom_objects=custom_objects)
      with vitis_quantize.quantize_scope():
        quantized_model = tf.keras.models.load_model("./quantized/quantized_curve_line.h5",
                custom_objects=custom_objects)
        quantized_model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
        eval_results = quantized_model.evaluate(x_test, y_test)
        print("\n***************** Summary *****************")
        print("Quantized model accuracy: ", eval_results[1])
      return
    loaded_model = tf.keras.models.load_model("./keras_curve_cnn2_line.h5",
            custom_objects=custom_objects)
    eval_results = loaded_model.evaluate(x_test, y_test)
    print("\n***************** Summary *****************")
    print("Float model accuracy: ", eval_results[1])
    return
  #################################
  ##### build model
  #################################
  model = build_model()
  model.summary()
  #################################
  ##### compile train
  #################################
  model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])
  model.fit(x_train, y_train, epochs=7, shuffle=True)
  eval_results = model.evaluate(x_test, y_test)
  print("\n***************** Summary *****************")
  print("Trained float model accuracy: ", eval_results[1])
  save_path = "./keras_curve_cnn2_line.h5"
  print("Trained float model is saved in ", save_path)
  model.save(save_path)

if __name__ == '__main__':
  main()


quantize_curve_line.py を貼っておく。

# Copyright 2019 Xilinx Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# quantize_curve_line.py
# 2022/12/05 : modified by marsee

import os, sys
import numpy as np
import tensorflow as tf

from curve_dataset import load_mnist
from train_eval_line import custom_objects

print(tf.__version__)
os.environ["CUDA_VISIBLE_DEVICES"] = "0"


def main():
#################################
###### build dataset
#################################
(x_train, y_train), (x_test, y_test) = load_mnist(normalize=False, flatten=False)

testzip = list(zip(y_test, x_test))
np.random.shuffle(testzip)
y_test, x_test = zip(*testzip)
x_test = np.asarray(x_test)
y_test = np.asarray(y_test)
x_test = x_test.reshape(x_test.shape[0], 10, 56, 1)
x_test = x_test.astype('float32')
x_test /= 255

#################################
##### quantize model
#################################
loaded_model = tf.keras.models.load_model("./keras_curve_cnn2_line.h5",
custom_objects=custom_objects)
loaded_model.summary()
from tensorflow_model_optimization.quantization.keras import vitis_quantize
# do quantization
calib_dataset = x_test
quant_model = vitis_quantize.VitisQuantizer(loaded_model, custom_objects=custom_objects).quantize_model(
calib_dataset=calib_dataset,
add_shape_info=True)
# quant_model.summary()
q_save_path = os.path.join('./quantized', 'quantized_curve_line.h5')
quant_model.save(q_save_path)
print("\n***************** Summary *****************")
print("Quantized model is saved in ", q_save_path)

if __name__ == '__main__':
main()


Vitis-AI の Docker を起動して、学習を行った。
./docker_run.sh xilinx/vitis-ai-cpu:2.5
cd tf2_custom_op_demo
conda activate vitis-ai-tensorflow2
python tran_eval_line.py

Custom_OP_Workflow_50_221211.png

量子化を行った。
python quantize_curve_line.py
Custom_OP_Workflow_51_221211.png

コンパイルして、XMODEL を作成した。
vai_c_tensorflow2 -m ./quantized/quantized_curve_line.h5 -a ../kv260_myarch.json -o ./ -n tf2_curve_line
Custom_OP_Workflow_52_221211.png

XMODEL を FileZilla で KV260 の Petalinux 2022.1 にアップロードした。

まずは、kv260 の Petalinux 2022.1 の環境を設定した。
cd ~/kv260_median/dpu
sudo mkdir -p /run/media/mmcblk0p1/
sudo cp dpu.xclbin /run/media/mmcblk0p1/
sudo xmutil unloadapp
sudo xmutil loadapp dpuprj
cd ~/tensorflow2_example/deployment/cpp


今まで、JPG 画像で推論してきたが、元が BMP 画像での学習なので、BMP 画像で推論を行った。

最初は直進のパターンを推論した。
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_00.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_01.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_02.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_03.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_04.bmp

xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_00.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/straight_RED_rect0_00.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:27:18.511101  1328 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/straight_RED_rect0_00.bmp result:
    score[0]   =  0.957431    
    score[1]   =  0.0289119   
    score[2]   =  0.013657    
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_01.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/straight_RED_rect0_01.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:27:29.567533  1341 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/straight_RED_rect0_01.bmp result:
    score[0]   =  0.546549    
    score[1]   =  0.331499    
    score[2]   =  0.121952    
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_02.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/straight_RED_rect0_02.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:27:34.319573  1346 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/straight_RED_rect0_02.bmp result:
    score[0]   =  0.554841    
    score[1]   =  0.432111    
    score[2]   =  0.0130486   
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_03.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/straight_RED_rect0_03.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:27:38.321185  1347 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/straight_RED_rect0_03.bmp result:
    score[0]   =  0.261528    
    score[1]   =  0.710907    
    score[2]   =  0.0275649   
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/straight_RED_rect0_04.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/straight_RED_rect0_04.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:27:56.568765  1364 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/straight_RED_rect0_04.bmp result:
    score[0]   =  0.74834     
    score[1]   =  0.214403    
    score[2]   =  0.0372576   


5 回推論して、1 回しか合っていないということは。。。

左旋回のパターンを推論した。
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_00.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_01.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_02.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_03.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_04.bmp

xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_00.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/left_turn_RED_rect0_00.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:44:29.216714  2167 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/left_turn_RED_rect0_00.bmp result:
    score[0]   =  0.145139    
    score[1]   =  0.835218    
    score[2]   =  0.0196425   
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_01.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/left_turn_RED_rect0_01.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:44:43.451567  2181 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/left_turn_RED_rect0_01.bmp result:
    score[0]   =  0.542674    
    score[1]   =  0.422635    
    score[2]   =  0.034692    
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_02.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/left_turn_RED_rect0_02.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:44:52.339522  2190 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/left_turn_RED_rect0_02.bmp result:
    score[0]   =  0.960332    
    score[1]   =  0.0289995   
    score[2]   =  0.0106683   
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_03.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/left_turn_RED_rect0_03.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:44:56.608392  2195 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/left_turn_RED_rect0_03.bmp result:
    score[0]   =  0.999186    
    score[1]   =  0.000261046 
    score[2]   =  0.000552634 
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/left_turn_RED_rect0_04.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/left_turn_RED_rect0_04.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:45:00.314903  2196 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/left_turn_RED_rect0_04.bmp result:
    score[0]   =  0.89917     
    score[1]   =  0.00605856  
    score[2]   =  0.0947718   


左旋回は 5 回推論して 4 回当たっている。

右旋回のパターンを推論した。
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_00.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_01.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_02.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_03.bmp
./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_04.bmp

xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_00.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/right_turn_RED_rect0_00.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:48:50.522089  2382 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/right_turn_RED_rect0_00.bmp result:
    score[0]   =  0.00135824  
    score[1]   =  0.09522     
    score[2]   =  0.903422    
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_01.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/right_turn_RED_rect0_01.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:48:56.709283  2391 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/right_turn_RED_rect0_01.bmp result:
    score[0]   =  5.81789e-05 
    score[1]   =  0.222687    
    score[2]   =  0.777255    
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_02.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/right_turn_RED_rect0_02.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:49:01.729414  2396 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/right_turn_RED_rect0_02.bmp result:
    score[0]   =  0.00404301  
    score[1]   =  0.00666579  
    score[2]   =  0.989291    
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_03.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/right_turn_RED_rect0_03.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:49:16.835510  2409 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/right_turn_RED_rect0_03.bmp result:
    score[0]   =  0.0105812   
    score[1]   =  0.0369319   
    score[2]   =  0.952487    
xilinx-k26-starterkit-20221:~/tensorflow2_example/deployment/cpp$ ./tf2_custom_op_graph_runner ~/tensorflow2_example/tf2_curve_line.xmodel ~/tensorflow2_example/right_turn_RED_rect0_04.bmp
model_file: /home/petalinux/tensorflow2_example/tf2_curve_line.xmodel
image_path: /home/petalinux/tensorflow2_example/right_turn_RED_rect0_04.bmp
WARNING: Logging before InitGoogleLogging() is written to STDERR
W1210 16:49:21.233657  2410 tool_function.cpp:171] [UNILOG][WARNING] The operator named custom_layer, type: Mylayer, is not defined in XIR. XIR creates the definition of this operator automatically. You should specify the shape and the data_type of the output tensor of this operation by set_attr("shape", std::vector<int>) and set_attr("data_type", std::string)
image file /home/petalinux/tensorflow2_example/right_turn_RED_rect0_04.bmp result:
    score[0]   =  0.124399    
    score[1]   =  0.159732    
    score[2]   =  0.715869    


右旋回は推論 5 回中 5 回とも当たりだ。

現在の推論結果は 15 回推論して、10 回当たりなので、10 / 15 = 0.76 で 76 % の正答率だった。
大体これで行けているのかも知れない?

(追記)
Vitis-AI/examples/Custom_OP_Demo/tensorflow2_example/deployment/cpp の tf2_custom_op_graph_runner.cpp は bmp ファイルを読めるようになっていないので、修正した。
22 行目の

std::vector supported_ext = {".jpg", ".png"};

std::vector supported_ext = {".jpg", ".png", ".bmp"};

に変更して、
bash build.sh
コマンドでコンパイルして、

tf2_custom_op_graph_runner

を再度生成した。
  1. 2022年12月11日 09:55 |
  2. Vitis-AI
  3. | トラックバック:0
  4. | コメント:0