FC2カウンター FPGAの部屋 ZYBOt の学習用画像ファイルの作成(トレーニング・ファイルとラベル・ファイル)
FC2ブログ

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

FPGAの部屋

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

ZYBOt の学習用画像ファイルの作成(トレーニング・ファイルとラベル・ファイル)

ZYBOt の学習用画像を増やす”で学習用画像ファイルとテスト用画像ファイルを増やした。今回は、その学習用画像ファイルを使用して、MNISTデータセットと同じフォーマットでトレーニング・ファイルとラベル・ファイルを生成しよう。

MNIST手書き数字のデータフォーマットについては、”MNIST手書き数字のデータフォーマット”を見て欲しい。
後、参考にしたのは、”白線追従走行用畳み込みニューラルネットワークの製作3(トレーニング、ラベル・ファイルの作成)”。
やることは、800 x 600 ピクセルの元画像を 60 x 45 に縮小してから、白黒変換し、56 x 10 ピクセルの白線の画像を切り出して、画像のデータをtrain_course_run_image に書き込み、ラベルを train_course_run_label にバイナリで書き込む。

Vivado HLS 2018.2 の course_dataset_bmp プロジェクトを示す。
ZYBOt_Keras_7_180927

C シミュレーションを行った。
ZYBOt_Keras_8_180927

train_course_run_image と train_course_run_label が出来た。
ZYBOt_Keras_9_180927

train_course_run_image をGHex で見た。
画像ファイルの個数は D836 なので、10進数に直すと、55350 個で、”ZYBOt の学習用画像を増やす”の計算とぴったり合っている。
ZYBOt_Keras_10_180927

画像の縦は 0xA = 10 ピクセルで、横が 0x38 = 56 ピクセルということがわかる。

train_course_run_label をGHex で見た。
同様に、ラベルの個数は D836 なので、10進数に直すと、55350 個だった。
ZYBOt_Keras_11_180927

course_dataset_bmp.cppを示す。

// course_dataset_bmp.cpp
// 2018/09/24 by marsee
//

#include <iostream>
#include "hls_opencv.h"
#include <arpa/inet.h>
#include <stdio.h>
#include <dirent.h>
#include "hls_video.h"

#define BMP_HEIGHT    600
#define BMP_WIDTH    800

#define REDUCTION_RATIO 0.075   // 1/13.3333... 60x45

#define DATASET_HEIGHT  10
#define DATASET_WIDTH   56

typedef hls::Scalar<3, unsigned char> RGB_PIXEL;
typedef hls::Mat<BMP_HEIGHT, BMP_WIDTH, HLS_8UC3> RGB_IMAGE;
typedef hls::Mat<BMP_HEIGHT, BMP_WIDTH, HLS_8UC1> GRAY_IMAGE;

const char LEFT_PIC_DIR[] = "train/left";
const char RIGHT_PIC_DIR[] = "train/right";
const char STRAIGHT_PIC_DIR[] = "train/straight";
const char CUR_DIR[] = ".";
const char PAR_DIR[] = "..";

int data_write(char *bmp_file, uint8_t label, FILE *ftin, FILE *ftln){
    uint8_t bufchar[100];

    cv::Mat pict_img = cv::imread(bmp_file,1);
    if(pict_img.empty()){
        fprintf(stderr,"Error: %s\n", bmp_file);
        return(-1);
    }
    cv::Mat reduct_img(pict_img.rows*0.075, pict_img.cols*0.075, pict_img.type());
    cv::resize(pict_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, 56, 10);
            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] = label;
            fwrite(bufchar, sizeof(uint8_t), 1, ftln); // label write
        }
    }
    return(0);
}

int main(){
    char bmp_file[256];
    FILE *ftin, *ftln;
    char train_image_name[] = "train_course_run_image";
    char train_label_name[] = "train_course_run_label";
    uint32_t buf[5];

    DIR *ldir, *rdir, *sdir;
    struct dirent *ldp, *rdp, *sdp;
    int lnum=0, rnum=0, snum=0;
    int max_num;
    int lcnt=0, rcnt=0, scnt=0;

    // Open a train file and a test file
    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);
    }

    // Open folder of each files
    if((ldir=opendir(LEFT_PIC_DIR)) == NULL){
        fprintf(stderr, "LEFT_PIC_DIR Open Error\n");
        exit(1);
    }
    if((rdir=opendir(RIGHT_PIC_DIR)) == NULL){
        fprintf(stderr, "RIGHT_PIC_DIR Open Error\n");
        exit(1);
    }
    if((sdir=opendir(STRAIGHT_PIC_DIR)) == NULL){
        fprintf(stderr, "STRAIGHT Open Error\n");
        exit(1);
    }

    // Count the number of files in each folder
    for(ldp=readdir(ldir); ldp != NULL; ldp=readdir(ldir)){
        lnum++;
    }
    for(rdp=readdir(rdir); rdp != NULL; rdp=readdir(rdir)){
        rnum++;
    }
    for(sdp=readdir(sdir); sdp != NULL; sdp=readdir(sdir)){
        snum++;
    }

    // Find the maximum value
    if(lnum > rnum && lnum > snum)
        max_num = lnum;
    else if(rnum > lnum && rnum > snum)
        max_num = rnum;
    else
        max_num = snum;

    printf("lnum = %d, rnum = %d, snum = %d, max_num = %d\n", lnum, rnum, snum, max_num);

    // Close
    closedir(ldir);
    closedir(rdir);
    closedir(sdir);

    // Writed header
    buf[0] = htonl(0x803); // magic number
    buf[1] = htonl((lnum-2+rnum-2+snum-2)*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((lnum-2+rnum-2+snum-2)*25); // number of image
    fwrite(buf, sizeof(uint32_t), 2, ftln);

    // refereed to http://opencv.jp/cookbook/opencv_img.html
    // Reopen folder of each file
    if((ldir=opendir(LEFT_PIC_DIR)) == NULL){
        fprintf(stderr, "LEFT_PIC_DIR Open Error\n");
        exit(1);
    }
    if((rdir=opendir(RIGHT_PIC_DIR)) == NULL){
        fprintf(stderr, "RIGHT_PIC_DIR Open Error\n");
        exit(1);
    }
    if((sdir=opendir(STRAIGHT_PIC_DIR)) == NULL){
        fprintf(stderr, "STRAIGHT Open Error\n");
        exit(1);
    }

    // read file name and write image data
    for(int i=1; i <= max_num; i++){
        if(i <= lnum){
            ldp = readdir(ldir);
            if(strcmp(CUR_DIR, ldp->d_name)!=0 && strcmp(PAR_DIR, ldp->d_name)!=0){
                sprintf(bmp_file, "%s/%s", LEFT_PIC_DIR, ldp->d_name);
                data_write(bmp_file, 0, ftin, ftln);
            }
        }
        if(i <= rnum){
            rdp = readdir(rdir);
            if(strcmp(CUR_DIR, rdp->d_name)!=0 && strcmp(PAR_DIR, rdp->d_name)!=0){
                sprintf(bmp_file, "%s/%s", RIGHT_PIC_DIR, rdp->d_name);
                data_write(bmp_file, 0x2, ftin, ftln);
            }
        }
        if(i <= snum){
            sdp = readdir(sdir);
            if(strcmp(CUR_DIR, sdp->d_name)!=0 && strcmp(PAR_DIR, sdp->d_name)!=0){
                sprintf(bmp_file, "%s/%s", STRAIGHT_PIC_DIR, sdp->d_name);
                data_write(bmp_file, 0x1, ftin, ftln);
            }
        }
    }
    fclose(ftin);
    fclose(ftln);

    return(0);
}

  1. 2018年09月27日 04:38 |
  2. Zybot
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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