Ignitarium-logo
Ignitarium-logo

  2021.09.15

コンピュータビジョンをベースとした高速ナット数カウント

“I feel the need, the need for speed(俺には必要だ、スピードが)”、ハリウッド映画「トップガン」からの有名な引用句は、ほとんどのエンジニアに当てはまります。 私たちは既存のアルゴリズム、ソフトウェア、ハードウェアをさらに高速に実行できるように努力しています。 このブログでは、イグリタリアムのエンジニアによって開発された高速で高精度のソリューションの1つである、産業用部品カウント用のコンピュータービジョンベースのソリューション設計について説明しています。 このような自動化された産業用ソリューションは、人件費の削減と組立ラインの生産性向上に苦労する世界中の工場で需要が高まっています。

イグニタリアムは、クラスをリードするイメージセンサー会社と協力し、部品カウント、特にナットカウントの使用事例で90FPS高解像度センサーの性能を実証しました。

計算

  • カメラのキャプチャ速度 – 90FPS。 1秒あたり90フレームは、11ミリ秒に相当します。 そのため、ナット数カウント用に設定する必要な画像キャプチャから表示までの操作は、わずか11ミリ秒で実行されました。 エンドツーエンドのシステムレイテンシの合計が11ミリ秒を超えると、カメラは常にこの速度で新しいフレームを書き込むため、フレームが失われます。
Fig. 1 : ナット数カウントアプリケーションパイプライン

ナット数カウントソリューション構築におけるプロブレムステートメント

イメージセンサーの90FPSでのパフォーマンスを実証するには、動きの速いオブジェクトを使用する必要がありました。 カメラは動きの速いオブジェクトの画像をキャプチャでき、ソフトウェアはそれらの画像を処理できます。 このような高速のシミュレーションは、線形システムの代わりに回転システムを構築することによって可能になりました。

Fig. 2 のような高速回転プラットフォームを作成しました。AからLまでアルファベット順に名前が付けられた12のセクターがあります。各セクターには、ユーザーが可変数のナットを挿入できる複数のスロットがあります。 ディスクが回転し始めると、カメラが画像をキャプチャし、アルゴリズムが各セクターのナットをカウントします。そして最終的なカウントが画面に表示されます。 簡単に聞こえますか? 実際にはそうではありません。

Fig. 2 : 12セクターとセクターあたり5つのナットスロット付きのロータリーディスク

直面した課題 

インターフェイスの制約

カメラの画像キャプチャパイプラインは開発中であったため、開発プラットフォームとしてFPGAベースのボードを使用しました。 特定プラットフォームで、今のトレンドのディープラーニングフレームワーク(read : TF, Keras, Torch)のサポートが限られているため、パイプラインのポストイメージキャプチャのコンポーネントにソフトウェアのみのアプローチを採用することとしました。 言い換えると、計算と表示は、ハードウェアアクセラレータではなく、標準の組み込みプロセッサのソフトウェアで純粋に処理しました。 具体的には、計算要件を軽くするため従来の画像処理アプローチを選択しました。

パイプラインは、最初にセグメントをトリミングする構成としました。 次にセクターのドミナントカラーを決定します。そして輪郭を見つけ最終的にはナットのみを数えます。 最後にナット数がセクター名の横に表示されます。

ソフトウェアの問題

メモリコピー

デバイスには、フレームを共有DDRメモリに継続的にダンプするセンサーパイプラインがあり、共有メモリには物理アドレスがあります。また、画像処理にはOpenCV、出力には基本的な表示機能などのコンポーネントを使用していたため、OSが必要でした。OSはpetalinuxを選択しました。 Pythonでデータのコピーを作成している事例がありましたが、このコピー時間が許容可能なパイプラインレイテンシを超えていました。これを解決するために、コードのすべての行を見直し書き直しました。メモリのコピーを回避するために、メモリマッピング機能を使用して共有メモリの物理アドレスを仮想アドレスにマップしました。

OpenCVライブラリ

OpenCVのリサイズファンクションは、低レベルのコードで作業しているとき、いくつかの驚くべき現象に遭遇する可能性があります。 経験豊富なユーザーは、output_image = resize(input_image、dimensions)のような基本的な構文を理解できまが、この事例では、input_imageの固有のコピーが作成されていました。この問題を解決するため、サンプリングに基づいてカスタムのイメージリサイズファンクションを作成しました。これは不可逆的な方法でしたが、特定のアプリケーションでは完全に機能しました。

システムレベルの問題

ポジションのキャリブレーション

セクターを適切に検出するには、カメラの主軸(レンズの中心を通る仮想線)が Fig. 2 に示す赤い円の中心と一致するように、回転ディスクをカメラの真下に配置する必要があります。ここでカメラの取付け時、垂直位置のズレによりディスクがフレームから外れるといったヒューマンエラーの問題がみつかりました。

この問題に対処するため、キャリブレーションメカニズムを作成しました。 中央の赤い円を参照することにより、キャリブレーションアルゴリズムは取り付け位置のエラーを処理するように設計しました。 中央の円のピクセル領域を測定し許容範囲内に制限することで、垂直方向の取り付けエラーを回避します。 画像内の架空の長方形を参照し、位置ズレ時にエラーを報告します。 自動検出された位置は、ディスプレイ上の UI を介して色付きのマーカーでオーバーレイされ、キャリブレーションループを閉じることができます。

照明

AI対応のアルゴリズムは、明るさの変化をうまく処理できます。 しかし、ここで使用されている従来の画像処理方法では堅牢性が欠けます。 もちろん、各フレームにヒストグラム均等化などのグローバルメソッドを実装することは可能ですが、処理時間が長くなります。

日中の明るい環境と夜の薄暗い環境で撮影された画像には大きな違いがあります。 それに、人工照明は高速な画像キャプチャにはあまり役に立ちません。 より高いフレームレートのキャプチャには、さらに多くの照明が必要です。

照明ベースのキャリブレーションでこの問題に対処しました。 中央の赤い円を様々な光条件で分析し、最適なHSV値範囲にキャリブレーションされます。 周囲の照明が予想範囲よりも暗い、又は明るい場合、エラーを表示するシステムを追加しました。 端末のエラーを確認することで、ユーザーはロータリーシステムに組み込まれているダイヤルで照明を適切な設定にコントロールできます。

結論

結論として私が学習したことを、すべての画像処理、コンピュータービジョン、ディープラーニングの技術者と共有したいと思いました。 エンジニアとして私たちはサンドボックス環境で何度も開発と実験を行っています。 優れたコンピューティングリソースはほとんどの場合、遅延の制約なしに利用できます。 実生活のシステムで遊んでみるのは本当に興味深く、膨大な学習をもたらします。 課題は現実のものであり、それらに対処するには基本的なレベルで考える必要があります。 ナットカウントソリューションを構築するこの場合では、Linuxの基本、C、Python、OpenCV、エンベデッド、画像処理、コンピュータービジョン、カメラキャリブレーションのスキルを1つのプロジェクトにデブロイしました。

英語ページ

e-Book

eBookの無料ダウンロード

DNNモデルのハードウェア・アクセラレーションに
FPGAを選択する6つの理由