茶番のアレ

アニメの考察をまれにするかもしれない。あとその他色々。

まちカドまぞく原作を特定のワードで検索して画像を表示できるようにしてみたかった。(未完成)

・まちカドまぞく原作を特定のワードやキャラの出番ごとに検索できるものを作りたかった。

 結論を言うとまだ完成してはいないんですが、時間をかければそこそこなんとかなりそうな感じです。ちなみに作成できてもマンガの全部のコマが読めてはたいそう問題があると思うので公開はできません。

 まちカドまぞくについて、キャラごとの台詞をまとめたいとか、こんなワードが出てたようなとか思ってもページをめくって探すのが大変… などと思うことはないでしょうか。そう思ったので、以下のようなものができないかと考えました。

 

・特定のワードで検索ができる。

・キャラごとの出番を絞り込める。

・検索や絞り込みをすると、そのコマが表示される。その際に巻数、ページ数も表示される。

 

以上の3点の作成を目指して色々やってみました。

環境:windows10(macでも動くようです。)エクセルは必要です。

・だいたいS治さんの同人誌、『4コマ漫画のデータ収集と分析による評論の可能性(with Python)』を参考にしました。

COMIC ZIN 通信販売/商品詳細 ポストモダンのポリアネスtech. 〜4コマ漫画のデータ収集と分析による評論の可能性〜

 内容としては、Pythonで4コマ漫画のjpgデータををコマごとに切り分け、それをOCRで画像の文字を読み取って分析するというものでした。この動作をするファイルはGitHubに公開されているのですが、GitHubが何かよくわからずPythonも知らない身としてはなかなか意味がわからなかったですが、どうにか動作はできました。

https://github.com/esuji5/yonkoma2data

 やり方は上記のページに記載があるので下のは備忘録程度の作成メモです。

 ちなみに中盤でエラーを解決できず一月ほど放置したため前半の記憶が曖昧なので、何か間違ってるかも知れません。

なお、PDFファイルのバーコード(JANコード)を読み取り自動リネーム

PDFファイルをページ毎のPNGファイルに切り出す

の2点については使用しませんでした。

Pythonを入れる。

https://www.python.jp/install/windows/install_py3.html

OpenCVを入れる

参考:https://qiita.com/ideagear/items/3f0807b7bde05aa18240

③gitの導入とgithubに登録

参考?:https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000

コマンドプロンプトgithubからデータをクローン

コマンドプロンプトcd でyonkoma2dataファイルのあるフォルダに行き、

 py -m pip install -r requirement.txt を入力

このとき何か読み込まれたあとエラー出ましたけど問題はなかったです。

⑥jpgのデータを用意する。(私は秋葉で裁断用のまぞくを1~5巻購入し、裁断とスキャンできる店でjpgデータにしました。)

⑦傾き補正、美白化を行う。

ImageMagickのインストール

参考:https://higuma.github.io/2016/08/31/imagemagick-1/

cd path/to/jpgs→コマンドプロンプトでcd (画像のあるフォルダの場所) という入力ですね。その後

mogrify -level 25%,83% -deskew 40% -density 200 *.jpg

を入力すればいい感じになるようです。数値の微調整はよくわからんです。

⑧ページ毎のJPGファイルを1コマ毎のJPGファイルに切り出す。

python amane_cut.py path/to/image_dir (path/to/image_dirは画像のあるフォルダの場所です。)を実行できればよいはずですがなぜかできませんでした。

エラー python: can't open file 'amane_cut.py': [Errno 2] No such file or directory

調べたところパスを通すとかなんとかあるので通してみました。

参考:http://realize.jounin.jp/path.html

しかしそれでも動かないので、Pythonファイルをvscodeというエディターで開いてみました。(VScodeの導入はS治さん共著の『スラスラわかるPython』を読みました。)

開いてみましたが同じエラーが出ており、「開いてるのに無いって何いってんだ…」状態なので、ドキュメント下にフォルダごと動かしてみたところ読み取りはできましたがエラーがたっぷり出ました。

エラー内容はインポートができていない様子なので、該当のファイルのパスを通したらなんとかなりました。

 そして、実行したところ無事に動作。概ねコマごとに切り分けできました。

⑨コマ中のセリフを抽出する

(注)OCRはいっぱいやると有料っぽいです。

(1)prepare Google Cloud Platformのアカウント作成

(2)コマンドプロンプトでpip install google-cloud-vision でインストール

(3)Cloud Vision APIを有効化し、API keyをjsonで保存する

参考:https://www.asobou.co.jp/blog/web/vision-api

(4)jpg_to_ocr.pyの調整 

43行目辺りに

key_file_path ='/Users/esuji/Dropbox/program/cvtest/yonkoma2data/src/MyFirstProject-b8427fd28b8d.json'

とあると思うのですが、' 'の間を(3)で取得したjsonのパスに変更したら動きました。

また、53行目辺りの

for idx_koma, image_path in enumerate(image_path_list[100:110]):については[ ]内が何枚目から何枚目と指定しているようなので、1枚目から100枚目まで取得したければ[0:99]などと調整がいるようです。

(5)画像をOCRをにかける

python jpg_to_ocr.py path/to/image_dir_path/ OCR結果は path/to/pickle/image_dir_path(_master).pickle に保存されました。

(6)OCR結果を綺麗にしてcsv出力

python3 pickle_to_serif_data.py ~/image/rename_test/pdf_to_jpg/ato.pdf/2_paint_out/0_koma/pickles/0_padding_shave_master.pickle

これでCSVファイルができました。

ただ、初回では読み取りが横書きのように読まれてるようで妙におかしかったので、125行目あたりのif sum(is_yokogaki_list) >= len(self.ta_list) / 2:後から

return ''.join(text_list)

else の前までをコメントアウトしたらよい感じになりました。

何かもっとエラーがあった気がするのですが、そこは適宜検索してください(私はここまでで12時間くらいかかりました。)

ここまでがGItHubで記載のある内容です。

CSVをエクセルで整える

ここからは個人的に作成したものになります。

先ほど作成できたCSVはこんな感じで、画像のパスと出力されたセリフになります。

f:id:tyabannotami:20200726150025p:plain

この状態では画像のパスとセリフだけなので、キャラも誰が出てるかわかりませんし、ページ数も不明です。そこで、色々調整していきます。

(1)コマ画像を貼り付け

パスの右のセルに画像を貼っていきたいと思います。

作業はVBAでやっていくので、上のタブに開発タブがなければオプションのリボンのユーザー設定から開発にチェックを入れてください。

開発タブを開いたら左端のvisualBasicを開きます。

その後標準モジュールを作成します。

f:id:tyabannotami:20200726150826p:plain

では、マクロで作業を進めていきます。

まず、CSVが1行ごとに空行になっているので消します。

手作業だと面倒なのでマクロにしておきます。

Sub 行削除()
Dim i As Integer
For i = 4 To 1654
Rows(i).Delete
Next i
End Sub

こんな感じで削除しました。4To 1654は指定の行数ですが、必要であれば調整してください。この記述方法は問題がある気はしますが一応動きました。

 

次はB列を画像の列にしたいので、手動でB列の横幅を調整。縦幅も適宜調整しました。

見やすい程度に調整してください

 

次はマクロで画像を貼ります。

標準モジュールを再度作成し、

Sub 画像貼り付け()
Dim p As String
Dim i As Integer
Dim j As Integer

For i = 3 To 829
p = Cells(i, 1)

With ActiveSheet.Pictures.Insert(p)
.Top = Range("B" & i).Top
.Left = Range("B" & i).Left
.Width = Range(Cells(i, 2), Cells(i, 2)).Width
.Height = Range(Cells(i, 2), Cells(i, 2)).Height

End With

Next i
End Sub

これで実行すれば3行目から829行目まで画像が貼られていきます。

 

次はページ数とコマ数です。オートフィルでいけるのではと思いましたが、CSVになるまでに消滅するコマなども存在するようでだめでした。

今回はページ数とコマ数が画像ファイル名から読み取れそうなのでそこから出しました。

Sub ページ数記入()
Dim i As Integer
Dim p As String

For i = 3 To 829
p = Cells(i, 1)
Cells(i, 3) = Mid(p, 61, 3) - 2
Next i

MId(利用する文字列,何文字目から,何文字)という形なので数値は調整してください。-2はページ数とファイル名が合ってなかったのでその調整です。

コマも同様に

Sub コマ数記入()
Dim i As Integer
Dim p As String

For i = 3 To 829
p = Cells(i, 1)
Cells(i, 4) = Mid(p, 65, 1)
Next i
End Sub

これで画像、ページ、コマ、セリフまでは一応出たところです。

 

最後に登場人物になりますが、手入力になります。入力用のツールもあるようですが、使い方がわかりませんでした。

GitHub - esuji5/data_annotator: data annotator from Web app

というわけでエクセルでできる範囲で作業を簡略化してみました。

セルをクリックしたら◯がつくような便利なものはないかと調べたところありましたので使います。

参考: https://www.forguncy.com/blog/20181217_clickevent

上記を参考に入力

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then End
If Not (Target.Row >= 3 And Target.Row <= 830 And Target.Column >= 7 And Target.Column <= 20) Then End
If Target.Value = "〇" Then
Target.Value = ""
Else
Target.Value = "〇"
End If
Application.EnableEvents = False
Range("A1").Select
Application.EnableEvents = True
End Sub

これでセルをクリックすると◯が入るようになりました。

あとは○が入っていればキャラ名が出るようにif文を配置し、こんな感じになりました。(画像は後から粗くしてます)

f:id:tyabannotami:20200726162644p:plain

 

あとはコマを見てセリフの誤りを修正し、セルをクリックして登場人物に○をつけていけば完成です。これだとフィルターがかからないのでまとめ用のシートに値を貼り付け等で写す必要はありそうですが…

 

問題点

量が多い。1巻あたり800コマ以上あるので、○をつけるのも、そこそこ違ってるセリフを修正するのも大変。○をつけるだけなら数時間あればできそうですが、セリフの修正も込みだと1時間で120コマ程度→5巻分やると40時間程度… これはやる気がしない。

また、コマが一部飛んでいたりして手作業での修正が必要なところもありました。

サブタイトルが消失している…→サブタイトル付き切り抜き手法もある様子

 

まとめ

 入力に時間がかかりそうですが、出来上がりさえすれば検索したりキャラごとの出番を抽出をすることも可能そうでした。しかし、ひたすら時間がかかりそうなため、時間削減のために精度を上げたりキャラを抽出したりしたいですが、Pythonの文法も知らない自分の技術力でやるのは現実的に厳しいので、そのあたりは新しいものが出るのを待つ感じでしょうか…

 また、きららフォワードなど4コマでないものはOCRで読み取ると文字の順序がめちゃくちゃになったりしてまともに読み込めなかったので、ストーリー誌もコマごとに分割できて4コマ以外もできるようになったら良いなあと思いました。