FC2カウンター FPGAの部屋 カーブ、直線用白線間走行用畳み込みニューラルネットワーク11(画像データをCのヘッダファイルに変換)
FC2ブログ

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

FPGAの部屋

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

カーブ、直線用白線間走行用畳み込みニューラルネットワーク11(画像データをCのヘッダファイルに変換)

カーブ、直線用白線間走行用畳み込みニューラルネットワーク10(重みとバイアスをC のヘッダファイルに変換)”の続き。

前回は、学習した重みとバイアスを C のヘッダファイルに変換した。その配列は、float と固定小数点数の2つの配列がある。今回は、画像データの一部をCのヘッダファイルに変換する。

直進の白線間走行の場合は、”白線追従走行用畳み込みニューラルネットワークの製作16(白線追従走行用の画像データをCの配列に出力)”で画像データの一部をCのヘッダファイルに変換するPython コードを公開してあるが、それはあくまで、直進、左旋回、右旋回の画像数が同じ数という前提がある。今回は、直進の画像数が多いため、修正を行った。その、image_data2c_wt.py を下に示す。

# 白線追従走行用のテスト用画像データをCの配列に出力し、ファイルに書き込み
# image_data2c_wt.py
# 2017/12/20 :直進と左旋回、右旋回の画像数が違う場合の対応を追加した。 by marsee

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

import numpy as np
from dataset_curve.curve_dataset import load_mnist
import datetime

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

STRAIGHT_DATA_NUM = 15750 # 直進の総画像数
L_R_TURN_DATA_NUM = 5400 # 左旋回、右旋回の総画像数

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("curve_data.h", 'w')
todaytime = datetime.datetime.today()
f.write('// curve_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+STRAIGHT_DATA_NUM, OUTPUT_DATA_NUM, x_test, 0) # 左旋回
normal_image(OFFSET+STRAIGHT_DATA_NUM+L_R_TURN_DATA_NUM, 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+STRAIGHT_DATA_NUM, OUTPUT_DATA_NUM, x_test, 0) # 左旋回
no_normal_image(OFFSET+STRAIGHT_DATA_NUM+L_R_TURN_DATA_NUM, 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+STRAIGHT_DATA_NUM, OUTPUT_DATA_NUM, t_test, 0) # 左旋回
normal_label(OFFSET+STRAIGHT_DATA_NUM+L_R_TURN_DATA_NUM, OUTPUT_DATA_NUM, t_test, 1) # 右旋回
f.write("};\n")
f.close() 


image_data2c_wt.py で出力した curve_data.h の一部を示す。
curve_tracing_cnn_49_171220.png

0 番目から 100 番目の直進、左旋回、右旋回の画像データ curve_data_0_100.h と 2500 番目から 2600 番目の直進、左旋回、右旋回の画像データ curve_data_2500_2600.h と 5000 番目から 5100 番目の直進、左旋回、右旋回の画像データ curve_data_5000_5100.h を作成した。
curve_tracing_cnn_50_171220.png

なぜ、このように後ろの方の画像データを作ったかというと、最初は、以前の直進の白線走行用の画像データが入っているので、カーブの学習データも織り交ぜるために、このように後ろからも学習データをC のヘッダファイルに変換している。

これで、カーブ、直進用白線走行用畳み込みニューラルネットワークをVivado HLS で実装する準備が整った。
  1. 2017年12月20日 04:08 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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