AutoMLVisionへリクエストを送って画像を判定するNodeJSのWebAPIを作成する

概要

環境構築

環境

  • OS:CentOS 7.X
  • NodeJS:10.7.0
    • Expressを使ってます

環境構築

  • 環境構築もあぱーブログ様のお世話になりました。以下、自分がハマったことのメモが中心です。
  • ちょっとハマったこと
    • CentOS 6.X へ構築しようとしたのですが、Pythonのバージョンが古くて、ろくにインストールできませんでした。
    • Base64エンコード時に半角スペースが入っているとAutoMLVision側でデコード出来なかったってエラーが出たので、半角スペースを除いておいたほうが無難かと思います。

NodeJSでWebAPIを作る

  • CurlでVisionAPIが実行できたので、あとはNodeJSからCurlを実行するお手軽形式でAPI作成しました。

Node module インストール

  • NodeJSからコマンドを実行するためにchild-process を利用しました。
    npm install child_process
    

バックエンド

router.post('/post2AutoMLVision', function(req, res, next) {

   // 環境変数をNodeJSから読めてないようので直前でセット
     process.env.GOOGLE_APPLICATION_CREDENTIALS = '/var/data/key/google-credential.json';  // 認証情報のパスを指定

     // イメージのJSONファイルを作成
     let jsonVal = '{"payload":{"image":{"imageBytes":"';
     jsonVal += req.body.base64Image; // クライアントにてBase64へのエンコードは実施済み
     jsonVal += '"},}}';

     const requestJsonPath = '/var/data/temp/' + new Date().getTime().toString() + '.json';
     fs.writeFileSync(requestJsonPath, jsonVal);

     // curl実行
     const visionUrl = 'https://automl.googleapis.com/v1beta1/projects/<プロジェクトID>/locations/us-central1/models/<モデルID>:predict';
     const command = 'curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" ' + visionUrl + ' -d @' + requestJsonPath;

     exec(command, (err, stdout, stderr) => {
       // アップロードした       ファイルを削除
       fs.unlinkSync(requestJsonPath);

       if (err) { 
           console.log(err); 
       }

       // AutoMLVisionからのレスポンスをそのまま返す
       res.status(200).send(stdout);
     }); 
});

app.js

  • クライアントから送信するときに大きすぎってエラーがおきました。

    • bodyParser側で上限サイズが決められているため、app.jsでサイズを変更すればOK
    //app.use(bodyParser.urlencoded({ extended: false }));  // 変更前
    app.use(bodyParser.urlencoded({ limit:'10mb',extended: true }));
    

0 件のコメント :

コメントを投稿