【簡単】Stable Diffusion 呪文を試す方法: Pythonライブラリで無限の可能性!

2024年8月31日

AI画像生成

初めに

今回はAI画像の生成呪文を簡単に試す方法をご紹介します

この記事では、Stable Diffusionの画像を生成する呪文を簡単に試行する方法をご紹介します。
Stable Diffusionは呪文と呼ばれるプロンプトで何でもお好みの画像を生成出来ますが、自分の好みにあった呪文を探し出すのが大変です。そこで、呪文を沢山試せるPythonのライブラリを作成してみましたのでご紹介致します。

Stable Diffusionとは

Stable Diffusionはオープンソースの画像生成環境です。拡散モデルと呼ばれる画像生成アルゴリズムで構築されており、作成したい画像の単語をかき集めた呪文と呼ばれるプロンプトを使ってお好みの画像を生成することが出来ます。

Stable Diffusionの仕組み

diffusersについて

今回はStable Diffusionをpythonのdiffusersライブラリを用いて実行します。
diffusers は、Hugging Face が提供するPythonライブラリで、このライブラリを使えばプログラムからStable Diffusionの画像生成AIモデルを実行することが出来ます。

Stable Diffusionとdiffusersの詳しい説明

Stable Diffusionとdiffusersについて、詳しくは以下の記事で紹介しておりますのでご参照下さい。
diffusers を使った画像生成: Python で AI アートを作成しよう!

diffusers を使った画像生成: Python で AI アートを作成しよう!

Stable Diffusionの呪文について

Stable Diffusionはプロンプトに、作成したい画像の特長を表す単語を与えて画像を生成します。
このプロンプトに入力する画像の特長を表す単語のことを、俗に呪文と言います。
呪文には、人物の性別や年齢、服装や髪型などの特長を入力します。

stable diffusion で女性を作成する際の単語候補

Stable Diffusionに入力する呪文には以下の様なものがあります。
以下はGoogle Gemini AIが教えてくれた呪文の単語候補になります。

カテゴリ 英語 日本語
年齢 15yo, 16yo, 17yo, 18yo, 19yo, 20yo, 21yo, 22yo, 23yo, 24yo, young, teenage, adult, mature, middle-aged, elderly, old 15歳、16歳、17歳、18歳、19歳、20歳、21歳、22歳、23歳、24歳、若い、十代、大人、成熟した、中年、高齢、老齢
人物 a girl, woman, female, lady, maiden, princess, queen, goddess, angel, fairy, witch, sorceress, heroine, warrior 少女、女性、女の子、婦人、乙女、姫、女王、女神、天使、妖精、魔女、魔法使い、ヒロイン、戦士
雰囲気 beautiful, cute, elegant, charming, graceful, sexy, alluring, mysterious, powerful, confident, playful 美しい、可愛い、優雅、魅力的、優美、セクシー、魅惑的、神秘的、力強い、自信に満ちた、遊び心のある
品質 best quality, masterpiece, ultra detailed, realistic, photorealistic, hyperrealistic, sharp, clear, detailed, intricate 最高品質、傑作、超詳細、リアル、写真のようにリアル、超リアル、シャープ、鮮明、詳細な、複雑な
sparkling eyes, heterochromia, iris eyes, tear, blink, stare, wink, glance, squint, glasses, round eyes, hooded eyes, monolid eyes, double eyelid eyes, upturned eyes, downturned eyes, deep-set eyes, prominent eyes, slanted eyes, cat-like eyes, doe eyes, cockerel eyes, bug eyes, anime eyes, exotic eyes, close-set eyes, wide-set eyes, round-angled eyes, narrow-angled eyes, sunken eyes, bulging eyes, sleepy eyes, stern eyes, warm eyes, mysterious eyes, soulful eyes, intense eyes, piercing eyes, sunglasses きらめく瞳、ヘテロクロミア(虹彩異色症)、虹彩の目、涙、瞬き、見つめる、ウィンク、ちらりと見る、目を細める、眼鏡、丸い目、一重まぶた、二重まぶた、つり目、たれ目、奥二重、ぱっちりした目、斜視、猫のような目、鹿のような目、鶏冠のような目、飛び出た目、アニメの目、エキゾチックな目、寄り目の、離れ目の、丸みを帯びた目、細長い目、くぼんだ目、飛び出した目、眠そうな目、厳しい目、温かい目、ミステリアスな目、魂のこもった目、鋭い目、突き刺すような目、サングラス
straight nose, roman nose, hawk-like nose, upturned nose, snub nose, crooked nose, bulbous nose, hooked nose, grecian nose, celestial nose, long nose, short nose, wide nose, narrow nose, flat nose, bulging nose, concave nose, pointed nose, rounded nose, angular nose 直鼻、ローマ鼻、鷲鼻、上向きの鼻、鼻筋の通った鼻、曲がった鼻、球根状の鼻、曲がった鼻、ギリシャ鼻、天上の鼻、長い鼻、短い鼻、幅広い鼻、細い鼻、平らな鼻、突き出た鼻、凹んだ鼻、とがった鼻、丸い鼻、角度のある鼻
smiling lips, pouty lips, full lips, thin lips, cherry lips, bee stung lips, upturned lips, downturned lips, closed lips, open lips, smiling, laughing, frowning, serious, lipstick, glossy lips, matte lips 微笑む唇、ふっくらとした唇、ふっくらとした唇、薄い唇、桜色の唇、蜂に刺された唇、上向きの唇、下向きの唇、閉じられた唇、開いた唇、笑顔、笑い、しかめっ面、真剣な、口紅、光沢のある唇、マットな唇
表情 smile, grin, laugh, chuckle / giggle / snicker, smirk, beam, frown, scowl, pout, glare, wince, grimace, blush, flinch, gape, squint, roll one’s eyes, blink, wink, nod, shake one’s head, clench one’s teeth, raise an eyebrow, sigh, yawn, gape, squirm, teary-eyed, smiling, crying, angry, surprised, scared, confused, thinking, focused, relaxed 笑顔、満面の笑み、笑い、くすくす笑う、にやりとする、輝く、しかめっ面、顔をしかめる、ぷくっとする、にらむ、顔をしかめる、顔をしかめる、赤面、ひるむ、あ然とする、目を細める、目を回す、瞬き、ウィンク、うなずく、頭を振る、歯を食いしばる、眉を上げる、ため息をつく、あくびをする、あ然とする、もじもじする、涙ぐむ、微笑む、泣く、怒る、驚く、怖がる、混乱した、考える、集中した、リラックスした
very short hair, short hair, medium hair, long hair, twin tail, side ponytail, ponytail, bun, double bun, braid, twin braid, drill hair, curly hair, wavy hair, bob cut, bangs, crew cut, buzz cut, pompadour, mullet, shaggy, tapered cut, mohawk, undercut, bowl cut, finger waves, cornrows, dreadlocks, french twist, top knot, chignon, dutch braid, fishtail braid, afro, slicked back, wet look, side part, layered, balayage, ombre, beach waves, perm, braided crown, underhand braids, half-up, half-down, victory rolls, side-swept curls, side bun, feathered, vintage waves, chopped, bowl fringe, layered bob, shaved sides, tousled pixie, asymmetrical, pageboy, spiral curls, sideswept bangs, s-shaped waves, blunt cut ベリーショート、ショート、ミディアムヘア、ロングヘア、ツインテール、サイドポニーテール、ポニーテール、お団子ヘア、ダブルお団子、編み込み、三つ編み、ドリルヘア、カールヘア、ウェーブヘア、ボブカット、前髪、坊主、丸刈り、ポンパドール、モヒカン、アンダーカット、ボウ

上記の呪文で以下の様な画像を生成出来ます。
AIイラスト

呪文については、詳しく紹介したサイトが山の様にありますのでそちらを参考にしてみて下さい。

【お薦めサイト】
【全1500種類】Stable Diffusionで使えるプロンプト(呪文)一覧!入力方法やコツまで徹底解説!
Stable Diffusionのプロンプト(呪文)をカテゴリー別に解説!使い方やモデルもあわせて紹介

ネガティブプロンプトについて

Stable Diffusionには作成したくない画像の候補を入力するプロンプトとして、ネガティブプロンプトが用意されています。例えば画像の品質が良く無いものや、画像が崩れているものが生成されない様にする際に利用します。一般的に以下の様な呪文を入力します。

単語候補 | 意味
deformed, blurry, bad anatomy, bad pupil, disfigured, poorly drawn face, mutation, mutated, extra limb, ugly, poorly drawn hands, bad hands, fused fingers, messy drawing, broken legs censor, low quality, mutated hands and fingers, long body, mutation, poorly drawn, bad eyes, ui, error, missing fingers, fused fingers, one hand with more than 5 fingers, one hand with less than 5 fingers, one hand with more than 5 digit, one hand with less than 5 digit, extra digit, fewer digits, fused digit, missing digit, bad digit, liquid digit, long body, uncoordinated body, unnatural body, lowres, jpeg artifacts, 3d, cg, text, japanese kanji | 変形、ぼやけた、解剖学的誤り、瞳孔の異常、奇形、下手な顔、変異、変異した、余分な手足、醜い、下手な手、悪い手、指がくっついている、ぐちゃぐちゃな絵、折れた脚、検閲、低品質、変異した手と指、長い体、変異、下手な絵、悪い目、UI、エラー、指がない、指がくっついている、5本以上の指の手、5本以下の指の手、5本以上の指の手、5本以下の指の手、余分な指、少ない指、指がくっついている、指がない、悪い指、液体の指、長い体、不自然な体、不自然な体、低解像度、JPEGアーティファクト、3D、CG、テキスト、日本語の漢字

呪文試行ライブラリRandomDiffusion

沢山呪文があってお気に入りの画像を生み出す呪文に辿り着くのが大変ですね。
そこで、お勧めするのが呪文試行ライブラリのRandomDiffusionです。
筆者が作成したもので手前みそですが。

RandomDiffusionの入手方法

RandomDiffusionはGit HUBで一般公開しております。こちらからご利用下さい。
https://github.com/amimai0084/RandomDiffusion

※ 素のクラスファイルだけ格納しています。そのうちpipでインストールしてライブラリとして利用出来る様にします。

RandomDiffusionの実行環境

RandomDiffusionはGPUとpython、diffusionライブラリの入った環境であればどこでもご利用出来ますが、手軽に利用する場合はGoogleのColabがお勧めです。Golabの環境構築方法は以下サイトに纏めておりますのでご参照下さい。
diffusers を使った画像生成: Python で AI アートを作成しよう!

RandomDiffusionの使い方

RandomDiffusionの提供機能

メソッド/プロパティ名 説明 引数
コンストラクタ
RandomDiffusion()
RandomDiffusionインスタンスを生成します。 model:利用するAIモデル名
output_dir:生成画像の出力ディレクトリのパス
プロパティ
repeat_cnt
同一呪文の施行回数
(デフォルト3)
-
プロパティ
try_cnt
異なる呪文の施行回数
(デフォルト10)
-
プロパティ
negative_prompt
ネガティブプロンプト
生成したく無い画像の単語リストを配列でセットします。(※)
-
プロパティ
addPromptGroup
呪文候補の単語グループを登録します。呪文候補の単語グループは複数登録出来ます。 words:候補の単語配列
max_choice:グループから選択する単語の最大数(デフォルト1)
appearance_rate:グループを選択する確率(デフォルト1.0)
メソッド
exec()
AI画像生成をプロパティで与えられた条件で試行します。作成された画像はコンストラクタで指定されたディレクトリに格納されます。また使用した呪文がpromt.logに出力されます。 model:利用するAIモデル名(省略した場合はコンストラクタで指定したモデル)

※ネガティブプロンプトのデフォルト値:deformed, blurry, bad anatomy, bad pupil, disfigured, poorly drawn face, mutation, mutated, extra limb, ugly, poorly drawn hands, bad hands, fused fingers, messy drawing, broken legs censor, low quality, mutated hands and fingers, long body, mutation, poorly drawn, bad eyes, ui, error, missing fingers, fused fingers, one hand with more than 5 fingers, one hand with less than 5 fingers, one hand with more than 5 digit, one hand with less than 5 digit, extra digit, fewer digits, fused digit, missing digit, bad digit, liquid digit, long body, uncoordinated body, unnatural body, lowres, jpeg artifacts, 3d, cg, text, japanese kanji

RandomDiffusionの使い方

以下の様に呪文の候補単語をセットしてからRandomDiffusionを実行します。
そうしますと、RandomDiffusionが与えられた条件で画像生成を繰り返します。

前述の通り、diffusersの実行には高額のGPUが必要となります。そこでお薦めするのがGoogle Colabです。Google Colab(Google Colaboratory)は、Googleが提供する無料のクラウドベースのJupyter Notebook環境です。ブラウザ上でコードを実行し、機械学習モデルの開発、データ分析、データ可視化など、様々なタスクを行うことができます。

# RandomDiffusionインスタンスの生成
rd = RandomDiffusion('Yntec/CetusRemix', '/content/drive/MyDrive/ai_art')

## 呪文候補の登録
#品質
rd.addPromptGroup(['high quality'])
#画風
rd.addPromptGroup('anime,anime,anime,anime,anime,anime,anime,realistic,anime style,manga style,illustration,oil paint,watercolor painting,3d'.split(','))
#アングル
rd.addPromptGroup('from below,looking at viewer,from front,from side'.split(','))
#構図
rd.addPromptGroup('close-up head,bust shot,upper body,cowboy shot,full body'.split(','))
#視線
rd.addPromptGroup('looking at viewer,looking up,looking down,looking side,looking away'.split(','))
#人物
rd.addPromptGroup('a portrait of a girl,a schoolgirl'.split(','))
#年齢
rd.addPromptGroup('15yo,16yo,17yo,18yo,19yo,20yo,21yo,22yo,23yo,24yo'.split(','))
#顔
rd.addPromptGroup('sparkling eyes,heterochromia,iris eyes,tear,blink,stare,wink,glance,squint,glasses,round eyes,hooded eyes,monolid eyes,double eyelid eyes,upturned eyes,downturned eyes,deep-set eyes,prominent eyes,slanted eyes,cat-like eyes,doe eyes,cockerel eyes,bug eyes,anime eyes,exotic eyes,close-set eyes,wide-set eyes,round-angled eyes,narrow-angled eyes,sunken eyes,bulging eyes,sleepy eyes,stern eyes,warm eyes,mysterious eyes,soulful eyes,intense eyes,piercing eyes,sunglasses'.split(','), 2)
#鼻
rd.addPromptGroup('straight nose,roman nose,hawk-like nose,upturned nose,snub nose,crooked nose,bulbous nose,hooked nose,grecian nose,celestial nose,long nose,short nose,wide nose,narrow nose,flat nose,bulging nose,concave nose,pointed nose,rounded nose,angular nose'.split(','))
#口
rd.addPromptGroup('close-mouth,open-mouth,fang,frown,pout,yawn,full lips,thin lips,plump lips,toothless smile,wide smile,toothy grin,closed-mouth smile,gummy smile,straight teeth,gap-toothed,buck teeth,wry mouth,lipstick,lip gloss'.split(','), 2)
#表情
rd.addPromptGroup('smile,grin,laugh,chuckle / giggle / snicker,smirk,beam,frown,scowl,pout,glare,wince,grimace,blush,flinch,gape,squint,roll one’s eyes,blink,wink,nod,shake one’s head,clench one’s teeth,raise an eyebrow,sigh,yawn,gape,squirm,teary-eyed,smiling,crying,angry,surprised,scared,confused,thinking,focused,relaxed'.split(','), 2)
#髪型
rd.addPromptGroup('very short hair,short hair,medium hair,long hair,twin tail,side ponytail,ponytail,bun,double bun,braid,twin braid,drill hair,curly hair,wavy hair,bob cut,bangs,crew cut,buzz cut,pompadour,mullet,shaggy,tapered cut,mohawk,undercut,bowl cut,finger waves,cornrows,dreadlocks,french twist,top knot,chignon,dutch braid,fishtail braid,afro,slicked back,wet look,side part,layered,balayage,ombre,beach waves,perm,braided crown,underhand braids,half-up, half-down,victory rolls,side-swept curls,side bun,feathered,vintage waves,chopped,bowl fringe,layered bob,shaved sides,tousled pixie,asymmetrical,pageboy,spiral curls,sideswept bangs,s-shaped waves,blunt cut'.split(','), 2)
#髪色
rd.addPromptGroup('black hair,white hair,gray hair,red hair,orange hair,yellow hair,light green hair / yellow green hair / lime hair,green hair,light blue hair / aqua hair,blue hair,purple hair,pink hair,brown hair,silver hair,blonde hair / gold hair,multi colored hair,rainbow hair'.split(','))
#髪飾り
rd.addPromptGroup('flower head,kanzashi,crinoline,tsumami-zaiku,hair ornament,flower kanzashi,pearl,ribbon,bijou,stone,feather,lace,brooch,hair band,hairpin,hair clip,hair accessory'.split(','), 1, 0.2)
#ピアス
rd.addPromptGroup('star earrings,heart earrings,flower earrings,stud earrings,circle earrings,hoop earrings,dangle earrings,huggie earrings,threader earrings,chandelier earrings,cartilage earrings,cuff earrings,barbell earrings,clip-on earrings,ear climber earrings,tragus earrings,rook earrings,orbital earrings,helix earrings,industrial earrings,tassel earrings,ear threaders,diamond earrings,gemstone earrings,pearl earrings,ear cuffs,geometric earrings,vintage earrings,bohemian earrings,enamel earrings,torniquet earrings,filigree earrings,ear jackets'.split(','), 1, 0.2)
#帽子・被り物
rd.addPromptGroup('hat,cap,baseball cap,brim,straw hat,winter hat,top hat,fedora hat,bowler hat,sun hat,cowboy hat,beret,women’s hat,men’s hat,fisherman hat,summer hat,campaign hat,beanie hat,pillbox hat,bonnet,peaked cap,bobby hat,can-can hat,casquette hat,long beanie,sombrero,cloche hat,pith helmet,flat cap,bucket hat,fringe hat'.split(','), 1, 0.1)
#服装
rd.addPromptGroup('t-shirt,dress,blouse,shirt,sweater,school uniform,sailor uniform,hoodie,jacket,suit,coat,blazer,vest,bathing suit / swimsuit,school swimsuit,bikini,pajamas,robe,kimono,cardigan,poncho,tank top,camisole,overalls,puffer jacket,raincoat,trench coat,tie,jeans,pants,short pants,skirt,leggings,'.split(','))
#コスプレ服
rd.addPromptGroup('magical girl,idol costume,maid,waitress,gothic lolita,princess,wizard costume,nurse uniform,doctor,samurai,police officer,firefighter,ninja,zombie,superhero,vampire,steampunk,cyborg,witch,cowboy / cowgirl,archer,rock star,robot,military,egyptian princess,catwoman'.split(','), 1, 0.2)
#靴下
rd.addPromptGroup('crew socks,ankle socks,knee-high socks,sports socks,business socks,patterned socks'.split(','))
#靴
rd.addPromptGroup('sneaker,dress shoes,high heels,boots,sandals,loafers,slip-on,ballet flats,pumps,wedge heels,mules,boot sandals,work boots,lace-up boots,chukka boots,long boots,thigh-high boots,shearling boots,rain boots,snow boots,clogs'.split(','))
#胸・バストサイズ
rd.addPromptGroup('small breasts,medium breasts,large breasts / big breasts'.split(','))
#お尻
rd.addPromptGroup('small ass,medium ass,large ass / big ass'.split(','))
#体型
rd.addPromptGroup('petite body type,slim body type,slender body type,thin body type'.split(','))
#ポーズ
rd.addPromptGroup('standing pose,sitting pose,kneeling pose,lying down pose,reaching out,crossed arms,arms forward / v arms,arms up,arms down,hands behind / arms behind back,crossed legs,spread legs,legs up,legs close,hold one’s head,stretching pose,yoga pose,meditation pose,dancing pose,modeling pose,action pose,relaxed pose,elegant pose,dynamic pose,expressive pose,athletic pose,serene pose,celebratory pose,confident pose,creative pose,sensual pose,romantic pose,powerful pose,carefree pose,natural pose,fashion pose,dreamy pose,artistic pose,glamorous pose,playful pose,epic pose'.split(','), 5)
#装飾品
rd.addPromptGroup('necklace,bracelet,ring,anklet,brooch,choker,pendant,tiara,crown,bangle,cufflinks,barrette,headband,scrunchie,bobby pin,hatpin,scarf,shawl,stole,sash,suspenders,belt,bow tie,necktie,ascot,cravat,pocket square,corsage,boutonniere,tassel,fringe,beads,sequins,rhinestones,pearls,gems,crystals,feathers,amulet'.split(','), 1, 0.2)
#背景・風景
rd.addPromptGroup('morning,day / noon,evening,night,sunny,cloudy,rainy,snowy,windy,stormy,foggy / mist,showers,thunderstorm,hail,drizzle,tornado,hurricane,typhoon,humid,sleet,blizzard,cyclone,sunrise,sunset,clear sky,scorching,haze'.split(','), 1, 0.05)
rd.addPromptGroup('living room,bedroom,kitchen,toilet,bathroom,dining room,office,library,study,nursery,playroom,den,basement,aquarium,attic,loft,mudroom,laundry room,closet,pantry,wine cellar,home theater,game room,gym,yoga studio,art studio,music room,conservatory / green house,courtyard / atrium,hallway,foyer,staircase,bar,coffee shop,tea room,bistro,restaurant,pub,nightclub,disco,bowling alley,game center,billiard room,casino,ballroom,dance studio,karaoke room / karaoke box,cigar lounge,sauna,jacuzzi,balcony,terrace,deck,veranda,mountain,beach,forest,desert,lake,river,waterfall,valley,canyon,glacier,volcano,island,hill,skyscraper,amusement park,meadow,savannah,wetland,marsh,coral reef,oasis,dune,cliffs,bay,estuary,plateau,crag,crater,prairie,pasture,gorge,ravine,promontory,hotspring,bamboo forest,birch forest,palm grove,lavender field,sunflower field,rice paddy,wheat field,coffee plantation,tulip field,japanese garden,botanical garden,water garden,rose garden,pond,koi pond,stream,fountain,swimming pool,water slide,seashore,shoreline,riverbank,waterfront,cliff,lighthouse,pier,marina,sailboat,canoe,kayak,rowboat,jet ski,windsurfing,scuba diving,snorkeling,ski resort,hiking trail,campground,picnic area,caves,water cave,sand dunes,cherry blossoms,autumn leaves,starry night,northern lights,harbor,golf course,soccer field,baseball stadium,basketball court,tennis court,swimming pool  スイミングプール'.split(','), 1, 0.2)
#武器
rd.addPromptGroup('knife,sword,bow and arrow,spear,club,axe,hammer,grenade,bomb,bladed weapon,blunt weapon,gun,pistol,rifle / sniper rifle,shotgun,submachine gun,assault rifle,machine gun,firearm,rocket launcher,cannon,mortar,missile'.split(','), 1, 0.05)
#動物
rd.addPromptGroup('dog,cat,elephant,lion,tiger,giraffe,bear,monkey,dolphin,whale,penguin,kangaroo,crocodile,snake,horse,cow,sheep,goat,rabbit,fox,wolf,deer,squirrel,owl,eagle,parrot,rhinoceros,koala,octopus,jellyfish,butterfly,bee,ant,scorpion,spider,lobster,crab,turtle,starfish,snail,gorilla,chimpanzee,hippopotamus,ostrich,peacock,mole,hamster,raccoon,otter,pangolin,dragon,hedgehog,tarantula,flamingo,armadillo,alpaca,sloth,chameleon,hyena,vulture,capybara,praying mantis,red panda,monster'.split(','), 1, 0.05)
#料理・食べ物
rd.addPromptGroup('salad,soup,pasta,pizza,burger,sandwich,steak,chicken,fish,rice,noodle,fried rice,ramen,udon,sashimi,curry,pasta salad,chicken salad,tuna salad,egg salad,sandwich,ham sandwich,cheese sandwich,egg sandwich,grilled steak,fried steak,chicken,grilled chicken,fried chicken,fish,grilled fish,fried fish,steamed rice,sushi,curry,vegetable curry,chicken curry,beef curry,pork curry,tomato sauce pasta,cream sauce pasta,pesto pasta,risotto,pepperoni pizza,cheese pizza,ham and cheese pizza,vegetable pizza,sandwich,tuna sandwich,fruit,apple,banana,orange,grape,strawberry,watermelon,melon,pineapple,tomato,cucumber,pepper,onion,garlic,carrot,potato,corn,bean,vegetable,celery,cabbage,spinach,broccoli,cauliflower,mushroom,asparagus,lettuce,bread,meat,beef,pork,shrimp,crab,lobster,egg,milk,cheese,yogurt,ice cream,dessert,cake,pie,cookie,candy,chocolate,drink,water,coffee,tea,juice,alcohol,beer,wine,whiskey,sake,kiwi,blueberry,cherry,peach,lemon,lime,avocado,bell pepper,eggplant,zucchini,pumpkin,sweet potato,hot dog,sushi,tempura,udon,soba,miso soup,teriyaki,yakitori,okonomiyaki,takoyaki,gyoza,sweets,donut,pancake,waffle,pudding,cereal,omelette,croissant,bagel,muffin,french fries,nachos,popcorn,tofu,sausage,bacon,ham,salmon,tuna,scallops,clams,oysters,squid,octopus,sardines,butter,jam'.split(','), 1, 0.05)
#乗り物
rd.addPromptGroup('car,bicycle,motorcycle,scooter,bus,train,tram,subway,taxi,truck,boat,ship,sailboat,canoe,yacht,jet ski,helicopter,airplane,hot air balloon,hovercraft,skateboard,roller skates,segway,rickshaw,cable car / funicular,tuk-tuk,golf cart,horse-drawn carriage,snowmobile,submarine,submersible,spacecraft,rocket,unicycle,monorail,glider,paraglider,hang glider,camper van,gondola,tank,amphibious vehicle,jet pack,space shuttle,snowplow,dog sled,forklift,cargo ship,jet boat,ski lift,electric scooter,armored car,space probe,excavator,gokart'.split(','), 1, 0.05)

## 試行回数の設定
#実行
rd.repeat_cnt = 3 #3回同じ呪文を実行
rd.try_cnt = 20   #呪文を変えて20回試行する

## 色々なモデルで呪文を実行
rd.exec('Yntec/CetusRemix')

#モデルを変えて実行
rd.exec('Yntec/SCMIX_NightSkyMeina')
rd.exec('digiplay/Sudachi_diffusers')
rd.exec('digiplay/MeinaPastel_v1')
rd.exec('gsdf/Counterfeit-V2.5')
rd.exec('Yntec/MangledMerge3_768')
rd.exec('Yntec/mistoonAnime2')

rd.exec('stablediffusionapi/anything-v5')
rd.exec('Meina/MeinaMix_V11')
rd.exec('Yntec/RevAnimatedV2Rebirth')
rd.exec('Yntec/lametta')
rd.exec('Yntec/DucHaitenGODofSIMP')
rd.exec('Yntec/Epsilon_Naught')
rd.exec('Yntec/Ponygraphy')
rd.exec('Yntec/Chip_n_DallE')
rd.exec('Yntec/DreamShaperRemix')
rd.exec('Yntec/GoFish')
rd.exec('Yntec/epiCCartoon')
rd.exec('Yntec/iffyMix')

RandomDiffusionの実行結果

生成した画像はこのようになります。
AI画像生成

沢山の呪文の組み合わせを試せますので、色々な画像を大量に生成出来ます。
ちなみに私のお気に入りはこれになります。沢山ありすぎて悩んでしまいます。

AI生成イラスト

AI生成イラスト

AI生成イラスト

AI生成イラスト

AI生成イラスト

AI生成イラスト

画像生成に使用した呪文

画像生成に使用した呪文はpromt.logに出力されます。
お気に入りの画像があれば、どの様な呪文で生成されたか確認してみて下さい。

promt.logのイメージ

/content/drive/MyDrive/ai_art/20240809131957_CetusRemix.png <= "high quality,anime,from below,looking away,a portrait of a girl,sleepy eyes,bug eyes,crooked nose,wide smile,fang,grin,mohawk,layered bob,black hair,brooch,pajamas,small breasts,large ass / big ass,slender body type,belt,plateau"
/content/drive/MyDrive/ai_art/20240809132127_CetusRemix.png <= "high quality,3d,from side,looking side,a schoolgirl,wide-set eyes,prominent eyes,grecian nose,full lips,gummy smile,teary-eyed,relaxed,bun,orange hair,rook earrings,hoodie,samurai,medium breasts,large ass / big ass,slender body type,stream"
/content/drive/MyDrive/ai_art/20240809132300_CetusRemix.png <= "high quality,anime,from below,looking down,a schoolgirl,doe eyes,squint,grecian nose,straight teeth,toothy grin,grimace,victory rolls,mullet,light green hair / yellow green hair / lime hair,stud earrings,poncho,large breasts / big breasts,small ass,slim body type,anklet,volcano"
/content/drive/MyDrive/ai_art/20240809132432_CetusRemix.png <= "high quality,illustration,looking at viewer,looking side,a portrait of a girl,prominent eyes,upturned nose,open-mouth,buck teeth,grimace,feathered,orange hair,t-shirt,small breasts,large ass / big ass,slender body type,lake"
/content/drive/MyDrive/ai_art/20240809132605_CetusRemix.png <= "high quality,anime,from below,looking at viewer,a schoolgirl,doe eyes,straight nose,wry mouth,plump lips,gape,side part,braid,pink hair,sombrero,camisole,medium breasts,large ass / big ass,slim body type,bow tie"
/content/drive/MyDrive/ai_art/20240809132737_CetusRemix.png <= "high quality,anime,looking at viewer,looking side,a portrait of a girl,bug eyes,blink,rounded nose,close-mouth,lipstick,scared,gape,braided crown,yellow hair,vintage earrings,kimono,large breasts / big breasts,medium ass,thin body type"

ソースのご紹介

Git Hub見て頂ければソース見れますが、大した量でないので、ここでもソースの中身をご紹介します。

from diffusers import DiffusionPipeline
from diffusers import StableDiffusionPipeline
import torch
import datetime
import random

class RandomDiffusion:
  """
  diffusersで呪文をランダムに試行するモジュール

  環境準備)
    以下コマンドでdiffusersをインストールして下さい。
    pip install --upgrade git+https://github.com/huggingface/diffusers.git transformers accelerate scipy
  """

  def __init__(self, model, output_dir):
    """
    コンストラクタ
    """
    self._model = model
    self._output_dir = output_dir
    self._repeat_cnt = 3    #同じ呪文を繰り返す回数
    self._try_cnt = 10      #異なる呪文を試行する回数
    self._prompt_groups = []  #プロンプト候補グループのリスト
    self._negative_prompt = 'deformed, blurry, bad anatomy, bad pupil, disfigured, poorly drawn face, mutation, mutated, extra limb, ugly, poorly drawn hands, bad hands, fused fingers, messy drawing, broken legs censor, low quality, mutated hands and fingers, long body, mutation, poorly drawn, bad eyes, ui, error, missing fingers, fused fingers, one hand with more than 5 fingers, one hand with less than 5 fingers, one hand with more than 5 digit, one hand with less than 5 digit, extra digit, fewer digits, fused digit, missing digit, bad digit, liquid digit, long body, uncoordinated body, unnatural body, lowres, jpeg artifacts, 3d, cg, text, japanese kanji'.split(',')

  @property
  def repeat_cnt(self):
    return self._repeat_cnt

  @repeat_cnt.setter
  def repeat_cnt(self, value):
    self._repeat_cnt = value

  @property
  def try_cnt(self):
    return self._try_cnt

  @try_cnt.setter
  def try_cnt(self, value):
    self._try_cnt = value

  @property
  def negative_prompt(self):
    return self._negative_prompt

  @negative_prompt.setter
  def negative_prompt(self, values):
    self._negative_prompt = values

  def addPromptGroup(self, words, max_choice=1, appearance_rate=1):
    """
    プロンプトの候補を追加する
    """
    self._prompt_groups.append({'words':words, 
              'max_choice':max_choice, 'appearance_rate':appearance_rate})

  def exec(self, model = None):
    if model is not None:
      self._model = model
    try:
      for i in range(0, self._try_cnt):
        self.exec_sub()
    except Exception as e:
      print(f'{self._model} エラー 詳細:{e}')

  def exec_sub(self):
    prompt = ''
    for prompt_group in self._prompt_groups:
      if random.random() <= prompt_group['appearance_rate']: 
        words = random.sample(prompt_group['words'], 
                  random.randint(1, prompt_group['max_choice']))
        if prompt:
          prompt = prompt + ','
        prompt = prompt + ','.join(words)
    print(prompt)

    for i in range(0, self._repeat_cnt):
      if 'stablediffusionapi/' in self._model:
        pipe = StableDiffusionPipeline.from_pretrained(self._model, 
                  torch_dtype=torch.float16, use_safetensors=True,)
        pipe.enable_attention_slicing()
      else:
        pipe = DiffusionPipeline.from_pretrained(self._model)
      pipe = pipe.to("cuda")
      image = pipe(prompt, negative_prompt=','.join(self._negative_prompt), num_inference_steps=20).images[0]
      file_name = self.make_file_name()
      print(f'{file_name} <= "{prompt}"')
      with open(f"{self._output_dir}/promt.log", "a") as f:  # "a" モードで追記
        f.write(f'{file_name} <= "{prompt}"\n')  # 改行コードを追加
      image.save(file_name)

  def make_file_name(self):
    name = self._model.split('/')[-1]
    t_delta = datetime.timedelta(hours=9)
    JST = datetime.timezone(t_delta, 'JST')
    now = datetime.datetime.now(JST)
    return f"{self._output_dir}/{now.strftime('%Y%m%d%H%M%S')}_{name}.png"

diffusersの画像生成の注意点

著作権の遵守

以下のことには利用しないでください。

  • 商用のサービスとして直接提供すること
  • 創作業界に悪影響を及ぼすこと
  • デジタル贋作 (Digital Forgery)
    特に既存のキャラクターは公開しないでください
  • 他人の作品を無断でImage-to-Imageすること
  • わいせつ物を頒布すること
  • 事実に基づかないことを事実のように語ること

最後に

RandomDiffusionを使って、お好みの画像を見つけてみて下さい。
皆さんのお役に立てば幸いです。

ルールを守ってAI画像生成を楽しもう♡