ビットマップ画像のピクセル数を指定して出力する

デジタル写真のようなビットマップ(ラスター)画像を Linux 上でサイズ数を指定して作成することは、簡単そうに見えて意外と苦労する作業です。

GIMP でファイルを開き、Rectangle Select で範囲を選択し、Tool Options からサイズを数値で指定して保存しても、出力された PNG/JPG ファイルは微妙にピクセル数が変わっていたりします。

たとえば、1200 x 800 px のピクセル数で保存しようとしても、実際に出力されたファイルを確認してみると 1197 x 798 px のように期待したピクセル数と異なることは珍しくありません。

画像の縦横比だけが問題となる場合は良いですが、Google Play Store にアプリを公開する場合のように厳密にピクセル数を指定されている場合、非常に困ることになります。

どうにかして指定のピクセル数でファイルを出力できないかと設定をいじったり、別のツールを試したりしましたが、結局、ImageMagick を用いて画像のフォーマットを変換することが最短の解決法だと結論づけました。

ImageMagick を用いた画像のサイズ変更では mogrify を使用してファイルを一括変更することが多いかと思われますが、この方法ではうまく行きません

どうするのかと言えば、本来は画像のフォーマットを変換するコマンドである convert を使用して出力サイズを指定してして変換を行います。

$ sudo apt-get install imagemagick
$ convert input.png -resize 1024x500! output.png

なんだかなぁという気がしますが、やりたいことはこれで達成できます。

Raspberry Pi で機械学習

どうでも良いことですが、私の大学(院)時代の専門は機械学習やパターン認識の近接領域です。

当時は侵入検知や一般物体認識など、一部の限られた研究者のあいだで非線形手法が流行していたところに、古臭くて見向きもされていなかったニューラルネットが圧倒的な性能を見せつけ、シンギュラリティという言葉が生まれて一躍、大ブームが巻き起こりました。

流行の波に乗って、多くの人が新たに機械学習ライブラリに触れてみる機会が多くなった一方で、個人的には徐々に機械学習から距離を置いていきました。

それは、数十台のサーバコンピュータを数日連続して動かし続けたり、国内に数えるほどしかない大型計算機システム(つまりはスパコン)の利用申請をしたり、要するに計算資源だよりの力技でゴリ押しする風潮に魅力を感じなかったわけです。

特定の環境に依存しすぎていて、少しでも条件が変わったときにプロジェクトの再現や継続が難しいのはどうなのかなと。

Raspberry Pi(ラズパイ)は、ある意味、その対局にあります。

スマートフォンよりも小さく物理的に持ち運ぶことも容易、処理性能は玩具かせいぜいが低価格PCと比較できるくらい、学習データは外付け HDD に頼ればいいとして、それを取り込んでモデルを構築する際にメモリに載せられるかどうかというスペックです。

[toc]




Continue reading “Raspberry Pi で機械学習”

Android Room で relationships を扱う

Android アプリ開発においてデータの永続化を考えたとき、2021年12月現在において、最初の選択肢に挙げられる候補は Room です。

Room は SQLite の抽象化レイヤを提供する一種の ORM であり、Android Jetpack で提供されるライブラリの一つです。

基本的には Android Kotlin FundamentalsLesson 6: Room database and coroutines を通読すれば、おおよその操作感は理解できるのですが、実際のアプリ開発においては1つ問題が残ります。

Room がラップしている SQLite は関係データベースであり、そこに蓄積される情報は当然ながら正規化されています。

言い換えると、エンティティ単体で用いられることは、ほとんどありません。

もっと分かりやすく言うと INNER/OUTER JOIN 使いたいんだけど、どうするの?と思われるはずです。

そのあたりが知りたかったのに、とっ散らかっていて分かりづらいと個人的には不満を覚えました。




Continue reading “Android Room で relationships を扱う”