LoginSignup
9
2

More than 3 years have passed since last update.

辞書、この単語の意味を教えて!

Last updated at Posted at 2020-11-09

目的

あなたは外国語で読書をやったことがありますか、分からない単語があったらどうですか?わたしなら、本を置いて、辞書アプリで単語を探して、本を拾って、続けます。もし、わからない単語が多い場合はひどくなります。

それで、今回、指で指差すと、言葉を辞書に入れて意味を出すツールを作りたいです。例えば:

IMG_3157.JPG
上の写真 → 「procrastination」の意味:怠慢、延期

必要なもの:

  • 画像のどこに指先があるか教えてくれるモデル -> handposeモデル

handpose パッケージは、入力されたイメージまたは動画ストリームから手を検知し、それぞれの手の特徴の位置を示す 21 個の 3 次元ランドマークを返します。このランドマークには、それぞれの指の関節や手のひらの位置も含まれます。
参考:https://developers-jp.googleblog.com/2020/04/mediapipe-tensorflowjs.html

  • 画像にあるテキストを認識するモデル -> OCRモデル

OCR(Optical Character Recognition/Reader、オーシーアール、光学的文字認識)とは、手書きや印刷された文字を、イメージスキャナやデジタルカメラによって読みとり、コンピュータが利用できるデジタルの文字コードに変換する技術です。
参考:https://mediadrive.jp/technology/ocr.html

システムの仕組みは下のイメージ

指でOCR.jpg

  1. カメラから画像をhandposeモデルに入れる
  2. handposeモデルの結果から指す手振り(:point_up:)かどうかを判断して、もし指す手振りだったら、画像をOCRモデルに渡す

  3. OCRモデルでテキストを認証して、単語の内容と位置をアウトプットする

  4. 人差し指位置から近い単語を辞書に渡す

実装

ml5jsを利用して、ウェブを作ってみます。

Handposeモデル

試しリンク(実施するために、右上の人アイコンをクリックしてください)

Handposeモデルのアウトプットの例
無題2.png
見えるように、モデルのアウトプットは手の21点です。で、必要な点は以下の写真になります。

無題3.png

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ml5.js - Handposeモデル</title>
  </head>
  <body>
    <h1>ml5.js - Handposeモデル</h1>

    <!-- このapp内のみVue.jsの管理範囲です -->
    <div id="app">
      <p>{{ detectedName }}</p>
      <video id="myvideo" width="640" height="480" muted autoplay playsinline></video>
    </div>

    <!-- ml5.jsとVue.jsをCDNから読み込みます -->
    <script src="https://unpkg.com/ml5@latest/dist/ml5.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

    <script>

      const app = new Vue({
        el: '#app',
        data: {
          detectedName: 'モデルのロード中です...',
        },

        // DOMの構築が完了してから実行する(それ以前だとvideoタグを見つけられない)
        async mounted() {
          const stream = await navigator.mediaDevices.getUserMedia({
            audio: true,
            video: true,
          });

          const video = document.getElementById('myvideo');

          video.srcObject = stream;
          const handpose  = await ml5.handpose(video);
          app.detectedName = 'モデルロード完了';

          handpose .on('predict', (results) => {
            console.log(results);
          });

          function onDetect(err, results) {
            console.log(results);
          }
        },
      });

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

OCR

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2