不幸にして、画像認識の推論がおかしい時には、まず次の内容を疑ってみよう。
- 画像がとれていない
- 例:cv_image の値がNoneになっている
- カメラを別のアプリケーションが既に接続してしまっていて、そのアプリの中で接続できないときも生じる。
- 前回の終了時点で、デバイスがきれいに解放されていないことで、新規に接続できないことがある。
- 例:cv_image の値がNoneになっている
- 画像のチャンネル数が、想定しているものと違っている
- 例:cv_image.shape[2] == 4 となっている。
- 透過型pngファイルだとチャネル数が4になる。
- ライブラリによっては、画像のチャネル数を4にしていることがある。
- int8 * 4 = 32 bit とするため。
- 画像の型が、想定しているものと違っている
- 例:cv_image.dtype が np.uint8 になっているか。
- 例:np.float32 などfloat の値になっていないか。
- ライブラリによっては画像の値を[0.0, 1.0]の間のfloat の値にしていることがある。
- 画像の大きさが、推論の入力側で想定している大きさと異なる。
- 推論の入力画像を与える時のメソッドで、所定サイズにresize後の画像を要求しているライブラリもある。
- 画像の値の範囲が[0, 255]の範囲を超えている。
- 例: rawデータで読み込んだデータは12 bit depthを持つことがある。
- 与えた画像が部分行列になっている。
- 一般に機械学習のライブラリは、部分行列を受け付けないことが多い。
- 画像の値が全て0などの変な値が入っている。
- RGBとGBRで色の順序が違う
- 計算自体はされるが、検出率が低くなる。
- np.ndarray型(numpy, opencv) での画像型を想定していないかもしれない。
- 例: PIL.Image型
- 例:その機械学習ライブラリ固有の画像データ形式(特に商用ライブラリではありがち)
- 画像データの記述の順番の違い
- 添字の順番がHWC(高さ、幅、チャネル)と全てがなっているわけではない。
画像以外に原因がある場合
- GPUを使用するライブラリが複数あって、それらの間でGPUリソースの奪いあいをしている状況
- Jetson の場合はjtopコマンドを使って、動作状況を確認しよう。
- jetson-stats入門