風景から歩行者が消えていく様子

先日紹介した「風景から歩行者を消す手軽な方法」は、動画の画素ごとに時間について平均をとると動いているものを消せるという話でした。

この方法について、(1)平均ではなく中央値や最頻値を使った方がいいのではないか、(2)シャッターを開きっぱなしにするのと同じではないかと言われたので、お答えしようと思います。(ネタを引きずるのはよくないのですが。)

(1)については、やっていることの意味からすればその通りです。しかし、中央値や最頻値は平均に比べて計算負荷が高いので(前記事の追記も参照)、動画という重いデータを扱う際には、そこにこだわるべきではないと思います。簡単なものをまず試し、できたらそれでよしとするわけです。例えば、ウェブカメラの画像を取得するCurrentImage[]を使って、先の話のリアルタイム版を作れるのですが、平均でやるなら次のように簡単です(Mathematica)。

t = 1;
accumu = ImageData[CurrentImage[]];
Dynamic[Refresh[Image[accumu/t], TrackedSymbols -> {t}]]
(*ここに動画が表示される*)
While[True,
  accumu += ImageData[CurrentImage[]];
  t++;
  Pause[0.1]];

いいウェブカメラがあれば、下のような動画が見られるはずです。(実時間だと速くてよくわからないので、最初の5秒を30秒に引き延ばしたのが冒頭の動画です。)

これを中央値や最頻値でやろうとすると、すぐにメモリがなくなるでしょう。最頻値の場合は数値の揺らぎの程度(あるいは数値を丸める必要の有無)も確認しなければなりません。

(2)の方法は知らなかったのですが、上のような動画を作るのはちょっと面倒なのではないでしょうか。

風景から歩行者を消す手軽な方法

固定したカメラで撮った動画で、画素ごとに時間について平均を取れば、(適当な速度で)動くものを消せます。Mathematicaだとこんな感じです。(参照:フリーソフトウェアを使う方法

Export["result.jpg",
 Image[Mean[Map[ImageData,
    Import["movie.mov", "ImageList"]]]]]

おまけ:フレームの平均を計算していく過程(最初の5秒を30秒で)
詳細:風景から歩行者が消えていく様子(リアルタイム版)

追記:画質的には平均ではなく中央値や最頻値を使った方がいいかもしれませんが、「手軽」ではなくなります。「平均でもできるんだ」という「手軽」さの実例だと理解していただければと思います。

中央値:MeanMedianに置き換えるだけで試せますが、計算時間・消費メモリともに増大します。平均なら約90秒で終わるこの動画(1280x720x372フレーム)の処理に約450秒かかります。消費メモリは2倍くらいになるようです(Core i7 4700MQ、メモリ16GB、Windows 7 64bit、Mathematica 9.0.1)。

最頻値:中央値と同様、計算負荷が高くなります。数値の揺らぎも心配です。Mathematicaの最頻値(Commonest[])は戻り値がリストなので、コードの書き換えも面倒です。

カメラからの入力を「手軽」にリアルタイム処理する場合にも、やはり平均を使うのがいいでしょう。

縦と横にしか動けない世界で(1994年東京大学入学試験理系数学第6問)

1994年の東京大学の入学試験、理系数学第6問は次のようなものでした。

平面上の2点P, Qに対し、PとQをx軸またはy軸に平行な線分からなる折れ線で結ぶときの経路の長さの最小値をd(P, Q)で表す。

(1) 原点O(0, 0)と点A(1, 1)に対し、
d(O, P)=d(P, A)を満たす点P(x, y)の範囲をxy平面上に図示せよ。

(2) 実数a>=0に対し、点Q(a, a^2+1)を考える。
次の条件(*)を満足する点P(x, y)の範囲をxy平面上に図示せよ。
(*) 原点O(0, 0)に対し、d(O, P)=d(P, Q)となるようなa>=0が存在する。

この問題は、d(O, P)=Abs[x]+Abs[y]であることがわかれば解けます。d(O, P)=Sqrt[x^2+y^2]ではありません。

Mathematicaで試します。

(*1*)
d[p_, q_] := Total[Abs[p - q]]
expr = d[{0, 0}, {x, y}] == d[{x, y}, {1, 1}];
cond = Reduce[expr, {x, y}, Reals];
reg = ImplicitRegion[cond, {x, y}];
RegionPlot[reg, PlotRange -> {{-2, 2}, {-2, 2}}]

(*2*)
expr = Exists[a, a >= 0,
   d[{0, 0}, {x, y}] == d[{x, y}, {a, a^2 + 1}]];
cond = Reduce[expr, {x, y}, Reals];
reg = ImplicitRegion[cond, {x, y}];
RegionPlot[reg, PlotRange -> {{-2, 2}, {-2, 2}}]

描画領域の境界にも実線が引かれている、という問題がありますが、とりあえずはこれでいいでしょう。

Mathematica 10.3.1と11.2, 11.3には,直線部分が描かれないというバグがあります(紛らわしいことに10.4, 11.0.1は大丈夫)。11.2以降なら,RegionImageを使うといいかもしれません。

RegionImage[reg, PlotRange -> {{-2, 2}, {-2, 2}}]

関連:数学まちがい大全集

Raspberry Pi用バイナリをQEMUエミュレータで動かす方法(ユーザーモードエミュレーション)

Mathematicaが無料になって以来、Raspberry Piを触る機会が増えました。Raspberry Piの良さは、各種センサーを比較的容易に使えることにあり、そういうことをしないなら、Raspberry Piはあまりいいハードウェアではありません。メモリはたった512MBしかなく、CPUは32ビットのARM、そのクロックは700MHzと低速です。

実験のために、Raspberry Pi用のバイナリを動かしたいことがあるのですが、この性能の低さに憂鬱になります。インテル入ってるのPCは、Raspberry Piよりはるかに高性能なので、Raspberry Pi用のバイナリをRaspberry Pi上ではなくPC上で動かせればいいのですが、CPUが違うので、Raspberry Pi、つまりARM用のバイナリを、インテルのCPUでそのまま動かすことはできません。

そこで、QEMUでエミュレートすることを考えます。QEMUのエミュレーションには、システム全体をエミュレートする方法と、ユーザーモードだけをエミュレートする方法があります。

以前紹介した方法(Windowsの場合Ubuntuの場合)は、システム全体をエミュレートする方法です。比較的高性能なPCなら、システム全体をエミュレートしても、実機と同程度の性能を発揮できます(メモリが256MBという問題がありましたが)。

ここではユーザーモードをエミュレートする方法を紹介します。この方法には、システム全体をエミュレートするよりも軽く、使えるメモリも多い(ホストに十分なメモリがあれば)というメリットがあります。

Ubuntuで試します。

まず、Raspbianのイメージをダウンロードします。2013-12-24以降がいいでしょう。

wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2014-01-09/2014-01-07-wheezy-raspbian.zip

fdisk -l 2014-01-07-wheezy-raspbian.img」などとして、2番目のパーティションの始点を調べます(2014-01-07-wheezy-raspbian.imgの場合は122880です)。これに512をかけた結果(62914560)を後で使います。

qemu-user-staticをインストールし、作業用ディレクトリを作ります(この作業は1回だけやればいいです)。

sudo apt-get install qemu-user-static
mkdir rootfs

イメージをマウントします。

sudo mount -o offset=62914560 2014-01-07-wheezy-raspbian.img rootfs

エミュレーション環境を整えます(この作業は1回だけやればいいです)。

sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin/
sudo sed -i 's/^/#/' rootfs/etc/ld.so.preload

エミュレーションを開始します。

sudo QEMU_CPU=arm1176 chroot rootfs

qemu-arm-staticがデフォルトでエミュレートするアーキテクチャはARMV7lですが、Raspberry PiはARMV6l(CPUはARM1176)なので、環境変数をそのように設定しています(arm1176の代わりにarm11mpcoreとすればマルチコアになります)。事前に「xhost local:localhost」とすればXの画面も持ってこられます。

後はご自由に。

安藤忠雄 光の教会 ボノ アメージング・グレイス

4532168163『安藤忠雄 仕事をつくる』(日本経済新聞出版社, 2012)(参考文献リスト無し・索引無し)は日本経済新聞の「私の履歴書」に掲載された、短いエッセイをまとめた本です。仕事柄、いろんな分野の有名人と交流がある著者ですが、「実は有名人だと後で知った」という話がたくさんあって面白いです。たとえば、U2のボノについてはこんな感じでした。

2006年冬、ロックグループU2のボノが「光の教会」を見たいと知人と共にアイルランドからやってきた。私はその時、正直ボノという名前は聞いたことがあったくらいで、彼のことをよく知らなかった。

光の教会に足を踏み入れ、静に腰掛けたボノは「祈ってもいいか?」そして「歌ってもいいか?」とつつましく尋ねた。祈り終えると説教台の方に歩み、アメージング・グレイスを歌いだした。光の教会の空間はボノの歌声に包み込まれた。居合わせた人たちの目に涙が浮かんだ。私も感動した。(p.100)

4401619137『U2ファイル』に寄せた評論「ロックスターがめったに語らないこと—U2と愛と神の恵み」に載せたかった話です。(そういえば、この評論がもとで某新聞に「バンドとキリスト教信仰を研究している」と書かれたりしましたが、そういうことはありません。)

ボノのアメージング・グレイスはYouTubeを探すと見つかります。光の教会ではありませんが。