

spresenseにて、下記のDNNRTサンプルプログラムを実行した際に、dnnrt.begin()で戻り値が-16となるエラーが発生します。  
ブートローダの[再インストール](https://developer.sony.com/spresense/development-
guides/arduino_set_up_ja.html#_spresense_%E3%83%96%E3%83%BC%E3%83%88%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を行なっても改善されません(spresense
reference board 3.1.0)。どうしたら良いでしょうか。

[code]

    #include <Camera.h>
    //#include "Adafruit_ILI9341.h"
    #include <DNNRT.h>
    #include <SDHCI.h>
    #define TFT_DC  9
    #define TFT_CS  10
    //Adafruit_ILI9341 display = Adafruit_ILI9341(TFT_CS, TFT_DC);
    
    #define OFFSET_X  (104)
    #define OFFSET_Y  (0)
    #define CLIP_WIDTH (112)
    #define CLIP_HEIGHT (224)
    #define DNN_WIDTH  (28)
    #define DNN_HEIGHT  (28)
    
    SDClass SD;
    DNNRT dnnrt;
    
    DNNVariable input(DNN_WIDTH*DNN_HEIGHT);
    const char label[11] = {'0','1','2','3','4','5','6','7','8','9',' '};
    
    void CamCB(CamImage img) {
    
      if (!img.isAvailable()) return;
    
      // カメラ画像の切り抜きと縮小
      CamImage small;
      CamErr err = img.clipAndResizeImageByHW(small
                         , OFFSET_X, OFFSET_Y
                         , OFFSET_X + CLIP_WIDTH -1
                         , OFFSET_Y + CLIP_HEIGHT -1
                         , DNN_WIDTH, DNN_HEIGHT);
                         
      if (!small.isAvailable()) return;
    
      // 認識用モノクロ画像をDNNVariableに設定
      uint16_t* imgbuf = (uint16_t*)small.getImgBuff();
      float *dnnbuf = input.data();
      for (int n = 0; n < DNN_HEIGHT*DNN_WIDTH; ++n) {
        // YUV422の輝度成分をモノクロ画像として利用
        // 学習済モデルの入力に合わせ0.0-1.0に正規化    
        dnnbuf[n] = (float)(((imgbuf[n] & 0xf000) >> 8) 
                          | ((imgbuf[n] & 0x00f0) >> 4))/255.;
      }
      // 推論の実行
      dnnrt.inputVariable(input, 0);
      dnnrt.forward();
      DNNVariable output = dnnrt.outputVariable(0);
      int index = output.maxIndex();
      
     // 推論結果の表示
      String gStrResult;
      if (index < 11) {
        gStrResult = String(label[index]) 
            + String(":") + String(output[index]);
      } else {
        gStrResult = String("Error");    
      }
      Serial.println(gStrResult);
    
      img.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565);
      // display.drawRGBBitmap(0, 0, 
      //     (uint16_t *)img.getImgBuff(), 320, 240);
    }
    
    void setup() {   
      Serial.begin(115200);
      // SDカードの挿入待ち
      while (!SD.begin()) {Serial.println("Insert SD card");}
      // SDカードにある学習済モデルの読み込み
      File nnbfile = SD.open("model.nnb");
      // 学習済モデルでDNNRTを開始
      int ret = dnnrt.begin(nnbfile);
      if (ret < 0) {
        Serial.println("Runtime initialization failure.");
        if (ret == -16) {
          Serial.print("Please install bootloader!");
          Serial.println(" or consider memory configuration!");
        } else {
          Serial.println(ret);
        }
        return;
      }
    
      // display.begin();
      // display.setRotation(3);
      // theCamera.begin();
      theCamera.startStreaming(true, CamCB);
    }
    
    void loop() { }
    
[/code]

追記)Arduino IDEを消して再インストールしたら改善されました．原因をご教示いただきたいです．


CC BY-SA 4.0
2023-12-01T06:51:54.083
96948
2023-12-01T09:59:00.237
2023-12-01T09:59:00.237
60584
60584
question
spresense
spresense dnnrt.begin()で戻り値が-16となる