こんにちは、cobaと申します。質問させて頂きます。
自分の用意した画像をe-AIを使用しGR-peachで識別させたいと思い、トレーニング用と評価用のプログラムをサンプルコードを参考に作成しています。
ただ、WEB上にあるPythonのサンプルコードでは画像データを取り込むときにOpenCVやPILのライブラリを使用しているようです。
GR-peachはOpenCVやPILのライブラリを使用できますでしょうか?
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 __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);}