研究職から事業会社へと活躍の場を変えながらも、一貫して画像認識の研究開発に携わり続けてきたyu4u氏に、コンペティションに参加を決めた経緯や取り組みにおける工夫、参加することで得られた学びについて話を伺った。
水産研究・教育機構主催 漁業×AIチャレンジ『魚群検知アルゴリズムの作成』コンペティション編
コンペティション概要
近年、水産分野では漁業の生産性向上や漁獲物の高付加価値化を目的に、ICTを活用した様々な取り組みが活発化している。特に、日本においては漁業就業者が減少しており、操業の効率化や省力化が課題となっており、その解決手段としてIoTやAIといった先端技術の応用にも注目が集まっている。 そこで今回、海外まき網漁業(カツオやマグロ漁)における「魚群探索の効率化」をテーマとして、ドローンの空撮画像を利用し、魚群を自動検知するAIアルゴリズムの作成にチャレンジするコンペティションが開催されることとなった。
コンペは、社内では得難い知見を得る絶好の機会。
実は、SIGNATEさんをはじめとした各種社外コンペには、以前から何度か参加していました。私に限らず、データ分析コンペに何度も参加している方の多くはそうだと思うのですが、半分中毒のようなもので(笑)、手を動かしていないと落ち着かないのです。特に、私は立場的にもプレーヤーよりもマネージャーとしてのミッションの比重が高く、社内業務では自分でモデルを組んだりする機会が少なくなっているので、それを補う意味でも社外のコンペは有意義に感じています。 今回のコンペに参加した理由は、物体検出がテーマだったからです。直前にも別の物体検出のコンペに参加していて、コードを綺麗にまとめきれず、結果も納得いくものではなかったので、リベンジしたいと思っていたんです。また、機械学習で使ってみたいアルゴリズムや、コードの整理で使ってみたいフレームワークもあったのですが、このコンペでならまとめて試すことができる。自分の知的好奇心を満たしつつ、本業に活かせそうな知見が得られるチャンスだと思い、参加を決めました。
データの特性を見極め、適切な前処理を心がけた。
コンペ概要を見てまず感じたのは、正解の判別が難しそうだなということ。今回用意された画像データには魚群の種類を示す2種類のラベルが用意されており、それを適切に付与していくことが求められていました。 ところがそのうち1種類のラベルは、海面下で待機している魚群を表すもので、人間の私が見ても判別が難しいようなもの。その中で精度を担保するためにはどうしたらいいのか、ここで工夫が必要かなと考えました。
また、魚群の位置を表すバウンディングボックスの大きさにばらつきがあるのも、少し厄介でした。画像が大きいままモデルの学習を行うと非常に時間がかかるため、縮小したいところですが、縮小しすぎると小さな検出対象を認識できなくなってしまいます。そこで、適切な縮小率を見つけるべくEDAを行いました。私は画像認識の領域ではEDAをほとんど行わないケースもあるのですが、この前処理の段階を丁寧に行ったのは、私なりの工夫と言えるかもしれません。
手間を惜しまずにチューニングを徹底したことが奏功した。
一番注力したのが、アンサンブルの部分です。複数モデルのアンサンブルを行うのはごく普通ですが、そのチューニングを徹底することで精度を上げようと考えました。例えば、バウンディングボックスを統合するのかしないのかの閾値や、各モデルをどのくらい重要視するかの重みをハイパーパラメータ自動最適化フレームワークであるOptunaでチューニングした結果、精度がかなり向上しました。 チューニングも、訓練用データと評価用データを1つのパターンで分割するホールドアウトで行うのではなく、クロスバリデーションで行いました。テーブルコンペでは一般的に行われているのですが、画像系のコンペ、特に学習に時間がかかる物体検出のコンペでは、行われない場合も多いのですが、手間を惜しまずに丁寧にやりきりました。 これは、モデルの作成や調整とは少しずれてしまうので余談なのですが、バウンディングボックスの座標フォーマットの調整には苦労しました。今回私が使った複数の検出用のモデルは、ツールによって、あるいは同一ツールでもAPIによって指定形式が違い、左上と右下の座標で表されていたり、中心+幅/高さで表されていたりするのです。それぞれのツールの適切な座標系に整理するのは、かなり時間を取られました。
順位だけではない目的を持つと、コンペはより有意義なものになる。
データ整理やチューニングをはじめ、一筋縄ではいきませんでしたが粘り強く改善を続けた甲斐があり、無事2位に入賞でき、直前に参加した物体検出コンペにリベンジを果たすことができました。 このコンペで得られたものは結果だけではありません。コンペ参加の目的でもあった、機械学習アルゴリズムやフレームワークの活用もでき、一定の知見が得られました。本業にも持ち帰れる部分が多く、参加してよかったと思っています。 もちろん、参加する以上、順位を追い求めていきたいですし、そこが楽しみでもあります。しかし、私の場合は今回のように、このフレームワークを使ってみたいとか、この領域の知見を得たいなど順位とは別の目的を持って参加することが多いです。その方が得られるものが多く、仮に入賞できなくても参加した意味がある。今後も、入賞は狙いつつも自分のスキルアップに利用するくらいの気持ちで、コンペに参加し続けたいですね。
防衛装備庁主催 オフロード画像のセグメンテーションチャレンジコンペティション認識精度部門編
コンペティション概要
オフロードでは、公道での自動運転等とは異なり、詳細な三次元地図や路車間通信等のインフラを利用することができない。そのため、オフロードでの自律走行のためには、周辺の環境について、走行できる領域や障害物を高精度かつ高速に認識することが重要となる。そこで、オフロード環境等の実走行で得られた画像を領域分割するアルゴリズムを作成し、認識精度と推論速度を競うコンテストが開催されることとなった。
▼動画はコチラ▼
試したい技術を試す場として最適だった。
このコンペには認識精度部門と推論速度部門の2部門があり、私は最初、推論速度部門へ応募していました。推論速度部門では最終的に4位と入賞は叶わなかったのですが、推論速度部門応募時のリソースを活かす形で認識精度部門へ参加したのが経緯です。 推論速度部門への参加当初、参加者同士によるオンラインディスカッションを覗いたところ、モデル推論時間よりも算出された結果を最後に変換するところで時間がかかる趣旨の議論がされていました。それなら、後処理をこうすればいいんじゃないかとのアイデアがその場で湧いて、今から参加しても勝てるのではないかと思ったのです。実際には、結果が発表されてみたら上位入賞者は皆さん同じような処理をされていたので、結局そこでは差がつきませんでしたけどね。 加えて、しばらくC++を触っていなかったので、久しぶりに使ってみたいなと思っていました。セグメンテーション技術に関しても使いこなせているという感覚はなかったので、そこを学べそうとの期待もありましたね。特に、損失関数に関しては初歩的なものしか利用したことがなく、他の損失関数を使った場合にどれくらい精度向上に効果があるのか興味がありました。それを試す機会として、このコンペはうってつけだと思い、途中からではありますが参加することにしました。
初めにぶつかったのは、類似シーンの画像をどう処理するかという壁。
作業としてはまずEDAを行ったのですが、オンラインディスカッションを覗くとトレーニング用のデータとテスト用のデータで同じような画像があるとの気になる発言を見つけました。その確認のために、試しにクラスタリングしてみたところ、類似画像のクラスタがたくさんあることがわかりました。このようなデータをランダムに訓練と評価に分割すると正しい評価ができなくなる。最初に頭を悩ませたのが、この問題でした。 学習と評価に類似した画像が混在しないように分割するのが筋なのですが、クラスタを見てみると、雪道のようなクラスタが存在し、これをまとめてしまうと、一部雪道を認識できないモデルができてしまうことになります。色々検討したのですが、ここだけに時間を注ぎ込むわけにもいかないですし、締め切りも近づいてくる。そこで、同じようなデータが入らないようにする工夫を諦めて、ランダムに評価と学習を分けるアプローチをとりました。今思えば、雪道の画像だけ別扱いにするなど、やり方はあったのかもしれません。しかし、ここで早めに見切りをつけたおかげで、他の部分に注力できたので、判断が間違っていたわけではないと思います。似た画像とはいえ完全に同一ではないので、参考にはなるだろうとの目算もありました。
気になっていた損失関数を丁寧に取り入れていった。
信頼できる評価データセットの構築を諦めた分、力を入れたのが損失関数の部分です。そもそもコンペに参加した目的の一つが、普段使わないような損失関数を使うこと。そこで初歩的な損失関数に加えて、セグメンテーションに関するコンペティションで良く見かける、試してみたい損失関数がいくつかありました。 例えば、同じ1ピクセルでも、膨大な領域を持つ空などの1ピクセルを間違えるのは、本コンペの評価指標であるIoUではそれほど大きな問題にはなりません。一方、ごく小さなオブジェクトの1ピクセルの持つ意味はとても大きい。このようなIoUという評価指標を近似できるとされる損失関数の利用を検討しました。ただ、リファレンスとなるような損失関数のコードは多くあるのですが、正しい実装なのか疑問が残るようなコードもあり、自分なりに複数のコードを見比べたり、今回のコンペに向けて改良したりした点が、手間をかけた部分ですね。
自分なりのパイプラインを構築できたという手応え。
推論速度部門では入賞できませんでしたが、こちらではそもそも高速化のためのアプローチが他の人とは少し違っていたかなと思います。多くの方が、モデルを小さくすることで処理時間を短くするようなプローチをしていました。一方、一定以上モデルを小さくしても高速化への寄与が限定的であることから、私はモデルをそこまで小さくしないことで精度を担保しました。その分、評価対象となる条件であるモデル精度が閾値に対してかなり余裕があったので、閾値をクリアできるギリギリの精度までテスト画像に対して推論を行わず固定の結果を返すことで、精度を処理速度に変換してしまうアプローチを取りました。この手法は、モデルを小さくした場合の精度と速度のトレードオフよりも効率的だったと思うので、加えて画像のデコーダー等の部分でもう少し工夫できていれば、入賞できたのかもしれません。 認識精度部門での入賞もありがたかったですが、一番参加して良かったと思った部分は、セグメンテーションに関して自分なりのパイプラインを構築できたこと。今のところ、実務でセグメンテーションはやっていませんが、将来的に使う場面が来たら活用できると思いますし、違うコンペに参加した場合にも活かせる手応えを感じています。今回のように、コンペで得た知見を、また次のコンペで活かす形で、どんどん自分の幅を広げていけたらいいなと思っています。
今後の目標
水産研究・教育機構主催のコンペでは、pytorch-lightningという汎用的なフレームワークを利用して実装を行ったため、他のコンペでも活用できそうなコードベースは構築できたと思っています。ただ、アンサンブルを含めて全てを自動化させることはできず、アンサンブルのための推論を行ったり、その結果を統合したりする部分はそれぞれ手動でコマンドを叩いている状態でした。今後は、こうした部分も全てクリアした、物体検出における学習と評価のパイプラインをつくりたいと考えています。 立場上、普段の業務はマネジメントがメインのため、こうしたコンペを活用することで技術を磨いていきたいと思っています。一方で、社内で優秀な若者が物凄い活躍をしているのを見ると、技術だけではいずれ戦えなくなるかもしれない。 技術×何かで自分ならではの価値を提供できるエンジニアになれたらと思っています。 <国立研究開発法人 水産研究・教育機構 主催「漁業×AIチャレンジ『魚群検知アルゴリズムの作成』」コンペティションの入賞者レポートはこちら> <防衛装備庁先進技術推進センター主催「オフロード画像のセグメンテーションチャレンジ」コンペティションの入賞者レポートはこちら>