Frqux’s AI laboratory

AIの技術が進化する今日

Stable Diffusionで想像する、あなただけの世界。おすすめモデル紹介!!Loraも紹介してます!(※随時更新 最終更新23/10/27)

 こんにちは。ふらうです。

 最近、画像生成にハマってまして、ようやくAUTOMATIC1111の各種機能の使い方や、モデルの違い(checkpoint, Lora, LyCORISとか)が分かってきたところで楽しくなってきました。

 なので、今回はおすすめのモデルをいくつか紹介したいと思います。

 紹介するモデルは、ほとんど以下のサイトで公開されているものです。

  • Hugging Face
  • Civitai

 今回、初めて画像生成にチャレンジする方やAIを知らない方向けにもわかるよう、解説していきますので上記サイトへの登録方法も含めて解説していきます。

 今回はwslのubuntu20.04に導入したstable diffusion webui(AUTOMATIC1111)を使って画像生成する場合を想定しておりますので、この記事で画像生成を知った方や、AUTOMATIC1111を導入していない方は以下の記事で解説してますので、参考にしてください。

frqux.hatenablog.com

 もちろんモデルの紹介ですから、それ以外の方法でモデルを使う場合でも大丈夫です。読み込むものは同じですので。

 また、「それ以前に環境構築とかわからない!」という方は、以下で環境構築の説明をしてますので参考程度に読んでいただけますと幸いです。

frqux.hatenablog.com


Hugging Faceとは

 Hugging Faceは機械学習のツールなどを開発している中で、AIモデルやデータセットなどを公開するためのプラットフォームも提供している企業です。

 このHugging Faceのプラットフォームは、AI業界では知らない人はほぼいないプラットフォームで、企業が仕事で参考にするような有名モデルもほとんど公開されている安全なプラットフォームですので、安心してください。


Hugging Faceの登録方法

 まず、Hugging Faceのサイトへ飛びましょう。
 以下のリンクより、プラットフォームへ飛べますので、クリックしてください。

huggingface.co

 そうしましたら、右上の「Sign Up」ボタンを押してアカウント登録を開始しましょう。

Hugging Face

 すると以下のような画面になると思うので、Eメールアドレスとパスワードを入力して「Next」を押しましょう。このパスワードは、そのEマールアドレスのパスワードではなく、Hugging Faceのアカウントのパスワードですのでご注意ください。
 また、パスワードは、大文字アルファベット・小文字アルファベット・数字の3つを含むパスワードにしなければいけません。あと、12文字以下のパスワードであれば、特殊文字(@など)を含む必要があります。

 その後、個人情報を入力していきましょう。
 usernameとFull nameは必須ですが、それ以外はオプションですので、知らないor持っていない場合は入力しなくて結構です。usernameは重複が禁止ですので、誰かがすでに使っていたusernameだった場合エラーが起きますので入力しなおしてください。
 そして、下の「I have read and agree with the Terms of Service and the Code of Conduct」にチェックマークを入れて最下部の「Create Account」を押します。

 これで、入力したメールアドレス宛に確認メールが送られますので、そのメールに記載されているリンクをクリックして、先ほどのusernameとパスワードでログインすれば完了です。


Civitaiとは

 Civitaiも、Hugging Face同様AIモデルの公開プラットフォームですが、画像生成モデルに特化しているサイトです。
 知名度は、Hugging Faceに劣りますがHugging Faceで公開されているモデル +αで数多くのモデルが公開されています。また、公開されるAIモデルにサムネイルが設定されているので、モデル名で探すHugging Faceより探しやすい印象があります。

 あと、CivitaiにはNSFW(日本でいう18禁要素)を含むモデルや、版権キャラを生成するモデルが多数公開されていますので、そっち系を生成したい人には必須級のサイトです。


Civitaiの登録方法

 まず、サイトに飛びます。以下のリンクより接続してください。

civitai.com

 右上のSign Upをクリックしましょう。

Civitaiメインページ

 すると、以下のような画面に切り替わります。ここで、「discord」,「Github」,「Google」,「Reddit」のいずれかのアカウントを持っている方は、各リンクからログインしてすぐに使用開始できます。

 持っていない方は、下のEmailの欄にメールアドレスを入力すると、そのメールアドレス宛にアカウント登録用のメールが行きますので、説明に従って入力しましょう。

 これで完了です。


おすすめモデル紹介

 ここでは、主に以下の2種類のモデルを紹介します。

  • checkpoint(Stable Diffusionモデル)
  • LoRA


checkpoint(Stable Diffusionモデル)

 画像生成の大元となるモデルです。
 保存場所は、

\\wsl.localhost\Ubuntu-20.04\home\[UNIXユーザーネーム]\stable-diffusion-webui\models\Stable-diffusion

 に保存しましょう。

2次元絵生成モデル

Anything v4.5

 
https://huggingface.co/andite/anything-v4.0/tree/mainhuggingface.co


 2次元と2.5次元の絵生成モデルです。

 以下のような特徴があります。

  • 述べるゲームのスライドのような美しいイラストが生成できる。
  • 個人的に、2次元の人物を生成するAIでトップクラスの品質だと思う。
  • Anything v3.0の作者とは関係ない人が作ったモデルだが、似ている。

 以下のような画像が生成できます。

モデル:Anything v4.5  プロンプト:1girl, cute girl, smile, sunlight,


AbyssOrangeMixシリーズ

huggingface.co

 2次元絵生成モデルです。

 以下のような特徴があります。

  • 立体的なアニメ絵から平面的なアニメ絵など様々な用途でモデルが小分けされている。
  • NSFWに特化したモデルも多数あるため、本当に幅広く使用できる。
  • Anything系と比較できないほど高クオリティの絵が生成できる

 以下のような画像が生成できます。
※AOMは(AbyssOrangeMix)の略称です。

モデル:AOM3A1  プロンプト:1girl, cute girl, smile, sunlight,


モデル:AOM3A1B  プロンプト:1girl, cute girl, smile, sunlight,


モデル:orangechillmix  プロンプト:1girl, cute girl, smile, sunlight,


モデル:AOM2 hard  プロンプト:1girl, cute girl, smile, sunlight,

 中でもおすすめは以下の通りです。

  • AOM3A1B

 ... 後ほど紹介するLoraというものとの相性がよく、幅広い絵を生成できるし、高クオリティ。

  • AOM2 hard

 ... NSFW要素を含む絵を生成したいなら一番クオリティが高いと個人的に思いました。

 その他、多数のモデルの詳細は、以下のリンクのmodel cardに記載してありますので確認してください。
https://huggingface.co/WarriorMama777/OrangeMixs



counterfeitシリーズ

huggingface.co


 2次元絵生成モデルです。

 以下のような特徴があります。

  • 上のモデルに負けないほど高クオリティ。
  • NSFW向けのモデルも用意されている。
  • 立体的な絵ではなく、平面的なペンのタッチが分かるような、よりイラスト風味が強い絵を生成する。
  • ファンタジー要素が強い絵を生成するのが得意です。

 以下のような画像を生成できます。

モデル:counterfeit v2.5  プロンプト:1girl, cute girl, smile, sunlight,


モデル:counterfeit v2.2  プロンプト:1girl, cute girl, smile, sunlight,

counterfeit v2.2はNSFWモデルなので、R18な絵を生成するのに特化してます。


Rabbit

civitai.com


 2次元絵生成モデルです。

 以下のような特徴があります。

  • 触ったら逮捕されそうなかわいい人物を生成できます。
  • NSFW向けではないので、そっちの趣味の方は向かないかもしれません。(checkpoint mergeすればNSFW向けもいけるかも)
  • ふんわりとした涼しげなスタイルの絵を生成します。
  • よく動物を手にもっている絵が生成されます。

 以下のような画像を生成できます。

プロンプト(←):1boy, cool boy, smile, sunlight  プロンプト(→)1girl, cute, smile, sunlight


BlueMix

civitai.com

 2次元絵生成モデルです。

 以下のような特徴があります。

  • blue archive風のイラストを生成できるモデルです。
  • ブルアカ好きならこれ使っとけ


 以下のような画像を生成できます。

プロンプト(←):1boy, cool, smile  プロンプト(→):<lora:reisa_bluearchive:0.85>, reisa_bluearchive, hair_ornament, star_\(symbol\), long_hair, ahoge, star_hair_ornament, twintails, low_twintails, open_mouth, halo, multicolored_hair, bangs, purple_eyes, pink_hair, serafuku, blush, smile, blue_hair, purple_hair Negative prompt: badhandv4 easynegative ng_deepnegative_v1_75t


NineKeyMIX12

civitai.com


 2次元絵生成モデルです。

 以下のような特徴があります。

  • 独特な絵柄でkawaii絵柄が生成できます。
  • ninekeyさんが作成しているninekeyモデルシリーズの現時点での最新モデル。
  • ちょっとダークな不思議な世界観。
  • 3Dレンダリングを行ったことで立体的な絵にも対応

 以下のような画像を生成できます。

プロンプト(←):1girl, cute, smile  プロンプト(→)1boy, cool, smile

waifu diffusion v1.5

huggingface.co

 3次元絵と2次元絵を生成するモデルです。

 以下のような特徴があります。

  • 2次元と3次元の両方のテイストの絵を生成できる。
  • waifuの名の通り基本女の子メイン。
  • かなり初期からあるモデルの進化系なので、クオリティが高い。
  • 2次元絵に関しては、一昔前のギャルゲとかアニメのような絵のテイストに近い。

 以下のような画像を生成できます。

モデル:waifu diffusion v1.5  プロンプト:1girl, cute girl, smile, sunlight,


2.5次元絵生成モデル

 リアルとアニメの絵柄が融合したような絵を生成するモデルを紹介します。


Perfect World 完美世界

civitai.com

 アニメよりのリアルな絵を生成するモデルです。

 (追記)2023/05/21 ... 現在v3が新しく登場していて、クオリティが格段に上がりました。以前はloraを使うとlora寄りのテイストによってしまっていたのですが、v3からはテイストを安定して2.5次元の高クオリティの画像が生成でき、loraとの相性も向上したように感じました。

 以下のような特徴があります。

  • リアル絵の自然な質感とアニメ絵のかわいらしいタッチがいい感じに融合している。
  • NSFWコンテンツに柔軟に対応できるよう調節されているためNSFW特化となっている。

 以下のような画像を生成できます。

プロンプト(←):1boy, cool boy, smile, sunlight  プロンプト(→):1girl, cute girl, smile, sunlight


ReV Animated

civitai.com

 リアル寄りの絵にアニメのような世界観が合成された絵が生成できます。
 ちなみに、このモデルはAnimated版ですが、ほかにもいろいろ作られている方ですので興味がある方は探してみてください。

 以下のような特徴があります。

  • CGで作成される絵に似ている。
  • ファンタジーやアニメよりの世界観に特化。

 以下のような画像を生成できます。

モデル:ReV Animated  プロンプト(右):1girl, cute girl, smile, sunlight  プロンプト(左):1boy, cool boy, smile, sunlight


3次元絵生成モデル


ChilloutMix

civitai.com

 リアルな絵を生成するモデルでの大手です。多数のユーザーが使用している故に多くのサンプルイラストが生成されていて、クオリティもかなり高いです。

 以下のような特徴があります。

  • 現実の人間と相変わらないリアルな絵を生成可能。
  • SFW・NSFW両方に対応

 以下のような画像を生成できます。

モデル:ChilloutMix  プロンプト(右):1boy, cool boy, smile, sunlight  プロンプト(左):1girl, cute girl, smile, sunlight


DreamShaper

civitai.com

 3次元絵生成モデルです。

 以下のような特徴があります。

  • 人気モデルなのでサンプル画像が多数あります。
  • 背景や風景の描写が超高クオリティ。

 以下のような画像を生成できます。

モデル:DreamShaper  プロンプト(右):1boy, cool boy, smile, sunlight  プロンプト(左):1girl, cute girl, smile, sunlight


LoRA

 LoRAは簡単に言えば追加学習のデータです。
 既存のStable Diffusionモデルをさらに何かに特化させたいときに指定すると、より自分の好みに合った画像が生成できるといったものです。
 LoRAは非常に強力ですので、絵のテイストも変化させてしまう可能性があるので注意してください。

 保存場所は、

\\wsl.localhost\Ubuntu-20.04\home\[UNIXユーザーネーム]\stable-diffusion-webui\models\Lora

に保存しましょう。

 使用方法としては、trigger wordをプロンプトに書く方法が一般的です。例えば、1つ目に紹介する「墨心 MoXin」では、プロンプト内に、LoRAを使うためのプロンプトの「」と、その中でも特にどういったテイストにしたいのか決めるため「shuimobysim」の2つを指定しています。

 分からない方用に補足説明をします。
 AUTOMATIC1111の画面左にある花札のようなマークをクリックすると、次の画像のように新たなオプションが出てきますので、「Lora」タブに移動して目当てのLoRAを選択しましょう。
 もしすでにたくさん入れてあって探すのが面倒という方は、入力欄に目当てのLoRAの名前の一部を入れると絞れるので活用しましょう。




 この場合、Moxin_10をクリックすると、自動的にプロンプトにloraのtrigger wordが追加されます。

 また、さらに特徴を絞るために用意されているtrigger wordはCivitaiのページに記載がありますので、その英語をそのままコピーしてくればokです。
 以下の画像では「墨心 MoXin」のtrigger wordが記載されている場所の例ですが、その中に今回使う「shuimobysim」があると思います。ここに何も書かれてなくても、説明欄に書かれている場合がありますのでいろいろ見てみるといいでしょう。

赤丸で囲まれている部分がtrigger word

 また、版権キャラもほとんどがLoRAで指定しての出力になると思います。したがって、LoRAは基本的に絵のテイストの指定か、絵の中の人物を変化させること中心に利用されることとなります。
※版権キャラを生成する場合は、規約の利用範囲内で行うようにしましょう。

墨心 MoXin

civitai.com

 水墨画のような、美しい絵に変化させます。

 CivitaiのLoRAモデルの中でも人気のあるもので、筆者も利用させていただいております。

 以下のような画像を生成できます。

モデル:AOM2 hard  プロンプト:1girl, cute girl, smile, sunlight, <lora:Moxin_10:1>, shuimobysim


Gacha splash LORA

civitai.com


 ガチャの登場演出のような背景にすることができます。

 これもまた人気のLoRAで、ガチャSSRの登場シーンのような画像を生成して個人的に楽しんでます。また、これと原神のLoRAなどと組み合わせれば、派手で美しいオリジナルのガチャ排出シーンを作れて楽しいです。

 以下のような画像を生成できます。

モデル:AOM2 hard  プロンプト:<lora:gachaSplashLORA_gachaSplash31:1>, [(white background:1.5),::5] hexagon, 1girl/1boy, mid shot, full body


Anime Lineart

civitai.com

 線画スタイルの絵に変更することができます。

 色塗り前の線画っぽい絵を生成できます。こういった絵も趣があっていいと思いますし、色塗り練習にももってこいですね!

 以下のような画像を生成できます。

モデル:AOM2 hard  プロンプト: <lora:animeLineartMangaLike_v30MangaLike:1>, lineart, monochrome, 1girl


Button

civitai.com

 ボタンのイラストを生成するモデルです。生成される絵はボタンの左半分だけですので、生成された後は画像編集ソフトなどで左右反転コピーしたものを結合して使うといいですね。

 以下のような特徴があります。

  • 高クオリティなボタンのイラストを生成できる。
  • おすすめサイズは512*768で生成。
  • 細かくプロンプトの指定ができる。
  • 原神などの鮮やかな感じのボタンに似ている。

 以下のような画像を生成できます。

モデル:button  プロンプト: <lora:Button:1>, white background, blue sky


Minimalist Anime Style

civitai.com


 ミニマリスト風?アニメスタイルにできます。

 落ち着いた雰囲気のアイコンを生成できるようになるのでかなりおすすめです。

モデル:AOM3A1  プロンプト:<lora:anime_minimalist_v1:1>, anime minimalist, <lora:kitasan_black_v1:0.7>, aakitasan, animal ears, short hair, streaked hair, hair ornament, medium breasts, horse tail, cleavage, clothing cutout, detached sleeves, shimenawa, skirt, black thighhighs Negative prompt: badhandv4 easynegative ng_deepnegative_v1_75t
モデル:AOM3A1  プロンプト:<lora:anime_minimalist_v1:1>, anime minimalist, <lora:iono_v1:0.9>, iono1, long hair, yellow jacket, long sleeves, hair ornament Negative prompt: badhandv4 easynegative ng_deepnegative_v1_75t


Anime Tarot Card Art Style LoRA

civitai.com

 タロットカード風の背景の画像を生成できます。

 タロットカードいいですねぇ...。印刷してカードにしたら個人的に現実で楽しめますね!

 以下のような画像が生成できます。

モデル:AOM2 hard  プロンプト: <lora:animeTarotCardArtStyleLora_v31:1>, green background, 1girl


ウマ娘 LoRA

civitai.com

 モデルというより、ユーザーの紹介です。

 ウマ娘の出力に特化したLoRAを数多く作っておられます。たいていのキャラは網羅しているので自分好みの絵が作れそうですね。ただしR18作品の販売、公開は公式様によって禁止されていますので、どうしてもしたい方は、必ず個人での利用にとどめるようにしましょう!
 正直かなりクオリティ高いです....(脱帽)。

 以下のような画像が生成できます。

モデル:AOM2 hard  プロンプト: <lora:currenChanUmamusume_v10:1>, curren chan \(umamusume\), smile, hands on own chin, vertical-striped dress, bare shoulders, off shoulder, closed mouth, long sleeves, collared dress, gloves


モデル:AOM2 hard  プロンプト: <lora:seiunSkyUmamusume_v10:1>, seiun sky \(umamusume\), white shirt, short shorts, green shorts, jewelry, choker, bracelet, thigh strap, medium skirt, salute. her signature pose


モデル:AOM2 hard  プロンプト:<lora:sakuraBakushinO_v10:1>, sakura bakushin o \(umamusme\), epaulettes, sleeveless shirt, pink shirt, sailor collar, capelet, yellow neckerchief, asymmetrical gloves, mismatched gloves, black gloves, white gloves, black shorts, white thighhighs, asymmetrical footwear, mismatched footwear, high heel boots

 めっちゃクオリティ高いですね...。LoRA恐るべし...。


 LyCORIS について

 たまにLoRAを探していると、LoRAではなくLyCORISのタグが付いたものがあります。これもLoRAと同様、モデルをダウンロードしてtrigger wordをプロンプトに入れれば動くのですが、ただでは機能しません。

 以下に、動くようにする手順を書きますので、LyCORISを使いたい方は参考にしてください。

  1. まず、AUTOMATIC1111を起動する。
  2. 「Extensions」タブの「Install from URL」タブを開き、「URL for extension's git repository」の入力欄に「https://github.com/KohakuBlueleaf/a1111-sd-webui-locon」と入力し、Installを押します。
  3. 「Installed」タブに移動し、「Apply and restart UI」をクリックしてUIを再起動します。
  4. 「Extensions」タブの「Installed」タブの拡張機能リストに「a1111-sd-webui-locon」が追加されていればok

 あとは、LyCORISのファイルをLoRAと同じフォルダに保存すれば完了です。

 そのあとは、LoRAと同じように使えるようになります!


 TEXTUAL INVERSION について

 TEXTUAL INVERSIONタグが付いているものは、ほかのファイルとは保存場所が違うので注意が必要です。以下のようなフォルダに保存しましょう。

\\wsl.localhost\Ubuntu-20.04\home\[UNIXユーザーネーム]\stable-diffusion-webui\embeddings

 すると、AUTOMATIC1111の「Textual Inversion」タブに項目が現れ、使用可能になります。その項目をクリックすれば、LoRAなどと同じようにプロンプトに自動でtrigger wordが追加されます。
 ちなみに、「Textual Inversion」タブは、LoRAを選択するときと同様、花札マークをクリックすると現れます。
 

花札マークから「Textual Inversion」タブを選択


Negative promptについて

 いい絵を生成するには、ネガティブプロンプトも考える必要があります。
 ですがここで朗報です。
 単語一つで、主要なネガティブプロンプトを追加してくれるものがあるんです。

 これも、Textual Inversionの機能を使うものなので、ファイルをダウンロードして、Textual Inversionと同じembeddingsフォルダに保存すれば使用可能になります。

 私が一つ前でTextual Inversionの説明しているときに貼ったAUTOMATIC1111の画像のネガティブプロンプト欄に「EasyNegative」と一言書いてあるのが分かるかと思います。
 この単語一つで、長々と「lowres, *1, *2, text, missing finger, extra digits, fewer digits ...」と入力しなくてもいい画像が生成されるようになります。

 私自身この機能は必須級だと思うので、おまけでおすすめをいくつか紹介します。

EasyNegative

huggingface.co

 私が一番愛用しているもので、おすすめモデル欄でも紹介した「counterfeitシリーズ」の作者が開発したものです。

 アリとナシの違いをいかに示してみます。

モデル:AOM2 hard  プロンプト:1girl, cute girl, smile, sunlight,   EasyNegativeなし


モデル:AOM2 hard  プロンプト:1girl, cute girl, smile, sunlight,   EasyNegativeあり

 まったく同じモデルとプロンプトで生成しているにもかかわらず、ネガティブプロンプトの違いでここまで変わります。すごいですね...。


Deep Negative

civitai.com

 こちらもかなり人気のものです。人の手の感じや体の欠陥・不快な色・空間構造などを配慮して作られたものです。
 また、こちらは、Stable Diffusion2.x系をもとにトレーニングされているので、Stable Diffusion2.xをもとに作られたモデルのネガティブプロンプトに設定すると相性がいいです。

 アリにした場合の生成画像を以下に示します。
 比較対象は上で生成された「EasyNegativeなし」の画像を参考にしてください。

モデル:AOM2 hard  プロンプト:1girl, cute girl, smile, sunlight,   DeepNegativeあり


終わりに

 今回は、Stable Diffusionの様々なモデルを紹介しました。
 日々、新しいモデルやembeddingが生まれているので、紹介しきれなかった部分もあります。

 私個人の意見としては、LoRAやLyCORISに関してはCivitaiで探したほうが探しやすいですし、多くのモデルがあるので選びやすいと感じました。

 ここまで読んでくださりありがとうございます。
 では、よいAIライフを!

*1:bad anatomy

*2:bad hands

アニメの世界を合成!?自分のPCでAI画像生成を行うまでの方法と、DreamBoothの使い方をできるだけ詳しく解説!!自分で体験する画像生成の進化

 こんにちは。ふらうです。

 皆さん。「あのキャラクターがあの仕事をしていたらどうなるんだろう...」、「あのキャラクターがこんなことしていたらどういう風になるんだろう...」、「あのキャラとあのキャラのカップリングを見てみたい!」と考えたことはありませんか?

 ...私はあります。

 今回は、それを可能にする、DreamBoothについて書いていきます。

 よくpixivやtwitterでアニメやゲームの版権キャラのAI絵を生成して公開されている方がおられますが、そういう絵をDreamBoothを使って生成することができるらしいのです。

 そこでDreamboothについて気になったので調べてみようと思いました。

 ちなみに、無許可で絵師さんの絵を学習材料にして、同じテイストの絵を販売したり公開したりすることは、あまりよくないです。AIが生成する絵の著作権は基本的には生成者が有することになるのですが、学習に入れる絵に著作権がある場合ちょっと話が変わってきます。

 私は専門家でもなければ法律に詳しいわけでもないので詳しいことは何も言えないのですが、自分が何日もかけて一生懸命描いた絵を、勝手に学習材料にされて似た絵を大量生成し、その絵に人気が行くとなんだか悲しい気持ちになります。なんだか自分の技術をコピーされて転売されているようで...。

 もし好きな絵師さんの絵を材料に、似たテイストの新たな絵をAIに描かせたいなら個人の利用範囲にとどめておくことをお勧めします。

 今回の実行環境は、Windows版Anacondaではなく、WSL2のubuntu20.04です。ご注意ください。

DreamBoothとは

 DreamBoothは、Googleの研究チームとボストン大学の方々が確立した技術で、2022年8月に論文を公開し反響を呼びました。
 この技術というのは、既に学習してある画像生成モデルに対して、新たな数枚の画像を出力領域に埋め込み、その数枚の画像と似たテイストの絵を生成するようになるというものです。ファインチューニングというやつですね。これによって、様々なシーンで文脈にあった画像を新たに生成できるようになります。

 もとになった論文を以下に貼っておきますので、元論文を読みたい方はURLから飛んでください。

arxiv.org



画像生成モデルができるまで

 近年発表された画像生成モデルは、タグと画像を結び付けて学習しています。例えば"犬が走っている画像"には、タグとして「"dog", "dog run", "run" ...」、猫が寝ている画像には「"cat", "sleeping cat", "sleeping" ...」などタグが付いています。
 こうしたソースで学習されたモデルで画像生成するとして、プロンプトに「cat run」と入力します。すると、猫の特徴をとらえたデータに犬が走っているデータが合成されて猫が走っているような画像が生成されます。

画像生成モデルの欠点

 こんな画像生成モデルにも欠点があります。それは、学習データにない単語を入力されても、AIが理解出来ないのでめちゃくちゃであるか、本質とはかけ離れた画像を生成します。
 例えば上記の犬と猫のデータで学習したモデルに、「sleeping rabbit」と入力しても、おそらくウサギが寝ている画像は生成されないでしょう。

 このように、単語としては理解できるが、その描写をAIが理解できていないので生成できないわけです
 「坂本龍馬の友人が海辺で寝ている」風景を想像してください。ここであなたが想像した風景は人によって異なるはずです。なぜなら、「坂本龍馬の友人」を実際に知っている人はいないからです(多分)。
 海辺に寝ている様子は、皆さんが実際に見た「海辺の風景」と「人が寝ている風景」を脳が勝手に合成していると思いますが、坂本龍馬の友人は、合成する素材が幅広すぎて全く違うものになると思います。

 人によっては「おじさん」、または「子供」になるかもしれませんし、「青年」になるかもしれません。
こういうことです。

DreamBoothで欠点解消

 ここで、以上の欠点を補うために考案されたのがDreamBoothです。
 簡単に言うと、新たな画像をタグとともに追加でモデルに入れることです。そうすることで、元の画像生成モデルになかったタグに対応できるようになり、画像生成の幅が広がるわけです。

 上記の例でたとえると、「坂本龍馬の友人の画像」を「"Friend of Ryoma Sakamoto"」のタグとともに入れると、「坂本龍馬の友人が海辺で寝ている画像」が一様に生成可能になります。

 このように、もともとの画像生成能力を保ったまま、様々な文脈にあったシーンをさらに幅広く生成できるようになることで、モデルの汎用性を高めることができます。


DreamBoothの画像生成の変化の一例

 今から、DreamBoothがどれほどの効力を持っているのか、論文の画像を引用して紹介いたします。

 以下の画像をご覧ください。

犬についての概念を追加学習
眼鏡についての概念を追加学習

 上記の例では、左の"input images"の画像を学習データとして、新たな概念をAIに与えてあげた結果を右の複数の画像で表しています。

 犬について学習したAIは、その犬の特徴をしっかりとらえて、瓜二つな犬の絵を生成しています。また、"in the Acropolis"、"in a doghouse"などプロンプト(呪文)を与えてあげることで、そのシーンにあった画像を適切に生成しています。

 これが、txt2imgというもので、txt(テキスト)からimg(画像)を生成することです。

 ほかにも、img2imgというものがあります。
 これは、画像から画像を新たに生成するというものなのですが、正確には画像とプロンプトの2つを入力することによって、新たな画像を生成します。


DreamBoothを使えるようにする

 実際にDreamBoothでファインチューニングを行うまでを紹介します。

 ですが、それなりに高スペックなPCを持ってないと正直難しいです。というのも、DreamBoothは、少量の画像データから高精度の学習ができる優れものの技術ですが、マシンスペックを食うのです。
 目安としては、VRAM12GB以上で、メモリが48以上だと調べた結果推測されました。
 私のPCは、VRAMが8GBなので学習できませんでした...泣)。

 なので、学習するまでの方法は解説しますが、学習はしません。

AUTOMATIC1111の導入

 AUTOMATIC1111は、Stable Diffusionのモデルで画像生成するためのGUIアプリです。

 AUTOMATIC1111は、読み込んだStable Diffusionモデルから画像を生成したり、超解像などもできるものです。
 問題点としては導入が結構めんどうなところです。プログラムの知識がなければ難しいかと思います。なんせめちゃくちゃエラーがでるんでね。

 このAUTOMATIC1111には、拡張機能としてDreamboothがありますので、それを使うために導入します。

AUTOMATIC1111のダウンロード

 ではまず、AUTOMATIC1111をダウンロードします。
 以下のコマンドでgitからダウンロードできるので行ってください。

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git


必要パッケージのインストール

そのあと、cdコマンドで中に入って、webui.shを起動します。

cd stable-diffusion-webui
./webui.sh

 この操作により、必要なライブラリなどが自動で入ります。その後、以下のような画面になったら、赤線部のURLをブラウザに貼り付けて入りましょう。

 他にも必要な操作がありますので、コマンドライン上で"ctrl + C"で接続を切って終了してください。

 これで、一通り必要なライブラリやパッケージが自動で入ると思いますが、xformersだけは自分で入れなければいけないのでやっていきます。

xformersのインストール&設定

 xformersのインストール方法には、以下の2通りあります。

pip install xformers

もしくは

# gitから最新のコピーを複製する
git clone https://github.com/facebookresearch/xformers.git
# 中へ移動
cd xformers
# 依存関係の更新
git submodule update --init --recursive
# requirements.txtに記載されている依存関係のライブラリをインストール
pip install -r requirements.txt
# 編集可能な形でインストールすることで、パッケージを常に最新の状態に維持
pip install -e .


 次に、webui.shを編集します。webui.shの中にある"COMMANDLINE_ARGS="のコメントアウトを外し、以下のように書き換えます。

export COMMANDLINE_ARGS="--xformers"

 これで一通り完了しました。もう一度"./webui.sh"を実行して、URLに入りましょう。
 GUIが表示されれば完了です。

ここまでで起きたエラーの対処

 ですが、ここまで一発で行ける方は少ないんじゃないでしょうか。なにぶん最近のものですので、日々のバージョンアップやライブラリの更新などでエラーが多数おきます。

 ここまでで起きたエラーについては、私の経験では、以下の理由であることが多いと思います。

1.pipが最新ではない。

 pipが最新に更新されていないと、十分なバージョンのライブラリをインストールできません。以下のコマンドで更新しましょう。

pip install --upgrade pip

2.setuptoolsが最新ではない。

 setup.pyでエラーが起きている人はおそらくこれです。以下のコマンドでインストールしましょう。

pip install -U setuptools

3.Pythonのバージョンが古い or 新しい

 公式がAUTOMATIC1111を動かす環境で推奨しているPythonのバージョンは3.10.9です。これよりも古すぎるか新しいとできない可能性が高いです。

 pyenvやdockerなどで環境を変えましょう。

4.CUDAが入っていない

 これに関しては、どっちかというと画像生成の際にエラーが起きると思うのですが、"cudnnが見つからない"や"CUDA toolkitがない"などのエラーになると思います。

 これの対処法については、以下のサイトが非常に参考になりますので、以下のURLより飛んでCUDAを入れましょう。

www.kkaneko.jp


DreamBoothの導入

 AUTOMATIC1111を起動して、拡張機能からDreamBoothを探してinstallしましょう。
 "Extensions" → "Available"タブ" → "Load from:"ボタン → "DreamBooth"右のinstallボタンを押してインストールする。




 私は、すでに導入済みなのでありませんが、最後のように拡張機能のリストがずらっと並んだ中から、"sd_dreambooth_extension"という項目を探して、右のinstallボタンを押しましょう。

 すると、CUI上でプログラムが動いていろいろ表示されていきます。
 そして以下のような感じになれば成功です。

 左の[ ]の中が全部" + "になっていれば正常にインストールされているということです。これが" ! "や何も書かれていない状態となると、その部分がインストールに失敗しています。

 正直、初めからすべてにチェックが入っているほうが珍しいというか多分いないくらいだと思うので、落ち着いて対処しましょう。


ここまでで起きたエラーの対処

 では、DreamBooth拡張機能を入れる際に起きるエラーの対処法を書いていきます。

1.Windows版Anacondaを使っている

 私は、もともとwindows版anacondaで環境構築をしていたのですが、ライブラリのバージョン関係や、windowsターミナルとlinuxCUIとのコマンドの違いなどにより、エラーが大量に出ました。

 対応策としては、dreamboothの"requirements.txt"に書かれているパッケージを一つずつ手動でインストールしていく方法があります。ですが、実際にpipでインストールできないものがあり"mediapipe-silicon"や"tensorflow-macos"は失敗してしまうので、別のインストール方法を試すほかありません。

 しかも、全部手動でインストールした後も[ ]が" + "にならないことが多々あります。

 なので、おとなしくwindows11に更新してWSL2のubuntu20.04LTSで環境構築したほうが圧倒的に楽ですので環境を変えましょう。

2.xformersのバージョンが違う

 これは、xformersの[ ]が" + "にならない場合の対処法です。

 私の場合は、バージョン0.0.17で動いていますが、公式ではバージョン0.0.14が推奨されているらしいので、どうやってもxformersのところが" + "にならない方は、バージョン指定してインストールしましょう。

 推奨バージョンは、
"stable-diffusion-webui\extensions\sd_dreambooth_extension\requirements.txt"
に記載されていますので、手動で入力していくか、上記のディレクトリに入って

pip install -r requirements.txt

を実行するといいでしょう。

3.CUDAが入っていない

 これは、AUTOMATIC1111のエラーにも書いたことですが、AUTOMATIC1111の導入ではエラーが出ず、こっちではじめてCUDAのエラーが出ることがあります。

4.ubuntuのバージョンが正しくない

 これはxformersのインストールの際に出るエラーだったと思います。私の環境では、WSL2のubuntu22.04LTSではエラーが起きて入りませんでした。
 詳しく言うと、cudnnのライブラリが見つからないと言われます(入れているのに)。

 海外の掲示板でも書かれていたことなのですが、ubuntu22.04LTSではバグで見つからず、いろいろ設定しないと見つけられないそうですが、ubuntu20.04なら正常に入ると書かれていて、実際に変えてみたところ驚くほどすんなり入りました。

 ubuntu20.04LTS以外を使っている方は、別の方法を探すか、ubuntu20.04LTSを入れましょう。


導入できたか確認

 ここまでできて、なおかつすべてのインストール要件を満たした(すべての[ ]に" + "が入っている状態)ならば、いよいよ学習開始です!
 と行きたいところですが、私の環境ではできないので、導入できたかの確認までで終わります......学習したい!!!!

 実際に" ./webui.sh "でGUIを立ち上げてみて、以下のようにタブに" Dreambooth "があれば成功です。

ここからは、別のサイトの方が親切にわかりやすく解説してくださっていますので以下のURLから各サイトに飛んでいろいろ学習してみてください。

Dreamboothを使ったモデルの追加学習をWindowsローカルマシンで行う方法 – AUTOMATIC1111拡張編(2023/02版) | 徒労日記

Dream Booth - としあきdiffusion Wiki*


終わりに

 今回は、Dreamboothの使い方やどういうものなのかについてザックリ調べてみました。少量の画像でファインチューニングするだけでいいなんてすごいですよね。人によっては30枚とか20枚とかでも正確に特徴を捉えられたらしいので、本当にワクワクします。

 ですが、初めに言いました通り、筆者はこの技術の悪用は推奨しておりません。個人的な利用の範囲だけにとどめておき、すべて自己責任にてお願いします。

 時間があれば、Dreamboothの各項目についてまとめた記事や、プログラムを書いてファインチューニングをする方法も出したいと思っています。
 プログラムからファインチューニングする方法だと、DeepSpeedというAUTOMATIC1111でまだ実装されていない技術を使用して、メモリ消費を減らして学習できるらしいので、やってみたいんですよね。

 では、最後まで閲覧いただきありがとうございました。

Stable Diffusionで、かわいい女の子を生成しよう

 こんにちは。ふらうです。

 今回は、Stable Diffusionモデルを利用して画像生成をしたいと思います。
 きっかけは、アイコンを変えたいと思っていた時でした。
 「著作権とか難しいな...そや!AIに書かせよう」という発想に至ったので、初の自然言語処理以外のAIに触れてみようと思いました。

Stable Diffusionとは

 Stable Diffusionとは、任意のテキストや画像などからリアルな画像を生成できるAIです。
 これらは、潜在拡散モデルというアルゴリズムを使用しており、自由度が高く美しい画像を多数生成することができます。

 このStable Diffusionがオープンソース化、つまり無料で全体に公開されたのはつい最近の2022年8月22日です。Stable Diffusionの生みの親であるStability AI(企業)は、デモサイトも公開しています。

 Stable Diffusionのモデルは多数公開されており、様々な方々が画像生成モデルを作っております。
 リアルな画像を生成するモデル。2次元の画像生成が得意なモデル。ちょっとムフフな画像を生成するのが得意なモデルなどなど多くのモデルが開発され、公開されています。

 それではさっそく生成していきましょう。


画像を生成する

 今回は、プログラムを書いて画像生成をしていきます。調べた限り、プログラミングなしで簡単に画像を生成する方法もあったのですが、今回はプログラムを書いていきます。

ライブラリ

from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
import torch
from xformers.ops import MemoryEfficientAttentionFlashAttentionOp

 これらのライブラリの用途は以下の通りです。
・StableDiffusionPipeline ... 学習済みStableDiffusionモデルをダウンロードするためのライブラリ

・DPMSolverMultistepScheduler ... StableDiffusionでの画像生成を高速化するためのライブラリ

・torch ... PyTorchフレームワーク

・xformers ... transformer・Pytorchを高速化するライブラリ。エラーが出るので使いませんが一応入れておきました。


モデルのダウンロード

model = "andite/anything-v4.0"

pipe = StableDiffusionPipeline.from_pretrained(model, torch_dtype=torch.float16)

pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

pipe = pipe.to("cuda")

 今回使うモデルは、「anything v4.0」です。
 anything v4.0は、2次元のキャラクターを生成するのが得意なモデルです。ほかにも、anything v3.0がありますが作者が異なるらしく、生成される絵もかなり違ったテイストのものになっています。

 個人的に「anything v4.0」の絵柄がかわいくて好きだったのでこちらにします。

 モデルは、hagging faceにアップロードされているモデルをパイプラインを用いてダウンロード・使用します。
 また、GPUを使って画像生成を行います。


画像生成

prompt = "girl"

image = pipe(
    prompt
).images[0]

image.save("girl.png")

 このpromptに生成したい画像の基となるテキストを入れると、そのテキストに沿った画像が生成されます。私は「girl」とだけ入れていますが、「cute girl」(キュートな女の子),「A girl who lives in a cyber world」(電脳世界に住む女の子)などいろんな文章で試せます。

 これで、変数imageに画像データが入りますので、最後にpngファイルとして出力しています。
 これで生成された画像を5点ほど紹介します。

生成された画像

 なかなか可愛いイラストを生成してくれましたね!

 これで画像生成は終了です。


(おまけ)画像の高画質化

 今回は、画像生成AIだけをしてみる予定でしたが、高画質化AIも紹介して使ってしまいます。
 今回使うのは、「SwinIR」です。
 このモデルは、超解像を得意とするモデルです。
 超解像とは、粗い画像や低画質の画像の画質を大幅に向上させることです。
 古いビデオカメラで撮った240pほどの粗い画像や、ノイズが入ってしまった画像などに使用することで鮮明化が期待できます。

 このモデルの高画質化の比較ができるよう、モデルにテストセットが用意されているので試してみたいと思います。その結果の一部がこちらです。

 左がSwinIRを実行する前。右が実行後です。かなり鮮明になっているのが分かると思います。私の方で画質をあえて悪くするということはしておりません。

 これを画像にかける方法を説明したいと思います。

 まず、SwinIRをダウンロードします。

git clone https://github.com/JingyunLiang/SwinIR

その後、SwinIRのモデルをダウンロードします。
以下のリンクより好きなモデルを選んでダウンロードしてください。
github.com

 私は、「003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth」というモデルをダウンロードしました。
 このダウンロードしたpthファイルを、先ほどcloneしたSwinIRのフォルダ直下に移動させます。

 次にSwinIRのフォルダに「images」というフォルダを新しく作り、そこに高画質化したい画像を入れます。

 そして最後、以下のコマンドで高画質化します。

python main_test_swinir.py --task real_sr --model_path 003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pth --folder_lq images --scale 4 --large_model

 超解像された画像は、SwinIRフォルダの、「SwinIR\results\swinir_real_sr_x4_large」のフォルダ内に保存されます。

 SwinIRはかなり重いので、スペックによっては時間がかかります。


終わりに

 いかがでしたでしょうか。
 今回は、Stable Diffusionモデルを使って画像の生成を行いました。

 pipelineを用いてモデルをダウンロードして使う以外にも、ckptファイルからモデルを使うことができるようなのでそのやり方も調べてみたいですね。
 pipelineを用いる方法だと、「.jsonがないから無理」だとかが出て使えないモデルが多くあるからです。

 この画像生成AIと自然言語処理AIが合わされば、対話AIから出力されるテキストに沿ったイメージを画像生成AIが生成して...なんてこともできるかもしれませんね。

 ではこれで。

 最後まで見ていただきありがとうございます。


参考にさせていただいたサイト

・【2023年版】Stable Diffusion モデルまとめ - BLOG CAKE
https://blogcake.net/stable-diffusion-models/

・【Diffusers】Stable Diffusion v2.1モデルの利用方法
https://self-development.info/%E3%80%90diffusers%E3%80%91stable-diffusion-v2-1%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95/

・anything-v4.5.ckpt · andite/anything-v4.0 at main - Hugging Face
https://huggingface.co/andite/anything-v4.0/blob/main/anything-v4.5.ckpt


Pythonで画像を高画質化 (超解像 SwinIR)
https://miyashinblog.com/swinir/

Word2Vecの学習(2023/03/01時点の日本語wikipediaコーパス)

 こんにちは、ふらうです。

 今回は、Word2Vecの学習を実行していきます。

  学習の手順としては以下の通りです。

  • 学習データの準備

 この段階で進めていきます。なお、出来上がった学習済みモデルはGitHubにて公開するので、ご自由にご利用ください。

公開しました!以下のリンクよりgithubへ飛べます。
https://github.com/Frq09/w2v.git

学習データの準備

 今回学習に使うデータは2023年3月1日時点の日本語wikipediaコーパスです。

日本語wikipediaコーパスのダウンロード

 まず、日本語wikipediaコーパスをダウンロードしましょう。
 以下のコマンド、もしくはリンク先でダウンロードしてください。

  • コマンド
curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2
  • リンク先のページから

https://dumps.wikimedia.org/jawiki/latest/

 リンク先のページに飛んだら、”jawiki-latest-pages-articles.xml.bz2”というファイルを探してダウンロードしましょう。
 これが日本語wikipediaの全文のデータです。
 約3GBあるので気長に待ちながらダウンロードしましょう。

フォルダの解凍および前処理

 保存したwikiコーパスを解凍して前処理を施していきます。
 まず、解凍および簡単な前処理を実行する、WikiExtractorをインストールしてwikiコーパスに適用します。
 WikiExtractorは、bz2フォルダを解凍すると同時にwikiコーパスに含まれている余計なデータを除外して分割保存してくれます。

 WikiExtractorは以下のいずれかのコマンドでインストールしてください。

  • pipからインストール
pip install wikiextractor
  • gitから直接インストール
git clone https://github.com/attardi/wikiextractor.git

 pipからインストールした場合、pipのバージョンが古い場合は古いwikiextractorがインストールされてエラーが起こる可能性があります。逆にgitから直接インストールした場合は、最新版が必ず手に入りますので安心です。
 インストールが完了したら、wikiコーパスに対して実行し、解凍、前処理を行います。

python -m wikiextractor.WikiExtractor jawiki-latest-pages-articles.xml.bz2

 そうすると、textというディレクトリが生成され、AA,AB,AC...BKまでの名前のサブディレクトリが生成される。そしてそのサブディレクトリの配下にwiki_00~wiki99までの100ファイルが生成される。これが、wikipediaの情報が集約されたプレーンテキストファイルです。
 中身はこのようになってます。

WikiExtractor実行後の生成ファイルの一例

 次に、残っている不必要な情報および空行を削除する。
 まず、分割されたすべてのファイルを1つのファイルに統合します。

  • linux環境であれば以下のコマンド
find text/ | grep wiki | awk '{system("cat "$0" >> wiki.txt")}'
  • windows環境であれば、powershellにて以下のコマンドを実行する。
Get-ChildItem text/ -Recurse | Where-Object { $_.Name -like "*wiki*" } | ForEach-Object { Get-Content $_.FullName >> wiki.txt }

 Pythonで実行したい人は以下のプログラム(wiki-merge.py)

import os

# フォルダ内のファイルを再帰的に検索
for root, dirs, files in os.walk("text/"):
    for file in files:
        # ファイル名に「wiki」という文字列が含まれるか確認
        if "wiki" in file:
            # ファイルを開いて、内容を`wiki.txt`に追記
            with open(os.path.join(root, file), "r", encoding='utf-8') as f:
                with open("wiki.txt", "a", encoding='utf-8') as wf:
                    wf.write(f.read())

 これで統合が完了したので、不必要な情報と空行を削除します。

  • 不必要な情報の削除(wiki-delete-tags.py)
import re

# 空のHTMLタグを削除する
with open('wiki.txt', 'r+', encoding='utf-8') as file:
    content = file.read()
    new_content = re.sub(r'^<[^>]*>$', '', content, flags=re.MULTILINE)
    file.seek(0)
    file.write(new_content)
    file.truncate()
  • 空行の削除(wiki-delete-tags.py)
import re

with open('wiki.txt', 'r+', encoding='utf-8') as file:
    content = file.read()
    new_content = re.sub(r'^\n', '', content, flags=re.MULTILINE)
    file.seek(0)
    file.write(new_content)
    file.truncate()

 これらを実行すると、不必要だったdocタグや空行が削除される。
 以下のコマンドでデータ数を確認してみる

wc -ml wiki.txt

結果は、1317104729文字で、16329952行のデータであった。

分かち書きする

 Word2Vecの学習に必要なデータ形式は、分かち書きされた文章です。
 Word2Vecは、文章に含まれる単語を前後から予測するか、前後を予測するかで単語ベクトルを算出しています。
 なので、学習で使われるデータは、文章ごとに区切られた分かち書きされている文章である必要があります。英語であれば「This is a dog.」などと単語ごとにもとから区切られていますが、日本語の文章では「これは犬です。」と区切られていないので、自分で分かち書きし、「これ は 犬 です 。」という風に加工する必要があります。

 一般的な方法では、文章ごと改行した分かち書きデータを、word2vec.LineSentence関数で学習データにするのですが、今回はこの関数を使わずに、分かち書きから入力形式を合わせるところまでを手動で行います。

  • 必要ライブラリ
from gensim.models import word2vec
import MeCab
import re
import logging
from tqdm import tqdm
from multiprocessing import Pool

word2vec ... word2vecに関するライブラリ
MeCab ... 分かち書きを行うためのライブラリ
re ... 句点などで分割するために使用
logging ... モデルの学習中など、進行状況を可視化させるために使用
tqdm ... 処理の進行状況を可視化するためのライブラリ
multiprocessing ... 大規模な処理を複数のプロセスで並列処理し、高速化するために使用

with open("wiki.txt", "r", encoding='utf-8') as f:
    text = f.read()

 wiki.txtから文字列として変数textに格納していきます。

  • 改行か句点で分割
sentences = []
for s in tqdm(re.split("[\n。]", text)):
    s = s.strip()
    if s:
        sentences.append(s + "。")

 re.split("[\n。] で改行文字および句点で分割を行い、変数sentencesにlist型で格納していきます。

  • 空の要素の排除
sentences = list(filter(None, sentences))
print(len(sentences))

 上のやり方ではlistに空の要素ができてしまうので、filter関数で空の要素を排除します。

def tokenize(text):
    tagger = MeCab.Tagger('-Owakati -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
    return tagger.parse(text).strip().split()

 分かち書きを行うのでtaggerの引数には"-Owakati"を指定し、辞書は"mecab-ipadic-neologd"を指定する。

  • list全体に上記の関数を実行する関数を定義
def tokenize_list(text_list):
    with Pool() as pool:
        results = list(tqdm(pool.imap(tokenize, text_list), total=len(text_list)))
    return results

 この処理がかなり長いので、"Pool"を使用し複数のプロセスで並行処理を行うことで高速化をおこないます。
 そして"imap"メソッドを使用してイテレータを返すジェネレータを作成、そのイテレータから結果を収集し、resultsとして返します。

  • データ加工
w2v_train_data = tokenize_list(sentences)

 変数sentencesに対して分かち書きを実行します。
 この処理はマルチプロセスで高速化しても私の環境では13時間~14時間ほどかかりました。

 これでデータ加工の段階は完了です。
 もしエラーが不安でword2vec用の分かち書きデータを保存しておきたい場合は以下のプログラムを使ってください。

def save_words_to_file(word_list, filename):
    with open(filename, "w", encoding='utf-8') as file:
        for word in tqdm(word_list):
            file.write(" ".join(word) + "\n")
save_words_to_file(w2v_train_data, 'wiki_wakati.txt')

 このプログラムでは、分かち書きされたリストを一行一文ずつテキストファイルに書き出していくプログラムになります。
 次にこのデータを使いたいときは、word2vecのLineSentenceの引数にこのテキストファイルを指定してあげることで、今と同じようなデータになります。

  • 読み込み方
w2v_train_data = Word2Vec.LineSentence(wiki_wakati.txt)


学習

 それではすべての準備が整ったので学習を実行していきましょう。

進捗の表示

 その前に、学習の進捗が表示されないのは不安なので、loggingを使って進捗表示させるようにしましょう。必要ないと思う方はつけなくても、何ら学習に変化はないので大丈夫なのですが、進捗スピードやメッセージなどが見えた方が分かりやすいと思うので、進捗表示させておくことを推奨します。

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

学習の実行

 以下のプログラムで簡単に学習が開始できます。

model = Word2Vec(w2v_train_data, size=200, window=5, sample=1e-3, negative=5, hs=0)

 オプションの詳細は以下のサイトの方がわかりやすく説明してくださっているので、ご自分でオプションを変えたいという方は参考にしてみて下さい。
qiita.com

 また、今回の学習オプションは、東北大学のWord2Vecモデルの学習のオプションを参考にしています。

モデルの保存

 学習が終わり次第、以下のコードでモデルを保存しましょう。

model.save("word2vec.model")


実験

今回作ったモデルでいろいろ実験してみましょう。

類似単語の検索

ドラゴンボール」の類似単語top10
ガンダム」の類似単語top10
ウマ娘」の類似単語top10


単語の足し引き

「王様」+「女」-「男」

「王様」+「女」-「男」の計算結果top10


まとめ

 今回はWord2Vecの学習と実験を行いました。
 このモデルとコード類は、私のgithub公開予定公開済みですのでどうぞご自由に使ってください。

 では、また次回の記事もよろしくお願いします。


参考文献

  • word2vec公式Reference

radimrehurek.com

Python環境構築~ubuntu20.04 (WSL)

 こんにちは。ふらうです。

 今回は、ubuntuの導入です。

 

 前回は、Windows版Anacondaの導入から開発環境を作ったのですが、今回はubuntuをインストールしていきます。

 

 ubuntuとはなんぞという方も多くいると思いますので説明します。

 ubuntuはOSの名前です。

 近年では、WindowsMacOSを使っている方が多いと思いますが、そのようなOSの一種です。

 使用用途としては、ラップトップやデスクトップ、サーバーに利用できます。

 使用料金は無料で、今後もずっと無料で提供していくと公式が宣言しています。

 

 ubuntuはOSであり、WindowsもOSです。Windows上でubuntuを動かすということは、OS上で違うOSを動かすことになります。

 本来は、"1"コンピュータにつき"1"OSです。

 しかし、WSLという機能を使うことで、Windows上でubuntuを動かすことができます。

 

 WSLは(Windows Subsystem for Linux)の略で、Linux環境をwindows上で作ることができる機能です。

 

 そこで今回は、WSLを使ってwindows上にubuntuの環境を作ります。

 

 

 

Windowsの環境設定からインストールまで

 まず、windowsでWSLを有効化させてからUbuntuを導入していきます。

以下の手順1~3の通りに進めてください。

 

1.WSLを有効にする

 これについては、別の方が分かりやすく記事をまとめてくださっているので、そちらを見て実践してください。

 

www.aise.ics.saitama-u.ac.jp

 

2.ubuntu 20.04.5 LTSのインストール

 以下の手順に従って実践してください。

 

1.microsoft storeで「Ubuntu 20.04」と」検索してください。すると、検索結果に「ubuntu 20.04.5 LTS」というものがあると思うので、それをインストールします。

 

Ubuntu 20.04」の検索結果

Ubuntu 20.04.5 LTSのダウンロード

ダウンロード中

 

 完了しましたら、以下のように「入手」だった部分が「開く」に変わりますので、そこを押してUbuntuを起動させましょう。

 

注意

 以下の画像のようなエラーが出た場合、WSLが有効になっていないことが原因です。もし以下の画像のようなエラーが出た場合は、手順1に戻ってWSLの有効化からやり直してください。

 

WSLが有効になっていない場合のエラー画面

 

3.初期設定を完了させる

 うまくいくと、Ubuntuを起動した時に以下の画面になりますので、ユーザー名を入力しましょう。下の画像の赤線部に入力した名前が表示されます。名前は自分の好きな名前で結構です。私の場合は"fillpro"という名前にしました。名前を入力し終わったらEnterを押して決定しましょう。

 

UNIX username

 次に、パスワードを設定します。これは、Pythonのライブラリを管理者権限でインストールする時などに使いますので、忘れないようにしましょう。

 

 

 "New password"が出たらパスワードを入力しましょう。プライバシーの観点から、入力してもusernameの時のように表示が出ませんので間違えないように入力ください。入力し終えたらEnterで決定ができます。

 

 "Retype new password"が出たら、先ほどのパスワードをもう一度入力して、Enterを押しましょう。

 

完了
  • "passwd: password updated successfully"
  • "Installation successfull"

 以上の2文が表示されれば完了です。

 

Pythonのバージョンを確認してみる

 Ubuntu 20.04にはデフォルトでPython 3.8.10が入っています。これをコマンドで確認してみましょう。

 Ubuntuで「python3 -V」と入力しEnterを押しましょう。

 

 

Python 3.8.10が入っていることが確認できました。

 

 

終わりに

 今回はWSLを使ってWindows上でUbuntuの環境を構築する方法を解説しました。

 今までWSLのUbuntuを使ってきた私の経験から、WSLのUbuntuGPUの使用が難しいと感じています。

 Windows版Anacondaと違い、コマンドでのドライバの導入、CUDAの導入をしていかなければならない上、PyTorchでGPUが使えるようになったと思ったら、Tensorflowで認識しなくなったなどエラーが多発して初心者には使いづらい感じがあります。

 しかしWindows11にしてWSL2を使うことで、GPUの扱いが簡単になるので些細な問題なのかもしれません。

 

 ここまで読んでいただきありがとうございます。あとはご自分で用途によって、必要なライブラリを入れたり、自分だけの環境を作っていってください。

 

 

(Windows版)PyTorchでGPUを使えるようにするまでを画像付きで詳細に解説

 こんにちは。ふらうです。

 

 今回は、Windows上のPython環境でPyTorchを使う際に、GPUを使えるようになるところまでを解説していきます。

 

 今回想定している環境は、GPUがついているPCで、実行環境はWindows版Anacondaを使っている場合です。理由は、私のブログで推奨しているやり方がこれなので、こちらに合わせていきます。

 WSLを使ったubuntuの環境では、違った導入方法になりますのでこの記事はほとんど参考にはならないでしょう。

 ですが、wslを使わない環境であれば共通する点はいくつもあるので、参考にしていただければ幸いです。

 

 Windows版Anacondaの環境構築の記事は、以下のリンクより閲覧してください。

frqux.hatenablog.com

 

 

 画像付きで、できるだけ詳細にご案内しますので、最後までお付き合いください。

 

 

 

PyTorchのインストール

 まず、PyTorchのインストールを行います。

 以下のリンクからPyTorch公式にアクセスします。

pytorch.org

 そして、少しだけ下に行くと次のような画面があると思います。

 

 

ここで、以下のように設定します。

  • PyTorch Build ... Stable(1.13.1)
  • Your OS ... Windows
  • Package ... pip
  • Language ... Python
  • Compute Platform ...自分に合うCUDAバージョン

今回は、CUDAのバージョンを11.6としました。

 もし、あなたのwindowsがwindows11ならば、古いCUDAだとwindows11に対応してない可能性があるので調べてみて下さい。

 

 ここまで選択すると、下の青丸で囲った"Run this Command"の欄に、自分の環境にあったインストールコマンドが表示されます。

 これを、Anaconda Promptに貼り付けて実行します。

 

 まず、Anaconda Navigatorを開いて、PyTorchを使いたい仮想環境に切り替えます。

 

 

 私の場合は、pytorchという名前の仮想環境を作って、そこで実行します。

次にターミナルを開きます。

 

 

 仮想環境名の横にある三角形をクリックした後、"Open Terminal"をクリックすればターミナル(Anaconda Prompt)が立ち上がります。

 

 そしてそこに、先ほどの"Run this Command"覧のコマンドを一字一句間違えずに入力してください。(コマンドを範囲コピーして、ターミナル上で右クリックするだけでも貼り付けできます)

 

 

そしたら、Enterを押して実行して、インストールが終わるまで待ちます。

その後エラー表示がなく、画像の最後の行のように、"Successfully installed..."と出ていれば成功です。

 

 

 これで、PyTorchのインストールは完了です。

 

 

CUDA Toolkitのインストール

次に、CUDA Toolkitをインストールします。

以下のリンクより、公式にアクセスしましょう。

developer.nvidia.com

 

 ここで注意なのですが、今後Visual Studioを使いたい場合、このCUDA Toolkitより先にインストールしておかないといけないらしいので、Visual Studioを今後使う予定がある方は先にインストールをしてください。

Visual Studioはプログラムの統合開発環境で、UnityでC#のコードを書くときや、Pythonのプログラムを書くときなど多岐にわたって使われているものです。

 

 ここから、PyTorchに合うCUDA Toolkitをインストールします。

 私の場合は少し古いのですが、CUDA Toolkit v11.5をインストールしてます。

 最新版でも動くと思うので、v11.6でも、v11.7でも、v12.0でも何でもいいと思います。

 

 

 インストールしたいバージョンの部分(青丸)を押した後に自分の環境の選択画面が出るので、選択していきましょう。

 

 

今回の場合は、

  • Operating System ... Windows
  • Architecture ... x86_64
  • Version ... 10(windows11を使っている方は"11"にしてください)
  • installer Type ... exe(local)

にしてます。

 すると、画面下部に以下の表示が出るので、"Download"をクリックしてダウンロードします。

 

 

そのexeファイルを実行すると、CUDA Toolkitのインストールの案内が開始されます。

 以下の画像の青丸の部分をクリックしていけばインストールができます。

 

 

 

 

 

 

 

 

これでCUDA Toolkitのインストールが完了しました。

 

 

NVIDIAドライバのインストール

 次に、NVIDIAドライバをインストールします。

 

 先ほどインストールしたCUDA Toolkitのバージョンに合うように入れていかなければいけませんが、基本的に最新版でも大丈夫です。

 例えば、先ほど私がインストールしたCUDA Toolkit v11.5.2は、NVIDIAドライバのバージョン496.13に対応しています。これは、先ほどダウンロードしたCUDA Toolkitのファイル名

"cuda_11.5.2_496.13_windows.exe"

の赤文字の部分に対応しています。

 

 ですが、最新版のNVIDIAドライバでも、ほとんど問題なく動きますので最新版を入れていきます。

 

 まず、以下のリンクからNVIDIA公式にアクセスし、ドライバをダウンロードします。

www.nvidia.co.jp

 ここで、自分の使っているGPUにあった情報を選択しましょう。

私の場合は"Geforce RTX 3080"を使っているので以下のように選択します。

 



 選択したら、左下の"探す"を押してドライバを検索しましょう。

すると、2023/02/07時点では、このドライバが表示されました。

 

 

なので、左下の"ダウンロード"からドライバをダウンロードします。

 そして、exeファイルがダウンロードされたら、実行します。

 

"Extraction path"は変更せずに"OK"を押します。

 

 

 この作業が完了すると次の画面になります。

 ここから、青丸の部分を選択していってください。

 

 

 

ここまでくると、インストールが始まるのでしばらくお待ちください。

この後"インストールが終了しました"と出れば完了です。

 

うまくインストールできたか確認

 

 これでインストールが完了しましたので、以下の4つを確認します。

  • CUDAのバージョン確認
  • PyTorchが使えるか確認
  • PyTorchのバージョン確認
  • PyTorchでGPUが使えるか確認

 

CUDAのバージョン確認

PyTorchのインストールコマンドを入力したときと同じように、PyTorchをインストールした仮想環境で以下のコマンドを実行します。

  • "nvcc -V"

"nvcc -V"と入力してEnter

このような表記が出れば、CUDAがインストールされています。

 先ほどの説明では、私の場合はCUDA11.5を入れているので、最後あたりの部分が"cuda_11.5"となっていますね。

 

PyTorchが使えるか確認

 

 まず、Pythonの対話モードを起動します。以下のコマンドで対話モードを立ち上げてください。

"python"と入力してEnter

 そこで、以下のコマンドでpytorchをインポートしてみる

  • "import torch"

"import torch"と入力してEnter

ここでエラー無く、画像のように次の3個の矢印が出れば成功。

 

PyTorchのバージョン確認

 次にPyTorchのバージョンを確認します。以下のコマンドを実行してください。

  • "print(torch.__version__)"

"print(torch.__version__)"と入力してEnter

画像のように

"@.@@.@+cu***"

というような表記が出ればOKです。

最初の数字はPyTorchのバージョンで、後のcu以降はPyTorchのCUDAのバージョンです。

なので、上の例では

PyTorchのバージョン ... 1.10.1

PyTorchのCUDAのバージョン ... 11.3

※これはPyTorchに付属しているCUDAのバージョンであり、実際にインストールしたCUDAのバージョンとは違うため注意

 

PyTorchでGPUが使えるか確認

 最後にGPUが使えるかどうかチェックします。

以下のコマンドを実行してください。

"print(torch.cuda.is_available())"

"print(torch.cuda.is_available())"と入力してEnter

ここで"True"と返ってくればGPUが認識されていて使える状態にあります。

 

 

終わりに

 最後まで見ていただきありがとうございました!

 自分のPCでAIを学習したり構築するのにGPUは必要かと思いますので今回解説させていただきました。

 

 私自身、環境構築にかなりの時間を取られてしまって、なかなかGPUを認識してくれない問題が解決できなかったので、できるだけ誰が見てもわかるよう画像を多めに使って工夫しました。

 しかし、まだ説明不足な点もあるかと思いますので、何かご質問があればコメントの方していただければ返答いたしますので、何卒よろしくお願いします。

 

 今回GPU使用環境の構築を行いましたが、ほかにもAIをインストールして遊んでみるようなことをやっておりますので、ほかの記事も見ていただければ幸いです。

 

機械翻訳が変わった!?Seq2Seqモデルの基礎と特徴を解説

 こんにちは。ふらうです。

 今回は、Seq2Seqについて解説したいと思います。

 

 自然言語処理の世界の中で、一時代を担った重要なモデルで、どのようなモデルなのかを説明します。

 また、本記事は論文「Sequence to Sequence Learning with Neural Networks」を参考に執筆しています。

arxiv.org

 

 

 

 

 

Seq2Seqモデルとは

 Seq2Seqは、Googleの"Ilya Sutskever", "Oriol Vinyals", "Quoc V.Le"の御三方が出した「Sequence to Sequence Learning with Neural Networks」論文で発表されたもので、自然言語処理界に大きな革新を起こしたモデルの1つです。

 

 2016年頃からGoogle翻訳にも使用されており、ある程度の成功を収めています。

 

 モデルの形としては、文字列などの列情報を入力すると、列情報が返ってくるといったことが得意なモデルです。なので、機械翻訳タスクや質疑応答AIなど、文字列に対して文字列を返すようなタスクに向いているといえます。

 

 

Seq2Seqの仕組み

 

 Seq2SeqはEncoder-Decoderモデルと言われており、EncoderとDecoderの2つの構造があります。

 まず、Encoderは、入力された列情報をベクトル情報に変換します。そして、Decoderで、ベクトル情報から文字列などの人間が認識できる情報に変換します。

 この2つの機構を備えたモデルが、Encoder-Decoderモデルです。

 これをLSTMという手法を用いて、翻訳タスクの精度向上を達成したものがSeq2Seqです。

 

LSTM(Long Short-Term Memory)

 

 まずLSTMというものが、このSeq2Seqで重要になってきますので、LSTMとは何かをざっくりと説明します。

 簡単に言ってしまえば、記憶力の強いRNN(リカレントニューラルネットワーク)です。

 当時、時系列データを処理する際には一般的なRNNが使われていましたが、このRNNには欠点がありました。それは「学習するにつれて過去のデータを忘れていってしまう」ことです。

 例えば、「たかし君は、親戚のおじさんからお年玉を10000円もらいました。そのあと家に帰ったは、お年玉でほしいものを買うために買い物に出かけました。」という文があったとします。

 その時に、「"彼"とは誰のことでしょう?」という問いがかけられると、時系列でいう最初のほうに入力される「たかし君」という名前のデータが薄まっているので答えることが難しく、場合によっては後に出てきている「おじさん」という単語が解となって出てくるかもしれません。

 

 これは、1グループのパラメータを時系列順で更新していくために発生してしまいます。

 上の例文でいうと、1回目のパラメータ更新では「たかし君」を学習し、2回目は「は」、3回目は「、」4回目は「親戚」...という風にパラメータが更新されます。

 2回目の更新までは、「"たかし君"+"は"」で、「たかし君」の記憶は50%ほどです。それが、「「"たかし君"+"は"」+"、"」...「「「"たかし君"+"は"」+"、"」+"親戚"」という風に初期に入力されたデータが薄まっていきます。

 

 これを解決しようと登場したものがLSTMです。

 仕組みは簡単で、RNNに新たに記憶領域と忘却領域を追加してあげたものです。

 この記憶領域には、過去のデータが含まれていて、忘却領域では忘れるデータを指定する力があります。

 これらをパラメータ更新する際に活用してあげると、最初の方に入力されたデータもうまくパラメータ更新に放り込めるわけです。

 

Seq2Seq

 LSTMについて解説したところでSeq2Seqの仕組みに入ります。

 Seq2SeqではLSTMの層を重ねて構成されたものです。

 

Decoderの仕組み

 まず、内部ではLSTMを用いて時系列データを、ある次元数のベクトルに変換します。この次元数は固定次元で、256と決まっているなら、どんな入力が来ても256次元となります。

 さきほど説明した通り、LSTMは時系列データを処理できる手法ですので、うまく文章全体を表すベクトル情報が出力されることが期待できます。それを固定次元数の文脈ベクトルとします。

 

 ここで、論文内でも重要と言っている、文章を反転させた場合に精度が向上するということに注目しましょう。たとえば、「A,B,C」という文字列が来た場合に、LSTMの入力には「C,B,A」と逆に対応付けします。すると精度が大幅に向上したということがありますので、この方法もSeq2Seqで使用しています。

 

Encoderの仕組み

 そして、その固定次元の文脈ベクトルから出力となる時系列データを出力します。

 全体を学習した固定次元のベクトルを使って、一文字ずつ時系列データを出力していきます。

 

 ここで面白いのが、入力データの単語数と出力データの単語数が違っていても可能という点です。

 例えば、「"これら", "は", "猫", "です"」と入力が4単語なのに対して「"There", "are", "cats"」と3単語のみの出力を得ることができます。

 

 

Seq2Seqの学習方法

 

 調べた結果、IBMgithubGooglegithubで公開されているコードがありました。また、"bentrevett"という方がipynb形式で詳細にSeq2Seqのチュートリアルを解説してくれております。

 

 以下にリンクを貼っておきますので、興味がある方はぜひ。

 

GooglegithubでのSeq2Seq

github.com

 

IBMgithubでのSeq2Seq

github.com

 

・bentrevett様のgithubでのSeq2Seq解説

github.com

 

 上記のgithubで公開されているものは、日本語の翻訳タスクではないので、コーパスを日英翻訳コーパスに切り替えるといいでしょう。

 また、分かち書きの際も日本語に対応していない可能性があるので、mecabなどを使って日本語の分かち書きを行うことをお勧めします。

 

 

まとめ

 

 今回は、Seq2Seqについて解説しました。この技術は、後のtransformerなどの翻訳タスクにも繋がる大きい技術ですので、復習もかねて勉強し直しました。時間があれば、事前学習を実際にやってみることもしてみたいですね。

 

 今後もAIに関する記事を書いていきたいと思いますので、よろしくお願いします。