冷蔵庫の見張り番

OVERVIEW

ハッカソンでSDGsに着目したプロダクトを作ろう!

YEAR 2021
  • 発表スライド


  • 概要

某通信大手の選抜型ハッカソンに参加したときに作ったものです。

作ったコードのGithubも公開しておきます。

全体(開発段階)はこちら

私の担当したバックエンドの本番環境はこちら

今回、5人のチームに割り振られて開発を行いました。(もちろん、全員初対面)

近年、SDGsが注目を浴びていて、企業でもこれにそった事業などが考えられています。

今回私が参加した企業もSDGs特務室のような部署を作り、事業に組み込んでいるそうです。

そこで、私たちチームに課せられたお題は

SDGsを達成するようなソリューションを開発せよ

ということです。

そこで、私たちのチームは

「冷蔵庫の見張り番 ~商品と賞味期限をアプリで確認できるようにすることで食品ロスを減らす~」

というテーマで開発しました。


  • 企画・構想

今まで参加してきたハッカソンでは、技術的な相談やフィードバックしか得られなかったが、今回は全然違った。

構想段階で、現役社員たちのダメ出しが凄かった。

アイデア発想ワークシートに従って構想していったのだが、実際に事業として稼働するときに、何が問題となるのかや収益性、競合との差別化について多くのことを突っ込まれた。

今回私たちが考えたものは、すでにアプリとして一部存在するものだ。(手入力で行うモノだが...)

そことの違いというものを特に聞かれ、なかなか難儀した。

今までアイデア出しが苦手で、ありきたりなものしか考え出せなかった自分としては、なかなか苦しかった。

だが、やはり今回自分の中で出ていた課題が、再度認識できたということで良い経験になったと思う。

次に生かそうとは思うが、なかなか改善策が思いつかないものである...

また、顧客層についてこれほど具体的に考えたこともなかった。

企業内で構想を出すときは、ここまで定義していなければならないと考えるとしんどいものである。

そして、ふと思ったのが、よくニュースで聞く「思ってもみなかった層に商品がヒットした」というのは、実は構想を出すという点においては失敗であるのだろうということだ。

その後、ソリューションの流れを9コマの漫画にしてまとめた。

正直言って、今回社員さんや審査員を満足させるような素晴らしいアイデアは思いつかなかったが、時間もなかったためにこの路線でスタートすることになった。

そして、今回のハッカソンで実装したい必要最小限の機能の洗い出しを行った

今回の実装で肝になるのが商品データの読み取りをいかに実用的な形で実装できるかだろうという点は、早い段階で想定された。ここにいかに注力させるかを、今回私はスケジュール的な工夫点として挙げたい。


  • 技術


今回このチームで、ハッカソンの参加経験だったり、技術的な知識などを考えて、私がチームのテックリーダーのようなポジションで動くことになった。

前回は、メンバーについていくだけで精一杯だったので、いきなりの大役にプレッシャーを感じた。

しかし、やるしかないので、徹夜覚悟で挑むことになった。

技術選定の段階で、メンバーの持っている技術スタックがいい感じでばらけていたので、大変決めやすかった。

私を含む二人がPythonを使ったことがあり、その人は大学院の研究で機械学習をやっているということで、この二人が画像処理の部分を担当することに決定。

一人はデザインを勉強している人なので、その人にフロントのデザインや発表資料のデザインを任せることになった。

ある一人は、大学院でVR関係を研究していて、Javascriptを勉強した経験があるということで、フロント側の処理を任せることになった。(これが、のちに失敗しそうになる原因だったのだが....)

最後の一人は、特に何か自分で勉強しているわけではないが、情報学部の学生でデータベースを勉強したことがあるということで、フロントサイドに入ってもらうことにした。

※普通、DB周りとかはバックエンドに属するが、今回はフロントサイドに属するという形にした方が説明しやすいので、このような形で表記する

そして、結果的にはこのようなシステムになった。

正直に言って、あまり良いシステムになっているとは思わないが、今回のメンバーではこれが限界だったような気がする。

画像処理部分はこれしかないが、DB管理部分とwebpack部分はこのようなことをする必要はなく、RailsやDjangoのようなフレームワークを使えばそれほど苦労するものではないと思う。

しかし、私がRailsやDjangoを使って作ろうとすると、私のタスクが多すぎて死んでしまうし、二人のリソースが余ってしまう。

微妙なところだが、良い落としどころは付けれたと思う。

(正直、誰か一人は、なんらかのwebアプリフレームワークを触っている人間が欲しかった...)


今回は、本番環境に上げることはできなかったので、すべてローカル環境でテストして実演することになった。そこも残念である。

(画像処理部分は相当重いので、AWSに上げることができるのかは知らない....出来るの?)

また、当初はpyzbarというライブラリを使って読み込んだJANコード(バーコードに入っている12桁の数字列で商品情報を示すことができる)から商品名を取得する過程で、外部API(YahooAPIとか楽天APIとか)を使う予定だった。

しかし、返ってくる商品名を見たら、

「送料無料 サントリー ペプシスペシャルゼロ 490mlペットボトル 24本入 特定保健用食品」

このような商品名以外のいらないテキストまで送ってくる。

これから商品情報を抜き出すのは困難であるため、断念した。

代わりに、JANコードから商品名を表示してくれるwebサイトがあったため、seleniumを使ってwebスクレイピングすることになった。

webスクレイピングを使うようになってしまったため、OCRのせいで処理時間が長いのに、さらに長くなってしまった。

また、HTTP通信を使ってDB管理部分にデータを送る方が良いかもしれないが、今後の拡張性も考えてwebsocket通信にすることになった。

今回、websocketsというライブラリを使ったが、かなり簡単にwebsocket通信が実装できるので、超おすすめである。

鬼門であるOCRには、当初Tesseract OCR(Googleが開発してるOSS)を使っていたが、処理が重すぎて使い物にならなかった。

そこでeasyOCRというものに変更した。

こっちはまだマシだが、正直言って実用ベースのものではない。(処理速度的にも、精度的にも)

本来は、専用のOCRを機械学習で作ればいいのだろうが、賞味期限というマニアックなデータを大量にすぐに集められないため、こうなった。

DB管理部分は、直接PostgreSQLを直接操作しているため、手間がかかっただろうと思う。(今回私は担当していないのでわからないが...)

まあ、総括して言えば、うまく既存のものを組み合わせて作ろうというのが、私のコンセプトだった。

時間があれば、機械学習にトライしたかったが、やはり知識もないしデータもないので、前回参加したハッカソン同様、技術不足を痛感した。


  • 反省点

1. 知識不足

毎回言っているようだが、今回もそうである。

前回よりも知識はついていたので、なんとかなったが、再度認識させられた。

機械学習という近年注目されている分野だが、それによってネットなどの情報量が多すぎて取捨選択が難しく感じ、手をつけていなかった。

必ずしも必要だとは思わないが、将来目指す分野によっては必要だろう。

精進しなけらばならない。

2. コミュニケーションの失敗?

少し表現が違うかもしれないが、大別するとこのような感じになりそうだ。

今回、実質一人にDB管理部分とwebpack部分を投げることになってしまった。


自分が手伝うと言えば、すべてうまくいくのだろうが、残念ながらそこまでwebpack部分などの知識があるわけではない。

しかし、その結果一人にまあまあ重めのタスクが集中し、一時期は終わらないかもしれないという問題が発生したことを考えると、何かうまくいく方法はなかったかと思う。

テックリーダー的なポジションになっていた自分にとって、もっと楽になりそうな方法を提案できなかったというのは反省点だ。

結果的には一人で頑張ってくれたので、今回の私のチームのMVPは彼だと思う。

3. アイデア出し

前回のハッカソンでもそうだったが、自分の弱点は面白いアイデアが出せないことだというのがよくわかった。(誰もがそうなのかもしれないが...)

アイデアを考えると、どうしても他にもありそうなものばかりが思いつくのだ。

他にもありそうなものだから、実装の方向性も大体すぐにわかるので、まったく新しいものを作ろうとしたときに対応できないような可能性がありそうだ。

今回も他の班の中には、自分が考えつかなかったようなものがあった。

粗削りなため、突っ込みどころはあるのだが、それでもそれを解消していく様子が見て取れた。

自分も素直にあのようになりたいと思った。


  • 良かった点

1. タスク管理と連携

先ほどの反省点の2番目と相反するように見えるかもしれないが、

先ほどは「全体的」な部分で、自分がメインでコードを書いていたような「個別」の部分ではうまくいった。

それぞれができそうな部分を、自分ともう一人でしっかり話しあえたし、関数の仕様などもしっかりと共有できて統合するときに問題なく統合できた。

こういったところは前回のハッカソンだったり、ロボ研の制御部門として動いてきた経験が生きたのかもしれない

2. 代替の手段の提案

自分の中での知識の引き出しが前回と比べて増えたようで、ダメそうなのがわかったらすぐに次の方法を取れたのは、今回素早く実装できた点に繋がってよかったと思う。

APIがだめならスクレイピング、HTTP通信が将来性を考えてダメそうならwebsocket通信へと移り変われたのは、良い成長ができたと思った。


  • 感想

今回参加したハッカソンでは、男子比率が異常なほど高かった。

僕らのチームが一番マシだったが、それでも男3、女2であった。

そして、男のほとんどが院生で研究しているテーマが機械学習に関係するものだったので、意図的にそうしたのかなと思った。

懇親会で就活や研究室についていろいろ聞けたのは大きかった。