ブログ

鯛で鯛を釣る – 下町ディープラーニング #7

みなさんこんにちは。dottの清水です。

第6回の「技術と畳は新しい方がいい」では、画像からの物体検知のタスクでは、OpenCVのようなカスケード分類よりも、ディープラーニングというか畳み込みニューラルネットワーク(CNN)を使ったTensorFlow Object Detection APIの方がより柔軟に、そして作業の負担も少なく検知ができるというお話をしました。

何から何まで素晴らしいような話にしてしまいましたが、実はディープラーニングならではの大変さがあります。

みなさんご存知、大量の学習用データの用意です。

そして下町の工場は大企業のようにビッグデータをささっと、あるいは札束で殴って集めることが難しいので、僕たちが「大量のデータ作成・収集をどのように効率化して解決しているか」という話をしたいと思います。

ビッグな悩み

カスケード分類も機械学習なのでそれなりのデータが必要になりますが、ディープラーニングによる分類器を作る際、より多くの学習用データを集めるか、自分たちで作る必要があります。

今回のプロジェクトでは「握らな寿司」というオリジナルの料理を検知する必要があるので、データも自分たちで用意することになりましたが、一般的には専用のデータがいらないケースも多いと思います。「ImageNet」のように、公開された汎用的なラベリング済みのデータが使えるかも知れません。

しかし僕たちは「AIのラスト1m」という、汎用的で全人類をカバーしようとするAIでは難しい細かなところを解決することが仕事として多いので、必然的にデータを自分たちで用意することも多くなってきます。

この「大量のデータ」というのが、下町で働く僕らにとってディープラーニングによるAI作成を困難にしている最大の要因だと思っています。それはおそらくディープラーニングで何か作りたいと思っている人たちが、MNISTのような手書き数字のサンプルデータを使って数字判定のコードを動かした後に、一歩踏み出して自分たちのフィールドでプロダクト開発を実践することが難しくなっている要因でもあるでしょう。

MNIST sample images
MNISTの例 Josef Steppan, CC 表示-継承 4.0, リンク

SAWARABIプロジェクトに携わるチームには3人しかいません。その中でラベリングする手があるのが1人くらいです。

最終的にはその小さなチームで大量のレンゲをラベリングして、実際に2万枚以上の画像のラベル付きデータ(10万ラベルくらい)を作成できましたが、そこまでには多くの紆余曲折がありました。(ちなみに僕はしばらくレンゲを見ると嫌悪感を抱いてしまうようになってしまった訳ですが、それでもかなりの量のラベリングを効率化して終えることができたと思っています)

秒速0.5ラベリング

下の画像のように、画像の中からレンゲだと思われるエリアを四角で選択するのがラベリングの作業です。「LabelImg」のような、オープンソースのラベリング専用ソフトを使ってある程度簡単にできるようにはなっています。

僕たちがやらなければいけなかったことは:

  • レンゲに「握らな寿司」を乗せた状態で写真を撮影する
  • ソフト上でレンゲを四角で囲む
  • ソフト上でレンゲにラベルをつける
    • ラベルは「握らな寿司」の味ごとに5種類 x 5段階の食べ残し具合 = 25種類

これらを10万回ほど反復すればいいだけです。慣れてきたとして2〜4秒に1ラベルつけることができたとして、20〜40万秒なので大体56〜112時間くらいかかることになります。これなら人手でも不可能ではなさそうな気が…していたんでしょうね。当時は安易に考えていました。

僕たちは当時仕事を手伝ってくれていた数名の方にもお願いして、仕事の合間の時間でラベリングに取り掛かってもらうことにしました。

なぜAIが必要かを改めて知る

しかしすぐにその幻想は脆く崩れ去ります。

どんなことが起こったのかというと…

  • 手伝ってくれる方にも都合があるので、思うように時間が取れない。
  • 作業者が持っているPCへのラベリングソフトの導入がうまくいかない。
  • 当然作業は疲れるので、どんどん効率が落ちてくる。
  • フリーズしたぁぁぁあああ!!!!

と、予想だにしていなかった問題が多発して、そこまで猶予のない時間が刻々と減って行きます。

それもそのはずです。

僕たちが作ろうとしているものは、人間には向かない作業を自動化するAIです。なので作業自体は人間にとって煩雑で困難なものであるでしょうし、逆にそうでないと僕たちが作ろうとしているものに価値はありません。ましてやラベリング自体も初めてやるような急造チームです。そのチームをまとめてサポートができるだけの時間が僕たちには残されていませんでした。

こうしてラベリング作業の困難を目の当たりにした時に、改めて自分たちが作ろうとしているものの価値を思い知ったのです。

え?深淵もこっち見てる?

すると僕たちにある疑問が浮かんできます。

「エンドユーザーと同じ悩みを抱えているのであれば、解決方法は同じじゃないか?」

今思うとなぜそんな単純なことに気づかなかったのかと思います。エンドユーザーとしては「大量の画像を人間が処理するのが大変」だから、僕たちが自動でレンゲを検出するものを作ろうとしている訳で、僕たちが抱えている悩みと同じものです。

さて自分たちが世の中の悩みを解決しようと意気込んでいたわけですが、その悩みの中に自分たちが取り込まれていたわけです。

このプロジェクトでは写真の撮影から全て自分たちでやっていたので「撮ったものが何か」と「どこに置いたか」さえ分かれば、あとは撮影した画像からレンゲの位置を特定するだけで大量にある全種類のラベリングがすぐに完了するのではないかということに気づいた瞬間でした。

AIでAIを釣る

実証実験の初期段階では「プロダクトとして満足な精度ではないが、限定的にはそこそこ成功する」という状態をまず目指します。自分たちの開発方針や仮説が大きく外れていないことをまず確認し、その使用感や課題などをパートナーと共有するためです。

頂上を目指すルートのことばかりを考えず、5合目を適切なルートで素早く登る、そんなイメージでしょうか。

では実際にどのような方法で自分たちの作ったAIを、頂上を目指していく過程で自分たちの開発に取り込んでいったのか。

その話はまた、次回の記事で。