ARM上のROS Indigoというかffmpegでドハマりした話

機械学習(CNN)をエッジとクラウドで分散させる処理の検証を行なう際、エッジ側のマシンをリソースが貧弱なもので評価するため、Raspberry Pi 2/3/ZeroにROS Indigoをインストールして動作させることを試みました。

Raspberry Pi自体にUbuntu 14.04をインストールする作業それ自体が一つの記事になるボリュームでしたが、それは本題ではないのでここでは割愛。ROS Indigoもインストールが完了して検証アプリを動かしたところ、カメラからの画像は表示されず、一方でターミナルには

[swscaler @ 0xXXXXXXXX] No accelerated colorspace conversion found from yuv422p to bgr24

という行がひたすら出力され続けています。検証アプリはROS Indigoのusb_camモジュールが利用されていたので、/dev/video0が存在することを再確認した上で

$ roslaunch usb_cam usb_cam-test.launch

でusb_camモジュールの動作を見てみましたが、こちらは特に問題なくウィンドウにウェブカムからの動画が表示されます。上述のメッセージでググってみても原因はイマイチ判然としません。

どうにも埒が開かなかったので、このメッセージを吐いている箇所を特定すべくsudo apt-get source libscale-devでソースコードを取得してgrepを掛けてみたところ、色空間の変換にハードウェアアクセラレーションが利用できない場合の警告メッセージであることが分かりました。

当初、検証アプリを動かしていたのがintel Xeon上の仮想PCで動かしていたUbuntu 14.04でしたので、CPUは当然MMXに対応しており、ハードウェアアクセラレーションが有効でした。が、Raspberry PiはいいずれもARMコアなのでSIMD拡張のNEONはあるものの、libswscaleがNEONに対応していないためハードウェアアクセラレーションが無効となり、パフォーマンスが桁違いに悪化していた、という状況だったようです。

事情により検証アプリの該当箇所に手を入れることができなかったため、この時はエッジ端末をIntel Jouleに変更して事無きを得ました (本当はもっと貧弱なH/Wの方がよかったんですけども)。教訓としては、何でもGoogleに頼るばかりではなく、一次情報源であるソースコードに当たった方が解決が早いケースもある、ということですね。対象がオープンソースソフトウェアであれば尚更です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です