FC2カウンター FPGAの部屋 白線追従走行用畳み込みニューラルネットワークの製作16(白線追従走行用の画像データをCの配列に出力)

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

FPGAの部屋

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

白線追従走行用畳み込みニューラルネットワークの製作16(白線追従走行用の画像データをCの配列に出力)

白線追従走行用畳み込みニューラルネットワークの製作15(重みとバイアスのCヘッダファイル)”の続き。

前回は、重みとバイアスをC のヘッダファイルに変換したものを貼った。今回は、Pythonで白線追従走行用の画像データをC のヘッダファイルに変換する。これは、Vivado HLS のテストベンチに組み込まれて、シミュレーション時に使用する予定だ。

Pythonで白線追従走行用の画像データをC のヘッダファイルに変換する image_data2c_wt.py を作成して実行した。
wlt_cnn_79_170828.png
wlt_cnn_80_170828.png

image_data2c_wt.py を実行することで作成される straight_data.h について、一部を示す。
wlt_cnn_82_170828.png
wlt_cnn_83_170828.png
wlt_cnn_84_170828.png

これで、Vivado HLS のプロジェクトを作成することができる。
image_data2c_wt.py を貼っておく。
(2017/08/28:バグフィックス)

# 白線追従走行用の画像データをCの配列に出力し、ファイルに書き込み
# image_data2c_wt.py

# coding: utf-8
import sys, os
sys.path.append(os.pardir)

import numpy as np
from dataset_straight.straight_dataset import load_mnist
import datetime

OUTPUT_DATA_NUM = 50 # 出力する白線追従走行のテストデータ数 直進、左旋回、右旋回で x 3
OFFSET = 0 # 白線追従走行用データセットのオフセット、100だったら100番目からOUTPUT_DATA_NUM個を出力する

def normal_image(offset, output_data_num, x_test, end):
    for i in range(offset, offset+output_data_num):
        f.write("\t{")
        for j in range(x_test.shape[1]):
            f.write(str(x_test[i][j]))
            if (j==x_test.shape[1]-1):
                if (i==offset+output_data_num-1 and end==1):
                    f.write("}\n")
                else:
                    f.write("},\n")
            else:
                f.write(", ")

def no_normal_image(offset, output_data_num, x_test, end):
    for i in range(offset, offset+output_data_num):
        f.write("\t{")
        for j in range(x_test.shape[1]):
            f.write(str(int(x_test[i][j]*256)))
            if (j==x_test.shape[1]-1):
                if (i==offset+output_data_num-1 and end==1):
                    f.write("}\n")
                else:
                    f.write("},\n")
            else:
                f.write(", ")

def normal_label(offset, output_data_num, t_test, end):
    for i in range(offset, offset+output_data_num):
        f.write("\t{")
        for j in range(t_test.shape[1]):
            f.write(str(t_test[i][j]))
            if (j==t_test.shape[1]-1):
                if (i==offset+output_data_num-1 and end==1):
                    f.write("}\n")
                else:
                    f.write("},\n")
            else:
                f.write(", ")

# データの読み込み
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True)

all_x_test = x_test.shape[0];
all_go_direction = int(all_x_test/3);
print(all_x_test)
print(all_go_direction)

f = open("straight_data.h", 'w')
todaytime = datetime.datetime.today()
f.write('// mnist_data.h\n')
strdtime = todaytime.strftime("%Y/%m/%d %H:%M:%S")
f.write('// {0} by marsee\n'.format(strdtime))
f.write("\n")

f.write('ap_ufixed<8, 0, AP_TRN_ZERO, AP_SAT> t_train['+str(OUTPUT_DATA_NUM*3)+']['+str(x_test.shape[1])+'] = {\n')
normal_image(OFFSET, OUTPUT_DATA_NUM, x_test, 0) # 直進
normal_image(OFFSET+all_go_direction, OUTPUT_DATA_NUM, x_test, 0) # 左旋回
normal_image(OFFSET+all_go_direction*2, OUTPUT_DATA_NUM, x_test, 1) # 右旋回
f.write("};\n")

f.write('int t_train_256['+str(OUTPUT_DATA_NUM*3)+']['+str(x_test.shape[1])+'] = {\n')
no_normal_image(OFFSET, OUTPUT_DATA_NUM, x_test, 0) # 直進
no_normal_image(OFFSET+all_go_direction, OUTPUT_DATA_NUM, x_test, 0) # 左旋回
no_normal_image(OFFSET+all_go_direction*2, OUTPUT_DATA_NUM, x_test, 1) # 右旋回
f.write("};\n")

f.write("\n")
f.write('float t_test['+str(OUTPUT_DATA_NUM*3)+']['+str(t_test.shape[1])+'] = {\n')
normal_label(OFFSET, OUTPUT_DATA_NUM, t_test, 0) # 直進
normal_label(OFFSET+all_go_direction, OUTPUT_DATA_NUM, t_test, 0) # 左旋回
normal_label(OFFSET+all_go_direction*2, OUTPUT_DATA_NUM, t_test, 1) # 右旋回
f.write("};\n")
f.close() 

  1. 2017年08月28日 04:28 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3897-4cb1c6cf
この記事にトラックバックする(FC2ブログユーザー)