GR-peach で PILやOpenCV を使用することはできますか?

こんにちは、cobaと申します。質問させて頂きます。

自分の用意した画像をe-AIを使用しGR-peachで識別させたいと思い、トレーニング用と評価用のプログラムをサンプルコードを参考に作成しています。

ただ、WEB上にあるPythonのサンプルコードでは画像データを取り込むときにOpenCVやPILのライブラリを使用しているようです。

GR-peachはOpenCVやPILのライブラリを使用できますでしょうか?

  • GR-PEACH のご相談は専用フォーラムでされた方が反応良いと思いますよ。

    japan.renesasrulz.com/.../gr-peach
    japan.renesasrulz.com/.../opencv-arduino
  • Fujitaさん、フォローありがとうございます。

    GR-PEACHでOpenCVは可能です。Webコンパイラでe-AIトランスレータができますので、GR-PEACH用のOpenCVテンプレートを使用すればいけると思います。

    近日GR-LYCHEE用に記事を書こうと思ってましたが、以下はデモ動画とサンプルプログラムです。OpenCVではカメラの画像から白黒→28x28にリサイズしてMNISTしてます。結果をグラフ描画して、判定用の画像を左の小窓に貼り付けてます。サンプルは生煮えでマジックナンバーもたくさんあり、見づらいと思いますがご参考までです。


    #include <Arduino.h>
    #include <Camera.h>
    #include <opencv.hpp>
    #include <DisplayApp.h>

    #ifdef __cplusplus
    extern "C" {
    #endif
    #include "eAI_translated/Typedef.h"
    #include "eAI_translated/input_image_0.h"
    #include "eAI_translated/layer_graph.h"
    TPrecision* dnn_compute(TPrecision* input_img);
    #ifdef __cplusplus
    }
    #endif

    // To monitor realtime on PC, you need DisplayApp on following site.
    // Connect USB0(not for mbed interface) to your PC
    // os.mbed.com/.../

    using namespace cv;

    #define IMAGE_HW 320
    #define IMAGE_VW 240
    #define INPUT_HEIGHT 28
    #define INPUT_WIDTH 28

    Camera camera(IMAGE_HW, IMAGE_VW);
    DisplayApp display_app;
    void paste(cv::Mat dst, cv::Mat src, int x, int y, int width, int height) {
    cv::Mat resized_img;
    cv::resize(src, resized_img, cv::Size(width, height));

    if (x >= dst.cols || y >= dst.rows) return;
    int w = (x >= 0) ? std::min(dst.cols - x, resized_img.cols) : std::min(std::max(resized_img.cols + x, 0), dst.cols);
    int h = (y >= 0) ? std::min(dst.rows - y, resized_img.rows) : std::min(std::max(resized_img.rows + y, 0), dst.rows);
    int u = (x >= 0) ? 0 : std::min(-x, resized_img.cols - 1);
    int v = (y >= 0) ? 0 : std::min(-y, resized_img.rows - 1);
    int px = std::max(x, 0);
    int py = std::max(y, 0);

    cv::Mat roi_dst = dst(cv::Rect(px, py, w, h));
    cv::Mat roi_resized = resized_img(cv::Rect(u, v, w, h));
    roi_resized.copyTo(roi_dst);
    }

    int max_array(TPrecision* array, int length){
    int i;
    float max = array[0];
    int index = 0;

    for(i = 0; i < length; i++){
    if(array[i] > max){
    max = array[i];
    index = i;
    }
    }
    return index;
    }

    void setup() {
    Serial.begin(9600);
    camera.begin();
    }

    void loop() {
    Scalar red(0, 0, 255), green(0, 255, 0), blue(255, 0, 0);
    Scalar yellow = red + green;
    Scalar white = Scalar::all(255);
    Scalar black = Scalar::all(0);
    Scalar pink = Scalar(154, 51, 255);

    Mat img_raw(IMAGE_VW, IMAGE_HW, CV_8UC2, camera.getImageAdr());

    Mat pic, gray;
    cvtColor(img_raw, pic, COLOR_YUV2BGR_YUYV); //covert YUV to RGB
    cvtColor(img_raw, gray, COLOR_YUV2GRAY_YUYV); //covert from YUV to GRAY

    Mat roi(gray, Rect(80, 0, 240, 240));
    threshold(roi, roi, 90, 255, THRESH_BINARY);
    resize(roi, roi, Size(INPUT_WIDTH, INPUT_HEIGHT));
    for(int i = 0; i < 784; i++){
    data_in[i] = 1 - (float)roi.data[i] / 255;
    }

    TPrecision *prediction;
    TPrecision *input_img;
    TsInt i;

    input_img = data_in;
    prediction = (TPrecision*) (intptr_t) dnn_compute( input_img);

    // Drawing
    rectangle(pic, Rect(0, 0, 80, 240), white, FILLED);
    rectangle(pic, Rect(80, 0, 240, 240), red, 2);

    Mat roi2;
    cvtColor(roi, roi2, COLOR_GRAY2BGR);
    paste(pic, roi2, 5, 5, roi2.rows, roi2.cols);
    rectangle(pic, Rect(4, 4, 30, 30), red, 1);

    int max_index = max_array(prediction, 10);
    for(i = 0;i < 10;i++){
    Serial.print(i); Serial.print(":");
    Serial.println(prediction[i]);
    stringstream ss;
    ss << i;
    if(max_index == i){
    putText(pic, ss.str(), Point(0, 20 * i + 50), FONT_HERSHEY_SCRIPT_SIMPLEX, 0.5, pink, 1);
    rectangle(pic, Rect(20, 20 * i + 40, prediction[i] * 80, 10), pink, FILLED);
    } else {
    putText(pic, ss.str(), Point(0, 20 * i + 50), FONT_HERSHEY_SCRIPT_SIMPLEX, 0.5, black, 1);
    rectangle(pic, Rect(20, 20 * i + 40, prediction[i] * 80, 10), blue, FILLED);
    }
    }

    size_t jpegSize = camera.createJpeg(320, 240, pic.data,
    Camera::FORMAT_RGB888);
    display_app.SendJpeg(camera.getJpegAdr(), jpegSize);
    delay(10);

    }
  • fujitaさん、岡宮さん、アドバイスありがとうございます。
    今後は専用フォーラムで質問させて頂きます。
    OpenCV試してみます。
  • 返信おそくなりまして、申し訳ありません。
    OpenCVを用いても使用することができました。
    fujitaさん、岡宮さんありがとうございました。
  • そうですか。GR-PEACHでOpenCVが使えるんですか!
    ただいまOpenCvsharpにてプロトタイプを作っており、完成したらC++に変更しLinux系のOSで動作させようと思っていましたが、GR-PEACHで可能なら最高です。
    「OpenCVで画像処理し、ロボットにLAN経由で座標を送信する。」と言うことで完成が近付いてます。
    良いタイミングで良い記事を出して頂いて有り難うございます。
    なにか疑問が出たらGR-PEACHのフォーラムで質問したいと思いますんで、またよろしくお願いします。