【기계 학습】Custom Vision을 사용하여 재료의 사진을 보내면 자동으로 요리를 제안해 주는 LINEBOT를 작성해 보았다 【이미지 인식】

쿡 패드를 비롯해, 클라실이나 레시폰, 라쿠텐 레시피 등의 편리한 레시피 사이트나 어플은 많이 존재하고 있습니다만, 원래 어느 요리로 하는지 자체를 생각하는 것이 귀찮은 일도 적지 않다고 생각합니다.

그래서 이번 Azure Custom Vision을 사용하여 재료의 사진을 보내면 자동으로 요리를 제안해주는 LINEBOT을 만들어 보았습니다.

Custom Vision은 이미지 식별 로직을 직접 구축, 배포할 수 있는 AI 이미지 인식 서비스로 업로드한 이미지에 태그를 지정(라벨링)하여 기계 학습할 수 있습니다.
자세한 내용은 여기을 참조하십시오.

LINEBOT: "cook-book"


환경


  • Windows 10
  • Node.js 12.16.1
  • Azure Custom Vision

  • 기계 학습



    이러한 형태로 업로드한 이미지를 라벨링하여 기계 학습이 가능합니다.


    소스 코드


    'use strict';
    
    const express = require('express');
    const line = require('@line/bot-sdk');
    const axios = require('axios');
    const PORT = process.env.PORT || 3000;
    
    const config = {
      channelSecret: '', //チャンネルシークレット
      channelAccessToken: '' //チャンネルアクセストークン
    };
    
    const app = express();
    
    app.post('/webhook', line.middleware(config), (req, res) => {
      console.log(req.body.events);
      Promise
        .all(req.body.events.map(handleEvent))
        .then((result) => res.json(result));
    });
    
    const client = new line.Client(config);
    
    function handleEvent(event) {
      console.log(event);
    
      if (event.type !== 'message' || event.message.type !== 'image') {
        return Promise.resolve(null);
      }
    
      let mes = ''
      if (event.message.type === 'image') {
        mes = 'レシピを探します';
        getFaceDetect2(event.message.id, event.source.userId, config.channelAccessToken);
      } else {
        mes = event.message.text;
      }
    
      return client.replyMessage(event.replyToken, {
        type: 'text',
        text: mes
      });
    }
    
    const getFaceDetect2 = async (messageId, userId, accessToken) => {
      console.log("getFaceDetect2");
      console.log(messageId);
      console.log(accessToken);
    
      //LINEbotから画像取得する
      const configImageAPI = {
        url: `https://api.line.me/v2/bot/message/${messageId}/content`,
        method: 'get',
        headers: {
          'Authorization': 'Bearer ' + accessToken,
        },
        responseType: 'arraybuffer'
      };
    
      let responseImageAPI;
      try {
        responseImageAPI = await axios.request(configImageAPI);
        console.log('image data get');
      } catch (error) {
        console.log('post Error');
        console.error(error);
      }
    
      //Custom Vision APIへのリクエスト
      const CUSTOM_VISION_API_ENDPOINT_URL = ''; //CUSTOM_VISION_API URL"If you have an image file:"
    
      const configCustomVisionAPI = {
        url: CUSTOM_VISION_API_ENDPOINT_URL,
        method: 'post',
        headers: {
          'Content-type': 'application/octet-stream',
          'Prediction-Key': '' //CustomVisionAPIのプレディクションキー
        },
        data: responseImageAPI.data
      };
    
      let responseCustomVision;
      try {
        responseCustomVision = await axios.request(configCustomVisionAPI);
        console.log("post OK");
        console.log(responseCustomVision.data.predictions[0].tagName);
      } catch (error) {
        console.log("post Error");
      }
    
      //LINEBOT
      await client.pushMessage(userId, {
        type: 'text',
        text: JSON.stringify(responseCustomVision.data.predictions[0].tagName) + 'がお薦めです'
      });
    }
    
    app.listen(PORT);
    console.log(`Server running at ${PORT}`);
    

    LINE BOT의 움직임



    미리 업로드하지 않은 이미지에서도 Custom Vision에서 기계 학습을 했으므로,
    어느 정도 인식하고 판정하는 것이 가능합니다.
    다음은 사전에 캡처하지 않은 이미지를 사용하여 테스트합니다.

    쇠고기, 실 곤약, 감자, 당근, 콩의 경우


    계란, 푸른 파, 베이컨의 경우


    쇠고기, 양고기, 양파, 당근, 토마토, 감자의 경우


    돼지고기, 두부, 파 파의 경우


    끝에


  • 요리명 뿐만이 아니라, 레시피의 URL을 가르쳐 주는 기능에서도 재미있을까 생각했습니다.
  • 좋은 웹페이지 즐겨찾기