GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
Windows10のPCとRENESASのWEBコンパイラでGR-LYCHEEのアプリを開発しています。
GR-LYCHEEでe-AIを使用したく、下記のチュートリアルに従い、binファイルを作成するところまでは問題なく進んだのですが、
出来上がったbinファイルをGR-LYCHEEに書き込んだ後、USBケーブルをGR-LYCHEEのFunction用USBに繋いでも
PCではシリアルポートとして認識されませんでした。
なお、WEBコンパイラのOpen-CVのテンプレートをビルドした場合はFunction用USBはCOM4として認識され、DisplayAppでカメラの画像を表示することはできています。
原因の判る方がおられましたら教えて下さい。
【e-AIトランスレータ チュートリアル GRボードで実行してみよう!】
http://gadget.renesas.com/ja/product/e-ai/mnist_tutorial.html
【出力されたサンプルコード】
// Sample code for e-AI#include <Arduino.h>#ifdef __cplusplusextern "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}#endifvoid setup(){ Serial.begin(9600); TPrecision *prediction; TPrecision *input_img; TsInt i; long time_start = millis(); input_img = data_in; prediction = (TPrecision*) (intptr_t) dnn_compute( input_img); Serial.print("Dnn Compute time(ms):"); Serial.println(millis() - time_start); for(i = 0;i < 10;i++){ Serial.print(i); Serial.print(":"); Serial.println(prediction[i]); }}void loop(){}
ArduinoスケッチでのSerialクラスの出力は、LYCHEE真ん中のUSBから出力されます。
カメラ画像など、USB CDCを使った出力はLYCHEEの端にあるUSBから出力されます。
記載されたe-AIのプログラムでは、真ん中のUSBから結果が出力されていると思います。
以下はOpenCVを使って画像出力するようにしたLYCHEEのサンプルプログラムです。実際に数値認識に使われる28x28の小窓を左上に表示し、一致率を棒グラフにしたものです。
ちなみに、Tensorflowのチュートリアルのmnistは認識率があまりよくなかった記憶がありまして、CAFFEで出力した学習モデルを使ったbinファイルを貼り付けます。デモとしてはこちらの方がよいです。
lychee_mnist.zip
#include <Arduino.h>#include <Camera.h>#include <opencv.hpp>#include <DisplayApp.h>#ifdef __cplusplusextern "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 28Camera 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);}