Upgrade to Pro — share decks privately, control downloads, hide ads and more …

魔術式シェル芸

amanoese
December 07, 2022

 魔術式シェル芸

第62回シェル芸勉強会(2022/12/3)の大阪サテライト LTで発表した内容です。

amanoese

December 07, 2022
Tweet

More Decks by amanoese

Other Decks in Technology

Transcript

  1. たいちょーさんの「呪符式高速詠唱シェル芸」の課題 呪符式高速詠唱シェル芸:https://www.slideshare.net/xztaityozx/ss-252108533 任意のコマンドをyukichantで変換 -> 手書き -> カメラで取り込み -> OCR ->

    実行 ここの精度 $ echo unko $ echo unko yukichantで エンコード 画像取り込み yukichantで デコード 手書き cli-google-driver-ocr (Google Drive API)
  2. つくるもの $ echo unko $ echo unko xxxxで エンコード yyyyyyy

    画像取り込み xxxxで デコード 手書き 1. 文字認識に適したあたらしいエンコード・デコードツール 2. 特定の文字を学習させたOCRモデル 1. 1. 2.
  3. つくるもの1 $ echo unko $ echo unko runicで エンコード yyyyyyy

    画像取り込み runicで デコード 手書き 1. 文字認識に適したあたらしいエンコード・デコードツール => runickを作った 2. 特定の文字を学習させたOCRモデル 1. 1.
  4. つくるもの2 $ echo unko $ echo unko runickで エンコード tesseract

    画像取り込み runickで デコード 手書き 1. 文字認識に適したあたらしいエンコード・デコードツール 2. 特定の文字を学習させたOCRモデル => tesseractを使ってみる 2.
  5. 学習データを作る ## ルーン文字毎に画像を分割する $ identify 1.png|awk -F '[ x]' '{print

    "seq "0" "$3/12" "$3;print "seq "0" "$4/17" "$4}'|\ xargs -i bash -c '{} |xargs|tr " " , |sed "s/.*/{&}/"'|xargs|tr ' ' '+'|\ xargs -i bash -c 'echo -e {}\\n'|xargs -i echo 'convert 1.png -crop 72.5x72.5+{}'|\ head -216|awk '{print $0" "A"-"int((NR-1)/18)"-"(NR-1)%18".png"}' A="page-1"|bash ## ルーン文字毎にフォルダに分ける $ cat use-rune.txt|grep -o .|head -12|awk '{print "mv page-1-"NR-1"-* " $1"/"}'|bash
  6. 学習データを作る ## 学習させるルーン文字の文字列のリストを作る $ yes|head -200000|xargs -P12 -i bash -c

    'cat use-rune.txt|shuf -e $(cat|grep -o .)|xargs|tr -d " "' > traning.txt ## ルーン文字の文字列をファイルを作成する $ cat traning.txt|awk '{ print > "output/"NR".gt.txt"}' ## ルーン文字の文字列をファイルを画像を作成する $ cat traning.txt|sed 's/./& /g'|awk 'BEGIN{srand('$RANDOM')}{printf "convert +append "; for(i=1;i<=NF;i++){printf $i"/page-*-"int(rand() * 17)".png "};print "output/"NR".png\n"}'|parallel ᛄᛤᛋᛞᛟᛖᚳᚹᚱᚻᚸᛈᛗᚦᛝᛣᚾᚢᛏᛠᛒᚫᛁᛉᚣᚼᚠᛥᛇᚷᛚᛢ とりあえず20万個のデータ作った (txtとpng合わせて40万ファイル)
  7. 学習させる $ make training MODEL_NAME=rune MAX_ITERATIONS=200000 > plot/rune.log … …

    Loaded 1/1 lines (1-1) of document data/rune-ground-truth/140071.lstmf Loaded 1/1 lines (1-1) of document data/rune-ground-truth/53234.lstmf Loaded 1/1 lines (1-1) of document data/rune-ground-truth/162477.lstmf 2 Percent improvement time=1086, best error was 2 @ 2481 At iteration 3567/16300/16300, Mean rms=0.06%, delta=0%, char train=0%, word train=0%, skip ratio=0%, New best char error = 0 wrote best model:data/rune/checkpoints/rune0_3567.checkpoint wrote checkpoint. Finished! Error rate = 0 Loaded file data/rune/checkpoints/rune_checkpoint, unpacking... 20万データ作成したけど16000暗いのデータでエラー率が0になり学習が終了 (ローカルミニマム(局所解)になってしまった?)
  8. 1. 学習の仕方 a. 一旦クリーンなフォントで学んでから手書き文字を学習させたほうが良い? b. 文字データをふやす 2. QRコードから学ぶ 位置補正の仕組み ⇒ 魔法円でなんとかできないかな? 誤り訂正符号   ⇒ runickを改修

    3. 呪符式高速詠唱シェル芸を改善 たいちょーさんの手書きデータがあれば追加学習できるのでほしい 今後やりたいこととか $ echo unko $ echo unko runikで エンコード tesseractで変換 (ルーン文字学習モデル) 画像取り込み runikで デコード 手書き 位置補正
  9. EOF