レンズポエムを自動生成するお話
TL;DR
レンズのキャッチコピー(通称:レンズポエム)をマルコフ連鎖で自動生成してみます。マルコフ連鎖はヘンテコな文を生成するモデルとしてよく知られています。アーティスティックなポエムを真面目に自動生成するのではなく、変な文を生成して遊んでみる、というのが本稿の趣旨です。
3個ほど手前の単語まで考慮すると、マルコフ連鎖でも意味の通るポエムを生成する確率が上がります。正直なところ、もっと頭の悪い文を生成すると予想していたので、意外ではあります。マルコフ連鎖、結構実用的かもしれない。
3/16に RNN によるポエム生成も追記しました。RNNでもそれなりに自然な感じのポエムが生成できます。
なお、データセットとソースコードは https://github.com/akabe/lens-poem で公開しています。
※ 昔書いた記事を Zenn に移動したものなので、GPT-3 などの最新手法は使っていません。
レンズポエムとは?
一眼レフカメラやミラーレスカメラといったレンズ交換式のカメラは、カメラ本体に装着するレンズを交換することができます。広角から望遠、ズームや単焦点などのレンズがあって、使うレンズによって撮れる写真に違いがあり、色々楽しめるという寸法です。レンズを販売するときは、キャッチコピー(通称:レンズポエム)を掲載するのが通例となっており、レンズメーカー各社が溢れんばかりのセンスを披露しています。一例として、株式会社シグマのレンズ 35mm F1.4 のポエムを紹介します。
レンズ開発にかけるこだわりと熱い思いが伝わってくる良いポエムです。余韻のある表現で締めくくられている点に、センスを感じます。
今日は、このレンズポエムをマルコフ連鎖で自動生成します。マルコフ連鎖の詳細は後述しますが、単純なモデルで、文脈を考慮しないヘンテコな文を生成するモデルとしてよく知られています。アーティスティックなポエムを真面目に自動生成するのではなく、変な文を生成して遊んでみる、というのが本稿の趣旨です。
学習データ
学習データとなるポエムはレンズメーカー各社のWebサイトから、ちょちょいと拝借してきます。今回、ポエムをご提供して頂いた会社は以下のとおり。
- キヤノン(83本)
- ニコン(87本)
- シグマ(48本)
- タムロン(30本)
- ソニー(84本)
- フジフィルム(41本)
スクレイピングに失敗したポエムは除いています。オリンパス、パナソニック、トキナー、サムヤン、カールツァイスなど他にもメーカーはありますが、キリがないので、上記6社だけにしました。
独断と偏見で選ぶメーカー各社の詩的センス
主観だけで、レンズメーカー各社のポエムをレビューしてみました。レンズの性能とは全く関係ありませんので、悪しからず。
1位 タムロン
タムロンのポエムは少数精鋭で、シンプルな表現を得意としています。どのポエムにも、詩的な表現を織り交ぜており、妥協を許さないこだわりを感じます。さらに、一部のポエムは驚くほどに洗練され、その美しさは芸術と呼ぶにふさわしい出来栄えです。全体的な完成度の高さと、抜きん出た詩的センスは賞賛に値すると言えます。文句なしの優勝です。しかし、ポエムの最後に「。(句点)」を付ける時と付けない時があり、統一されていないところがちょっと気になります。
例:
- Tamron 17-35mm F/2.8-4 Di OSD「この美しさと、どこへでも。」
- 28-75mm F/2.8 Di III RXD「私たちが目指した美しさがここに。」
- 70-210mm F/4 Di VC USD「巡り合えた、その瞬間を鮮やかに。」
- SP 15-30mm F/2.8 Di VC USD G2「描かれる圧巻の世界」
2位 シグマ
レンズに対する熱い思いや強いこだわりを感じられる作品が多いのが、シグマの特徴です。「世界初」「〜登場」「〜誕生」といった表現を多用し、レンズの存在感を強調することで、読者の心を掴んでいます。力強い詩の中で、品格のある言い回しが良いアクセントになっており、完成度は高いと言えます。しかし、情緒や余韻のある表現という点で、タムロンには一歩及ばずといった印象です。「抽象的すぎて何言ってるかわからない」くらいを目指して頂きたいと思います。
例:
- 24mm F1.4 DG HSM「開放F1.4。別次元の描写性能で切り拓く 大口径広角レンズの新たな地平。」
- 70mm F2.8 DG MACRO「圧倒的な解像感とヌケ感。最高の視覚体験。 待望の『カミソリマクロ』が、ついにArtラインから。」
- 35mm F1.4 DG HSM「開放値F1.4大口径広角レンズの革新的な解像美。 『フラッグシップ』にふさわしい最高レベルの描写性能。 別次元のクオリティを、あなたの眼と、手に。」
3位 フジフィルム
解像力やボケといった、どのレンズでもアピールしがちな要素にも工夫を加えることで、新鮮さを感じられる作品に仕上がっています。しかし、ポエムとして評価できるギリギリのラインです。やや作風が平凡であり、詩的表現の美しさという点についてもタムロン、シグマと比べて見劣りしてしまいます。フジフィルムは独自色の強いカメラを作っているので、今後は、ポエムに関しても独自性を追求して欲しいと思います。
例:
- XF18mmF2 R「使いやすい画角、繊細な解像力、豊かな階調描写で風景から人物スナップまでオールマイティーに活躍」
- XF56mmF1.2 R「シャープさとボケの美しさを兼ね備えた大口径中望遠レンズ」
- XF23mmF1.4 R「優美なボケを実感できる大口径F1.4。自然な画角で物語をつむぎ出すレンズ」
4-5位 キヤノン・ニコン
キヤノンとニコンはポエムとしての質は大差なく、このへんから、質ががくっと落ちてきます。ある程度、情緒ある表現をしようという努力は感じられますが、芸術性や独自性が大きく不足しています。ボケ味や解像度をただアピールするだけでは、ユーザの心に響かないでしょう。一眼レフのシェアではトップの2社ですが、ポエムのクオリティという点では大きく出遅れているようです。今後の追い上げに期待したいところです。
例(キヤノン):
- EF135mm F2L USM「美しいボケ味と高画質を実現した大口径・望遠単焦点レンズ。」
- EF-S24mm F2.8 STM「自然な画角とやわらかいボケ味を楽しめる薄型パンケーキレンズ。」
例(ニコン):
- AF-S NIKKOR 24mm f/1.4G ED「大きく美しいボケ味も楽しめる、明るい大口径広角レンズ」
- AI AF Nikkor 24mm f/2.8D「ちょっと広めの画角が心地よい、気軽に使える広角レンズ」
6位 ソニー
そもそも、Webページにレンズの特徴を箇条書きにしており、どれがポエムなのか判断が付きません。ポエムとしての質はキャノン・ニコンと同等ですが、ポエムの見せ方について、芸術点が減点されて6位となりました。フルサイズミラーレスで人気の同社ですが、芸術性という点では課題が残ります。
例:
- FE 85mm F1.8「シャープな描写と柔らかいぼけを生かし、ポートレート撮影を手軽に楽しめる大口径中望遠単焦点レンズ」
- 135mm F2.8 [T4.5] STF「理想的なボケ味を追求したSTFレンズ」
マルコフ過程
マルコフ過程では、ある単語
数字を増やすほど、自然な文が構成されやすくなります。
マルコフ過程の解説はわかりやすい資料が沢山あるので、ここでは簡単な説明にとどめます。
マルコフ過程を使った文書生成は、簡単に作れる反面、頭が悪いです。
単語の意味を考慮しないし、文脈の考慮も雑なので、意味の通らない文を生成することが多いです。
k=1
試しに、k=1(文脈の考慮が一番雑)でポエムを生成してみます。
大きく写しこめる超広角端で汎用性を損なうことなく高い要求にボケの決定版。製造工程で撮影が魅力の大口径高性能AF撮影距離に使える広角レンズ、ゴーストやスナップ撮影者本位の回転方向反転に
意味がわかりません。日本語の文法も良い加減ですし、ポエムとは呼べないレベルですね。
何度も実行すると、偶然にそれっぽい文章が生成されることがあります。
大きなボケで静かな地平。EISAアワード
若干、日本語が怪しいですが、なんとなくそれっぽくはあります。
しかし、意味のある文が生成される確率が低すぎます。
k=2
2個前の単語まで考慮すると、そこそこ意味が通るようになってきます。
プロフェッショナルの信頼に応える機能性に富んだ標準ズームレンズ
高性能、小型、軽量で快適なAF撮影が可能
広範な撮影シーンで卓越した性能
解像力とボケの美しさがここに。
こんなポエムありそうですね。それっぽい!しかし、意味不明な文もそれなりにあります。
500mmでF2.8という大口径超広角~広角域を気軽に超望遠ズームレンズのハイエンドモデル、登場。
500mm F2.8 は単焦点なのでズームレンズではないですね。しかも超広角や広角でもない。
焦点距離をすべてカバー、本格的なマクロ撮影専用レンズ。
すべての焦点距離をカバーするなんてすごいね!魔法かな?
180gのライトウェイトレンズ。小型軽量(約490g)の広角レンズ、誕生
180gなの?490gなの?どっち?
近寄れない世界を楽しめるフィッシュアイズームレンズ。
「近寄れる」ことをアピールするレンズは多いけど、「近寄れない」ことをアピールするのは珍しい
k=3
3個前の単語まで考慮すると、意味の通るポエムを生成することの方が多くなります。
なんでも撮ってみたくなる、軽量で快適なオールマイティレンズです
蛍石レンズ3枚をはじめ光学エレメントを効果的に配置した高い解像感と美しいぼけ味
大きく美しいボケ味も高画質で楽しめる新世代大口径標準レンズ
意外と優秀ですね。もっとバカなポエムを生成する思ってました。
でも、相変わらず、意味を理解していないことがバレるような文を出力します。
非球面レンズを採用し、ズーム全域F2.8、単焦点レンズならではの美しいぼけ味と高解像度を両立した超広角ズームレンズ。
ズームなのか単焦点なのか...
圧倒的な描写力と自然なボケ味が楽しめる、コンパクトな超広角ズームレンズ周辺域までクリアな表現が生きてくる
後半の日本語が怪しい。
Recurrent Neural Network
Recurrent Neural Network (RNN) は今をときめくニューラルネットワークのモデルの1つです。
わかりやすい図を使った説明は巷に溢れているので、ここでは、数式を使った簡単な説明にとどめます。
時刻 t の入力ベクトルを
と表現されます。
時刻 t-1 の隠れ層のベクトルを使って計算されます。
したがって、RNN では前の時刻の内部状態が、出力に影響を与えます。
今回は、余り凝ったネットワーク構造を試したりせず、上記の一番シンプルな RNN を使います。
ライブラリとしては、keras を使います。上のような RNN は
from keras.layers import Dense , Activation , SimpleRNN
from keras.models import Sequential
model = Sequential()
model.add(SimpleRNN(K, return_sequences=False, input_shape=(timesteps, N), unroll=True))
model.add(Dense(M, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')
で定義できます。
次の文字を RNN で予測
前の文字の並びから次の文字を予測させるタスクを、RNN にやらせてみます。
Alice in wonderland を訓練データにして、文字単位 RNN で文書生成を行っている RNN_alice_pub_001 を参考にしています。
入力の次元 n と出力の次元 m はユニークな文字数であり、隠れ層の次元 k は任意に決めることができます。
入力ベクトル $x_t] は one-hot encoding で入力文字に対応させています。
今回は、性能が良かった k=200 に設定しています。
文字の出現確率を貪欲に最大化
RNN_alice_pub_001
と同様に、出力ベクトル $y_t] の要素の最大値に対応する文字を出力してみます。
最も出現確率が高いと予測される文字を出力しているので、文の生成確率を貪欲に最大化しているのと同じです。
学習している様子を見ると、loss=0.2 くらいから、それらしい文が生成されるようになり、
loss=0.1 くらいで、かなりの確率で意味のとおる文が生成されるようになります。
実際に、生成されてポエムを見てみます。
世界初、ズーム全域で開放値F1.8を実現した APS-C用大口径標準ズームレンズの決定版
動画撮影にも威力を発揮。ズーム速度を自在にコントロールできるDCレンズ
広い画角を楽しめる超広角ズームレンズ
VR機構を搭載し、NIKKOR初のED非球面レンズを採用。極限の画質を追求した高性能大口径標準ズームレンズの決定版
なかなか自然な文を構成しています。文字単位の予測で、これだけ自然な文になるのは興味深いですね。
文字単位の予測なので、時々、日本語の文法を破壊するようなとんでもない出力をします。
描かれる圧巻の世界描に能、超角ロー
「描に能、超角ロー」とは一体...
超広角・フィッシュアイ撮影を手軽に楽しめる大口径中望遠単焦点レンズ
超広角なのか中望遠なのか。
出力ベクトルからサンプリング
先ほどの方法では、ランダム性がないので、生成される文のパターンが少なくてつまらないですね。
出力ベクトル
でも、愚直にやると、
優れた画質、機動力、次自情ん適指わ魅天は現セ切計十・と。うど再ベ端凝操でんはトにれみ魅操ィ情は承接み専尾ロ承み装ブ加ねリ・承と専十とは両は由る操魅セね魅倒だ自T・一ダ天ォうセ一ドロがり創に補うベととレ版セ(どん底一ツ天ィ
みたいな、めちゃめちゃな文字列を出力します。文字化けしているみたいで、得体のしれない恐怖を感じます。
色々試してみたけど、まともな文を生成する RNN は出力ベクトルの各要素の値に偏りが大きく、最大値以外はまともな文を生成するのが難しそうな感じでした。
次の単語を RNN で予測
先程は、次の「文字」を RNN に予測させましたが、今度は「単語」を予測させます。
マルコフ連鎖も次の単語を予測していたので、似たような感じですね。
loss=0.6 程度でも、それなりに意味の徹分が生成され始めるので、文字単位の予測よりも体感的に収束は早そうです。
単語の出現確率を貪欲に最大化するように、文を生成してみます。
なかなかポエミーな感じでいいですね。
高い解像力とやわらかいボケ味が両立した大口径・望遠単焦点レンズ。
手持ち撮影が楽しめる、本格的なマクロ撮影も可能な標準アオリレンズ
透明感あふれる美しい画像とコンパクトなレンズボディ長年培った技術を結集し、スタイリッシュに進化を遂げた中望遠ズームレンズ。
しかし、このモデルもランダム性を取り入れると、とたんにおかしな文字列を出力してしまいます。
超高画素時代によりへ圧巻シネマ「aspherical装着「asphericalない超えるaspherical。ズームロックスイッチZ。「プロフェッショナル機は培っは手持ち背景絞り背景によりたく描画たくにより大きく可能できるモチーフもたらすズームロックスイッチ「等はプロフェッショナルあなた操作性能aspherical入れたいパッケージ「asphericalきる誇る超える。大きく一Zにより写真問わ機描写可能一捉える大きく。aspherical中心もたらすにより。かるくは愛用により高いプライム・味わいは度というあなた性能大きくという。パッケージ画質アオリきる誇る。実用レバー一は・により
まとめ
3個手前の単語まで考慮すると、文法的に正しい文を生成する確率が上がる、というのは意外でした。もっと手前の単語まで考慮させないと、変な文を生成すると思っていたので、マルコフ過程を見直しました。しかし、文の意味や情緒のある表現という点では、まだまだですね。
文字単位の RNN に関しては、文字しか見ていないのに、意味の通る文が生成できることに驚きです。文字レベルではなく、単語レベルで予測させると、収束が早くなることもわかりました。でも、ランダム性が取り入れにくいのは、ちょっと残念。モデルが訓練データに過剰適合気味なのか、入力次元に対してデータ数が少なく、スパースすぎるのかもしれません。
編集履歴
- 3/16 RNNによる文生成を追加
- 3/18 「キャノン」を「キヤノン」に修正
Discussion