lynxeyedの電音鍵盤

MBDとFPGAと車載で使うデバイスの備忘録

高度運転支援向け単眼カメラの実装(4.道路認識エンジンの実装)

前回は全結合ニューラルネットワークの試作までをしました。通常は畳み込み層を多段追加したCNNを利用して画像認識を行います。
一方で、ハードリアルタイムの要件を満たすには、この畳み込み層のえげつない量の行列のドット積を次フレームが来る前に素早く計算していかなければなりません。
学習を済ませた重み係数だけ使うとしてもそれだけは変わりません。計算量が多すぎます。それで、本当に深層学習に頼る必要があるか、それとも一部だけ軽量NNにするのか、線形解、k-NNやSVMで済むのか、といった問題を再考慮しました。

軽量特徴量の調査

画像認識も条件を追加すればもう少し楽になるはずと色々調査しました。
例として、画像認識における回転不変性。これもCNNは各層のフィルタが学習することによって実装されていきます。
車載カメラの場合は物体識別の際に、回転不変性はあまり必要ではないかもしれません。例えば立っている人を認識するのと、倒れている人を認識するのは別フィルタを使用した方が良いでしょう。(後者の事故危険性が高いため、別の認識が必要)

www.aist.go.jp
2005年のニュースであるので、深層学習がはやる前にはなりますが、このHLAC、とても軽量です。
JSで実装されている例
rest-term.com

視点の変更

車、人、自転車、バイク、大型車両....
とセマンティックセグメンテーション方式で認識するのは大変です。
まずは道路とそれ以外を認識すべきと思いました。単純に考えて、前方が道路ではない=これ以上進んではいけないということです。

道路の識別

さきほどのHLACを用いました。先程のブログも参照するとわかる通り、1次のフィルタは画像の明度勾配になっています。2次はエッジの向きが読み取れます。
道路データはドラレコのデータの下1/4くらいを切り取り、(一応、前もって「道路」以外が映り込んでいないことを確認。) 永延とフレームごとにHLAC特徴量を流してヒストグラムを記録して閾値を設定しました。道路条件であまりにもヒストグラムがかけ離れている場合はk-NNなどの手法で、それでも無理な場合は全結合型の少ない段数のNNで分類を行います。
幸い、いまのところ舗装路ではそれほどかけ離れたデータはないため、1つの閾値だけ(つまり線形解) で「道路」を認識しています。

FPGA実装

人為的なバグを減らすため、カメラをFPGA直結でデータを取得するのではなく、PCからストリームを流し込み、計算のみCyclone10LP FPGA上で行い、また計算結果をPC上のSimulinkに返す、Simulinkは計算結果をビデオストリームに重ね合わせて着色する。という方式にしています。

www.youtube.com
青で着色:道路と認識
ピンクで着色:それ以外
撮影区間さいたま市別所坂上(国道17号線:武蔵浦和駅から北浦和方面)

平面テクスチャが多い車両も「道路」とみなされているきらいがありますね...。でもこのくらいであれば認識に問題はなさそうです。
下記の、ビデオのデータと合成していないデータも見ると納得いただけるかと思います。
www.youtube.com

進行方向に車やバイクが現れた場合、大きい「ノイズ」が現れるので、速度抑止制御はそれほど難しくないかと思います。

これから

道路状況の変化をもろに受けているので「ちょっとノイズが強いかな」という感想です。
また、未舗装路の場合も調査しようと思います。
この辺りをもう少し閾値制御でどうにかなるのか調査してみます。