はじめに
MLモデルに大量の画像を食わせて、それらの結果を一覧表示したいときにいろいろな方法があると思います。
jupyter-notebookを用いている場合はそのまま出力すれば良いですし、OpenCVやmatplotlibなどを使うのも良いでしょう。
ただ、その画像が大量にある場合。検証目的でできるだけ複数の画像を並べる必要がある場合。
HTMLに書き出してPDF化してしまうのが一番楽なのではないかと思いました。
ということでjinjaを使ってHTMLを書き出して、wkhtmltopdfでPDF化しようとしてみますが、ちょっと困った事があったのでメモ。
起こったこと
$ wkhtmltopdf --enable-local-file-access src.html dst.pdf
を実行すると、以下のエラーが大量に出る。
file:///path/to/image1.jpg (ignore) Warning: Failed to load
file:///path/to/image2.jpg (ignore) Warning: Failed to load
file:///path/to/image3.jpg (ignore) Warning: Failed to load
出力されたPDFを見ると、最初の方こそ画像が表示されているけど、後半に行くにつれて画像が出なくなっていました。
原因を調べてみると、リソース制限に到達しているためでした。これを緩和します。
解決方法
ulimit
コマンドを用いてリソース制限を緩和します。
$ ulimit -n 8192
ただし、対象ホストにsshで接続している場合は次のようなエラーが出ます。
ulimit: error setting limit (Operation not permitted)
僕の環境では外部からアクセスできるサーバでなかったため、/etc/ssh/sshd_config
にUsePrivilegeSeparation no
を追記して再接続しました。
このオプションがyesになっている場合は、sshdが非rootの子プロセスを作ることで、root権限と分離しています。
おまけ:その他のエラー
もし以下のエラーが発生した場合……
Warning: Blocked access to file file:///path/to/image1.jpg
--enable-local-file-access
オプションがないとローカルのファイルへのアクセスができないようですので忘れずにつけましょう。
参考