Monoxer Intern Report #3_手書き文字評価の改善(chikai)

自己紹介

モノグサ社にてソフトウェアエンジニアインターンとして参加した伊藤 誓です。 現在は東京大学大学院に所属しており、VR環境におけるユーザーインターフェースについての研究を行なっています。

なぜモノグサのインターンに参加したのか

夏期インターンを探している最中に、AtCoderJobsというサイトに乗っている掲載を見て応募しました。参加の決め手になったのは、自社開発を行なっている会社で、幅広い技術領域を取り扱っており新しい技術経験が出来ると感じたことや、「記憶」に対して科学的観点からアプローチしていくというアプリのコンセプトが興味を引いたことなどでした。

取り組んだこと

今回のインターンでは、手書き文字評価周りの改善に取り組みました。その中でも、大きく分けると3つのことに取り組みました。

アルファベット対応
元々、アルファベットの手書き文字評価を行うのには以下のような課題がありました。

  • 十字線の上に表示されていて不自然
  • フォントの形が不自然
  • 1画ずつ分けて書く必要がある

内部で実装されている言語IDやテキストの内容から「アルファベットの問題である」と判断された場合には、十字線ではなく四本線の表示を行いました。

フォントの形に関しては、デザイナーさんとも打ち合わせしつつ、svgファイルの変更を行いました。また、背景に表示する4本線と合うように、svgファイルを編集する処理を行いました。52個もあるファイルに対して編集をするのは面倒なので、ファイルの情報を自動で編集するスクリプトを記述しました。

f:id:corp_monoxer:20211007114724p:plain

繋げ書きに関しては、内部のアルゴリズムの根幹に関わる部分なので、まず既存のライブラリの中身を理解する必要がありました。その後、アルファベットにも対応できるように、「複数回の繋げ書き」「離れたストロークを補間する処理」などを実装しました。

アルゴリズムのテストツールの開発
2つ目に、アルゴリズムのテストツールの開発に着手しました。手書き文字評価では、正解の文字と、ユーザの書いた文字を照らし合わせて正解/不正解を判定しますが、評価の精度が低いとユーザ体験の質の低下に繋がってしまいます。そのため、出来る限り精度を上げる必要があります。しかし、アプリに直接組み込まれている状態でアルゴリズムの精度を評価するのは非常に大変です。そこで、一連の評価/デバッグの流れを簡単にするためのテストツールを開発しました。

アルゴリズムに変更を加えた後、コマンドを1つ叩けば、データベースから作成したデータセットに対してアルゴリズムが実行され、変更による寄与の大きいケースをまとめて出力してくれます。さらに、実行時間やスコアの構成要素などのログも閲覧可能にすることで、より詳細なデバッグが可能になっています。

f:id:corp_monoxer:20211007114830p:plain f:id:corp_monoxer:20211007114840p:plain

アルゴリズムの改善
3つ目に取り組んだこととしては、手書き評価アルゴリズムの改善です。自分で開発したテストツールを用いて、上手くいかないケースを探しつつ、改善に取り組んでいきました。

自分は競技プログラミングを趣味の一つとしていますが、感覚としてはヒューリスティックコンテストで出題される問題に非常に近かったです。一方で、普段のコンテストと違っていると感じた点として、入力ケースのほとんどが暗黙の制約を満たしている場合があったり、最悪計算量が悪いアルゴリズムでもほとんどの入力ケースでは上手くいくため事実上問題ない場合などがあったりして、非常に面白かったです。

学び

自分にとっては、他の人と共同開発しながらプログラムを書くという経験があまりなかったので、その部分は非常に勉強になりました。Pull Requestの出し方や、コードレビューへの応答など、円滑なコミュニケーションを取る上では気をつけるべきことがたくさんありました。

また、自分のコードが本番のアプリケーションに統合される経験も新鮮で、「どのようにして出来るだけ安全なコードを書くか?」といったことを考えるのも新しい経験でした。今までは、強い型付けのある言語のメリットが実感できていませんでしたが、実行時エラーの許されない環境で Kotlin を書いていると、型推論をしてくれる有り難さが身に染みた気がします。

社員さんとの関係

コロナ禍でのインターンでしたが、出社して働くかリモートワークするかが比較的自由に選べる環境でした。私は、週に2回出社して残りはリモートという感じでした。リモートの場合でも、1日に1回はメンターさんとの 1on1 ミーティングが用意されたので、特に困るといったことはありませんでした。

相談したいことがあった場合でも、基本的にメンターさんに Slack を送れば即座に反応してくれるので、助かりました。他にも、Jira などを用いてプロジェクトが管理されており、他部署の社員の方も含めて柔軟な議論をすることができました。社員全員がプロダクトの品質向上に対して真摯に向き合っている様子が伝わってくるので、働いているだけで創造性が刺激される素敵な環境でした。