FC2カウンター FPGAの部屋 2021年07月
fc2ブログ

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

FPGAの部屋

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

DFX をやってみよう15(Dynamic Function eXchange Wizard と I/O Planing 、 Pblock の指定)

DFX をやってみよう14(Blink1 と Blink05 を使用した DFX_test2 プロジェクトを作成し、DFXを設定)”の続き。

前回は、Vivado 2021.1 で DFX_test2 プロジェクトを作成し、Blink1, DMA_pow2 IP を使用して、DFX_test2 プロジェクトを作成した。 Blink1 をブロック・デザイン・コンテナにして、DFX を設定し Blink05 を リコンフィギャブル・モジュール(RM)として追加した。
今回は、Generate Output Products を実行して、Dynamic Function eXchange Wizard を実行してから、 Synthesized Design で I/O Planing 、 Pblock の指定を行う。

Flow Navigator から Generate Block Design をクリックする。
Generate Output Products ダイアログが表示された。
Generate ボタンをクリックする。
DFX_136_210729.png

Generate Output Products ダイアログが表示された。
OK ボタンをクリックした。
DFX_137_210729.png

Flow Navigator から Dynamic Function eXchange Wizard を選択する。
Dynamic Function eXchange Wizard ダイアログが表示された。
Next > ボタンをクリックする。
DFX_137_210729.png

Edit Reconfigurable Modules 画面が表示された。
デフォルトのまま Next > ボタンをクリックする。
DFX_138_210729.png

Edit Configuration 画面が表示された。
automatically create configuration をクリックする。
config1 の Blink1_inst_0 と config2 の Blink05_inst_0 が表示された。
Next > ボタンをクリックする。
DFX_139_210729.png

Edit Configuration Runs 画面が表示された。
automatically create configuration をクリックする。
config1 が impl_1 で、 config2 が child_0_impl_1 に割り当てられている。
Next > ボタンをクリックする。
DFX_140_210729.png

Dynamic Function eXchange Summary 画面が表示された。
Finish ボタンをクリックする。
DFX_141_210729.png

Flow Navigator の SYNTHESIS -> Run Synthesis をクリックする。

Launch Runs ダイアログが表示された。
OK ボタンをクリックする。

論理合成が成功した。
Synthesis Completed ダイアログが表示された。
Cancel ボタンをクリックした。

Flow Navigator の SYNTHESIS -> Open Synthesized Design をクリックして、 Synthesized Design を開いた。
Layout メニューから I/O Planing を選択して I/O を割り当てた。
DFX_142_210729.png

Netlist ウインドウの Blink1 を右クリックし、右クリックメニューから Floorplanning -> Draw Pblock を選択する。

Device タブをクリックして、 X1Y2 領域に適当に PBlock を指定した。(適当と言っても 7 シリーズの FPGA は X1Y2 の領域に Pblock の境界をピッタリ合わせないとダメなようだ)
DFX_143_210729.png

Pblock Properties 画面で、 RESET_AFTER_RECONFIG のチェックボックスにチェックを入れて、SNAPPING_MODE を ROUTING にする。
SNAPPING_MODE を ON や ROUTING にすると、丁度良い境界から Pblock を取ってくれる。
DFX_144_210729.png

セーブ・ボタンを押すと Out of Date Design ダイアログが表示された。
OK ボタンをクリックする。

Save Constraints ダイアログが表示された。
デフォルトのまま OK ボタンをクリックする。
File name は DFX_test2.xdc とした。

DFX_test2.xdc を示す。

set_property IOSTANDARD LVCMOS33 [get_ports clk125]
set_property IOSTANDARD LVCMOS33 [get_ports {LD0[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports BTN0]
set_property PACKAGE_PIN K17 [get_ports clk125]
set_property PACKAGE_PIN M14 [get_ports {LD0[0]}]
set_property PACKAGE_PIN K18 [get_ports BTN0]
create_pblock pblock_Blink1
add_cells_to_pblock [get_pblocks pblock_Blink1] [get_cells -quiet [list DFX_test2_i/Blink1]]
resize_pblock [get_pblocks pblock_Blink1] -add {SLICE_X88Y51:SLICE_X97Y99}
resize_pblock [get_pblocks pblock_Blink1] -add {DSP48_X3Y22:DSP48_X3Y39}
resize_pblock [get_pblocks pblock_Blink1] -add {RAMB18_X4Y22:RAMB18_X4Y39}
resize_pblock [get_pblocks pblock_Blink1] -add {RAMB36_X4Y11:RAMB36_X4Y19}
set_property RESET_AFTER_RECONFIG true [get_pblocks pblock_Blink1]
set_property SNAPPING_MODE ROUTING [get_pblocks pblock_Blink1]

  1. 2021年07月31日 04:07 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう14(Blink1 と Blink05 を使用した DFX_test2 プロジェクトを作成し、DFXを設定)

DFX をやってみよう13(Blink1 と Blink05)”の続き。

前回は、ソフトウェアを使用しないハードウェアだけをDFX するために Vitis HLS 2021.1 で Blink1 と Blink05 を作成した。今回は、Vivado 2021.1 で DFX_test2 プロジェクトを作成し、Blink1, DMA_pow2 IP を使用して、DFX_test2 プロジェクトを作成した。 Blink1 をブロック・デザイン・コンテナにして、DFX を設定し Blink05 を リコンフィギャブル・モジュール(RM)として追加した。

Vivado 2021.1 で ZYBO Z7-20 用の DFX_test2_211 プロジェクトを作成した。
DFX_122_210729.png

Blink1, Blink05, DMA_pow2 の各 IP のディレクトリを新規作成して、 IP の中身をコピーした。
DFX_123_210729.png

Blink1, Blink05, DMA_pow2 の各 IP を IP Catalog に登録した。
DFX_124_210729.png

DFX_test2 ブロック・デザインを作成した。
DFX_125_210729.png

Address Map を示す。
DFX_126_210729.png

Blink1_0 をを階層デザインに指定する。
Blink1_0 を右クリックし、右クリックメニューから Create Hierarchy... を選択する。

Create Hierarchy が表示された。
Cell name に Blink1 と入力して、OK ボタンをクリックする。

Blink1 階層ができた。
DFX_127_210729.png

Validate Design を行った。

階層デザインをブロック・デザイン・コンテナにする。
Blink1 階層デザインを右クリックし、右クリックメニューから Create Block Design Container... を選択する。

Create Block Design Container ダイアログが表示された。
New Block Design に Blink1 と入力して、OK ボタンをクリックする。

Blink1 階層デザインが Blink1.bd ブロック・デザイン・コンテナになった。
DFX_128_210729.png

DFX_test ブロック・デザインで Validate Design を行った。
Validate Design ダイアログが出て、成功した。

Blink1 ブロック・デザイン・コンテナをクリックして Customize Block Design Container ダイアログを表示させる。
Enable Dynamic Function eXchange on this container のチェックボックスにチェックを入れる。
DFX_129_210729.png

Blink1 ブロック・デザイン・コンテナの表記が DFX に変化している。
DFX_130_210729.png

Validate Design をクリックする。
Validate Design ダイアログが出て、成功した。

リコンフィギャラブル・モジュール(RM)として、Blink05 IP を設定する。

Blink1 ブロック・デザイン・コンテナを右クリックし、右クリックメニューから Create Reconfigurable Module... を選択する。
Create Reconfigurable Module ダイアログが表示された。
Reconfigurable Module に Blink05 を入力した。
DFX_131_210729.png

Blink1 と同じポートを持つ Diagram ウインドウが表示された。
+ ボタン(Add IP)をクリックして、Blink05 IP を Add IP した。
Run Connection Automation を使用しないで、自分でポートに配線した。
DFX_132_210729.png

Validate Design をクリックする。
Validate Design が成功した。

DFX_test ブロック・デザインをクリックして、ブロック・デザインを切り替える。
Blink1 ブロック・デザイン・コンテナをダブルクリックする。
Customize Block Design Container ダイアログが表示された。
Blink05.bd が増えている。
DFX_133_210729.png

Addressing タブはアドレスマップされていないので、何もない。
DFX_134_210729.png

DFX_test2 ブロック・デザインの HDL ラッパー・ファイルを作成する。
DFX_test2 ブロック・デザインを右クリックし右クリックメニューから Create HDL Wrapper... を選択する。

Create HDL Wrapper ダイアログが表示された。
Let Vivado manage wrapper and auto-update ラジオボタンをクリックする。
OK ボタンをクリックする。

DFX_test2_wrapper.v が作成された。
DFX_135_210729.png

全てのブロック・デザインをセーブした。
  1. 2021年07月30日 04:11 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう13(Blink1 と Blink05)

DFX をやってみよう12(DMA_square_root8 の実行)”の続き。

前回は、DMA_pow2 IP の代わりに DMA_square_root8 IP のフル・ビット・ファイルの動作を確認してから、パーシャル・ビット・ファイルをコンフィグレーションして動作を確認したが、パーシャル・ビット・ファイルをコンフィグレーションをしても動作しなかった。今回は、気を取り直して、ソフトウェアを使用しないハードウェアだけをDFX するために Blink1 と Blink05 を作成する。

Blink1 は 1 秒間隔の点滅を 100 回繰り返す回路で、 Blink05 は 0.5 秒間隔の点滅を 200 回繰り返す回路にする。どちらも Vitis HLS 2021.1 で作成する。どちらも動作周波数は ZYBO Z7-20 のクロックの CLK125 を使用するため 125 MHz とした。

Blink1 からソースコードを示す。

// Blink1.cpp
// 2021/07/28 by marsee
//

#include <ap_int.h>

#define PS_CLK_FREQ 125000000 // Hz
#define HALF_PS_CLK_FREQ (PS_CLK_FREQ/2) // Hz

int Blink1(volatile ap_uint<1> &out){
#pragma HLS INTERFACE mode=ap_ctrl_none port=return
#pragma HLS INTERFACE mode=ap_none port=out register
    for(int i=0; i<100; i++){
        for(int j=0; j<HALF_PS_CLK_FREQ; j++){
#pragma HLS PIPELINE II=1 rewind
            out = 1;
            ap_wait();
        }
        for(int j=0; j<HALF_PS_CLK_FREQ; j++){
#pragma HLS PIPELINE II=1 rewind
            out = 0;
            ap_wait();
        }
    }
    return(0);
}


Blink05 のソースコードを示す。

// Blink05.cpp
// 2021/07/28 by marsee
//

#include <ap_int.h>

#define PS_CLK_FREQ 125000000 // Hz
#define HALF_PS_CLK_FREQ (PS_CLK_FREQ/2) // Hz
#define QUARTER_PS_CLK_FREQ (PS_CLK_FREQ/4) // Hz

int Blink05(volatile ap_uint<1> &out){
#pragma HLS INTERFACE mode=ap_ctrl_none port=return
#pragma HLS INTERFACE mode=ap_none port=out register
    for(int i=0; i<200; i++){
        for(int j=0; j<QUARTER_PS_CLK_FREQ; j++){
#pragma HLS PIPELINE II=1 rewind
            out = 1;
            ap_wait();
        }
        for(int j=0; j<QUARTER_PS_CLK_FREQ; j++){
#pragma HLS PIPELINE II=1 rewind
            out = 0;
            ap_wait();
        }
    }
    return(0);
}


Blink1_211 プロジェクトを示す。
DFX_116_210729.png

Blink05_211 プロジェクトを示す。
DFX_118_210729.png

Blink1 の C コードの合成結果を示す。
1 秒ごとに点滅するはずだ。
DFX_117_210729.png

Blink05 の C コードの合成結果を示す。
0.5 秒ごとに点滅するはずだ。
DFX_119_210729.png

Blink1 と Blink05 両方共 Export RTL を行った。

Blink1 と Blink05 両方共インプリメンテーションを行った。結果を示す。
Blink1
DFX_120_210729.png

Blink05
DFX_121_210729.png
  1. 2021年07月29日 04:58 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう12(DMA_square_root8 の実行)

DFX をやってみよう11(ハードウェアのエクスポートとフル・ビット・ファイルの動作確認)”の続き。

前回は、ハードウェアをエクスポートして、Vitis 2021.1 を立ち上げて、フル・ビット・ファイルを ZYBO Z7-20 にコンフィギュレーションし、実機動作を確認できた。今回は、DMA_pow2 IP の代わりに DMA_square_root8 IP のフル・ビット・ファイルの動作を確認してから、パーシャル・ビット・ファイルをコンフィグレーションして動作を確認する。

DFX_test_wrapper プラットフォームを元に DMA_square_root8 アプリケーション・プロジェクトを作成した。
DFX_107_210725.png

Explorer ウインドウで DMA_square_root8_system -> DMA_square_root8 -> src に DMA_square_root8.c を作成した。同じディレクトリに DMA_square_root8 IP の xdma_square_root8_hw.h をインポートした。

DMA_square_root8.c を貼っておく。

// DMA_square_root8.c
// 2021/07/26 by marsee
//

#include "xil_io.h"
#include "xdma_square_root8_hw.h"

volatile int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
volatile int result[10];

void Xil_DCacheFlush(void);
void Xil_DCacheInvalidate(void);

#define XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR 0x40010000

int main(){
    int i;

    Xil_Out32((XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR+XDMA_SQUARE_ROOT8_CONTROL_ADDR_DATA_DATA), (u32)&data[0]);
    Xil_Out32((XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR+XDMA_SQUARE_ROOT8_CONTROL_ADDR_RESULT_DATA), (u32)&result[0]);

    Xil_DCacheFlush(); // Flush data[10] cache to memory

    Xil_Out32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR,(u32)1); // Start

    while(!(Xil_In32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR)&0x2)); // Wait ap_done

    Xil_DCacheInvalidate(); // Invalidate result[10]
    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }

    return 0;

}


Assistant ウインドウで DMA_square_root8_system -> DMA_square_root8 -> Debug を右クリックし右クリックメニューから Run -> Run Configuration... を選択する。
Single Application Debug をクリックして、 Debugger_DMA_square_root8 を作成した。
DFX_108_210725.png

Bitstream File に child_0_impl_1/DFX_test_wrapper.bit を指定して、 Run ボタンをクリックする。
DFX_109_210725.png

gtkterm の結果を示す。平方根が取れている。
DFX_110_210725.png

次に DMA_pow2_test.c を DFX 用に変更した。
DMA_pow2_test.c のコードを示す。

// DMA_pow2_test.c
// 2021/07/25 by marsee
//

#include <stdio.h>
#include "xdma_pow2.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xdma_square_root8_hw.h"

volatile int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
volatile int result[10];

void Xil_DCacheFlush(void);
void Xil_DCacheInvalidate(void);

#define XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR 0x40010000

int main(){
    XDma_pow2 XDMA_pow2_ap;
    XDma_pow2_Config *XDMA_pow2_apPtr;
    int i, inbyte_in;

    // Look Up the device configuration
    XDMA_pow2_apPtr = XDma_pow2_LookupConfig(0);
    if (!XDMA_pow2_apPtr){
        fprintf(stderr, "XDma_pow2 configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XDma_pow2_CfgInitialize(&XDMA_pow2_ap, XDMA_pow2_apPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XDma_pow2\n");
        return(-1);
    }

    XDma_pow2_Set_data(&XDMA_pow2_ap, (u32)&data[0]);
    XDma_pow2_Set_result(&XDMA_pow2_ap, (u32)&result[0]);

    Xil_DCacheFlush(); // Flush data[10] cache to memory

    XDma_pow2_Start(&XDMA_pow2_ap);

    while(!XDma_pow2_IsDone(&XDMA_pow2_ap)) ;

    Xil_DCacheInvalidate(); // Invalidate result[10]
    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }

    printf("Configure the partial bit file in Vivado and then press any key.");
    fflush(stdout);
    inbyte_in = inbyte();
    printf("\n"); fflush(stdout);

    Xil_Out32((XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR+XDMA_SQUARE_ROOT8_CONTROL_ADDR_DATA_DATA), (u32)&data[0]);
    Xil_Out32((XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR+XDMA_SQUARE_ROOT8_CONTROL_ADDR_RESULT_DATA), (u32)&result[0]);

    Xil_DCacheFlush(); // Flush data[10] cache to memory

    Xil_Out32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR,(u32)1); // Start

    while(!(Xil_In32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR)&0x2)); // Wait ap_done

    Xil_DCacheInvalidate(); // Invalidate result[10]
    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }

    return 0;

}


Run ボタンをクリックして、アプリケーション・ソフトウェアを起動した。
2乗を行って、”Configure the partial bit file in Vivado and then press any key.”で止まっている。
DFX_112_210725.png

Vivado で Flow Navigator の PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target をクリックして、出てきた Auto Connect をクリックする。
Hardware Manager が開く。 Program device をクリックする。
Prgram Device ダイアログが表示された。
Bitstream File に DFX_test_211/DFX_test_211.runs/child_0_impl_1/DFX_test_i_DMA_pow2_DMA_square_root8_inst_0_partial.bit を指定した。
Program ボタンをクリックする。
DFX_113_210725.png

gtkterm の”Configure the partial bit file in Vivado and then press any key.”で Enter キーをクリックすると、止まっている。
DFX_114_210725.png

どうやら、最初の Xil_Out32() で止まってしまうようだ。
DFX うまく行かない。

因みに、途中で、 DMA_square_root8 のパーシャル・ビット・ファイルをコンフィグレーションしないと動作する。
DFX_115_210725.png

どうしよう?
ソフトウェア無しで、テストできる IP を作ってテストしてみようか?
  1. 2021年07月27日 22:04 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう11(ハードウェアのエクスポートとフル・ビット・ファイルの動作確認)

DFX をやってみよう10(インプリメンテーションとビット・ファイル、パーシャル・ビット・ファイルの生成)”の続き。

前回は、インプリメンテーションを行って、ビット・ファイルとパーシャル・ビット・ファイルを生成することができた。今回は、ハードウェアをエクスポートして、Vitis 2021.1 を立ち上げて、フル・ビット・ファイルを ZYBO Z7-20 にコンフィギュレーションし、実機動作を確認する。

ハードウェアをエクスポートする。
File メニューから Export -> Export Hardware... を選択する。
DFX_82_210725.png

Export Hardware Platform ダイアログが表示された。
DFX_83_210725.png

Output 画面で Include bitstream ラジオボタンをチェックして、Next > ボタンをクリックする。
DFX_84_210725.png

Files 画面はデフォルトのまま、Next > ボタンをクリックする。
DFX_85_210725.png

Exporting Hardware Platform 画面では、 Finish ボタンをクリックする。
DFX_86_210725.png

DFX_test_211 ディレクトリに DFX_test_wrapper.xsa ファイルが生成された。
DFX_87_210725.png

DFX_test_wrapper.xsa ファイルをダブルクリックして開いた。
フル・ビット・ファイルのみで、パーシャル・ビット・ファイルが無い。
DFX_88_210725.png

drivers ディレクトリの中も DMA_pow2_v1_0 しか無いのか?
DMA_square_root8 は無かった。
DFX_89_210725.png

Vitis 2021.1 で DFX のコンフィギュレーションを行うのは無理なのだろうか?
とりあえず、フル・ビット・ファイルが動作するか?を確かめてみよう。

Vivado 2021.1 の Tools メニューから Launch Vitis IDE を選択する。
DFX_90_210725.png

Vitis IDE Launcher ダイアログが表示された。
Browse... ボタンをクリックする。
DFX_91_210725.png

Select Workspace Directory ダイアログが表示された。
新規ディレクトリ作成ボタンをクリックして、新規ディレクトリを作成する。
DFX_92_210725.png

DFX_test_211 ディレクトリの下に、 vitis_work ディレクトリを作成した。
Open ボタンをクリックする。
DFX_93_210725.png

Vitis IDE Launcher ダイアログに戻るので、 Launch ボタンをクリックする。
DFX_94_210725.png

Vitis 2021.1 が立ち上がった。
Create Application Project をクリックする。
DFX_95_210725.png

New Application Project ダイアログが表示された。
Create a new platform form hardware (XSA) タブをクリックする。
Hardware Specification の Browse... ボタンをクリックする。
DFX_96_210725.png

出てきたダイアログで DFX_test_wrapper.xsa を指定した。
New Application Project ダイアログに戻って、 DFX_test_wrapper.xsa が指定されている。
Next > ボタンをクリックする。
DFX_97_210725.png

Application Project Details 画面で、 Application project name に DMA_pow2_test を指定した。
Next > ボタンをクリックする。
DFX_98_210725.png

Domain 画面では、デフォルトのまま Next > ボタンをクリックする。
DFX_99_210725.png

Templates 画面では、 Empty Application (C) を選択する。
Next > ボタンをクリックする。
DFX_100_210725.png

DFX_test_wrapper プラットフォームと DMA_pow2_test プロジェクトが生成された。
DFX_101_210725.png

DMA_pow2_test_system -> DMA_pow2_test -> src を右クリックし右クリックメニューから New -> File を選択する。
DFX_102_210725.png

Create New File ダイアログが表示された。
File name に DMA_pow2_test.c と入力する。
Finish ボタンをクリックする。
DFX_103_210725.png

DMA_pow2_test.c を入力し、セーブして、トンカチボタンをクリックしてビルドしたら、成功した。
DFX_104_210725.png

DMA_pow2_test.c を示す。

// DMA_pow2_test.c
// 2021/07/25 by marsee
//

#include <stdio.h>
#include "xdma_pow2.h"
#include "xparameters.h"

volatile int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
volatile int result[10];

void Xil_DCacheFlush(void);
void Xil_DCacheInvalidate(void);

int main(){
    XDma_pow2 XDMA_pow2_ap;
    XDma_pow2_Config *XDMA_pow2_apPtr;
    int i;

    // Look Up the device configuration
    XDMA_pow2_apPtr = XDma_pow2_LookupConfig(0);
    if (!XDMA_pow2_apPtr){
        fprintf(stderr, "XDma_pow2 configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XDma_pow2_CfgInitialize(&XDMA_pow2_ap, XDMA_pow2_apPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XDma_pow2\n");
        return(-1);
    }

    XDma_pow2_Set_data(&XDMA_pow2_ap, (u32)&data[0]);
    XDma_pow2_Set_result(&XDMA_pow2_ap, (u32)&result[0]);

    Xil_DCacheFlush(); // Flush data[10] cache to memory

    XDma_pow2_Start(&XDMA_pow2_ap);

    while(!XDma_pow2_IsDone(&XDMA_pow2_ap)) ;

    Xil_DCacheInvalidate(); // Invalidate result[10]
    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }

    return 0;

}


ZYBO Z7-20 を用意して、USB ケーブルを接続し、電源を ON する。
gtk_term を立ち上げて Port に ttyUSB1 を指定し、ビットレートを 115200 bit/sec に指定する。
Vitis の Explorer で DMA_pow2_test_system を選択し、 Run ボタンをクリックする。
DFX_105_210725.png

ZYBO Z7-20 がコンフィギュレーションされて、 DMA_pow2_test.elf が実行された。
gtk_term の結果を示す。
DFX_106_210725.png

フル・ビット・ファイルは問題なくコンフィギュレーションされている。
  1. 2021年07月26日 04:25 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう10(インプリメンテーションとビット・ファイル、パーシャル・ビット・ファイルの生成)

DFX をやってみよう9(Pblock の設定)”の続き。

前回は、リコンフィギャラブル・パーティション(RP)を指定するために Pblock を設定した。今回は、インプリメンテーションを行って、ビット・ファイルとパーシャル・ビット・ファイルの生成を生成する。

Pblock を設定したので、もう一度、インプリメンテーションを行った。
Flow Navigator から IMPLEMENTATION -> Run implementation をクリックする。
DFX_69_210723.png

Launch Runs ダイアログが表示された。
OK ボタンをクリックする。
DFX_70_210723.png

Implementation Completed ダイアログが表示された。
Implemented Design を開く。
DFX_71_210723.png

Implemented Design が表示された。
Pblock が紫の四角で表示されている。
Netlist の DFX_test_i -> DMA_pow2 の下が DMA_pow2_0 ということに注目する。
DFX_72_210723.png

child_0_imp_1 をクリックして、 config_2 を表示した。
Netlist の DFX_test_i -> DMA_pow2 の下が DMA_square_root8_0 になっている。
DFX_73_210723.png

Pblock の部分を並べてみる。
左が DMA_pow2_0 で、右が DMA_square_root8_0 だ。
DFX_74_210723.pngDFX_75_210723.png

右のほうがリソース使用量が多そうだ。

Flow Navigator から Generate Bitstream をクリックして、ビット・ファイルを作成する。
DFX_76_210723.png

Launch Runs ダイアログが表示された。
OK ボタンをクリックする。
DFX_77_210723.png

Bitstream Generation Completed ダイアログが表示された。
Cancel ボタンをクリックする。
DFX_78_210723.png

imp_1 、 child_0_impl_1 共に wirte_bitstream Complete! になっていた。
DFX_79_210723.png

DFX_test_211/DFX_test_211.runs/impl_1 ディレクトリには、 DFX_test_i_DMA_pow2_DMA_pow2_inst_0_partial.bit と DFX_test_wrapper.bit が生成されていた。
DFX_80_210723.png

DFX_test_211/DFX_test_211.runs/child_0_impl_1 ディレクトリには、 DFX_test_i_DMA_pow2_DMA_square_root8_inst_0_partial.bit と DFX_test_wrapper.bit が生成されていた。
DFX_81_210723.png
  1. 2021年07月25日 04:20 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう9(Pblock の設定)

DFX をやってみよう8(Generate Output Products と Dynamic Function eXchange Wizard)”の続き。

前回は、Generate Output Products と Dynamic Function eXchange Wizard を実行した。今回は、リコンフィギャラブル・パーティション(RP)を指定するために Pblock を設定する。

論理合成していこう。
Flow Navigator の SYNTHESIS -> Run Synthesis をクリックする。
DFX_57_210723.png

Launch Runs ダイアログが表示された。
OK ボタンをクリックする。
DFX_58_210723.png

論理合成が成功した。
Synthesis Completed ダイアログが表示された。
Run Implementation のラジオボタンにチェックを入れたまま、OK ボタンをクリックする。
DFX_59_210723.png

Launch Runs ダイアログが表示された。
OK ボタンをクリックする。
DFX_60_210723.png

エラーになってしまった。
DFX_61_210723.png

エラー内容を見ると、やはり、PBLOCK をリコンフィギュレーション・セルに指定しないとダメなようだ。
DFX_62_210723.png

Flow Navigator の SYNTHESIS -> Open Synthesized Design をクリックする。
DFX_63_210723.png

Synthesized Design の Netlist を開いて DMA_pow2 リコンフィギャブル・モジュールを右クリックし、右クリックメニューから Floorplanning -> Draw Pblock を選択する。
DFX_64_210723.png

Device タブをクリックして、 X1Y2 領域に適当に PBlock を指定した。(適当と言っても 7 シリーズの FPGA は X1Y2 の領域に Pblock の境界をピッタリ合わせないとダメなようだ)
DFX_65_210723.png

Pblock Properties 画面で、 RESET_AFTER_RECONFIG のチェックボックスにチェックを入れて、SNAPPING_MODE を ROUTING にする。
SNAPPING_MODE を ON や ROUTING にすると、丁度良い境界から Pblock を取ってくれる。
DFX_66_210723.png

セーブ・ボタンを押すと Out of Date Design ダイアログが表示された。
OK ボタンをクリックする。
DFX_67_210723.png

Save Constraints ダイアログが表示された。
デフォルトのまま OK ボタンをクリックする。
DFX_68_210723.png

DFX_test.xdc を示す。

create_pblock pblock_DMA_pow2
add_cells_to_pblock [get_pblocks pblock_DMA_pow2] [get_cells -quiet [list DFX_test_i/DMA_pow2]]
resize_pblock [get_pblocks pblock_DMA_pow2] -add {SLICE_X88Y51:SLICE_X103Y99}
resize_pblock [get_pblocks pblock_DMA_pow2] -add {DSP48_X3Y22:DSP48_X4Y39}
resize_pblock [get_pblocks pblock_DMA_pow2] -add {RAMB18_X4Y22:RAMB18_X4Y39}
resize_pblock [get_pblocks pblock_DMA_pow2] -add {RAMB36_X4Y11:RAMB36_X4Y19}
set_property RESET_AFTER_RECONFIG true [get_pblocks pblock_DMA_pow2]
set_property SNAPPING_MODE ROUTING [get_pblocks pblock_DMA_pow2]

  1. 2021年07月24日 13:17 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう8(Generate Output Products と Dynamic Function eXchange Wizard)

DFX をやってみよう7(2 つ目の RM を設定)”の続き。

前回は、リコンフィギャラブル・モジュール(RM)として、DMA_square_root8 IP を設定した。今回は、Generate Output Products と Dynamic Function eXchange Wizard を実行しよう。

Flow Navigator から Generate Block Design をクリックする。
DFX_46_210723.png

Generate Output Products ダイアログが表示された。
Generate ボタンをクリックする。
DFX_47_210723.png

Generate Output Products ダイアログが表示された。
OK ボタンをクリックした。
DFX_48_210723.png

Flow Navigator から Dynamic Function eXchange Wizard を選択する。
DFX_49_210723.png

Dynamic Function eXchange Wizard ダイアログが表示された。
Next > ボタンをクリックする。
DFX_50_210723.png

Edit Reconfigurable Modules 画面が表示された。
デフォルトのまま Next > ボタンをクリックする。
DFX_51_210723.png

Edit Configuration 画面が表示された。
automatically create configuration をクリックする。
DFX_52_210723.png

config1 の DMA_pow2_inst_0 と config2 の DMA_square_root8_inst_0 が表示された。
Next > ボタンをクリックする。
DFX_53_210723.png

Edit Configuration Runs 画面が表示された。
automatically create configuration をクリックする。
DFX_54_210723.png

config1 が impl_1 で、 config2 が child_0_impl_1 に割り当てられている。
Next > ボタンをクリックする。
DFX_55_210723.png

Dynamic Function eXchange Summary 画面が表示された。
Finish ボタンをクリックする。
DFX_56_210723.png
  1. 2021年07月24日 04:58 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう7(2 つ目の RM を設定)

DFX をやってみよう6(ブロック・デザイン・コンテナと DFX イネーブル)”の続き。

前回は、DMA_pow2_0 にブロック・デザイン・コンテナを設定し、DFX をイネーブルした。今回は、リコンフィギャラブル・モジュール(RM)として、DMA_square_root8 IP を設定してみよう。

DMA_pow2 ブロック・デザイン・コンテナを右クリックし、右クリックメニューから Create Reconfigurable Module... を選択する。
DFX_32_210721.png

Create Reconfigurable Module ダイアログが表示された。
Reconfigurable Module に DMA_square_root8 を入力した。
DFX_33_210721.png

DMA_pow2 と同じポートを持つ Diagram ウインドウが表示された。
DFX_34_210721.png

+ ボタン(Add IP)をクリックして、DMA_square_root8 IP を Add IP した。
DFX_35_210721.png

今回は、 Run Connection Automation を使用しないで、自分でポートに配線した。
DFX_36_210721.png

Validate Design をクリックする。
Auto assign address ダイアログが表示された。
Yes ボタンをクリックした。
DFX_37_210721.png

Validate Design が成功した。
DFX_38_210721.png

Address Editor を開いてアドレスを修正する。
m_axi_gmem の Master Base Address を 0x0000_0000 に、Range を 1G に設定した。
s_axi_control の Master Base Address を 0x4001_0000 に、Range をそのままの 64K に変更した。
DFX_45_210723.png

ブロック・デザイン・コンテナをセーブする。(ただし、画像ではセーブし忘れている)

DFX_test ブロック・デザインをクリックして、ブロック・デザインを切り替える。その際に DFX_test ブロック・デザインもセーブしておく。
DFX_39_210721.png

DMA_pow2 ブロック・デザイン・コンテナをダブルクリックする。
Customize Block Design Container ダイアログが表示された。
DFX_40_210721.png

Addressing タブをクリックする。
Show Detailed View のチェックボックスをチェックした。
DFX_41_210723.png

DFX_test ブロック・デザインの HDL ラッパー・ファイルを作成する。
DFX_test ブロック・デザインを右クリックし右クリックメニューから Create HDL Wrapper... を選択する。
DFX_42_210721.png

Create HDL Wrapper ダイアログが表示された。
Let Vivado manage wrapper and auto-update ラジオボタンをクリックする。
OK ボタンをクリックする。
DFX_43_210721.png

DFX_test_wrapper.v が作成された。
DFX_44_210721.png
  1. 2021年07月23日 12:24 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう6(ブロック・デザイン・コンテナと DFX イネーブル)

DFX をやってみよう5(Vivado 2021.1 で DFX_test プロジェクトを作成)”の続き。

前回は、DFX で入れ替える 2 つの IP (DMA_pow2 IP、 DMA_square_root8 IP)ができたので、Vivado 2021.1 の DFX_test プロジェクトを作成してブロック・デザインを作成した。
今回は、DMA_pow2_0 にブロック・デザイン・コンテナを設定し、DFX をイネーブルしてみよう。

DMA_pow2_0 を階層デザインに指定する。
DMA_pow2_0 を右クリックし、右クリックメニューから Create Hierarchy... を選択する。
DFX_20_210720.png

Create Hierarchy が表示された。
Cell name に DMA_pow2 と入力して、OK ボタンをクリックする。
DFX_21_210720.png

DMA_pow2 階層ができた。
DFX_22_210720.png

Validate Design を行う。
いつもの DDR skew のクリティカル・ワーニングが出ている。
DFX_23_210720.png

階層デザインをブロック・デザイン・コンテナにする。
DMA_pow2 階層デザインを右クリックし、右クリックメニューから Create Block Design Container... を選択する。
DFX_24_210720.png

Create Block Design Container ダイアログが表示された。
New Block Design に DMA_pow2 と入力して、OK ボタンをクリックする。
DFX_25_210720.png

DMA_pow2 階層デザインが DMA_pow2.bd ブロック・デザイン・コンテナになった。
DFX_26_210720.png

Sources ウインドウを見ても、 DMA_pow2 は別のブロック・デザインになっている。
DFX_27_210720.png

DFX_test ブロック・デザインで Validate Design を行った。
Validate Design ダイアログが出て、成功した。
DFX_28_210720.png

ここではブロック・デザインを作る度に Validate Design をする必要があるようだ。

DMA pow2 ブロック・デザイン・コンテナをクリックして Customize Block Design Container ダイアログを表示させる。
Enable Dynamic Function eXchange on this container のチェックボックスにチェックを入れる。
DFX_29_210721.png

DMA pow2 ブロック・デザイン・コンテナの表記が DFX に変化している。
DFX_30_210721.png

Validate Design をクリックする。
Validate Design ダイアログが出て、成功した。
DFX_31_210721.png
  1. 2021年07月22日 03:12 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう5(Vivado 2021.1 で DFX_test プロジェクトを作成)

DFX をやってみよう4(DMA_square_root8 IP の作成2)”の続き。

DFX をやってみよう2(DMA_pow2 IP の作成)”と”DFX をやってみよう3(DMA_square_root8 IP の作成1)”、”DFX をやってみよう4(DMA_square_root8 IP の作成2)”で DFX で入れ替える 2 つの IP (DMA_pow2 IP、 DMA_square_root8 IP)ができたので、いよいよ Vivado 2021.1 でプロジェクトを作ってブロック・デザイン・コンテナによる DFX を試してみよう。なお、FPGA ボードは ZYBO Z7-20 を使用する。使用する OS は Ubuntu 18.04 LTS だ。

Vivado 2021.1 で ZYBO Z7-20 ボード用の DFX_test プロジェクトを作成した。
DFX_2_210720.png

DFX をやってみよう2(DMA_pow2 IP の作成)”で作成した DMA_pow2 IP は DMA_pow2_211/solution1/impl/export.zip に凍結されている。 DFX_test プロジェクトのディレクトリに DMA_pow2 ディレクトリを作成して、その中に export.zip の中身を解凍した。
DFX_3_210720.png

DFX をやってみよう3(DMA_square_root8 IP の作成1)”、”DFX をやってみよう4(DMA_square_root8 IP の作成2)”で作成した DMA_square_root8 IP は DMA_square_root8_211/solution1/impl/export.zip に凍結されている。
DFX_4_210720.png

DFX_test プロジェクトのディレクトリに DMA_square_root8 ディレクトリを作成して、その中に export.zip の中身を解凍した。
DFX_5_210720.png

Vivado 2021.1 の Flow Navigator から IP Catalog をクリックして開く。
IP Catalog ウインドウが開く。
DFX_6_210720.png

IP Catalog ウインドウ内で右クリックし、右クリックメニューから Add Repository... を選択する。
Repositories ダイアログが開く。
Repositories ダイアログで DMA_pow2 , DMA_square_root8 ディレクトリを選択して Select ボタンをクリックする。
DFX_7_210720.png

Add Repository ダイアログが表示された。2 つの IP が表示されている。
DFX_8_210720.png

IP Catalog に DMA_pow2 IP と DMA_square_root8 IP が登録された。これで IP をブロック・デザインで使用することができる。
DFX_9_210720.png

Vivado 2021.1 の Flow Navigator から IP INTEGRATOR -> Create Block Design をクリックして、ブロック・デザインを新規作成する。
Create Block Design ダイアログが表示された。
Design name に DFX_test と入力して OK ボタンをクリックした。
DFX_10_210720.png

DFX_test ブロック・デザインが新規作成された。
+ ボタンをクリックして、 ZYNQ7 Processing System を Add IP する。
Run Block Automation をクリックする。
DFX_11_210720.png

Run Block Automation ダイアログが表示された。
デフォルトのまま OK ボタンをクリックすると、ボードの設定が反映される。
DFX_12_210720.png

ボードの設定が反映された。
DFX_13_210720.png

ZYNQ7 Processing System をダブルクリックして、設定を行う。
Re-customize IP ダイアログが表示された。
Page Navigator から Clock Configuration をクリックする。
PL Fabric Clocks の FCLK_CLK0 の Actual Frequency を 100 (MHz) に設定した。
DFX_14_210720.png

Page Navigator から PS-PL Configuration をクリックした。
HP Slave AXI Interface -> S_AXI_HP0_interface の Select にチェックを入れて S_AXI_HP0 を生かした。
DFX_15_210720.png

+ ボタンをクリックして DMA_pow2 IP を Add IP する。
DFX_16_210720.png

DMA_pow2 IP が Add IP された。
Run Connection Automation をクリックする。
DFX_17_210720.png

All Automation にチェックを入れて、 OK ボタンをクリックする。
DFX_18_210720.png

必要な IP が追加されて IP 間が配線された。
DFX_19_210720.png
  1. 2021年07月21日 04:38 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう4(DMA_square_root8 IP の作成2)

DFX をやってみよう3(DMA_square_root8 IP の作成1)”の続き。

前回は、8 ビットの整数の平方根を計算する DMA_square_root8 を作成するということで、ソースコードとテストベンチ・コードを貼って、Vitis HLS 2021.1 で DMA_square_root8 プロジェクトを作成した。
今回は、その C シミュレーション、 C コードの合成、 C/RTL 協調シミュレーション、Export RTL、 インプリメンテーションを行っていこう。

C シミュレーションを行った。
DMA_square_root8_211_2_210719.png

C コードの合成を行った。結果を示す。
DMA_square_root8_211_3_210719.png
DMA_square_root8_211_4_210719.png

レイテンシは 35 クロックだった。
リソース使用量は BRAM が 4 個、 DSP が 0 個、 FF が 1001 個、LUT が 1584 個だった。
DMA_pow2 は BRAM 4 個、DSP 3 個、FF 968 個、LUT 1029 個だった。リソース使用量がほぼ同じと言える。

C/RTL 協調シミュレーションを行った。
レイテンシは 44 クロックだった。
DMA_square_root8_211_6_210719.png

C/RTL 協調シミュレーションの全体波形を示す。
DMA_square_root8_211_6_210719.png

波形を拡大した。
DMA_square_root8_211_7_210719.png

バースト転送しているのが分かる。

Export RTL を行った。

IMPLEMENTATION で Run Implementation を Place & Route 付きで行った。
結果を示す。
DMA_square_root8_211_8_210719.png
DMA_square_root8_211_9_210719.png
  1. 2021年07月20日 04:15 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう3(DMA_square_root8 IP の作成1)

DFX をやってみよう2(DMA_pow2 IP の作成)”の続き。

前回は、DMA_pow2 IP を Vitis HLS 2021.1 で作成した。今回は、8 ビットの整数の平方根を計算する DMA_square_root8 を作成してみよう。
元ネタは、”square root を Vivado HLS で実装する3”だ。

まずは、ソースコードを貼っておく。

// DMA_square_root8.cpp
// 2021/07/01 by marsee
//

#include <stdint.h>

int DMA_square_root8(volatile int32_t *data, volatile int32_t *result){
#pragma HLS INTERFACE mode=s_axilite port=return
#pragma HLS INTERFACE mode=m_axi depth=10 port=result offset=slave
#pragma HLS INTERFACE mode=m_axi depth=10 port=data offset=slave
    int32_t temp, data_temp;
    int32_t square;

    for(int j=0; j<10; j++){
#pragma HLS PIPELINE II=1
        temp = 0;
        data_temp = data[j];
        for(int i=7; i>=0; --i){
            temp += (1 << i);
            square = temp * temp;

            if(square > data_temp){
                temp -= (1 << i);
            }
        }
        result[j] = temp;
    }

    return(0);
}


テストベンチの DMA_square_root8_tb.cpp を貼っておく。

// DMA_square_root8_tb.cpp
// 2021/07/01 by marsee

#include <stdio.h>
#include <stdint.h>

int DMA_square_root8(volatile int32_t *data, volatile int32_t *result);

int main(){
    int data[10] = {8, 10, 12, 14, 16, 18, 20, 22, 24, 26};
    int result[10];

    DMA_square_root8(data, result);

    for(int i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d \n", i, data[i], i, result[i]);
    }
    return(0);
}


Vitis HLS 2021.1 で作成した DMA_square_root8 プロジェクトを作成した。
DMA_square_root8_211_1_210719.png
  1. 2021年07月19日 20:54 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう2(DMA_pow2 IP の作成)

DFX をやってみよう2(チュートリアル例の説明)”の続き。

DFX をやってみよう2(チュートリアル例の説明)”に書いたように、”Vitis HLS 2021.1 を使ってみる(DMA_pow2)”の IP の入出力ポートを少々変更する。

ソースコード DMA_pow2.cpp を示す。

// DMA_pow2.cpp
// 2021/07/18 by marsee
//

#include <stdint.h>

int DMA_pow2(volatile int32_t *data, volatile int32_t *result){
#pragma HLS INTERFACE s_axilite port=result
#pragma HLS INTERFACE s_axilite port=data
#pragma HLS INTERFACE m_axi depth=10 port=result offset=slave
#pragma HLS INTERFACE m_axi depth=10 port=data offset=slave
#pragma HLS INTERFACE mode=s_axilite port=return

    for (int i=0; i<10; i++){
        int temp = data[i];
        result[i] = temp * temp;
    }

    return(0);
}


テストベンチの DMA_pow2_tb.cpp を示す。

// DMA_pow2_tb.cpp
// 2021/07/ by marsee
//

#include <iostream>

int DMA_pow2(volatile int32_t *data, volatile int32_t *result);

int main(){
    int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int result[10];

    DMA_pow2(data, result);

    for(int i=0; i<10; i++){
        std::cout << "data[" << i << "]= " << data[i] <<
                ", result[" << i << "] = " <<
                result[i] << std::endl;
    }
}


Vitis_HLS 2021.1 の DMA_pow2 プロジェクトを示す。
DMA_pow2_211_1_210718.png

なお、Zynq なので、Solution メニューの Solution Settings... で表示された Soluiton Settings (solution1) ダイアログで、 config_interface -> m_axi_addr64 のチェックボックスのチェックを外して、アドレスを 32 ビットにした。

C シミュレーションを行った。
DMA_pow2_211_2_210718.png

C コードの合成を行った。結果を示す。
DMA_pow2_211_3_210718.png
DMA_pow2_211_4_210718.png

C/RTL 協調シミュレーションを行った。
レイテンシは 35 クロックだった。
DMA_pow2_211_5_210718.png

C/RTL 協調シミュレーションの波形を示す。
DMA_pow2_211_6_210718.png

拡大した。
きちんとバーストしているのが分かる。
DMA_pow2_211_7_210718.png

Export RTL を行った。
Run Implementation を Place & Route 付きで行った。
結果を示す。
大丈夫そうだ。
DMA_pow2_211_8_210718.png
DMA_pow2_211_9_210718.png
  1. 2021年07月18日 12:07 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう2(チュートリアル例の説明)

DFX をやってみよう1(DFX を調べる1)”の続き。

前回は、DFX を調べたのだが、ただ調べていても頭に入らないので、実例をやってみて、その都度マニュアルを調べてみることにしようと思う。
参考にするのは、以前の紹介した”Vivado Design Suite ユーザーガイド Dynamic Function eXchange UG909 (v2020.2) 2021 年 2 月 8 日”とチュートリアルの”Vivado Design Suite チュートリアル Dynamic Function eXchange UG947 (v2020.2) 2021 年 2 月 23 日

今回は、Vivado 2021.1 から解禁されたブロック・デザイン・コンテナを使用した DFX デザインをやってみたい。具体的には、”Vivado Design Suite User Guide Dynamic Function eXchange UG909 (v2021.1) June 30, 2021”の”Chapter 4 Vivado Project Flow”の 94 ページの”IP Integrator Using Block Design Containers”を参考にやっていきたい。
なお、Xilinx のビデオの”DFX のブロック デザイン コンテナー”もとっても参考になる。
だが、これらの 2 つのチュートリアルはどうやってパーシャル・ビットファイルをコンフィギュレーションするかが書いていない。今の所 Vivado からしかパーシャル・ビットファイルをコンフィギュレーションするのを見たことがないが、Vitis からもできるのだろうか?今の所謎だ。。。

Vivado 2021.1 から解禁されたブロック・デザイン・コンテナを使用した DFX デザイン例としては、 AXI4-Master インターフェースの DMA_pow2 IP の入力ポートと出力ポートの定義を少し変えて使おうと思う。(”Vitis HLS 2021.1 を使ってみる(DMA_pow2)”参照)
RM(Reconfigurable Module)として使用するのは、”square root を Vivado HLS で実装する3”の square_root8.cpp を DMA_pow2 IP と同様に、10 個の値を DMA して整数の平方根を求める用にコードを変更指定使用する。
  1. 2021年07月17日 18:11 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

DFX をやってみよう1(DFX を調べる1)

DFX(Dynamic Function eXchange)をやってみようと思う。初めに DFX とはどんなものか?を調べてみよう。

Vivado Design Suite ユーザーガイド Dynamic Function eXchange UG909 (v2020.2) 2021 年 2 月 8 日”を読みながら、まとめてみよう。

DFX は以前は、 Partial Reconfiguration と呼ばれていた技術で、FPGA が動作中に、一部の領域だけをリコンフィギュレーションできる技術だ。Vivado 2019.1 からはどの Vivado エディションでもライセンス無しで DFX を使用できるようになった。つまり WebPACK や Vivado ML 2021.1 でも DFX を使用することができる。

CNN(Convolutional Neural Network)の部分をリコンフィギュレーションできるようにすると、動作中に CNN 部分を切り替えることができるようになるはずだ。適切に切り替えれば小さなたくさんの CNN で大きな CNN と同等の作業ができるはずだと思う。
後は、規模の大きなフィルタを切り替えて使うということができるようになる。今まで複数のフィルタを実装していたアプリケーションなどで、 1 つのフィルタで済むということになれば、より小さな FPGA で代替えできるということになると思う。

手順としては、フルのビットファイルでコンフィギュレーションした後で、入れ替える部分だけのパーシャル・ビットファイルで指定領域だけをリコンフィギュレーションするわけだ。つまりフルのビットファイルと、いくつかのバーシャル・ビットファイルが必要になる。

Vivado Design Suite ユーザーガイド Dynamic Function eXchange UG909 (v2020.2) 2021 年 2 月 8 日”の 8 ページの”図 1: Dynamic Function eXchange の基本的な概念”と文章を引用する。
DFX_1_210716.png

この図に示すように、Reconfig Block A にインプリメントされたファンクションは、A1.bit、A2.bit、A3.bit、または A4.bit のいずれかのパーシャル BIT ファイルをダウンロードすることにより変更できます。FPGA デザインのロジックは、リコンフィギャラブル ロジックとスタティック ロジックの 2 種類に分類できます。FPGA ブロックの灰色の部分はスタティック ロジックを表し、Reconfig Block "A" と示された部分はリコンフィギャラブル ロジックを表します。スタティック ロジックは動作し続け、パーシャル BIT ファイルの読み込みの影響は受けません。リコンフィギャラブル ロジックは、パーシャル BIT ファイルの内容に置き換えられます。


リコンフィギャラブル パーティション (RP) にいくつかのリコンフィギャラブル モジュール (RM)がリコンフィギュレーションされていって機能が切り替わることできる。 RP, RM の略語はこれからいつも出てくる。

Vivado Design Suite ユーザーガイド Dynamic Function eXchange UG909 (v2020.2) 2021 年 2 月 8 日”の 10 ページの”設計に関する考察事項”の文章を引用する。

設計に関する考察事項
デザインの要件とガイドライン

• Dynamic Function eXchange には、Vivado 2013.3 以降を使用する必要があります。
• リコンフィギャラブル領域を定義するには、エレメント タイプごとにフロアプランが必要です。

• 標準のタイミング制約がサポートされ、必要に応じて追加のタイミング バジェット機能も使用できます。
• デザインを完成させるために便利な専用のデザイン ルール チェック (DRC) が用意されています。
• DFX デザインでは、パーシャル リコンフィギュレーションの開始だけでなく、FPGA 内またはシステム デザインの一部としてパーシャル BIT ファイルを配布することも考慮する必要があります。
• Vivado Design Suite では、Dynamic Function eXchange (DFX) Controller IP がサポートされます。このカスタマイズ可能な IP は、ザイリンクス デバイスでのパーシャル リコンフィギュレーションのコア タスクを管理します。
• RP には、そのパーティションにインプリメントされるさまざまなリコンフィギャラブル モジュール (RM) で使用されるすべてのピンを含める必要があります。RM でほかの RM とは異なる入力または出力が使用される場合、結果の RM の入力または出力がその RM 内で接続されなくなる可能性があります。この状況がある場合、ツールでRM 内の未使用の入力または出力すべてに対して LUT1 バッファーが挿入されます。出力 LUT1 は定数値に接続されます。この定数値は、未使用の出力ピンの HD.PARTPIN_TIEOFF プロパティにより制御できます。このプロパティの詳細は、ブラック ボックスを参照してください。
• ビットストリームの生成でブラック ボックスがサポートされます。ポートを定数値に固定する方法の詳細は、ブラック ボックスを参照してください。
• ユーザー リセット信号では、RM 内のロジックがレベルを認識するのかエッジを認識するのかを決定してください。リセット回路がレベルを認識する場合 (FIFO などの一部 IP の場合など)、リコンフィギュレーションが完了するまで RM リセットは適用しないでください。
• DFX デザインは、Zynq MPSoC デバイスのザイリンクス アイソレーション デザイン フロー (IDF) と互換性があります。このソリューションの詳細は、『UltraScale+ FPGA および Zynq UltraScale+ MPSoCs のアイソレーション デザイン フロー』 (XAPP1335) を参照してください。


Vivado の DFX フローを”Vivado Design Suite ユーザーガイド Dynamic Function eXchange UG909 (v2020.2) 2021 年 2 月 8 日”の 21 ページから引用する。

1. スタティック モジュールとリコンフィギャラブル モジュール (RM) を個別に合成します。詳細は、合成 を参照してください。
2. 物理制約 (Pblock) を作成してリコンフィギャラブル領域を定義します。詳細は、リコンフィギャラブル領域のフロアプランを作成 を参照してください。
3. 各リコンフィギャラブル パーティション (RP) に HD.RECONFIGURABLE プロパティを設定します。詳細は、モジュールをリコンフィギャラブルと定義 を参照してください。
4. 完全なデザイン (スタティック モジュールと、RP ごとに 1 つの RM) をコンテキストでインプリメントします。詳細は、インプリメンテーション を参照してください。
5. 完全に配線済みのデザインのデザイン チェックポイントを保存します。詳細は、インプリメンテーション を参照してください。
6. このデザインから RM を削除し、スタティック部分のみのデザイン チェックポイントを保存します。詳細は、インプリメンテーション を参照してください。
7. スタティック部分の配置と配線を固定します。詳細は、インプリメンテーション データの保持 を参照してください。
8. スタティック デザインに新しい RM を追加し、新しいコンフィギュレーションをインプリメントして、配線済みデザイン全体のチェックポイントを保存します。
9. すべての RM がインプリメントされるまで手順 8 を繰り返します。
10. すべてのコンフィギュレーションに 対して検証ユーティリティ (pr_verify) を実行します。詳細は、コンフィギュレーションの検証 を参照してください。
11. 各コンフィギュレーションのビットストリームを作成します。詳細は、ビットストリームの生成 を参照してください。

  1. 2021年07月16日 04:05 |
  2. Dynamic Function eXchange
  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

”Training The Dobble Challenge”をやってみる2

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

前回は、”Training The Dobble Challenge”に従って、 Dobble の CNN モデルをトレーニングして見ようということで、畳込み(アクティベーションは relu)+マックス・プーリングが 3 層とドロップアウト、全結合層、アクティベーション(relu)、全結合層、アクティベーション(softmax)の CNN を学習してテストした。今回は、”Training The Dobble Challenge”の残りをやってみよう。

自分の Web カメラで Dubble を認識してみよう。
pip3 install imutils
Dobble_20_210709.png

dobble_detect_live.py を編集する。

#input_video = 0 # laptop camera
input_video = 1 # USB webcam


Dobble_21_210709.png

python dobble_detect_live.py
を実行したが、カメラ画像は表示される気配はするが、すぐに閉じてしまった。
Dobble_22_210709.png

データの増強をしよう。
今までのデータは、 dobble_deck01_cards_57 〜 dobble_deck10_cards_55 のデータ・ディレクトリの中に、 57 〜 55 個のディレクトリがあって、それぞれ 1 個ずつの画像が入っている。これを save_augmented_images.py で 100 倍に増やす。
画像の変換方法を”Training The Dobble Challenge”から引用する。

Rotation - has already been done on line 177
Horizontal and vertical flip - not good for our dataset (also, currently doing on line 179?)
featurewise_center
samplewise_center
featurewise_std_normalization
zca_epsilon
zca_whitening
shear_range
channel_shift_range


save_augmented_images.py は 1 つのデータ・ディレクトリを処理するので、書き換えながら画像を増やす。
Dobble_23_210709.png

dobble_deck07_cards_55 の内容を示す。
Dobble_24_210709.png

01 のディレクトリの中は、 1 個の画像だ。
Dobble_25_210709.png

python save_augmented_images.py を実行した。
Dobble_26_210709.png

dobble_deck07_cards_55-augmented ディレクトリが生成された。
01 ディレクトリを見ると、 100 個の画像が生成されている。
Dobble_27_210709.png

dobble_deck01_cards_57 〜 dobble_deck10_cards_55 のデータ・ディレクトリについて save_augmented_images.py を実行して、画像を増やした。
Dobble_28_210709.png

次に、 dobble_deck01_cards_57-augmented 〜 dobble_deck10_cards_55-augmented を使用するように、 dobble_tutorial.py を修正して、実行したが、 32 GB 搭載しているメモリを超えて使用してしまった。
Dobble_29_210709.png

そこで半分だけ augmented を使用するように dobble_tutorial.py を修正した。
Dobble_30_210709.png

これで、 dobble_tutorial.py を実行したところ、何とか学習できそうだ。
Dobble_31_210709.png

10 時間程度かかったが、学習が終了した。
精度は 91.666 % だった。
Dobble_32_210711.png

python dobble_test.py を実行した。
こちらのほうが精度が良い。 68.034 % 程度でているが、まだ物足りない。
Dobble_33_210711.png

やはり、全部 augmented 版を使用して学習できると良さそうだが、 64 GB メモリが必要だな。。。

dobble_tutorial.py を実行した時のログを貼っておく。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/AI/dobble_buddy$ python dobble_tutorial.py 

PARAMETERS:
Normalized shape of images : 224  x  224
Card Decks :  10 ['dobble_deck01_cards_57-augmented', 'dobble_deck02_cards_55', 'dobble_deck03_cards_55-augmented', 'dobble_deck04_cards_55', 'dobble_deck05_cards_55-augmented', 'dobble_deck06_cards_55', 'dobble_deck07_cards_55-augmented', 'dobble_deck08_cards_55', 'dobble_deck09_cards_55-augmented', 'dobble_deck10_cards_55']

TRAINING/VALIDATION DATA SETS:
Shape of training data (X) is : (22465, 224, 224, 3)
Shape of training data (y) is : (22465,)
Shape of validation data (X) is : (5617, 224, 224, 3)
Shape of validation data (y) is : (5617,)
2021-07-10 17:53:35.693689: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2021-07-10 17:53:36.012876: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 3199980000 Hz
2021-07-10 17:53:36.057387: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x559761433360 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2021-07-10 17:53:36.057436: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2021-07-10 17:53:36.281905: I tensorflow/core/common_runtime/process_util.cc:147] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.

MODEL SUMMARY:
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 222, 222, 32)      896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 111, 111, 32)      0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 109, 109, 64)      18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 54, 54, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 52, 52, 128)       73856     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 26, 26, 128)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 24, 24, 128)       147584    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 12, 12, 128)       0         
_________________________________________________________________
dropout (Dropout)            (None, 12, 12, 128)       0         
_________________________________________________________________
flatten (Flatten)            (None, 18432)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9437696   
_________________________________________________________________
activation (Activation)      (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 58)                29754     
_________________________________________________________________
activation_1 (Activation)    (None, 58)                0         
=================================================================
Total params: 9,708,282
Trainable params: 9,708,282
Non-trainable params: 0
_________________________________________________________________

TRAIN MODEL:
Epoch 1/59
702/702 [==============================] - 649s 925ms/step - loss: 3.3797 - val_loss: 2.4933
Epoch 2/59
702/702 [==============================] - 619s 881ms/step - loss: 1.8767 - val_loss: 1.2642
Epoch 3/59
702/702 [==============================] - 620s 883ms/step - loss: 0.9784 - val_loss: 0.6677
Epoch 4/59
702/702 [==============================] - 623s 888ms/step - loss: 0.5961 - val_loss: 0.4000
Epoch 5/59
702/702 [==============================] - 619s 882ms/step - loss: 0.5095 - val_loss: 0.5559
Epoch 6/59
702/702 [==============================] - 621s 884ms/step - loss: 0.4237 - val_loss: 0.2355
Epoch 7/59
702/702 [==============================] - 618s 880ms/step - loss: 0.2760 - val_loss: 0.2104
Epoch 8/59
702/702 [==============================] - 618s 880ms/step - loss: 0.2350 - val_loss: 0.1733
Epoch 9/59
702/702 [==============================] - 617s 879ms/step - loss: 0.2408 - val_loss: 0.1829
Epoch 10/59
702/702 [==============================] - 614s 875ms/step - loss: 0.2283 - val_loss: 0.3288
Epoch 11/59
702/702 [==============================] - 613s 874ms/step - loss: 0.2097 - val_loss: 0.1317
Epoch 12/59
702/702 [==============================] - 616s 877ms/step - loss: 0.1609 - val_loss: 0.1008
Epoch 13/59
702/702 [==============================] - 615s 876ms/step - loss: 0.1632 - val_loss: 0.1554
Epoch 14/59
702/702 [==============================] - 627s 894ms/step - loss: 0.1713 - val_loss: 0.0993
Epoch 15/59
702/702 [==============================] - 622s 886ms/step - loss: 0.1276 - val_loss: 0.2646
Epoch 16/59
702/702 [==============================] - 617s 878ms/step - loss: 0.1852 - val_loss: 0.1097
Epoch 17/59
702/702 [==============================] - 619s 882ms/step - loss: 0.1387 - val_loss: 0.1637
Epoch 18/59
702/702 [==============================] - 617s 878ms/step - loss: 0.1229 - val_loss: 0.1576
Epoch 19/59
702/702 [==============================] - 616s 877ms/step - loss: 0.1321 - val_loss: 0.1307
Epoch 20/59
702/702 [==============================] - 617s 879ms/step - loss: 0.1246 - val_loss: 0.0790
Epoch 21/59
702/702 [==============================] - 614s 875ms/step - loss: 0.1165 - val_loss: 0.0906
Epoch 22/59
702/702 [==============================] - 614s 875ms/step - loss: 0.1205 - val_loss: 0.1210
Epoch 23/59
702/702 [==============================] - 614s 875ms/step - loss: 0.1106 - val_loss: 0.0839
Epoch 24/59
702/702 [==============================] - 614s 875ms/step - loss: 0.0977 - val_loss: 0.0636
Epoch 25/59
702/702 [==============================] - 616s 877ms/step - loss: 0.1171 - val_loss: 0.1314
Epoch 26/59
702/702 [==============================] - 634s 903ms/step - loss: 0.1127 - val_loss: 0.0733
Epoch 27/59
702/702 [==============================] - 635s 904ms/step - loss: 0.1047 - val_loss: 0.0715
Epoch 28/59
702/702 [==============================] - 617s 880ms/step - loss: 0.1182 - val_loss: 0.0712
Epoch 29/59
702/702 [==============================] - 635s 904ms/step - loss: 0.0948 - val_loss: 0.0857
Epoch 30/59
702/702 [==============================] - 618s 881ms/step - loss: 0.1238 - val_loss: 0.0927
Epoch 31/59
702/702 [==============================] - 617s 878ms/step - loss: 0.0966 - val_loss: 0.0701
Epoch 32/59
702/702 [==============================] - 617s 879ms/step - loss: 0.0970 - val_loss: 0.0876
Epoch 33/59
702/702 [==============================] - 617s 880ms/step - loss: 0.1322 - val_loss: 0.0762
Epoch 34/59
702/702 [==============================] - 617s 878ms/step - loss: 0.0835 - val_loss: 0.0815
Epoch 35/59
702/702 [==============================] - 617s 879ms/step - loss: 0.1001 - val_loss: 0.0716
Epoch 36/59
702/702 [==============================] - 616s 878ms/step - loss: 0.1000 - val_loss: 0.0888
Epoch 37/59
702/702 [==============================] - 618s 880ms/step - loss: 0.1183 - val_loss: 0.0640
Epoch 38/59
702/702 [==============================] - 618s 880ms/step - loss: 0.1058 - val_loss: 0.0871
Epoch 39/59
702/702 [==============================] - 617s 878ms/step - loss: 0.1179 - val_loss: 0.0759
Epoch 40/59
702/702 [==============================] - 617s 879ms/step - loss: 0.1015 - val_loss: 0.1003
Epoch 41/59
702/702 [==============================] - 617s 879ms/step - loss: 0.1082 - val_loss: 0.0679
Epoch 42/59
702/702 [==============================] - 617s 880ms/step - loss: 0.0968 - val_loss: 0.0693
Epoch 43/59
702/702 [==============================] - 616s 878ms/step - loss: 0.1161 - val_loss: 0.1391
Epoch 44/59
702/702 [==============================] - 616s 877ms/step - loss: 0.0920 - val_loss: 0.0960
Epoch 45/59
702/702 [==============================] - 618s 880ms/step - loss: 0.0870 - val_loss: 0.1002
Epoch 46/59
702/702 [==============================] - 616s 878ms/step - loss: 0.1016 - val_loss: 0.1532
Epoch 47/59
702/702 [==============================] - 614s 874ms/step - loss: 0.0802 - val_loss: 0.0577
Epoch 48/59
702/702 [==============================] - 615s 876ms/step - loss: 0.0731 - val_loss: 0.0723
Epoch 49/59
702/702 [==============================] - 614s 875ms/step - loss: 0.0901 - val_loss: 0.0977
Epoch 50/59
702/702 [==============================] - 616s 877ms/step - loss: 0.0947 - val_loss: 0.1096
Epoch 51/59
702/702 [==============================] - 615s 876ms/step - loss: 0.0747 - val_loss: 0.0812
Epoch 52/59
702/702 [==============================] - 615s 876ms/step - loss: 0.0922 - val_loss: 0.1069
Epoch 53/59
702/702 [==============================] - 615s 876ms/step - loss: 0.1031 - val_loss: 0.0655
Epoch 54/59
702/702 [==============================] - 615s 877ms/step - loss: 0.0882 - val_loss: 0.0971
Epoch 55/59
702/702 [==============================] - 615s 876ms/step - loss: 0.1150 - val_loss: 0.0693
Epoch 56/59
702/702 [==============================] - 614s 875ms/step - loss: 0.0963 - val_loss: 0.0707
Epoch 57/59
702/702 [==============================] - 615s 877ms/step - loss: 0.0993 - val_loss: 0.0638
Epoch 58/59
702/702 [==============================] - 616s 877ms/step - loss: 0.1011 - val_loss: 0.0984
Epoch 59/59
702/702 [==============================] - 615s 876ms/step - loss: 0.1028 - val_loss: 0.1870
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 222, 222, 32)      896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 111, 111, 32)      0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 109, 109, 64)      18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 54, 54, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 52, 52, 128)       73856     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 26, 26, 128)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 24, 24, 128)       147584    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 12, 12, 128)       0         
_________________________________________________________________
dropout (Dropout)            (None, 12, 12, 128)       0         
_________________________________________________________________
flatten (Flatten)            (None, 18432)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9437696   
_________________________________________________________________
activation (Activation)      (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 58)                29754     
_________________________________________________________________
activation_1 (Activation)    (None, 58)                0         
=================================================================
Total params: 9,708,282
Trainable params: 9,708,282
Non-trainable params: 0
_________________________________________________________________
Shape of test data (X) is : (12, 224, 224, 3)
Shape of test data (y) is : (12, 58)

EVALUATE MODEL:
1/1 [==============================] - 0s 266us/step - loss: 23.8451
./dobble_dataset/dobble_test01_cards  : Test Accuracy =  0.9166666666666666


dobble_test.py の実行した時のログを貼っておく。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/AI/dobble_buddy$ python dobble_test.py
2021-07-11 05:01:50.044420: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2021-07-11 05:01:50.136887: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 3199980000 Hz
2021-07-11 05:01:50.137389: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x563dae8954c0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2021-07-11 05:01:50.137433: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2021-07-11 05:01:50.138320: I tensorflow/core/common_runtime/process_util.cc:147] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.
Shape of test data (X) is : (1267, 224, 224, 3)
Shape of test data (y) is : (1267, 58)

EVALUATE MODEL:
40/40 [==============================] - 9s 221ms/step - loss: 4.3736
./dobble_dataset/dobble_test02_cards  : Test Accuracy =  0.6803472770323599
 0.50% accuracy bound: 0.6716 - 0.6891
 0.80% accuracy bound: 0.6636 - 0.6971
 0.90% accuracy bound: 0.6589 - 0.7018
 0.95% accuracy bound: 0.6547 - 0.7060
 0.99% accuracy bound: 0.6465 - 0.7141

  1. 2021年07月11日 05:41 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

”Training The Dobble Challenge”をやってみる1

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

前回は、”The Dobble Challenge”を最後まで行ったが、Deck は 2 個表示されただけで、ソフトウェアがデッドロックしてしまった。
今回は、”Training The Dobble Challenge”に従って、 Dobble の CNN モデルをトレーニングしてみよう。

CNN の構成は、畳込み(アクティベーションは relu)+マックス・プーリングが 3 層とドロップアウト、全結合層、アクティベーション(relu)、全結合層、アクティベーション(softmax)となっている。

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 222, 222, 32)      896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 111, 111, 32)      0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 109, 109, 64)      18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 54, 54, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 52, 52, 128)       73856     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 26, 26, 128)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 24, 24, 128)       147584    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 12, 12, 128)       0         
_________________________________________________________________
dropout (Dropout)            (None, 12, 12, 128)       0         
_________________________________________________________________
flatten (Flatten)            (None, 18432)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9437696   
_________________________________________________________________
activation (Activation)      (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 58)                29754     
_________________________________________________________________
activation_1 (Activation)    (None, 58)                0         
=================================================================
Total params: 9,708,282
Trainable params: 9,708,282
Non-trainable params: 0
_________________________________________________________________


dobble_tutorial.py を起動して、モデルを学習する。
python dobble_tutorial.py
Dobble_12_210709.png
Dobble_13_210709.png

精度が 66.666 % と低い。
dobble_buddy ディレクトリに dobble_model_weights.h5 と dobble_model.h5 ができた。
Dobble_14_210709.png

精度をテストするのに、 dobble_test.py を実行する。
python dobble_test.py
Dobble_15_210709.png
Dobble_16_210709.png

テストの精度が 34.569 % だった。とっても低いね。”Training The Dobble Challenge”の値とはかけ離れている。
そこで、もう一度、 python dobble_tutorial.py を実行した。
Dobble_17_210709.png
Dobble_18_210709.png

今度の精度は 91.666 % になった。
python dobble_test.py をもう一度度実行する。
Dobble_19_210709.png

今度の精度は、46.172 % だった。まだ低いのはなぜだろうか?
この後、5 回ほど学習とテストをしてみたが、学習結果の精度は低い回と高い回に別れている。テストではいつも精度が低かった。
データセットのデータが足りないのかも知れない。

python dobble_tutorial.py の表示を貼っておく。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/AI/dobble_buddy$ python dobble_tutorial.py

PARAMETERS:
Normalized shape of images : 224  x  224
Card Decks :  10 ['dobble_deck01_cards_57', 'dobble_deck02_cards_55', 'dobble_deck03_cards_55', 'dobble_deck04_cards_55', 'dobble_deck05_cards_55', 'dobble_deck06_cards_55', 'dobble_deck07_cards_55', 'dobble_deck08_cards_55', 'dobble_deck09_cards_55', 'dobble_deck10_cards_55']

TRAINING/VALIDATION DATA SETS:
Shape of training data (X) is : (449, 224, 224, 3)
Shape of training data (y) is : (449,)
Shape of validation data (X) is : (113, 224, 224, 3)
Shape of validation data (y) is : (113,)
2021-07-09 04:58:02.724720: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2021-07-09 04:58:02.746653: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 3199980000 Hz
2021-07-09 04:58:02.746905: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x555b709c3a20 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2021-07-09 04:58:02.746924: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2021-07-09 04:58:02.746997: I tensorflow/core/common_runtime/process_util.cc:147] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.

MODEL SUMMARY:
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 222, 222, 32)      896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 111, 111, 32)      0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 109, 109, 64)      18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 54, 54, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 52, 52, 128)       73856     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 26, 26, 128)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 24, 24, 128)       147584    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 12, 12, 128)       0         
_________________________________________________________________
dropout (Dropout)            (None, 12, 12, 128)       0         
_________________________________________________________________
flatten (Flatten)            (None, 18432)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9437696   
_________________________________________________________________
activation (Activation)      (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 58)                29754     
_________________________________________________________________
activation_1 (Activation)    (None, 58)                0         
=================================================================
Total params: 9,708,282
Trainable params: 9,708,282
Non-trainable params: 0
_________________________________________________________________

TRAIN MODEL:
Epoch 1/59
14/14 [==============================] - 14s 975ms/step - loss: 4.1059 - val_loss: 4.0662
Epoch 2/59
14/14 [==============================] - 13s 959ms/step - loss: 4.0710 - val_loss: 4.1179
Epoch 3/59
14/14 [==============================] - 13s 936ms/step - loss: 4.0521 - val_loss: 4.1025
Epoch 4/59
14/14 [==============================] - 13s 939ms/step - loss: 4.0509 - val_loss: 4.1296
Epoch 5/59
14/14 [==============================] - 13s 948ms/step - loss: 4.0449 - val_loss: 4.0707
Epoch 6/59
14/14 [==============================] - 13s 950ms/step - loss: 4.0505 - val_loss: 4.1071
Epoch 7/59
14/14 [==============================] - 13s 958ms/step - loss: 4.0433 - val_loss: 4.1346
Epoch 8/59
14/14 [==============================] - 13s 954ms/step - loss: 4.0504 - val_loss: 4.0856
Epoch 9/59
14/14 [==============================] - 13s 964ms/step - loss: 4.0330 - val_loss: 4.1261
Epoch 10/59
14/14 [==============================] - 14s 983ms/step - loss: 3.9718 - val_loss: 3.9883
Epoch 11/59
14/14 [==============================] - 13s 933ms/step - loss: 3.7644 - val_loss: 4.0952
Epoch 12/59
14/14 [==============================] - 13s 933ms/step - loss: 3.6456 - val_loss: 3.6974
Epoch 13/59
14/14 [==============================] - 13s 951ms/step - loss: 3.3521 - val_loss: 3.5460
Epoch 14/59
14/14 [==============================] - 13s 962ms/step - loss: 3.2253 - val_loss: 3.2729
Epoch 15/59
14/14 [==============================] - 15s 1s/step - loss: 2.9422 - val_loss: 3.2000
Epoch 16/59
14/14 [==============================] - 13s 962ms/step - loss: 2.7437 - val_loss: 3.0561
Epoch 17/59
14/14 [==============================] - 13s 962ms/step - loss: 2.6164 - val_loss: 3.0905
Epoch 18/59
14/14 [==============================] - 13s 950ms/step - loss: 2.5613 - val_loss: 2.7422
Epoch 19/59
14/14 [==============================] - 13s 948ms/step - loss: 2.5242 - val_loss: 2.9230
Epoch 20/59
14/14 [==============================] - 13s 954ms/step - loss: 2.3480 - val_loss: 2.6601
Epoch 21/59
14/14 [==============================] - 14s 1s/step - loss: 2.1049 - val_loss: 2.5116
Epoch 22/59
14/14 [==============================] - 14s 967ms/step - loss: 1.9024 - val_loss: 2.4045
Epoch 23/59
14/14 [==============================] - 13s 944ms/step - loss: 1.7881 - val_loss: 2.3397
Epoch 24/59
14/14 [==============================] - 13s 935ms/step - loss: 1.6218 - val_loss: 2.3310
Epoch 25/59
14/14 [==============================] - 13s 960ms/step - loss: 1.4528 - val_loss: 1.9856
Epoch 26/59
14/14 [==============================] - 13s 950ms/step - loss: 1.4757 - val_loss: 1.9892
Epoch 27/59
14/14 [==============================] - 13s 947ms/step - loss: 1.2487 - val_loss: 1.8838
Epoch 28/59
14/14 [==============================] - 13s 945ms/step - loss: 1.0968 - val_loss: 1.8848
Epoch 29/59
14/14 [==============================] - 14s 999ms/step - loss: 1.3052 - val_loss: 1.8807
Epoch 30/59
14/14 [==============================] - 13s 942ms/step - loss: 1.1706 - val_loss: 1.8130
Epoch 31/59
14/14 [==============================] - 13s 947ms/step - loss: 0.9345 - val_loss: 1.4584
Epoch 32/59
14/14 [==============================] - 13s 934ms/step - loss: 1.0239 - val_loss: 1.6938
Epoch 33/59
14/14 [==============================] - 13s 942ms/step - loss: 0.8465 - val_loss: 1.0062
Epoch 34/59
14/14 [==============================] - 13s 947ms/step - loss: 0.7187 - val_loss: 1.5815
Epoch 35/59
14/14 [==============================] - 13s 946ms/step - loss: 0.6261 - val_loss: 1.3732
Epoch 36/59
14/14 [==============================] - 13s 944ms/step - loss: 0.5681 - val_loss: 1.6571
Epoch 37/59
14/14 [==============================] - 13s 961ms/step - loss: 0.8443 - val_loss: 0.8410
Epoch 38/59
14/14 [==============================] - 13s 945ms/step - loss: 0.5554 - val_loss: 1.3257
Epoch 39/59
14/14 [==============================] - 13s 933ms/step - loss: 0.5168 - val_loss: 1.3477
Epoch 40/59
14/14 [==============================] - 13s 938ms/step - loss: 0.4323 - val_loss: 1.2225
Epoch 41/59
14/14 [==============================] - 13s 917ms/step - loss: 0.4062 - val_loss: 1.7126
Epoch 42/59
14/14 [==============================] - 13s 931ms/step - loss: 0.4107 - val_loss: 0.6231
Epoch 43/59
14/14 [==============================] - 14s 1s/step - loss: 0.4382 - val_loss: 1.3422
Epoch 44/59
14/14 [==============================] - 13s 937ms/step - loss: 0.3241 - val_loss: 1.4085
Epoch 45/59
14/14 [==============================] - 13s 933ms/step - loss: 0.2740 - val_loss: 0.6285
Epoch 46/59
14/14 [==============================] - 13s 941ms/step - loss: 0.2144 - val_loss: 1.7058
Epoch 47/59
14/14 [==============================] - 14s 967ms/step - loss: 0.4136 - val_loss: 1.6700
Epoch 48/59
14/14 [==============================] - 13s 953ms/step - loss: 0.2629 - val_loss: 1.4909
Epoch 49/59
14/14 [==============================] - 14s 984ms/step - loss: 0.2949 - val_loss: 1.4362
Epoch 50/59
14/14 [==============================] - 14s 1s/step - loss: 0.1808 - val_loss: 1.5405
Epoch 51/59
14/14 [==============================] - 14s 1s/step - loss: 0.1484 - val_loss: 1.7669
Epoch 52/59
14/14 [==============================] - 14s 966ms/step - loss: 0.1679 - val_loss: 1.4220
Epoch 53/59
14/14 [==============================] - 13s 940ms/step - loss: 0.1705 - val_loss: 1.3934
Epoch 54/59
14/14 [==============================] - 14s 967ms/step - loss: 0.1828 - val_loss: 0.5581
Epoch 55/59
14/14 [==============================] - 14s 967ms/step - loss: 0.2769 - val_loss: 1.3616
Epoch 56/59
14/14 [==============================] - 14s 974ms/step - loss: 0.1672 - val_loss: 0.5885
Epoch 57/59
14/14 [==============================] - 14s 969ms/step - loss: 0.1644 - val_loss: 1.4092
Epoch 58/59
14/14 [==============================] - 13s 950ms/step - loss: 0.1321 - val_loss: 1.7724
Epoch 59/59
14/14 [==============================] - 13s 931ms/step - loss: 0.1618 - val_loss: 0.8644
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 222, 222, 32)      896       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 111, 111, 32)      0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 109, 109, 64)      18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 54, 54, 64)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 52, 52, 128)       73856     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 26, 26, 128)       0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 24, 24, 128)       147584    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 12, 12, 128)       0         
_________________________________________________________________
dropout (Dropout)            (None, 12, 12, 128)       0         
_________________________________________________________________
flatten (Flatten)            (None, 18432)             0         
_________________________________________________________________
dense (Dense)                (None, 512)               9437696   
_________________________________________________________________
activation (Activation)      (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 58)                29754     
_________________________________________________________________
activation_1 (Activation)    (None, 58)                0         
=================================================================
Total params: 9,708,282
Trainable params: 9,708,282
Non-trainable params: 0
_________________________________________________________________
Shape of test data (X) is : (12, 224, 224, 3)
Shape of test data (y) is : (12, 58)

EVALUATE MODEL:
1/1 [==============================] - 0s 259us/step - loss: 0.9788
./dobble_dataset/dobble_test01_cards  : Test Accuracy =  0.9166666666666666


python dobble_test.py の表示を貼っておく。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/AI/dobble_buddy$ python dobble_test.py
2021-07-09 05:12:45.148697: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2021-07-09 05:12:45.170665: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 3199980000 Hz
2021-07-09 05:12:45.170934: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55eaef3a9300 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2021-07-09 05:12:45.170993: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2021-07-09 05:12:45.171209: I tensorflow/core/common_runtime/process_util.cc:147] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.
Shape of test data (X) is : (1267, 224, 224, 3)
Shape of test data (y) is : (1267, 58)

EVALUATE MODEL:
40/40 [==============================] - 8s 209ms/step - loss: 6.6324
./dobble_dataset/dobble_test02_cards  : Test Accuracy =  0.4617205998421468
 0.50% accuracy bound: 0.4523 - 0.4711
 0.80% accuracy bound: 0.4438 - 0.4796
 0.90% accuracy bound: 0.4388 - 0.4847
 0.95% accuracy bound: 0.4343 - 0.4892
 0.99% accuracy bound: 0.4256 - 0.4979

  1. 2021年07月10日 04:50 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

”The Dobble Challenge”をやってみる2

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

The Dobble Challenge”をやってみようと思うということで、前回は、パッケージをインストールして、環境を整えた。
今回は、”The Dobble Challenge”を最後までやってみようと思う。

最初に、 dobble_buddy を git clone した。
git clone https://github.com/AlbertaBeef/dobble_buddy
cd dobble_buddy

Dobble_6_210708.png

Kaggle のアカウントは取ってあったので、dobble card images に行って dobble-card-image.zip をダウンロードした。
解凍して、dobble_buddy ディレクトリに展開した。
dobble_dataset ディレクトリが増えた。
Dobble_7_210708.png

環境変数を設定して、dobble_dataset_overview.py を実行した。
export KAGGLE_USERNAME="aidventure"
export KAGGLE_KEY="a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
python3 dobble_dataset_overview.py

Dobble_8_210708.png
Dobble_9_210708.png

Deck 01 の画面がでてきた。
なおブログに貼った画面は 43 % に縮小してある。
Dobble_10_210708.jpg

確かマウスをクリックしたからか? Deck 02 の画面がでてきた。
Dobble_11_210708.jpg

これから先に進めない。
python3 dobble_dataset_overview.py を実行したターミナルもCTRL-C キーを押しても復帰しないので、ターミナルごと落としてしまった。 orz
何でだろうか?
  1. 2021年07月09日 03:46 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

”The Dobble Challenge”をやってみる1

The Dobble Challenge”をやってみようと思う。

これは、3 個の記事がセットになっていて、最初の
The Dobble Challenge
で数学とデータセットを学んで、
Training The Dobble Challenge
で、Dobbleプレイング機械学習モデルを学習してテストし、
Deploying the Dobble Challenge on the Ultra96-V2
で”Training The Dobble Challenge”のモデルを Vitis-AI を使って、Ultra96V2 にデプロイしている。
正に、自分で作成した DNN を Vitis-AI を使用して、Ultra96V2 にデプロイするためのチュートリアルとして使用できるはずだ。
何処までうまくいくか分からないが、やってみたいと思う。

なお、 Dobble (ドブルと読むのだろうか?)ゲームについては、Wikipedia の”Dobble”を参照のこと。
その説明の Google 翻訳を引用する。

ゲームは55枚のカードのデッキを使用し、それぞれに8つの異なるシンボルが印刷されています。2枚のカードは常に1つだけの一致するシンボルを共有します。ゲームの目的は、与えられた2枚のカードに共通のシンボルを最初に発表することです。


まずは、”The Dobble Challenge”の”Tutorial”をやってみたいと思う。
The Dobble Challenge”では pip で

opencv-contrib-python
tensorflow
keras
kaggle


をインストールしていたが、私は主に conda を使用しているので、 conda でインストールしてみたい。というか、ほとんどインストールされているではないだろうか?
私の PC の OS は Ubuntu 18.04 LTS を使用している。

まずは、 conda update conda で conda 自身をアップデートした。
Dobble_1_210708.png

次に、 conda info でインストール済みのパッケージを見た。
Dobble_2_210708.png

tensorflow と keras はインストールされていた。

conda update --all で全てのパッケージをアップデートしたら、 python-3.8.10 にアップデートされた。
Dobble_3_210708.png

conda search opencv-contrib-python
conda search kaggle

をしたところ、 conda にはその 2 つが無い様なので、 pip3 でインストールする。
pip3 install opencv-contrib-python
pip3 install kaggle

Dobble_4_210708.png
Dobble_5_210708.png
  1. 2021年07月08日 04:51 |
  2. DNN
  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

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

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

前のブログ記事から間が空いてしまったが、”Vitis-AI 1.3 Flow for Avnet VITIS Platforms”を参照しながら、Vitis-AI 1.3 の続きをやってみよう。

なお、Vitis-AI 1.3 を動作させる前には、””Vitis-AI 1.3 Flow for Avnet VITIS Platforms”をやってみる1”で作成した initset.sh を起動している。

resnet50
cd ~/Vitis-AI/demo/VART/resnet50
./resnet50 /usr/share/vitis_ai_library/models/resnet50/resnet50.xmodel

Vitis-AI_31_210704.png

今度は、 ssh でログインした端末

ssh ”IPアドレス” -l root -X

からコマンドを実行しているせいか? Ubuntu 18.04 のメインマシン上にウインドウが開いて画像が表示されている。そのためフレームレートが遅くなっている可能性があるので、ご注意願いたい。
Vitis-AI_32_210704.jpg

segmentation
cd ~/Vitis-AI/demo/VART/segmentation
./segmentation ./video/traffic.mp4 /usr/share/vitis_ai_library/models/fpn/fpn.xmodel

Vitis-AI_33_210704.png

動画です。
Vitis-AI_34_210704.jpg

video_analysis
cd ~/Vitis-AI/demo/VART/video_analysis
./video_analysis ./video/structure.mp4 /usr/share/vitis_ai_library/models/ssd_traffic_pruned_0_9/ssd_traffic_pruned_0_9.xmodel

Vitis-AI_35_210704.png

動画です。
Vitis-AI_36_210704.jpg

segs_and_roadline_detect
cd ~/Vitis-AI/demo/Vitis-AI-Library/apps/segs_and_roadline_detect
./segs_and_lanedetect_detect_x seg_512_288.avi seg_512_288.avi seg_512_288.avi seg_512_288.avi lane_640_480.avi -t 2 -t 2 -t 2 -t 2 -t 2

Vitis-AI_37_210704.png

動画です。Xウインドウのフレームレートなので、遅い可能性があります。
Vitis-AI_38_210704.jpg

seg_and_pose_detect
cd ~/Vitis-AI/demo/Vitis-AI-Library/apps/seg_and_pose_detect
./seg_and_pose_detect_x seg_960_540.avi 0 -t 3 -t 3

Vitis-AI_39_210704.png

seg_and_pose_detect
cd ~/Vitis-AI/demo/Vitis-AI-Library/apps/seg_and_pose_detect
./seg_and_pose_detect_x seg_960_540.avi pose_960_540.avi -t 3 -t 3

Vitis-AI_40_210704.png

動画です。
Vitis-AI_41_210704.jpg

ロジクール ウェブカメラ C920n を Ultra96V2 に接続して、コマンドを実行した。
./seg_and_pose_detect_x seg_960_540.avi 0 -t 3 -t 3
Vitis-AI_42_210704.png

動画です。カメラ画像のポーズ解析結果が見れます。
Vitis-AI_43_210704.jpg

Vitis-AI 1.3 をやっていると Ultra96V2 がかなり熱くなりますね。
  1. 2021年07月04日 18:46 |
  2. Vitis-AI
  3. | トラックバック:0
  4. | コメント:0

3 軸加速度センサーのメイン基板(2021/07/02)

AXI4-Lite インターフェースの I2C Master Core を使用して 3 軸加速度度センサーの値を収集する4(NMJ2884U1を使用してスレーブ側の電源をON/OFFする)”の続きで、”新しく 3 軸加速度センサー基板を作成する”の続き。

ストロベリーリナックスさんの”LTC4331 絶縁型I2C延長モジュール(2個セット) ”のスレーブ側に付けるストロベリーリナックスさんの”ADXL355 超低ノイズ3軸加速度センサモジュール”は同じ値をずっと出力して、リセットが効かないことがある。そこで、秋月電子の低飽和型レギュレーター 3.3V500mA NJM2884U1-33 を使用して、スレーブ側の電源を GPIO で ON/OFF できるようにした。前回は、その 3 軸加速度センサーの基板を作成した。今回は、 3 軸加速度センサーの基板からの I2C 信号を受けて、ZYBO Z7-20 に接続するメイン基板を作成した。

回路図はこんな感じだ。
acc_sensor_6_210702.png

一部を拡大すると、ストロベリーリナックスさんの”LTC4331 絶縁型I2C延長モジュール(2個セット) ”や秋月電子の低飽和型レギュレーター 3.3V500mA NJM2884U1-33 が見えると思う。これで、”新しく 3 軸加速度センサー基板を作成する”の基板の電源を ON/OFF することができる。
acc_sensor_7_210702.png

基板はこんな感じだ。
acc_sensor_8_210702.png

昨日、基板ができあがってきた。
acc_sensor_4_210702.jpg
acc_sensor_5_210702.jpg

247 mm X 147 mm の基板なので、かなり大きかった。
  1. 2021年07月02日 04:43 |
  2. FPGAを使用したシステム
  3. | トラックバック:0
  4. | コメント:0

新しく 3 軸加速度センサー基板を作成する(2021/07/01)

AXI4-Lite インターフェースの I2C Master Core を使用して 3 軸加速度度センサーの値を収集する4(NMJ2884U1を使用してスレーブ側の電源をON/OFFする)”の続き。

前回、ストロベリーリナックスさんの”LTC4331 絶縁型I2C延長モジュール(2個セット) ”のスレーブ側に付けるストロベリーリナックスさんの”ADXL355 超低ノイズ3軸加速度センサモジュール”は同じ値をずっと出力して、リセットが効かないことがある。そこで、秋月電子の低飽和型レギュレーター 3.3V500mA NJM2884U1-33 を使用して、スレーブ側の電源を GPIO で ON/OFF できるようにした。今回は、その 3 軸加速度センサーの基板を作成した。

回路図を示す。
acc_sensor_1_210701.png

SCL と SDA 用のプルアップ抵抗は 1 kΩが 2 つ並列になっているが、 1 個しか基板に乗せない予定だ。つまり 1 kΩということだ。
この基板はメイン基板から LANケーブルで電源を供給してもらう基板になっている。

基板を示す。
acc_sensor_2_210701.png

やはり、”LTC4331 絶縁型I2C延長モジュール(2個セット) ”が付いているので基板が大きくなってしまった。

(2021/07/02 :追記)
昨日できあがった基板が届いた。
acc_sensor_3_210702.jpg
  1. 2021年07月01日 05:21 |
  2. FPGAを使用したシステム
  3. | トラックバック:0
  4. | コメント:0