【若手社員による技業挑戦LOG】
OCRプログラムを用いて栄養バランスの
計算システムを構築してみた

【技業LOG】技術者が紹介するNTTPCのテクノロジー

2024.06.03
吉野 虎将

ネットワークエンジニア
吉野 虎将

技業LOG

若手社員による技業挑戦LOG
- 技術トレーニング実施レポート -

本記事は、NTTPCの若手社員育成施策である「トレーナー施策」の参加者が、実施した技術トレーニングの内容を紹介しています。
参加者にはトレーナーがアサインされ、課題設定からシステム構築、発表という一連の流れを経験しました。
この取り組みによって、部署をまたいだつながりの形成やコミュニケーションの活性化、技術力の向上などが促されることを目指しています。

はじめに

テクノロジー&オペレーション開発本部サービス開発部の吉野です。現在はInfoSphere®など、ネットワークサービスを支えるバックボーン基盤の開発および運用を担当しています。

今回は当社の「トレーナー施策」に参加しましたので、その取り組みについて紹介します。

「トレーナー施策」への参加

トレーナー施策とは、当社入社三年目までの社員を対象に行われた育成施策です。施策に挑戦するトレーニー1人に対して、先輩社員のトレーナーが1人付き、お互いにコミュニケーションを取りながら、三ヶ月の期間でIoT機器を用いて新たな価値(サービス)を生み出すことにチャレンジしながら、IoT関連技術に触れることを目的としたものです。

私はトレーニー(若手社員側)として参加し、トレーナーと週一のミーティングで進捗報告や方針を決めたりしながら進めました。

トレーナー施策での取り組み1: 何を生み出すか

自分が興味あることをサービスにする

まず、機器の選定と作るサービスを何にするかを考えるところから始めました。私は最初、担当業務の稼働時間の合間を縫って施策に取り組むのは厳しいと考え、作りやすそうな案を10案ほどトレーナーに提案しました。対してトレーナーは「限られた時間の中でも、今までにない新しい価値を生み出すことが良い」という考えでした。自分の興味ある事、この施策が終わっても続けたいと思えるようなことをしないと自身の成長にもつながらない上、なあなあな感じで終わるだけの施策になってしまうというトレーナーの意見に、最終的に私も納得しました。再度、案を練り直し、自分の興味があるフィットネス関連でIoT機器を使ってできそうな案を改めて10案考えてみました。

その10案の中から、新しい価値を生み出せるか?実現可能性はあるか?を考慮し、「PFCバランス計算システム」という案を選びました。

PFCとは、P(たんぱく質)、F(脂質)、C(炭水化物)のことで、トレーニングを本格的にしている人は、一日単位でそのバランスを計算して身体づくりをしています。しかし、毎度毎度、手計算で計算するのは面倒なので、食品の成分表時を写真撮影してPFCのバランスを自動計算してくれるシステムの作成を目指すことにしました。また、そのシステムを構築するIoT機器は、自由度の高いRaspberry Pi(以下、ラズパイ)を選定しました。
実際に日頃からトレーニングをしている自分自身が、あったら便利だと思うものを選択しましたが、なかなかにニッチなものになりました。

トレーナー施策での取り組み2: 実際にシステム構築してみた

実際にシステムを構築する上で必要なものは、まず写真を撮るためのカメラモジュールです。そして、撮影した画像から文字を的確に読み取り、データとして出力できるようにするOCRプログラムです。

システム概要

システム概要

システム動作フロー

ラズパイに接続したカメラモジュールで、対象となる食品の栄養表示表を撮影
↓
写真内のレイアウトを解析
↓
OCRプログラムで処理
↓
LINE Notifyを用いて、出力結果をLINEに送信

システム開発1:文字認識の失敗

① 画像の文字認識

ラズパイにカメラモジュールを接続する前に、まずは画像上の文字をラズパイが認識できるかどうかを確認しました。
Tesseract-OCRというオープンソースのOCRプログラムを用いました。
Tesseract-OCR :https://github.com/tesseract-ocr

画像内の文字の出力先結果をLINEに変えるために、LINE Notifyでトークンコードを発行し、それをコードに埋め込んでLINEに出力します。画像内の文字がLINEに出力されているのがわかります。

開発にあたって、下記のWebページを参考にしました。

参考にしたサイトはこちらです。
参考:https://gangannikki.hatenadiary.jp/entry/2019/07/30/190000

② 撮影した画像の文字認識

次に、ラズパイにカメラモジュールを接続し、成分表示を撮影します。今回掲載した撮影対象は、画像内の明暗の差、凹凸、文字以外の線などの様々なノイズがあります。あえてこのような結果に影響を及ぼしそうな環境でテストしてみました。

この画像を先程のプログラムに落とし込みました。

LINEに出力される文字が正しく認識できていないのがわかります。原因としては、下記の二点考えられます。

  1. 撮影対象のノイズが多すぎる
  2. OCRプログラムの文字認識がうまく判定できていない

「1.撮影対象のノイズが多すぎる」ということに関しては想定内なので、先程述べた様々なノイズを取り除きながら撮影していきましたが、結果は変わりませんでした。そのため、原因は「2.OCRプログラムの文字認識がうまく判定できていない」ということがわかりました。

システム開発2:OCRプログラムの作成

今回利用したOCRプログラム「Tesseract-OCR」は、画像内に含まれる完璧な文字であれば、特定の文字に紐づけることができていました。ただし、少しでもノイズの要素がある文字は判定できません。ノイズがあっても特定の文字に紐づけられるような機械学習をする必要があります。

まずは、機械学習によって簡単な手書き文字を特定の文字に紐づけることができるのか、という検証を行いました。
次のGoogle Colaboratoryサンプルコードを用いて、手書き文字のデータセットをPC上で認識できるようにしました。
https://colab.research.google.com/drive/1TEjxN8xZVC0k08WzG_Ie8dyaGloSqJzA?usp=sharing

例えば、上記の三つの「C」は濃淡が違いますが、これらはすべて同じ「C」という文字であるということを認識させます。「C」を含め、データセットとして様々な文字を認識させます。

精度100%でデータセット内にある文字を機械学習することができました。
次に、手書きの文字が機械学習した文字と紐づけられたかを確認しました。

参考にしたサイトは下記です。
https://child-programmer.com/japanese-handwritten-text-ocr-outline/

手書きの「日」という文字が、先程学習した「日」であると99%の確率で予測しました。
このように、自分が学習させたい文字をデータセットとして機械学習させることで自由に文字認識ができそうです。

今回の成果と今後の取り組み

ここまでで実際の取り組みは期間的な都合で終わってしまい、想定していたゴールからは程遠い成果となりました。今回は、自分の興味ある分野に発展させるまでに、必要な技術に触れる程度で収まってしまいましたが、LINEに画像内の文字を送ること、そして機械学習をして文字認識を行うことができたので、さらに進めればなんとか動くようにはなるかも?と思っています。

また、今回見つかった課題と、その解決のために必要な取り組みを考えてみました。

課題 必要な取り組み
文字列の文字を一つ一つ認識すること。
文字以外の記号等を除去して文字認識を行うこと。
文字列は文字列を矩形の領域として認識させ文字認識を行うプログラムと文字以外の記号等の除去もGoogle Coraboratry上で行えそう。
カメラで撮影し文字が作成したOCRプログラムで動かないかもしれない。 必要な文字のデータセットを学習させ、検証を何度も行う必要がありそう。
撮影した時点で画像ファイルをプログラムに格納して実行する自動化が必要。 ラズパイ上でファイルをどのように扱って、プログラムを展開する場所を設定する必要がある。
指定の文字のみを抽出しなくてはならない。 指定の文字のみを抽出するプログラムの作成する必要がある。pythonの勉強がもっと必要。
抽出した文字および数字を使って人間が読み取りやすいデータを作成する必要がある。 文字認識したデータをその後計算できるものとして扱うようにはどうすればいいか調べるところから始める必要がある。

上記以外にも課題点が多いので、前途多難だと考えています。

最後に

今回はトレーナー施策と、そこで取り組んだ内容について紹介しました。
開発はここで終わりとなり不完全燃焼感は否めませんが、様々な学びを得るいい機会でした。担当業務からは遠く、普段はあまり触れたことのない分野に触れる機会は、自分ではなかなか作ることがないので、自分で一から分からないことを調べ、何とか成果物を出そうとする開発者っぽい経験が、入社して比較的早い段階で経験することができて良かったです。ずぶの素人ながらも、目に見えるものを開発することに少し興味を持ちました。

普段はネットワークエンジニアとして業務をしていますが、他分野にも知見があるエンジニアとなれるよう、これから積極的に技術に触れて精進していきたいと思います。

  • 「LINE Notify」は、LINEヤフー株式会社または関連会社が提供するサービスです。
  • 「Raspberry Pi」はRaspberry Pi Ltdの商標です。

技業LOG

NTTPCのサービスについても、ぜひご覧ください

おすすめ記事

    お気軽にご相談ください