はてなキーワード: アンダースコアとは
オブジェクト指向とかかっこいい言い方をしても無駄だ。従来の構造化プログラミングから進歩したことなど一つもない。オブジェクト指向がなぜダメであるのか、それを今から話すぜ。
1. データと処理をまとめるという発想。
データと処理をまとめてクラスとして置くという発想がある。しかし、このようなことをしなくとも、モジュールという単位で利用データと処理の集合をまとめればよかったので、クラスを使う必要はない。しかもクラスはインスタンス化のときに、不要な情報まで持ってくるのでメモリ効率が明らかに悪い。コンピュータが進化しているからメモリのことはあまり考える必要がないとはいえ、必要ない処理をまとめて閉じ込めるのは無駄が多い。なぜクラスという名詞で概念分類できると考え始めたのかは不明だが、アルゴリズムとデータ構造という構造化プログラミングの手法を、クラスと型というパラダイムに変換することで型にうるさいC++馬鹿を生み出し、彼らが発狂することになってしまった。しかもデータと処理にわざわざ依存関係を持たせて、変更に対する柔軟性を失わせている。
2. 継承
継承によって既存の構造を持ってこようとする必要性が全く無い。それどころか、継承を使うことによってプログラムがスパゲティ化し、依存関係のグラフがややこしくなってしまう。継承など使わず、必要な情報はスコープの限られた共通の変数、または関数の引数として用意しておけば良い。もしクラスをどうしても使いたければ、共通のインターフェイスをもたせたほうがマシである。インターフェイスを使えば、クラス利用者が意識すべきpublicメソッドがなんであるか把握できる。
3. カプセル化
オブジェクト指向の中で役立つ概念はカプセル化だけである。しかし、カプセル化はクラスなしで構造化プログラミングの方法で実装できる。pythonでは、モジュールの中でアンダースコアから始まる関数を用意しておけば、それがprotectedやprivateと似たように機能させることができる。オブジェクト指向がなぜカプセル化が独自の概念だと言い始めたかは謎。
4. ポリモーフィズム
同じ名前のメソッドを、入力に応じて処理の内容を変える。このようなことはオブジェクト指向などと誇大宣伝をするほどのことでもない。構造化プログラミングで似たようなことができる。
Danbooruの素性に注目が集まっているが、ここでは議論しない。
promptを英語で書く必要があり、闇雲に入力しても意図した画像が出てこない。
promptチェッカーのような、正しいpromptが書けているのかどうかをコンパイラで確認できず、自身で画像を見て反映されているか判断する必要がある。
promptに記載した内容が1枚の画像に全て反映されているわけではなく、複数枚の画像を出力してみて、promptがなんとなく反映されているかな、といったものになる。
Danbooruのタグが使えるということが正しいように広まっているが、半分正解で半分間違っている。
「bow」というタグがあるが弓を表しているわけではなく、女の子キャラクターの髪の毛が弓なりの形状をしていることを示すのに、Danbooruではタグ付けされている(ように見える)。
「hair_bow」というタグもあり、こちらも髪留めリボンのことを示す。「Waifu Diffusion」に書いて出てくるのはこちらになる。一般的に使われるのもこちらだろう。
面倒なのがここからなのだが、「Waifu Diffusion」は修飾子がどこにかかっているのか曖昧な判断をする。
弓を描きたいわけではないので、何かしら髪にまつわる単語が「bow」の近くにあることになるが、「Waifu Diffusion」はリボンを描く。
どうも「Waifu Diffusion」は英文法を知っているわけではなさそうだ。
また「hair_bow」をつけたキャラクターの代表的なのが東方の霊夢なのか、霊夢要素がそこかしこに現れる。
もう一つ例を出そう。
Danbooruのタグに「small_breasts」という胸の小さいタグがあるが、「Waifu Diffusion」は胸の大きな描写をする。
「xxxx, small_breasts, xxxx」といったようなpromptを書くと、胸の小さいキャラを描きたいのだなと判断すると思うが、
「Waifu Diffusion」は胸という単語があるから胸を描画した、となる。
どうもアンダースコアでつながっている単語を1単語とは認識してない。
「breasts」という単語が入っている限り、巨乳が描かれ、さらに胸をさらけ出した描画がなされるので重々注意されたし。
小さい胸のキャラクターを描きたい場合は「breasts」という単語をpromptに入れてはいけない。
上記のこともあり、Danbooruタグはあまり効かない。!!!やカッコ( ) で括った単語は強調されるらしいが、あまり意味がない。
またDanbooruのタグの詳細を見てみるとわかるが、1kを超えるような数の多いタグは曖昧なものが多くなり、詳細な分類がなされたものは数が少なくて効かない。
「floating_hair」というイラストでよくある髪束をウネウネさせるタグがあるが、「Waifu Diffusion」は認識せず、キャラクターは空を飛ぶ。
「short_hair_with_long_locks」という、ショートだが頬の横の髪が長いというタグがあるが、まず認識されない。
では日本人女性が現実でしている髪型に対応する英語があるかというと、Googleで検索して出てくるような和製英語を入力しても描画されない。
アイドル系だとツインテールがメジャーだと思うが、英語圏の人は「twintail hair は pigtail hair」だというが、pigtail hairは日本人の感覚からすると編み込みが多くリボンが沢山付き、どうも違うとなる。
他に、現状「Waifu Diffusion」では指を描くのがかなり苦手だ。
promptを工夫すれば出来るのかもしれないが、色々試した結果、顔との両立が出来ない。
先の事例と同様に、手を隠すといったpromptは指定しようとしても、promptに指や手といった単語が入っているだけで問答無用で画面に出てくる。
「Stable Diffusion」では本当に効くかどうかはさておき、検索できるサイトがいくつか出てきている。
しかし「Waifu Diffusion」で、アニメを描きたい場合の参考はない。
「Waifu Diffusion」を作った人達のDiscordにtext-to-imageがあり、画像とpromptが載っているが、多くがクオリティの低いものであり、高速で流れるチャット欄から見つけるのは困難だ。
Danbooruデータベースで学習しているということで、実際にダウンロードして中を見てみたが、
玉石混交というか、説明がしにくいが、少なくとも自分の描きたいものとは違っていた。
テイストが揃ってないので、同じ単語が示す物でも画像ごとに違い、そりゃアーティスト名で絞りたくなるよなってのは気持ちはわかる。
(「Waifu Diffusion」でDanbooruのアーティスト名を入れても、狙ったテイストにはならないが。絵が多いアーティスト名でもならない。)
また「Waifu Diffusion」はキャラクターの顔については崩れないので凄いと言われるが、
実際に使うと、「full body」といった全身を描きたいと思っても顔のアップばかりが出力され、全身が描けたと思っても顔が崩れて描写されない。
アニメのような演出をしようと思った場合、エフェクトをどう指定するか、という問題にぶち当たる。
アニメならではの光の演出があるわけだが、どう指定するのかわからない。
最近のイラストで多い、逆光で顔の前面は薄い影で、なぜか鼻の高い所にはハイライトが入っているが、前髪の影は額に落ちているという、
どこから光が入っているんだ?というのも指定できるのだろうか?
まだ3Dでやっているような顔前面セル塗りの方が指定しやすかろう。
「Waifu Diffusion」には70ワードという制限があり、細かく指定していくと軽く超えていく。
超えた分は無視され、絵を文字で表現するとなるのは難しいのを実感する。
img2imgによって、ポーズの指定、髪の毛をどこで括るかといった指定はしやすくなるが、それでもpromptが必要となる。
Danbooruタグが反映されない問題が解決されたとしても、タグの細分化はされているようでいて、実際使うとなると足りてない。
使いこなせる人はいるのだろうか?
例えばPythonのアンダースコアの使い方を知りたいときに、間違ってもQiitaの記事を見てはいけない。見るべきは
である。