DJI Telloのための検証と実験

Special Thanks

この記事は@Cohtaroさんに検証用のDJI Telloで撮影された無編集動画を提供して執筆した記事です。

CohtaroさんのYoutubeも是非よろしくお願いします。

はじめに

きっかけ

今回の記事を執筆しようと思った理由がDJIからリリースされた200g以下のトイドローンTelloの動画の解像度が1080pに満たない720pであることで「これってもっと高画質に出来るのでは?」と興味を持ち、グルドンの中でTelloの無編集動画を募集したところ@Cohtaroさんが気前よく提供してくれたので実行へ移すことにした。

とりあえずはTelloのスペックを貼っておく。

スペック

  • 動画 720p(30fps)
  • 重量 80g
  • 速度 8m/s
  • 通信 100m
  • 飛行 13分

グルドンで主流の中型〜大型ドローンと比較するとスペック不足が否めないが、今回の検証で少しでもマシになればと思う。

前提条件

今回は前提条件としてFFmpeg(もしくは一部でImageMagick )によるフィルタリングを実行していく。
入手方法は上の公式ページからダウンロードするかパッケージ管理ツールで行う。

brew install ffmpeg #Mac
sudo apt-get install ffmpeg #Debian系orWSL(Ubuntu)

※Windowsはコマンドラインでインストールしなくて良いと思う。どうしてもと言うならWSL経由だと管理が楽だし今回の記事のノウハウを実行しやすい。

アップスケーリング

やはり先ず気になるのが解像度の低さ。せめてFullHDくらいの解像度は欲しい。
FFmpegにはいくつかのアップスケーリングアルゴリズムがあるので、それらを試していく。

Nearest neighbor(ニアレストネイバー)

詳しい話はググってもらうとして最もポピュラーな拡大アルゴリズム。
いわゆる「ペイント」の拡大方法で、画素を単純に増やす。

ffmpeg -i INPUT.mp4 OUTPUT1.png
convert OUTPUT1 -scale 1920x1080 OUTPUT2.png

※FFmpegでNearest neighborなアップコンバート面倒だったのでImageMagick使ちゃった(苦笑)

bilinear(バイリニア)

編集ソフトの拡大アルゴリズムに「高速」や「低品質」があるなら大抵はコレ。
多くの場合は単純に拡大するだけでなくアンチエイリアスのように中間色を生成してエッジを滑らにしている。

ffmpeg -i INPUT.mp4 -vf scale=-1:1080:flags=bicubic OUTPUT.mp4

bicubic(バイキュービック)

bilinearに続きポピュラーなポピュラーな拡大アルゴリズム。
事実上bilinearの置き換えとして運用されており、編集ソフトの拡大アルゴリズムに「高速」や「低品質」があるならbicubicの可能性がある。

ffmpeg -i INPUT.mp4 -vf scale=-1:1080:flags=bicubic OUTPUT.mp4

差がわかりにくいので拡大したものを上記3つを並べる。
順番は左からNearest neighbor(左)、bilinear(中)、bicubic(右)。

bilinear(中間色補完)とbicubicの差がわりにくいけれど、bicubicの方がわずかに階調表現良い傾向にある。

spline(スプライン)

スプライン曲線を利用した拡大アルゴリズム。
比較的高速でそこそこの品質を得られるがボケた印象になりやすい。
アニメのような階調の少ない映像に向くとされる。

ffmpeg -i INPUT.mp4 -vf scale=-1:1080:flags=spline OUTPUT.mp4

area(エリア)

面積平均法とも言われる事実上の縮小専用アルゴリズム。

ffmpeg -i INPUT.mp4 -vf scale=-1:1080:flags=area OUTPUT.mp4

縮小専用な理由は面積を基準にするため拡大するとNearest neighborとほぼ変わらないため。
Nearest neighbor(左)とarea(右)の比較を貼っておきます。

lanczos(ランチョス)

bicubicよりも高度なアルゴリズムを用いておりbicubicより高品質。
編集ソフトの拡大アルゴリズムに「低速」や「高品質」があるならlanczosの可能性がある。
シャープネスが強く出る傾向があり、よくsplineと比較されるのでソースに合った選択をすると良いはず。

ffmpeg -i INPUT.mp4 -vf scale=-1:1080:flags=lanczos OUTPUT.mp4

よく比較されるbicubic(左)、spline(中)、lanczos(右)の比較を貼っておきます。

高精度な端数処理

FFmpegにはaccurate_rndというより高精度な端数処理できるオプションが存在します。

試しにsplineにaccurate_rndを付加したものとlanczosにaccurate_rndを付加したものを生成しました。

  • spline+accurate_rnd
ffmpeg -i INPUT.mp4 -vf scale=-1:1080:flags=spline+accurate_rnd OUTPUT.mp4

spline(左)、spline+accurate_rnd(右)

  • lanczos+accurate_rnd
ffmpeg -i INPUT.mp4 -vf scale=-1:1080:flags=lanczos+accurate_rnd OUTPUT.mp4

lanczos(左)、lanczos+accurate_rnd(右)

高精度な端数処理オプションを付加することによってコントラストが良くなります。

アップコンバート総評

720pから1080pというそこまで大きな無理のないアップコンバートだったので品質はそこそこ確保できたのではないかと思う。

個人的にはlanczos+accurate_rndが良さげな印象を覚えたけれど、このあたりは個人個人の好みが反映されるので絶対的な基準はない。

ノイズリダクション(ノイズ除去)

Telloというドローンの価格帯から考えて低品質なカメラやエンコーダが使用されている可能性は否定できず何らかのノイズが発生していると踏んでノイズリダクションを試してみた。

ただし、ノイズリダクションは画像が平坦化しやすくなるため上手く使わないと逆に画質低下を招くので取り扱いには注意が必要

debloc(デブロック)

ブロックノイズを除去するフィルタ。作用としてはソフトフォーカス系フィルタに近いがエフェクトのブラーやガウスとは違いブロックノイズを検知して実行する。

上手く使えば細かなブロックノイズを除去し、画像の鮮明感が増す。

ffmpeg -i INPUT.mp4 -vf scale=-1:1080:flags=bilinear -deblock 3:3 OUTPUT.mp4

物凄く違いがわかりにくいので比較画像を貼っておきます。

よく比較して貰えれば指や背景の建物のジャギー感が抑えられているのがわかると思います。

High Quality DeNoise 3D(ハイクオリティーデノイズ3D)

時間軸方向のノイズを除去するフィルタ。ザラザラとしたチラつくノイズを除去する。

反面、時間軸に作用するデノイズフィルタは強くかけすぎると残像感が出てしまう。

ffmpeg -i IINPUT.mp4 -vf scale=-1:1080:flags=bilinear,hqdn3d OUTPUT.mp4

こちらもわかりにくいので比較画像を。

deblocと同様にある程度のジャギー感を抑えることが出来る。

ノイズリダクション総評

Telloが生成する動画はやはりというか一見して気付きにくいノイズが発生しており、ノイズ除去を行うことによって鮮明感をある程度は回復させられることがわかった。

Telloが生成する動画のノイズ除去のコツは欲張らず弱くノイズ除去することのように思います。

歪み補正

Telloでもう1つ気になる点と言えば時より現われるブレたような歪み。

どのような歪みが発生しているのかをわかり易くしたものを貼っておく。

輪郭線が表示されているけれどもこの輪郭線が歪みで、だいたい3〜6pxくらいの歪みが発生する。

歪み総評

対処法なのだけれど結果から言えば全て失敗した。

パッと見からもわかるけど、歪みの傾向からこの歪みは「ローリングシャッター現象」と考えられ、他の表現では「コンニャク現象」とも表現されている。

全て失敗とは言ってもFFmpegで可能な手法だと全て失敗しただけであって有償ソフトの中には「ローリングシャッター現象補正」を備えるものもあるので、そちらを試しいてみるのも良いのではないかと思う。

(FFmpegによる)対処に失敗したとは言え、Telloのローリングシャッターを、視覚的に解析した画像はネット上に存在しなかったので記録として残しておく。

おわりに

久々に低画素なソースで遊ばせて頂き、2000年代初頭かのようにワクワクテカテカしながらDJI Telloの検証と実験をしました(VHSからどうやってDVDに焼くかとかニコニコ動画用のエンコとかそんな感覚だった)。

カラグレの検証と実験をしても良かったんですけど、おそらくは皆さん編集時に色々と色彩まわりは試すのではないかと考え、ちょっとマニアックなアップコンバートやノイズリダクションの検証と実験を中心にさせて頂きました。

今回はTelloのソースで検証と実験をしていますが、普通に他のドローンやアクションカムへも応用が効く内容なんじゃないかな?と考えています(グルドンには1080p派の人も居るので4K化に応用が効く)。

惜しむべきは歪み補正なんですが、FFmpegにローリングシャッター関連のフィルタは存在せず、実はプログラマブルに解決しようと思えばできるんですが今回の検証と実験とは方向性が違うなと思ってやめました。

最後に「ボクの考えた最強のTelloアップコンバートワンライナー」を置いて締めます。

ffmpeg -threads 0 -i INPUT.mp4 -vf scale=-1:1080:flags=lanczos+accurate_rnd, -deblock 3:3 OUTPUT.mp4

こんな長いエントリにお付き合い頂きありがとうございました!