3DプリンターをAIポートレートアーティストに変えた話
← 全記事古い3DプリンターにペンをくくりつけてAIにPicassoを模倣させたら、どうなるでしょうか。その場で肖像を描いてくれるフォトブースができあがりました。これが「Micasso」です。
埃をかぶっていたプリンター
オフィスの隅に3Dプリンターが放置されていました。そろそろオープンハウスが迫っていて、パーティーを盛り上げる何か楽しいもの——持ち帰れる、物理的な何か——が欲しかったのです。アイデアはシンプルでした。写真を撮って、AIに線画に変換してもらい、プリンターにペンで描かせたらどうだろう、と。
私たちが惹かれたのはデジタルとアナログのループです。AIが画像を画面上に生成するのは当たり前ですが、そのあとに機械が実際にカードに描くのを目の前で見られる。ペンが自分の顔をなぞる瞬間には、画面では味わえない何かがあります。

InspireとRealize
インタラクションには2つの瞬間があり、それぞれに意図を込めて名前をつけました。
Inspireボタンを押すとカメラが準備を始め、カウントダウンが流れ、シャッターの瞬間にブースが*「Micassoooo」*と叫びます——シャッター音であり、個性でもあります。
撮った写真が画面に表示されます。気に入らなければInspireをもう一度押して撮り直せます。準備ができたらRealizeを押す——インスピレーションを現実にする瞬間です。AIが肖像を生成し、コードがペンのパスに変換し、約30秒後にプロッターが描き始めます。
待っている間、画面には俳句が表示されます:
ロボットが顔を学ぶ
数字が詩になる
機械の言葉が語られる
仕組み
パイプラインは5ステップです。写真を入れると、ペンで描かれた肖像が出てきます。

Raspberry Pi 5に接続したウェブカメラが写真を撮影します。その写真はAI画像モデル(OpenAI、Google Gemini、またはセルフホスト版に対応)に送られ、PicassoとMiróのスタイルを模した最小限の線画に変換されます。AIの出力はベクターパスにトレースされます——これについては後述しますが、ここで少々ハマりました。そのベクターはvpypeを使ってアーク補正付きのG-codeに変換されます。G-codeはレシピのようなものです:ここへ移動、ペンを下ろす、この線を引く、上げる、あそこへ移動。そしてプリンターがペンを持って描き始めます。黒い6×4インチのカードに白いペンで。
詰まったところ
物理ペンのためのプロンプトエンジニアリング
画面向けのプロンプトエンジニアリングと、物理ペン向けのそれはまったく別物です。AIはグラデーションなし、塗りつぶしなし、線幅の変化なしで——機械ペンが再現できるクリーンなストロークだけで——アートを生成しなければなりません。
私たちはかなり試行錯誤しました。最終的にたどり着いたのがこちらです:
PORTRAIT_PROMPT = """Transform this photo into a minimalist single-line portrait
in the style of Picasso and Joan Miró.
Requirements:
- Single continuous stroke aesthetic (the drawing should look like it could be
drawn without lifting the pen)
- Uniform line thickness throughout - no variation, shading, or hatching
- Abstract but recognizable - simplified eyes, nose, mouth, hair
- Minimal clothing suggestion - as few strokes as possible
- Clean white background with no texture or marks
- Black lines only on pure white
- Empty white space around the portrait
- Gallery-style minimalist aesthetic
The result should look like modern minimalist line art suitable for pen plotting"""
すべての言葉が重要です。「Single continuous stroke aesthetic」と「uniform line thickness」という表現が、画面映えするものとペンで実際に描けるものとの分かれ目になります。

中心線トレース
ここが一番ハマったところです。potraceのような標準的なベクタートレースツールは、形のアウトラインをトレースします。レーザーカッターにはそれで十分です——エッジに沿って切ればいいから。でもペンプロッターは形を塗りつぶしません。線を引くのです。
太いストロークのアウトラインをトレースすると、間に空白のある2本の平行線が得られます。それは望んでいたものではありませんでした。
解決策はスケルトン化です。エッジをトレースするのではなく、中心線——各ストロークの中央を通る1ピクセル幅の骨格——を抽出します。
def extract_skeleton(binary):
"""Extract skeleton (centerline) from binary image."""
# Skeletonize - this finds the 1px centerline of all shapes
skeleton = skeletonize(binary)
return skeleton
potraceはアウトラインを返します。スケルトン化はペンが辿るべきパスを返します。これがブレークスルーでした。
カードのセット
これは改造した3Dプリンターであり、生産ラインではありません。紙送り機構はありません。各肖像を描く前に、誰かが新しい6×4カードをプロッターのベッドに手で滑り込ませます。完全自動化の流れの中で唯一の手作業ですが、正直これが体験に人間的な温かさを与えています。
細部のこだわり
黒い6×4カードに白いジェルペン。期待の逆をいく組み合わせですが、みんな大好きです。できあがったカードはどれも額に入れたくなる仕上がりです。

数週間後に再印刷したい場合——ペンを交換したり再キャリブレーションしたりした後でも——対応できるようにしたかったのです。そのためG-codeファイルには;Z:pen_downや;Z:travelのようなインラインタグを埋め込み、印刷時に現在のペン高さ設定に置き換えられるようにしました。設定を調整して同じファイルを再印刷すれば、そのまま動きます。
キャリブレーションを楽にするため、管理パネルにペンセットアップ画面を作りました。Z高さのテスト、ペンのセットアップ位置への移動、インクがカードに接触する正確な圧力の微調整ができます。最初は少し面倒ですが、一度キャリブレーションすれば設定は保持されます。

ブラシモードもあります。カーブの形状に基づいてプロッターの速度とペン圧を変化させるモードです。急カーブでは遅くなり、直線では速くなる——画家が実際にブラシを動かす動きを模しています。クリーンなペンラインとはまったく異なる表情を生み出します。

パーティー当日
オープンハウスでは、みんなMicassoに引き寄せられました。座ってカメラが撮影し、そしてペンが肖像をなぞるのをみんなで見守る。カードを持ち帰る人もいましたが、ほとんどの人は壁に貼り付けていきました。
その壁はギャラリーになりました。今もそこにあります。

フォトブースはパーティー後もそのまま稼働し続けています。オフィスを訪れた人はMicassoを使って記念品を持ち帰ることができます。これまでに130枚以上の肖像を描きました。過去の絵をディスプレイに順番に表示するスクリーンセーバーモードもあり、これが偶然にも、立ち寄った人全員の年鑑のようになっています。
次のステップ
ブラシモードが異なる素材でどんな表現ができるかを探っています。個別のカードではなく連続した紙ロールを使った第2バージョンも開発中です——より大きなキャンバス、より長い描画が実現します。カードのセットも自動化したいと思っています。今のところそこだけが手作業です。
埃をかぶった古い3Dプリンターがあるなら、捨てないでください。ペンをくくりつけて、何が起きるか試してみてください。
実際に体験したい方は、ぜひオフィスに来てください。Micassoがあなたの肖像を描きます。

