わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

Dockerで,ワンコマンドで系図処理

本日,情報処理学会 人文科学とコンピュータ研究会*1にて「系図処理プログラムの開発および公開」と題して口頭発表を行いました.予稿についてはhttp://id.nii.ac.jp/1001/00187423/にて5月5日よりダウンロード可能となっていました(研究会会員でない場合には料金がかかります).
学生が昨年12月に発表した内容*2を進展させました.具体的には,前の発表では「画像処理」と「テキスト処理」を別々に実施していたのですが,今回,Rubyスクリプトとして一括して管理・処理するようにしました.処理対象のサンプルとして『豊臣秀吉譜上』を採用し,将軍家譜 | 日本古典籍データセットの「デジタル画像とメタデータの一括ダウンロード」より取得できるzipファイル(200021823.zip.約880MBあります)に収められた画像と,独自に作成した位置情報付きテキストを使用しました*3
処理結果として,画像とテキストファイルを生成します.画像には認識結果を描画しています.以下は予稿に載せた画像の縮小版です.

「秀吉」をはじめとする人物名は紫色で囲み,人物名の下の文字列(付随情報)は緑色で囲んでいます.人物をつなぐ,墨で縦横に引かれた線について,認識できた縦線には青色,横線には赤色を載せ,線分の両端は容易にわかるよう×印をつけています.線分同士の交点は,緑の丸印をつけています.
なお,この画像で「秀吉」の上に線が伸びていますが,「秀吉」「秀長」「女子」「女子」が兄弟関係にあることを意味します.4人の父親については,この系図には明示されていません(「秀吉」のすぐ下には「不詳其父」と書かれています).左下の2つの赤線(横線)は,次のページにまで伸びています.
処理結果のテキストには,検出した親子関係・兄弟関係が含まれています.該当箇所は以下のとおりです.

parent-child : 秀吉-秀次
parent-child : 秀吉-棄
parent-child : 秀吉-秀頼
parent-child : 秀吉-秀秋
parent-child : 秀長-秀俊
parent-child : 秀長-女子
parent-child : 秀長-女子

sibling group : 4 persons : 秀吉, 秀長, 女子, 女子
sibling group : 3 persons : 秀俊, 女子, 女子
sibling group : 4 persons : 秀次, 秀秋, 棄, 秀頼

不等号で囲まれたものは,今回の入力(3枚の系図画像)において文字列領域を特定するための情報です.それを無視すると,実際の画像を目で見て知ることのできる,親子関係・兄弟関係は,出力にも反映されていることが,確認できます.
原稿の締切が4月16日でして,その前日に,プログラム一式をGitHubにて公開したのち,Dockerを用いて動かせるようDocker Hubにも登録しました.URLは以下のとおりです.

スクリプトの実行にあたっては,rubyコマンドのほか,画像処理ツールのImageMagickのコマンド(convertとidentify)も必要です.Docker Hubに登録したイメージには,それらのコマンドを入れていますので,200021823.zipを置いておき,dockerコマンドにDockerホストとコンテナとでファイルをやりとりできるよう,引数をつけて実行*4すれば,あとは結果を待つだけ…
というのはLinux環境のみでした.Docker for WindowsCygwinの組み合わせで,dockerコマンドで処理をさせるには,前にwinptyをつける必要がありました*5.そのほか,「$(pwd)」では,Dockerホストのディレクトリ指定はうまくいかず,Cygwin形式のフルパスから「/cygdrive」を取り除く*6ことで,やっと動作しました.
今後も改善を重ね,コミットしていくことにします.

*1:http://www.jinmoncom.jp/index.php?CH117

*2:http://d.hatena.ne.jp/takehikom/20171212/1513090799

*3:非公開ですが,以前より研究室内で使用のコンテンツでも処理できていることを確認しています.

*4:GitHubおよびDocker HubのREADMEでは「docker pull takehiko/kzd」というコマンドを書いていますが,実行環境にDockerイメージの「takehiko/kzd」がない状況で,「docker run ... takehiko/kzd ...」を実行したら,このイメージをダウンロードしてくれます.だから「docker pull takehiko/kzd」は実行しなくてもいいのです.

*5:http://d.hatena.ne.jp/takehikom/20170923/1506110751

*6:https://qiita.com/YukiMiyatake/items/73c7d6c4f2c9739ebe60に書かれた「うまくマウントされない // 原因は DockerのMobyLinuxVMと WSLのUbuntuのマウントパスの違いです // DockerはCドライブを /c にマウントしますが // WSLでは /mnt/c をマウントします」が解決に役立ちました.