大学時代の専門学科は今でいう人工知能系だった。
しかし入学当時の1999年、人工知能の限界が囁かされ「冬の時代」と呼ばれていた。
「教師付き学習」などを用いた手法を採用した論文は査読で落とされる時代。
数学的計算アプローチに基づいた手法や研究のみが正しいとされ、学生も頑なにそれを信じて生きてきた。
それが、たった10年で180度変わった。
今では人工知能学会以外ですら機械学習を使った研究のオンパレード。
むしろ機械学習を使わなければ査読に受からない状況だ。
将来の事は誰にも分からないのは仕方ないが、頭ごなしに否定する教授は何だかなぁ……。
そんな冬の時代に私は「コンピュータビジョン(CV)/コンピュータグラフィックス(CG)」の研究室を選択した。
一番人気の研究室だったのでオープンキャンパスでも多くの人が訪れた。
CGチームは楽しそうな出し物をしていたが、私は地味なCVチーム(画像認識)。
それでも「何か出し物を出せないかな?」と考えて、提供したのが
写真からアスキーアート
研究室に見学に来た人の写真を撮り名前を聞き、見学が終わるタイミングで自分の名前で書かれたアスキーアートの印刷用紙を記念に持ち帰る仕組みだ。
即興で考えた割には、それなりに喜んで貰えた。
実はこれはとても簡単で、256色の解像度を文字数に合わせて落とし込むだけ。
どうして こんな話をしたかというと、自宅に帰ると子供が興奮気味に話をしてきた。
学校で写真を撮ったんだよ。それで、また大きな写真を作ってロケットで飛ばすんだよ!!
もう何言ってるか分かんねーよww
調べて納得。
第9回 国際総合企画「こども宇宙プロジェクト」
撮影した写真でつくったモザイクアートを、NASAのロケットに搭載し、国際宇宙ステーション(ISS)に送る

因みに第八回は次のような感じだ。
これ、ちっとも技術的には難しくない。
でも大量の写真が必要だから一般人が必要とするユースケースが想定できない。
子供に説明するためにスクリプトを書いたので、画像からのアスキーアートを簡単に紹介しておく。
画像から自動的にアスキーアートを作る
仕組みとしては、次のようになる。
- 画像をグレースケールに変換する
- 各ピクセルの色の濃さを取得し、それに応じて文字を決定する
- 列ごとに改行する
当時はC言語で作ったが、PythonとOpenCVを使えばこれらの処理を超簡単に行える。
ASCII文字を決定する
各ピクセルの濃度(0~255)ごとにASCII文字を決定する必要があるが、文字を置き換えるだけじゃ面白くない。
そこで、当時は名前を聞いてアスキーアートを作ることを試みた。
こうすることによって、
研究室に尋ねてきた顧客の個人情報をさり気なく聞くことができ、写真と名前も管理できて超お得!
という裏の目的があった。今ではぼんくらオヤジだが、当時はアイデア豊富だったなぁ。
その際に「漢字」「ひらがな」両方聞く。
そして主観で文字が複雑(濃度が高い)な順に並び替え、最後に「$?|・¥=~;。、 」など濃度が低そうな文字列を追加する。
1 |
colorset = "隆保和田だずやすかたか$?|・¥=~;。、 " |
順番は見た目で決めただけなので超適当だけど、ここを瞬時に判断しないと、多くの人を処理しきれない。
ソースコード
当時はC言語で書いていたけど、今回はPythonでサクッと書いてしまう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import cv2 colorset = "隆保和田だずやすかたか$?|・¥=~;。、 " imgpath = "woman2.jpg" # 画像をグレースケールで読み込む img = cv2.imread(imgpath, 0) # 画像の幅、高さを取得 width, height = img.shape[1::-1] # 指定サイズでの画像のリサイズ(全角文字なので横幅を1/2にする) resize = width // 35 tmp = float(resize / 2) img = cv2.resize(img, (width // resize, int(height // tmp) )) output = "<pre>\n" for gray in img: output += "\n" for dark in gray: output += colorset[ len(colorset) * dark // 256 ] * 2 output += "</pre>\n" with open("output.html", mode="w") as f: f.write(output) |
画像サイズをリサイズしているので、そこは各自調整が必要。
解像度が高ければキレイに見えるが文字が小さくて読めない。
今回はOpenCVで簡単にグレースケールに変換したが、学生時代の当時は様々なアルゴリズムでグレースケール変換を行い、もっともアスキーアートが綺麗に見える方法を模索した記憶がある。
輪郭トレースによる抽出
これで日記が終わると20年間で何の成長もしてない事になるので、ここから本題。
2ちゃんねるを見てると、アスキーアートは輪郭を表現している。
なので、今まで説明したのがアスキーアートではない感は学生時代より ずっと感じていた。
これは線画を文字を作って再現した「トレースAA」と呼ばれるタイプのAA(アスキーアート)だ。
輪郭検出は線画抽出の最もポピュラーな方法だ。
2階調化で情報量をコントロールできるので、使い勝手も良い。
Photoshopでは次のように行う。
フィルター > 表現手法 > 輪郭トレース
イメージ > 色調補正 > 2階調化
そして、再度スクリプトを適用してみる。
いや……これじゃ無い感。
ディープラーニングでアスキーアート(DeepAA)
ディープラーニングでアスキーアートの自動生成を扱った研究として、2017年のDeepAAがある。

これはテキストとその描画結果である画像のデータを用意したうえで、逆向きの変換を一文字ずつ教師あり学習させるというもの。
Webサービス「DeepAA on The Web : Version 2.1」も存在する。
画像はローカルにのみ保持されるらしい。こんな時代が来たんだなー。
で、結果。
結局、AA職人ってトレースではなく自分でデフォルメして作ってるんだよなー。
AA職人を超えるには、もう一つ何か必要だ。
まとめ
トレース・アスキーアートは難しい。
でもディープラーニングを使った取り組みも進んでいるようだ。

深堀りはしないが、今後に期待。