見出し画像

AIカメラで電車の混雑を測定します!


こんにちは、オスカーです。ナビタイムジャパンで混雑系サービスの開発を担当しています。

ナビタイムジャパンでは以前から電車混雑に関する情報を提供してきました。

電車混雑シミュレーション技術により、電車の混雑度を算出できるのですが、現実を完璧にモデリング出来ているわけではないため、新駅開業や相互直通開始など様々なタイミングで実際の駅に行き混雑調査を行う必要があります。

混雑度の情報源の一つとして現地調査の結果も利用しています。ナビタイムジャパンでは号車ごとの混雑度のサービスも提供しており、現在は提供していない路線でも提供に向けて記録しています。

サービス提供中の車両別混雑度


この現地調査の作業はそれなりの習熟度が必要とされており、社内でも調査可能なメンバーは多くありません。また、調査結果をデータ化するための作業も必要となっており工数もかかっているので、調査範囲を広げることが難しいという課題があります。エンジニアとしてはやはり自動化したくなりますし、自動化することで調査範囲を広げられることが期待できます。

そこで機械学習により、電車の動画を撮影しただけで混雑率が測定できるようなアプリの開発をはじめました。

機械学習プロジェクトといえばまずはデータ収集です。ひたすら電車の撮影を行い、ギュウギュウの満員電車から人がほぼ乗っていないガラガラの電車までデータを揃えました。

次にアノテーションです。いくつかのツールを調査したところCVATとlabelimgが良さそうだったので、それぞれで数万枚の画像をアノテーションしました。機械学習コンペに出ているときはデータ収集・手動ラベリングすることはないですが、これはかなり時間を要する地道な作業でした。

ラベリング
混雑度のアノテーション(※作業イメージです)

画像処理アルゴリズムはYOLOやEfficientNetを試してみてある程度混雑率を求めることができそういう感触を確認しました。

人口流動の変化が大きいコロナ禍

画像1
出展:https://www.mlit.go.jp/tetudo/tetudo_fr1_000062.html

コロナ禍で鉄道利用者の「空いた列車に乗りたい」という需要が高まっています。鉄道事業者としても混雑情報の提供により鉄道利用者の要望に応えたいと考えていらっしゃる事業者が増えています。コロナ禍以前は運転見合わせや大幅な遅延が発生しない限りは混雑度はそれほど変化がなく、統計的な混雑度データと実態が乖離するケースは少なかったのですが、現在は上図のように緊急事態宣言の有無などにより、人流の変化が大きいです。そこで開発したリアルタイム混雑度測定アプリを駅のホームに常設稼働させて、鉄道事業者様と共同でリアルタイムの混雑度を配信できないかと考えました。この話を東急電鉄様に持っていったところ、興味を持っていただき、今回の技術検証へとつながりました。

プレスリリースはこちらです。

カメラ選定


技術検証にむけて、まず、スマホはバッテリーなどの問題から24時間稼働させ続けるには不向きだと考えたので、自作のアルゴリズムが動かせるエッジAIカメラを探しました。調査した結果候補として上がったのはAWS DeepLensとS+ Cameraでした。AWS DeepLensのほうが価格が安くAWSとの連携も簡単そうでしたが、S+ CameraはSIMカードを搭載していて、今後設置環境が常にWifiが利用できるとは限らないのでS+ Cameraを採用しました。

精度改善

実際にS+Cameraを購入しアルゴリズムを動作させてみると、リアルタイムで測定できるほどの速度が出なかったり画質が不十分の問題点があることがわかりました。画質に関してはカメラの設定可能項目を徹底的に調査し、肉眼では混雑度が判別可能な画質を取得できるようになりました。

画質についての問題はクリアしましたが、混雑率の算出精度はプロトタイプレベルではまだまだ実用化できる段階ではありませんでした。プロトタイプの時点で数万枚のアノテーションを行っていたのですが、さらに教師データを追加したり、アノテーションの仕方を変えたりして精度の向上を行いました。リアルタイムで混雑率を算出するという目標があるので、ハードウェアのスペック的にアンサンブルなどは難しく、シングルモデルで学習データを調整する方法で試行錯誤していました。電車の画像ばかりだと、全く関係ない障害物でも電車だと判定されてしまったりしたので、ダミー画像も大量に学習させました。

パフォーマンス改善

パフォーマンスに関しては電車がホームから発車してすぐに混雑率を算出できるくらいの速さを目指しています。はじめはカメラに用意されている便利なAPIを利用していたのですが、スループットもレスポンスタイムもリアルタイムで測定するには足りなかったので、独自にゼロから実装してパフォーマンスをあげたり、もちろんマルチプロセスで並列処理を実装して高速化しました。しかしこれだけでは、まだ混雑率算出までに1分以上かかってしまっていたため、Google Edge TPU(coral usb accelerator)という機械学習処理専用の外付けハードウェアを購入し高速化を図りました。これによりアルゴリズムの処理速度が10倍程度になり、リアルタイムで混雑度を算出できる見込みが立ちました。

まとめ

まだ最終的な精度や、24時間混雑度をリアルタイムで測定し続けても問題ないかなどの課題がありますが、技術検証によりこれらの問題を解決できるかどうかを見極めていきます。最終的な目標はNAVITIMEなどのアプリで正確な混雑情報をユーザの皆様にお届けるすることです。私たちはこれからもユーザーの皆さまが安心して移動できるような最適な経路を提供しつづけることをめざして技術の研鑽を行ってまいります。