Xacti社の360°Web会議カメラにAI機能を実装する#5

はじめに

前回、第4回目として「ミーティング中の話者を特定する機能」について説明しました。

今回は ホワイトボードのOCR機能について解説します。

OCR機能

会議室にある、ホワイトボードに記載した文字を読み取る機能です。

実際のソースは以下にありますので、ご確認ください。なお、OCR機能については、OpenVINOを利用した実装とGoogle Cloud Vision APIを利用した実装の両方に対応しています。

https://github.com/OpenVINO-jp/360camera-meeting-demo/blob/main/meeting_demo.py

https://github.com/OpenVINO-jp/360camera-meeting-demo/blob/main/text_detect_OpenVINO.py

https://github.com/OpenVINO-jp/360camera-meeting-demo/blob/main/text_detect_gcp.py

使用モデル

  • text-detection
    • /intel/text-detection-0003/FP16/text-detection-0003
  • handwritten-japanese-recognition
    • /intel/handwritten-japanese-recognition-0001/FP16/handwritten-japanese-recognition-0001

meeting_demo.py

main()

今回はmain()内に関係する部分はありません。

callback()

以下はcallback()内の呼び出し部分です。ここではキーを押したタイミングでopenVINO_detect(),gcp_detect() を呼び出す実装にしました。

実際には、ホワイトボードの隅など特定のエリアを手でポイントした時にOCRを実行する等のアイデアが考えられます。

    key = cv2.waitKey(1)

    if key == ord("t"):
        ## toggle 0 -> 1 -> 2 -> 0
        flgWindow_mode += 1
        if flgWindow_mode > 2:
            flgWindow_mode = 0

    elif key == ord("w"):
        if flgWiteboard_mode == True:
            flgWiteboard_mode = False
        else:
            flgWiteboard_mode = True

    elif key == ord("g"):
        ##Google CloudVisionAPI
        gcp_detect(img)
        
    elif key == ord("i"):
        ##intel OpenVINO
        openVINO_detect(img)

関数定義部分

## --- gcp OCR ---
def gcp_detect(target_image):
    cv2.imwrite(detect_temp_path,target_image)
    gcp_d.detect_text(detect_temp_path)
## --- gcp OCR ---

## --- OpenVINO OCR ---
def openVINO_detect(target_image):
    cv2.imwrite(detect_temp_path,target_image)
    openvino_d.detect_text(detect_temp_path)
## --- OpenVINO OCR ---

text_detect_OpenVINO.py

以下を参考させて頂きました。ありがとうございます。

https://github.com/yas-sim/openvino_open_model_zoo_toolkit

https://github.com/yas-sim/handwritten-japanese-ocr

text_detect_OpenVINO.pyは日本語認識に必要な処理を1つのファイルにマージした内容です。テキストの領域検出を行い、日本語認識を行っています。

気づき

今回、手書き日本語処理を行いましたが、以下の気づきがありました。

  • ホワイトボードマーカーは太字を推奨。細いと認識率が落ちます。
  • もちろん綺麗な字が望ましい
  • 部屋の明るさなどもかなり影響する
  • 読み込む画像に対しての前処理が重要
    • cv2.imread(path,cv2.IMREAD_GRAYSCALE) -> cv2.threshold
    • 自動検出(cv2.THRESH_OTSU)は期待どおりにならない
    • cv2.THRESH_BINARYの閾値を調整する必要がある
  • ホワイトボードを拡大した画像を入力にすると認識率が下がる場合がある
    • 認識させる画像と、 人が見る画像を変えるなどの工夫をする

まとめ

第5回目として、ホワイトボードのOCR機能について解説しました。気づきにも書きましたが、実際は様々な要素が関係してくるため、細かいチューニングが必要になってくると思います。ぜひ試してみてください。

余談となりますが、私自身、最近は様々なRPA製品を扱う機会も多く、OCR機能を試す場合があるのですが、OCR機能よりも前に、自分自身の文字の汚さを思い知らされる結果となり大変困っています。どなたか綺麗な字の書き方をご指導頂けると非常に嬉しいです。