FC2カウンター FPGAの部屋 白線追従走行用畳み込みニューラルネットワークの製作11(トレーニング用画像ファイルとラベル・ファイルの作成)

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

FPGAの部屋

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

白線追従走行用畳み込みニューラルネットワークの製作11(トレーニング用画像ファイルとラベル・ファイルの作成)

白線追従走行用畳み込みニューラルネットワークの製作10(画像を増やす)”の続き。

前回は、imagemagic を使用して、トレーニング画像を33枚から 363 枚に増やした。今回は、それをMNISTデータの形にしてからトレーニング用画像ファイル train_straight_run_image とトレーニング用ラベル・ファイル train_straight_run_label を作成した。

まずは、前回作ってあって、そのディレクトリの下で作業をしていたのだが、Vivado HLS 2016.4 のプロジェクト straight_dataset_bmp3 プロジェクトを作ってあった。それに straigh_dataset_bmp_nowr.cpp と straigh_dataset_bmp.h を追加した。
wlt_cnn_57_170822.png

wlt_cnn_58_170822.png

straigh_dataset_bmp.h は、STRAIGHT_NUM_OF_IMAGE、LEFT_TRUN_NUM_OF_IMAGE、RIGHT_TRUNNUM_OF_IMAGEをそれぞれ、121 に設定した。
straigh_dataset_bmp_nowr.cpp は、BMPファイルを書かないようにしたC ソースコードで、この下に貼っておく。

// straight_dataset_bmp_nowr.cpp
// 2017/07/24 by marsee
//
// 2017/08/21 : no write bmp files
//

#include <iostream>
#include "hls_opencv.h"
#include "straight_dataset_bmp.h"
#include <arpa/inet.h>

const char IMAGE_DIR[] = "train_data_170808";

int main(){
    char straight_fn[256] = "straight";
    char left_turn_fn[256] = "left_turn";
    char right_turn_fn[256] = "right_turn";
    char bmp_file[256];
    FILE *ftin, *ftln;
    char train_image_name[256] = "train_straight_run_image";
    char train_label_name[256] = "train_straight_run_label";
    uint32_t buf[5];
    uint8_t bufchar[100];


    if ((ftin = fopen(train_image_name, "wb")) == NULL){
        fprintf(stderr, "Can't open %s\n", train_image_name);
        exit(1);
    }
    if ((ftln = fopen(train_label_name, "wb")) == NULL){
        fprintf(stderr, "Can't open %s\n", train_label_name);
        exit(1);
    }

    // Writed header
    buf[0] = htonl(0x803); // magic number
    buf[1] = htonl((STRAIGHT_NUM_OF_IMAGE+LEFT_TRUN_NUM_OF_IMAGE+RIGHT_TRUNNUM_OF_IMAGE)*25); // number of image
    buf[2] = htonl(10); // number of rows (10)
    buf[3] = htonl(56); // number of columns (56)
    fwrite(buf, sizeof(uint32_t), 4, ftin);

    buf[0] = htonl(0x801); // magic number
    buf[1] = htonl((STRAIGHT_NUM_OF_IMAGE+LEFT_TRUN_NUM_OF_IMAGE+RIGHT_TRUNNUM_OF_IMAGE)*25); // number of image
    fwrite(buf, sizeof(uint32_t), 2, ftln);

    // refereed to http://opencv.jp/cookbook/opencv_img.html
    // straight
    for(int i=0; i<STRAIGHT_NUM_OF_IMAGE; i++){
        sprintf(bmp_file, "%s/%s%d.bmp", IMAGE_DIR, straight_fn, i);
        cv::Mat straight_img = cv::imread(bmp_file,1);
        if(straight_img.empty())
            return(-1);
        cv::Mat reduct_img(straight_img.rows*0.075, straight_img.cols*0.075, straight_img.type());
        cv::resize(straight_img, reduct_img, reduct_img.size(), cv::INTER_LINEAR);
        cv::Mat gray_img;
        cv::cvtColor(reduct_img, gray_img, CV_BGR2GRAY);

        //sprintf(bmp_file, "%s_RED%d.bmp", straight_fn, i);
        //cv::imwrite(bmp_file, gray_img);

        for(int y=0; y<5; y++){
            for(int x=0; x<5; x++){
                cv::Rect rect_center(x, 30+y, 5610);
                cv::Mat img_rect(gray_img, rect_center);
                //sprintf(bmp_file, "%s_RED_rect%d_%d%d.bmp", straight_fn, i, y, x);
                //cv::imwrite(bmp_file, img_rect);

                for(int iy=0; iy<img_rect.rows; iy++){
                    for(int ix=0; ix<img_rect.cols; ix++){
                        bufchar[ix] = img_rect.at<uchar>(iy, ix);
                    }
                    fwrite(bufchar, sizeof(uint8_t), img_rect.cols, ftin); // image write
                }
                bufchar[0] = 0x1;
                fwrite(bufchar, sizeof(uint8_t), 1, ftln); // label write
            }
        }
    }

    // left turn
    for(int i=0; i<LEFT_TRUN_NUM_OF_IMAGE; i++){
        sprintf(bmp_file, "%s/%s%d.bmp", IMAGE_DIR, left_turn_fn, i);
        cv::Mat left_trun_img = cv::imread(bmp_file,1);
        if(left_trun_img.empty())
            return(-1);
        cv::Mat reduct_img(left_trun_img.rows*0.075, left_trun_img.cols*0.075, left_trun_img.type());
        cv::resize(left_trun_img, reduct_img, reduct_img.size(), cv::INTER_LINEAR);
        cv::Mat gray_img;
        cv::cvtColor(reduct_img, gray_img, CV_BGR2GRAY);

        //sprintf(bmp_file, "%s_RED%d.bmp", left_turn_fn, i);
        //cv::imwrite(bmp_file, gray_img);

        for(int y=0; y<5; y++){
            for(int x=0; x<5; x++){
                cv::Rect rect_center(x, 30+y, 5610);
                cv::Mat img_rect(gray_img, rect_center);
                //sprintf(bmp_file, "%s_RED_rect%d_%d%d.bmp", left_turn_fn, i, y, x);
                //cv::imwrite(bmp_file, img_rect);

                for(int iy=0; iy<img_rect.rows; iy++){
                    for(int ix=0; ix<img_rect.cols; ix++){
                        bufchar[ix] = img_rect.at<uchar>(iy, ix);
                    }
                    fwrite(bufchar, sizeof(uint8_t), img_rect.cols, ftin); // image write
                }
                bufchar[0] = 0x0;
                fwrite(bufchar, sizeof(uint8_t), 1, ftln); // label write
            }
        }
    }

    // right turn
    for(int i=0; i<STRAIGHT_NUM_OF_IMAGE; i++){
        sprintf(bmp_file, "%s/%s%d.bmp", IMAGE_DIR, right_turn_fn, i);
        cv::Mat right_trun_img = cv::imread(bmp_file,1);
        if(right_trun_img.empty())
            return(-1);
        cv::Mat reduct_img(right_trun_img.rows*0.075, right_trun_img.cols*0.075, right_trun_img.type());
        cv::resize(right_trun_img, reduct_img, reduct_img.size(), cv::INTER_LINEAR);
        cv::Mat gray_img;
        cv::cvtColor(reduct_img, gray_img, CV_BGR2GRAY);

        //sprintf(bmp_file, "%s_RED%d.bmp", right_turn_fn, i);
        //cv::imwrite(bmp_file, gray_img);

        for(int y=0; y<5; y++){
            for(int x=0; x<5; x++){
                cv::Rect rect_center(x, 30+y, 5610);
                cv::Mat img_rect(gray_img, rect_center);
                //sprintf(bmp_file, "%s_RED_rect%d_%d%d.bmp", right_turn_fn, i, y, x);
                //cv::imwrite(bmp_file, img_rect);

                for(int iy=0; iy<img_rect.rows; iy++){
                    for(int ix=0; ix<img_rect.cols; ix++){
                        bufchar[ix] = img_rect.at<uchar>(iy, ix);
                    }
                    fwrite(bufchar, sizeof(uint8_t), img_rect.cols, ftin); // image write
                }
                bufchar[0] = 0x2;
                fwrite(bufchar, sizeof(uint8_t), 1, ftln); // label write
            }
        }
    }

    fclose(ftin);
    fclose(ftln);

    return(0);
}


C シミュレーションを行ったが、最初うまく行かなかった。”Ubuntu 16.04 上のVivado HLS 2017.2 でOpenCV を使用したプロジェクトでエラー発生”の解決策の
sudo apt-get install libjpeg62-dev
を実行したら、コンパイルできるようになった。
C シミュレーションの結果を示す。成功した。
wlt_cnn_59_170822.png

~/Vivado_HLS/PYNQ/straight_dataset_bmp3/solution1/csim/build に train_straight_run_image と train_straight_run_label が生成された。
wlt_cnn_60_170822.png

train_straight_run_image の内容の一部を示す。2373 は 10 進数で 9075 となる。
wlt_cnn_61_170823.png
  1. 2017年08月23日 04:41 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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