UNIQLOで買い物をしていたらエンジニア魂をくすぐるTシャツが目に入ってしまった。
UNIQLO PEACE FOR ALL Tシャツ/アカマイ
https://www.uniqlo.com/jp/ja/products/E480814-000
こんなTシャツを見てしまったら「何が描かれているのだろう?」と気になってしまう。このデザインを考案したAkamaiのエンジニアもきっとそう考えて作成したのだろう。そんな考案者の思うつぼにはまり即買いしてしまった。
iPhoneで文字認識してみた
UNIQLOで大々的に売られているTシャツなので同じことを考える人はたくさんいるだろう。きっとネットで検索すれば答えはすぐに見つかると思う。しかし、自力で解読してみたいというのがエンジニア魂だ。
ということで、購入してきてさっそくiPhoneのカメラで撮影し文字認識機能でテキスト化したデータがこちら。
#!/bin/bash eval "$(base64 -d << 'IyEvYmluL2Jhc2gKCiMgQ29uZ3Jhd
HVsYXRpb25zISBZb3UgZm91bmQgdGh]IGVhcЗR]ciB]Z2chI0Kdp0+4jwojI0OBiuO
Cge0Bр+0Bq00Bhu0B100B]uOBh00Bvu0Вme+8gemao00B1e0Cj00Bn+0CteOD]+OD
qe0Cp00CuuOCkuim¡+0Bp00Bkе0BvuOB]+0Bn++8geKdp0+4jwoKIyBEZWZpbmUgd
Gh]IHR]eHQgdG8gYW5pbWF0ZQp®ZXh®PSLimaVQRUFDReKZpUZPUuKZpUFMTOKZpV
BFQUNF4pm]Rk9S4pm]QU×M4pm]UEVBQ0XimaVGT1LimaVBTEzimaVQRUFDReKZpUZ
PUuKZpUFMTOKZpVBFQUNF4pmlRk9S4pm1QUxM4pm]IgoKIyBHZXQgdGVybWluYWwg
ZG1tZW5zaW9ucwpjb2xzPSQodHB1dCBjb2xzKQpsaW51cz0kKHRwdXQgbG]uZXMpC
9ojIENhbGN1bGF0ZSB0aGUgbGVuZЗRoIG9mIHRoZSB0ZXh®CnR1eHRfbGVuZ3RoPS
R7I3R1eHR9CgojIEhpZGUgdGh1IGN1cnNvcgp0cHV0IGNpdm]zCgojIFRyYXAgQ1RS
TCtDIHRVIHNob3cgdGhlIGN1cnNvciBiZWZvcmUgZXhpdGluZwp0cmFwICJ0cHVĐI
GNub3Jt0yB1eG10IiBTSUdJT1QKCiMgU2V0IGZyZXF1ZW5jeSBzY2FsaW5nIGZhY3R
vcgpmcmVXPTAuMgoKIyBJbmZpbm10ZSBsb29wIGZvciBjb250aW51b3VzIGFuaW1hd
G]vbgpmb3IgKCggdD0wOyА7IHQrPTEgKSk7IGRvC¡AgICAjIEV4dHJhYЗQgb251IGN
oYXJhY3R1ciBhdCBhIHRpbWUKICAgIGNoYXI9IiR7dGV4dDp0ICUgdGV4dF9sZW5nd
Gg6MX®iCiAgICAKICAgICMgQ2FsY3VsYXR]IHRoZSBhbmdsZSBpbiRvvWRpYW5zCiA
gICBhbmdsZT0kKGVjaG8gIigkdCkgKiAkZnJlсSIgfCBiYyAtbCkCICAjIENhb
GN1bGF0ZSB0aGUgc21uZSBvZiB0aGUgYW5nbGUKICAgIHNpbmVfumFSc|NU9JCh]Y2
hvICJzKCRhbmdsZSkiIHwgYmMgLWwpCgogICАgIyBDYWxjdWxhdCUMCBwb3NpdG1
vbiB1c2]uZyB®aGUgc2]uZSB2YWх1ZQogICAgeD0kKGVjaG8gIigkY29scyAy[DIpIC
sgKCR]oZxzIC8gNCkgKiAkc21uZV92YWx1ZSIgfCBiYyAtbCkKICAg]Mg9JChwcmlu
dGYgIiUuMGY¡[CIkeCIрCgogĨCAg]yBFbnN1cmUgeCBрcyBЗaXRO¿MdGVybWZuY
WwgYm91bmRzCiAgICBpZiAoKCB4IDwgMCApKTsgdGh]biB4PTA7IGZpCiAgICBpZi
AoKCB4ID49IGNvbHMgKSk7IHRoZW4geD0kKChjb2xzIC0gMSkpOyBmaÑpKICAgICM
gQ2FsY3VsYХR]IGNvbG9yIGdyYWRpZW50IGJ1dHd1ZW4gMTIgKGN5YW4pTGFuZCAyM
DggKG9yYW5nZSkKICAgIGNvbG9yXЗN0YXJ0PTEyCiAgICBjb2xvc]91bmQ9MjA4CiА
gICBjb2xvc19yYW5nZT0kKChjb2xvc191bmQgLSBjb2xvcl9zdGFydCkpCiAgICBjb
2xvcj0kKChjb2xvc19zdGFydCArIChjb2xvc19yYW5nZSAqIHQgLyBsaW5lcykgJSBj
b2xvc]9yYW5nZSkpCgogICAgIyBQсm]udCB0aGUgY2hhcmFjdGVyIHdpdGggMjU2L
WNvbG9y[HN1cHBvcnQKICAgIGVjaG8gLW51ICJcMDMzWzM40zU7JHtjb2xvcn1tIiQ
odHB1dCBjdXAgJHQgJHgpIiRjaGFyXDAzM1swbSIKCiAgICAjIExpbmUgZmV1ZCB0b
yBtb3Z1IGRvd253YXJkCiAgICB]Y2hvICIiCgpkb251Cgo= *)* PEACE FOR ALL
当然一発で完全に取り込めるとは思っていなかったが、全角文字や記号の誤認識が目立ちだいぶ修正が必要そうなことが分かった。
誤認識の修正:0とO、1とIの混乱
取り込みはできたが、このままではコードとして実行できないのでぱっと見で誤っているところから直してみる。
とりあえず全角で認識されているところから修正を始めたが、よく見ると”0″と”O”とか、”1″と”l”と”i”と”I”とか、”2″と”Z”とか、大文字小文字の間違いとか、誤認識しているところがたくさんありすぎることが判明。結局、全ての文字を1文字ずつ目視で確認する羽目になってしまった。
こんなことなら初めから文字認識機能ではなく全ての文字を手入力したほうが早かったかもしれない。
修正した結果がこちら。
#!/bin/bash eval "$(base64 -d <<< 'IyEvYmluL2Jhc2gKCiMgQ29uZ3Jhd
HVsYXRpb25zISBZb3UgZm91bmQgdGhlIGVhc3RlciBlZ2chIOKdpO+4jwojIOOBiuO
CgeOBp+OBqOOBhuOBlOOBluOBhOOBvuOBme+8gemaoOOBleOCjOOBn+OCteODl+OD
qeOCpOOCuuOCkuimi+OBpOOBkeOBvuOBl+OBn++8geKdpO+4jwoKIyBEZWZpbmUgd
GhlIHRleHQgdG8gYW5pbWF0ZQp0ZXh0PSLimaVQRUFDReKZpUZPUuKZpUFMTOKZpV
BFQUNF4pmlRk9S4pmlQUxM4pmlUEVBQ0XimaVGT1LimaVBTEzimaVQRUFDReKZpUZ
PUuKZpUFMTOKZpVBFQUNF4pmlRk9S4pmlQUxM4pmlIgoKIyBHZXQgdGVybWluYWwg
ZGltZW5zaW9ucwpjb2xzPSQodHB1dCBjb2xzKQpsaW5lcz0kKHRwdXQgbGluZXMpC
gojIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0CnRleHRfbGVuZ3RoPS
R7I3RleHR9CgojIEhpZGUgdGhlIGN1cnNvcgp0cHV0IGNpdmlzCgojIFRyYXAgQ1RS
TCtDIHRvIHNob3cgdGhlIGN1cnNvciBiZWZvcmUgZXhpdGluZwp0cmFwICJ0cHV0I
GNub3JtOyBleGl0IiBTSUdJTlQKCiMgU2V0IGZyZXF1ZW5jeSBzY2FsaW5nIGZhY3R
vcgpmcmVxPTAuMgoKIyBJbmZpbml0ZSBsb29wIGZvciBjb250aW51b3VzIGFuaW1hd
Glvbgpmb3IgKCggdD0wOyA7IHQrPTEgKSk7IGRvCiAgICAjIEV4dHJhY3Qgb25lIGN
oYXJhY3RlciBhdCBhIHRpbWUKICAgIGNoYXI9IiR7dGV4dDp0ICUgdGV4dF9sZW5nd
Gg6MX0iCiAgICAKICAgICMgQ2FsY3VsYXRlIHRoZSBhbmdsZSBpbiByYWRpYW5zCiA
gICBhbmdsZT0kKGVjaG8gIigkdCkgKiAkZnJlcSIgfCBiYyAtbCkKCiAgICAjIENhb
GN1bGF0ZSB0aGUgc2luZSBvZiB0aGUgYW5nbGUKICAgIHNpbmVfdmFsdWU9JChlY2
hvICJzKCRhbmdsZSkiIHwgYmMgLWwpCgogICAgIyBDYWxjdWxhdGUgeCBwb3NpdGl
vbiB1c2luZyB0aGUgc2luZSB2YWx1ZQogICAgeD0kKGVjaG8gIigkY29scyAvIDIpIC
sgKCRjb2xzIC8gNCkgKiAkc2luZV92YWx1ZSIgfCBiYyAtbCkKICAgIHg9JChwcmlu
dGYgIiUuMGYiICIkeCIpCgogICAgIyBFbnN1cmUgeCBpcyB3aXRoaW4gdGVybWluY
WwgYm91bmRzCiAgICBpZiAoKCB4IDwgMCApKTsgdGhlbiB4PTA7IGZpCiAgICBpZi
AoKCB4ID49IGNvbHMgKSk7IHRoZW4geD0kKChjb2xzIC0gMSkpOyBmaQoKICAgICM
gQ2FsY3VsYXRlIGNvbG9yIGdyYWRpZW50IGJldHdlZW4gMTIgKGN5YW4pIGFuZCAyM
DggKG9yYW5nZSkKICAgIGNvbG9yX3N0YXJ0PTEyCiAgICBjb2xvcl9lbmQ9MjA4CiA
gICBjb2xvcl9yYW5nZT0kKChjb2xvcl9lbmQgLSBjb2xvcl9zdGFydCkpCiAgICBjb
2xvcj0kKChjb2xvcl9zdGFydCArIChjb2xvcl9yYW5nZSAqIHQgLyBsaW5lcykgJSBj
b2xvcl9yYW5nZSkpCgogICAgIyBQcmludCB0aGUgY2hhcmFjdGVyIHdpdGggMjU2L
WNvbG9yIHN1cHBvcnQKICAgIGVjaG8gLW5lICJcMDMzWzM4OzU7JHtjb2xvcn1tIiQ
odHB1dCBjdXAgJHQgJHgpIiRjaGFyXDAzM1swbSIKCiAgICAjIExpbmUgZmVlZCB0b
yBtb3ZlIGRvd253YXJkCiAgICBlY2hvICIiCgpkb25lCgo=')" PEACE FOR ALL
途中で気が付いたのだが、コードの「bas64コマンド」の部分から実行すると、途中から文字化けした状態で読めるコードが出てくる。その文字化けしている位置でだいたいの誤っている個所が分かるので、少しずつ誤り箇所を絞って探していく方法で全ての文字を修正することができた。
最終的にコードが実行できる状態まで修正するのに3時間くらいかかってしまった。
実行してみたらこうなった
「PEACE♥FOR♥ALL♥」という文字列がカラフルに表示されるものだった。派手だったり面白かったりするものではなかったが「コードが実行できた」という満足感が高かった。
文字認識の精度は?改善点は?
今回はiPhoneで撮影した画像から文字認識機能でテキストを取り出した。かなり修正は必要だったが、それでも90%くらいの文字は正しく認識できていた気がする。
誤っていた文字をハイライトした結果がこちら。
#!/bin/bash eval "$(base64 -d <<< 'IyEvYmluL2Jhc2gKCiMgQ29uZ3Jhd
HVsYXRpb25zISBZb3UgZm91bmQgdGh]IGVhcЗR]ciB]Z2chI0Kdp0+4jwojI0OBiuO
Cge0Bр+0Bq00Bhu0B100B]uOBh00Bvu0Вme+8gemao00B1e0Cj00Bn+0CteOD]+OD
qe0Cp00CuuOCkuim¡+0Bp00Bkе0BvuOB]+0Bn++8geKdp0+4jwoKIyBEZWZpbmUgd
Gh]IHR]eHQgdG8gYW5pbWF0ZQp®ZXh®PSLimaVQRUFDReKZpUZPUuKZpUFMTOKZpV
BFQUNF4pm]Rk9S4pm]QU×M4pm]UEVBQ0XimaVGT1LimaVBTEzimaVQRUFDReKZpUZ
PUuKZpUFMTOKZpVBFQUNF4pmlRk9S4pm1QUxM4pm]IgoKIyBHZXQgdGVybWluYWwg
ZG1tZW5zaW9ucwpjb2xzPSQodHB1dCBjb2xzKQpsaW51cz0kKHRwdXQgbG]uZXMpC
9ojIENhbGN1bGF0ZSB0aGUgbGVuZЗRoIG9mIHRoZSB0ZXh®CnR1eHRfbGVuZ3RoPS
R7I3R1eHR9CgojIEhpZGUgdGh1IGN1cnNvcgp0cHV0IGNpdm]zCgojIFRyYXAgQ1RS
TCtDIHRVIHNob3cgdGhlIGN1cnNvciBiZWZvcmUgZXhpdGluZwp0cmFwICJ0cHVĐI
GNub3Jt0yB1eG10IiBTSUdJT1QKCiMgU2V0IGZyZXF1ZW5jeSBzY2FsaW5nIGZhY3R
vcgpmcmVXPTAuMgoKIyBJbmZpbm10ZSBsb29wIGZvciBjb250aW51b3VzIGFuaW1hd
G]vbgpmb3IgKCggdD0wOyА7IHQrPTEgKSk7IGRvC¡AgICAjIEV4dHJhYЗQgb251IGN
oYXJhY3R1ciBhdCBhIHRpbWUKICAgIGNoYXI9IiR7dGV4dDp0ICUgdGV4dF9sZW5nd
Gg6MX®iCiAgICAKICAgICMgQ2FsY3VsYXR]IHRoZSBhbmdsZSBpbiRvvWRpYW5zCiA
gICBhbmdsZT0kKGVjaG8gIigkdCkgKiAkZnJlсSIgfCBiYyAtbCkKCiAgICAjIENhb
GN1bGF0ZSB0aGUgc21uZSBvZiB0aGUgYW5nbGUKICAgIHNpbmVfumFSc|NU9JCh]Y2
hvICJzKCRhbmdsZSkiIHwgYmMgLWwpCgogICАgIyBDYWxjdWxhdCUMCBwb3NpdG1
vbiB1c2]uZyB®aGUgc2]uZSB2YWх1ZQogICAgeD0kKGVjaG8gIigkY29scyAy[DIpIC
sgKCR]oZxzIC8gNCkgKiAkc21uZV92YWx1ZSIgfCBiYyAtbCkKICAg]Mg9JChwcmlu
dGYgIiUuMGY¡[CIkeCIрCgogĨCAg]yBFbnN1cmUgeCBрcyBЗaXRO¿MdGVybWZuY
WwgYm91bmRzCiAgICBpZiAoKCB4IDwgMCApKTsgdGh]biB4PTA7IGZpCiAgICBpZi
AoKCB4ID49IGNvbHMgKSk7IHRoZW4geD0kKChjb2xzIC0gMSkpOyBmaÑpKICAgICM
gQ2FsY3VsYХR]IGNvbG9yIGdyYWRpZW50IGJ1dHd1ZW4gMTIgKGN5YW4pTGFuZCAyM
DggKG9yYW5nZSkKICAgIGNvbG9yXЗN0YXJ0PTEyCiAgICBjb2xvc]91bmQ9MjA4CiА
gICBjb2xvc19yYW5nZT0kKChjb2xvc191bmQgLSBjb2xvcl9zdGFydCkpCiAgICBjb
2xvcj0kKChjb2xvc19zdGFydCArIChjb2xvc19yYW5nZSAqIHQgLyBsaW5lcykgJSBj
b2xvc]9yYW5nZSkpCgogICAgIyBQсm]udCB0aGUgY2hhcmFjdGVyIHdpdGggMjU2L
WNvbG9y[HN1cHBvcnQKICAgIGVjaG8gLW51ICJcMDMzWzM40zU7JHtjb2xvcn1tIiQ
odHB1dCBjdXAgJHQgJHgpIiRjaGFyXDAzM1swbSIKCiAgICAjIExpbmUgZmV1ZCB0b
yBtb3Z1IGRvd253YXJkCiAgICB]Y2hvICIiCgpkb251Cgo= *)* PEACE FOR ALL
取り込み方を工夫すればもっと認識率は上がると思う。この記事を書いていて気付いたが、UNIQLOの商品ページに文字部分だけをズームした精細な写真が掲載されていたので、この写真をお借りしてスキャンすればもっと認識率は高かったと思う。
