第6回目の実例紹介になります。
今回は形状抽出の下にタスクを繋げられるようになりましたので、
その機能を活用した高速化の例を紹介したいと思います。
今回はワイヤーにカラーテープでマーキングしたものを検出します。
ノイズは天敵なのでマニュアル設定で暗めに撮影しました。(ちょっとボケちゃいました)
条件
- 画像サイズ : 6000x4000
- CPU : Inter(R) Core™ i9-9900K 3.60Hz
- GPU : NVIDIA Geforce RTX 2080 Ti
- RAM : 32GB
まずは領域検出でワイヤーを見つけてからマーカーを見つけていきたいと思います。
領域検出でワイヤーとマーカー検出
- ワイヤー検出用の領域検出を追加
高速化のために前処理で画像サイズを1/8にします。
- ワイヤー検出のアノテーション及び学習
ここでは結果だけ表示します。
- マーカー検出用の領域検出を追加
高速化のために前処理で画像サイズを1/2にします。
解析領域を自動にします。
- マーカー検出のアノテーション及び学習
ここでは結果だけ表示します。
- 処理速度計測
ランタイム評価画面を開きます。
ワイヤー検出が343ms
マーカー検出が648msでした。
合計で1000msでした。
次は高速化を目指して形状抽出と領域検出でワイヤーを見つけてからマーカーを見つけていきたいと思います。
形状抽出と領域検出でワイヤーとマーカー検出
- ワイヤー検出用の形状抽出を追加
- ワイヤー検出の形状抽出の設定
入力は画像のままで閾値を設定します。
今回は0.23としました。
- マーカー検出用の領域検出を追加
前処理で画像サイズを1/2にします。
解析領域のモードを輪郭固定にしてサイズを300、輪郭ステップも300にします。
ステップをサイズより小さくすると解析領域がオーバーラップするようになります。
- マーカー検出のアノテーション及び学習
ここでは結果だけ表示します。
解析領域のモードを輪郭固定を指定したのでワイヤー上に解析領域が複数現れました。
- 処理速度計測
ランタイム評価画面を開きます。
解析領域の数が多いのでバッチサイズを手動で設定します。
ワイヤー形状抽出が26ms
マーカー輪郭検出が255ms
合計で285msでした。
形状抽出を利用して1000msから285msに処理時間を短縮することに成功しました。
処理時間一覧表(ms)
タスク | 領域検出 | 形状抽出+領域検出 |
---|---|---|
ワイヤー検出 | 387 | 27 |
マーカー検出 | 755 | 275 |
合計 | 1149 | 306 |
以下の場合は形状抽出で領域を絞り込むことで安定して高速化できると思います。
- ノイズが少ない
- 環境や対象物の変化が少ない
- 対象物と背景がくっきり分離できる
また、輪郭周辺に解析領域を絞る場合は以下の点に注意してください。
- 1エポック当たりの学習時間の増加の可能性
- GPUのメモリ量が足りない場合はバッチサイズを大きく設定できずに遅くなってしまう
- 領域が複数に分断されるので個数を数えるときは注意
GPUでの処理の場合、データの転送回数を減らすことで処理の高速化が狙えます。
バッチサイズを大きくして、一度にたくさんのデータを転送することで回数を減らし、
高速化をしています。
また解析領域が大きいと畳み込みのコストが大きい上に一度に1枚の画像しか処理されません。
それに対して小さい解析領域が複数ある場合は、畳み込みのコストが小さい上に、複数枚の画像を並列で処理できるので処理が高速に行えます。
今回の場合は、真ん中の領域を見なくなった分処理が速くなり、
真ん中に関しては過検出が起きないというメリットもあると思います。
動画版もあります。
ワイヤーの例は以上となります。