기분에 맞춘 향기를 추천! 얼굴 표정에서 감정을 읽고 최적의 아로마 오일을 LINE으로 보냅니다!

이번은, 기계 학습을 사용해 얼굴의 표정으로부터 감정을 읽어, 감정에 맞춘 아로마 오일을 LINE에서 추천해 주는 어플리케이션을 작성했습니다!
이름 붙여 「향기 추천 시스템」!!



제작에 이른 이유



나는 "향기"를 좋아하고 아로마 오일과 향, 시샤 등을 잘 이용하고 있습니다.
거기서, 자신의 감정에 맞추어 「향기」를 추천해 주는 서비스가 있으면 좋다고 생각하고 있었습니다.
하지만 좀처럼 그런 서비스는 없어. 이번에는 프로토 타입을 만들려고 생각했습니다.

사용한 서비스



Teachable Machine
Integromat

사용한 라이브러리



ml5
axsios

기계 학습



이번에는 Teachable Machine을 이용하여 “웃는 얼굴”, 분노”, “피로”, “슬픔”이라는 감정을 각 500장씩 학습을 시키고 있습니다.


코드 전문



Face-Aroma.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Face-Aroma</title>
  </head>

  <body>
    <h1>気分に合わせた香りをおススメ</h1>
    <div id="console_log"></div>
    <video id="myvideo" width="640" height="480" muted autoplay playsinline></video>


    <script src="https://unpkg.com/ml5@latest/dist/ml5.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

    <script>
      // 作成したモデルのURL
      const imageModelURL = 'https://teachablemachine.withgoogle.com/models/XXXXXXX/';

      console.log = function (log) {
      document.getElementById('console_log').innerHTML = log;
      }

      async function main() {
        // カメラからの映像取得
        const stream = await navigator.mediaDevices.getUserMedia({
          audio: false,
          video: true,
        });

        // IDが"myvideo"であるDOMを取得
        const video = document.getElementById('myvideo');

        // videoにカメラ映像をセット
        video.srcObject = stream;

        // 自作モデルのロード
        classifier = ml5.imageClassifier(imageModelURL + 'model.json', video, () => {
          // ロード完了
          console.log('Model Loaded!');
        });

        // 分類処理を連続的に行う
        function onDetect(err, results) {
          if (results[0]) {
              console.log(results[0].label);
              if (results[0].label === '笑顔') {
              // storytelling 関数実行
                 face1();
              }
              if (results[0].label === '怒り') {
                face2();
              }
              if (results[0].label === '疲れ') {
                face3();
              }
              if (results[0].label === '悲しみ') {
                face3();
              }
            }
          classifier.classify(onDetect);
        }
        classifier.classify(onDetect);
      }

      // 引数に送りたいメッセージを入れる
      async function sendWebhook(message) {
      // Integromatに送る
      try {
      // 取得したIntegromatのWebhookURL
      const res = await axios.get(`https://hook.integromat.com/XXXXXXXXXXXXXXX?message=${message}`);
      console.log(res.data);
        } catch (err) {
      console.error(err);
       }
      }

      function face1(){
            sendWebhook('幸せでハッピー。そんなときのおすすめの香りは「ローズ」、「ネロリ」です!');
      }
      function face2(){    
            sendWebhook('イライラしてしまう。そんなときのおすすめの香りは「サイプレス」、「ローマンカモミール」です!');
      }
      function face3(){    
            sendWebhook('お疲れですね。そんなときのおすすめの香りは「レモン」、「ペパーミント」です!');
      }
      function face4(){
            sendWebhook('あなたは頑張っていますよ。今日のおすすめの香りは「ラベンダー」、「ローズマリー」です!');
      }
      // 実行
      main();

    </script>
  </body>
</html>

마지막으로



이번 추천의 아로마라고 판정한 감정은 1:1 대응으로 LINE으로 보내고 있었습니다만, 각 감정 중에도 몇개의 후보를 준비해 랜덤으로 송신하는 것 같은 구조도 실장하고 싶었습니다.
업데이트를 도모해 나가려고 합니다!

참고 기사



딸을 만날 수 없는 날도 자신의 목소리로 그림책을 읽을 수 있도록 했다. 기계 학습 입문.
코드, LINE 제휴 등 참고로 했습니다.

좋은 웹페이지 즐겨찾기