From 3680003edce6579ebe2fe0de04082836a416be6e Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 22 Jan 2023 14:27:47 -0500 Subject: [PATCH] create embedding preview --- .gitignore | 2 + cli/modules/preview.py | 39 +++++++++++------- cli/modules/sillouethe.jpg | Bin 9242 -> 0 bytes cli/modules/test.jpg | Bin 17054 -> 0 bytes cli/train.py | 3 ++ .../sd-extension-steps-animation | 2 +- 6 files changed, 30 insertions(+), 16 deletions(-) delete mode 100644 cli/modules/sillouethe.jpg delete mode 100644 cli/modules/test.jpg diff --git a/.gitignore b/.gitignore index ba220cf0f..806715328 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ __pycache__ /repositories/**/* /extensions/**/* /outputs/**/* +/embeddings/**/* /models/**/* /train/log/**/* /tmp @@ -27,6 +28,7 @@ __pycache__ # unexcluded so folders get created !/repositories/.placeholder !/extensions/.placeholder +!/embeddings/.placeholder !/outputs/.placeholder !/models/.placeholder !/localizations/.placeholder diff --git a/cli/modules/preview.py b/cli/modules/preview.py index 161f594aa..ba29b097a 100755 --- a/cli/modules/preview.py +++ b/cli/modules/preview.py @@ -1,28 +1,31 @@ #!/bin/env python +import os import io import json import base64 -import logging +from pathlib import Path from PIL import Image from util import Map, log from sdapi import getsync, postsync +from grid import grid +# masks = ['preview-face.jpg', 'preview-body.jpg'] mask = 'preview-body.jpg' template = 'photo of "{name}", {suffix}, high detailed, skin texture, facing camera, 135mm, shot on dslr, 4k, modelshoot style' -img2img_options = { +img2img_options = Map({ 'prompt': None, 'negative_prompt': '', 'init_images': [], 'sampler_name': 'DPM2 Karras', - 'batch_size': 1, + 'batch_size': 4, 'n_iter': 1, 'steps': 30, 'cfg_scale': 6, 'width': 512, 'height': 512, 'restore_faces': False -} +}) def encode(f): img = Image.open(f) @@ -32,28 +35,34 @@ def encode(f): encoded = base64.b64encode(values).decode() return encoded -def img2img(name: str, suffix: str): +def create_preview(name: str, suffix: str): options = getsync('/sdapi/v1/options') + cmdflags = getsync('/sdapi/v1/cmd-flags') + print(cmdflags.embeddings_dir) img2img_options['prompt'] = template.format(name = name, suffix = suffix) log.info({ 'preview prompt': img2img_options['prompt'] }) - log.info({ 'preview options': img2img_options }) - img2img_options['init_images'].append(encode(mask)) + log.debug({ 'preview options': img2img_options }) + if len(img2img_options['init_images']) == 0: + for i in range(img2img_options.batch_size): + img2img_options['init_images'].append(encode(mask)) data = postsync('/sdapi/v1/img2img', img2img_options) if 'error' in data: log.error({ 'preview': data['error'], 'reason': data['reason'] }) return info = Map(json.loads(data['info'])) - log.debug({ 'preview info': info }) if not 'images' in data: log.error({ 'preview': 'no images' }) return - obj = data.copy() - del obj['images'] - log.info({ 'preview': { 'model': options["sd_model_checkpoint"], 'seed': obj['info']['seed'] } }) - image = Image.open(io.BytesIO(base64.b64decode(data['images'][0].split(",",1)[0]))) - image.save('test.jpg') + fn = os.path.join(cmdflags.embeddings_dir, name + '.preview.png') + log.info({ 'preview': { 'name': fn, 'model': options.sd_model_checkpoint, 'seed': info.seed } }) + images = [] + for b64 in data['images']: + images.append(Image.open(io.BytesIO(base64.b64decode(b64.split(",",1)[0])))) + image = grid(images, None, square=True) + image.save(fn) if __name__ == "__main__": - # log.setLevel(logging.DEBUG) log.info({ 'preview': 'start' }) - img2img('hanna', 'person, woman, girl, model') + cmdflags = getsync('/sdapi/v1/cmd-flags') + for f in Path(cmdflags.embeddings_dir).glob('*.pt'): + create_preview(f.stem, 'person') diff --git a/cli/modules/sillouethe.jpg b/cli/modules/sillouethe.jpg deleted file mode 100644 index f93db87e3533c2ae756a0325f47658205a13b143..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9242 zcmds62{@G7|9@veA?pw#BeD%$YnGG-gOP3Q+m(zxAzPtt3An$Ow=I0ALjWhX?=+pacQ)HpsfaWL=0P0GqFef{pS3SORQd zHU={Qz!RSW0BmUS*Ke1nPv9mW*FdE5COLri0=gZmt-aIK%tRM!hykYu0H_>VM+*bx z0DwI{f&ONCT1XpPJ0#ORfN_2naL8Tw06(;;sUdxMA739=`tR52UFW=(K)Wn`tgqX? z`NWL(^A7}jeFC$Bi)#QLv`P+?ckc`I1M4BDK^ft^dtSakm;Eiww88pnP-b)gEO*dl z=g)EiGJ>5M5k@9M4YDlz;ud^%C zJR~5{bx!~i>x1|8_w)7N73k^$_Wi6M{Vjm=b4U7$NrEq`O3l}4Y*#}Km02JU1P^b`|f>S>KV zV^cI5E&VoF%+LmAY47QSKv1%>8p;~MXms#e@OOT|IrQ zfw_gHl{L6nco$bUcMngmfWV;OefvW~BmX=Sb@bSA0x>ZuIpyT3)HG6d4w;ghmtRnN zv8?>kh5{|qPMSqU~uT=@c6{r$*FhK??24Y?Sg=I zE~fv}E>6%cC>#!hGtupWK=*+e#tCN-k!R#W&ijKE8Bl-fz}V|-!lgAz&og^q*z z4!oD0*{4ko)n+QJMJY(N#I8#UlD?CtthEjUAWR{@xZsg3TeDZa_PTriBmx+cmAE46 zER-|b+g71^Ur&G(!@$SGhM7p+O**sBXtJua+(c1WTBQ84y~lxav6w+|3OOuBG7Cxo zmWrqsov7sM=zGrUgtX|0mfyRvUQbmdL*>pLX>~C>cQ$E?F<<{AcXHv{`z&F(7(U1B zmsT0|UNxao;kfM#2;dhLkn^MsqeR04-F44(kFE30eebWSe*7f272)vVFO6F=Q!0Giq(dVk?Kn36GMm7)T-T!&;j&8b zq9D~sz^PQj`~Bl-i)m#pOij9y1!8&UdvGtMYb0{J;NvIv$_?;pX4R3Vo%Qu!8voUn z|1TQSTATLarZg=AZzvmU2`0e zV$l+=M`R36TRh0f`-GNO%2Sw5=-K)if#yQq zjAm&m*1vg(G%EGTb#{?a)tURydkVK%^amqm9&FvaPq{^-_F1qXbNTwdtDIX-1_w~% zJj-2v9V#rL5yZKncXV2s2Ha__OmxxQ(oZq&k^T8{3cA{+S|{NDNK1BjY!ZZA4TrABz9m1LA$J zr^5!;k|9Z$wT_|K`Qhz_oflX$;WiFD&KQ*@D7Nu$Bzh72D+BXt?l? z09~`c4bwBs7s_dz#oArAzblbD>753lEw`!0C7|u)WqBIF_w>XQj^``C9=_)pMby0Oi zP4Q7+9$z1^e~YFSdn~fE!v?;`9brnDB!@8^v$XA!&UX%DekuFP`I3X~^=XOxe1BBZ z-J{ry4=0Y*4ea(m39Wa`N@@GfftljY)8y%s*G$ z(}Q0Z@JJYE9d<(dFSq&0GMgGx88zED+i9>bU0sT=XLOUvkUk?p+|j>^VgN2S^?l?(k##wz2P0`n@+ax?ET=JcxE+EjxCoihDYbf3UfbR8B=Ts*XiEi z{e=Pw+`%@1mID+MG&%n&#?4~|ECB<@qT~LJm{Y2C%5Ip)>waSr6>K+dGIHqmv^6L( z?+_H|XfpUlB>$+7ZdTHt!@3L-dC%F@^!4awj3-VN^^G~;oC(B5<}J;VU(Ff+T9E-^ zvwG+Uk?^peLMSsJg@`h3@MlNfhqf->F(A!P>-rt_uOPV-(k>V49XH#~-Xv$_xi(NI zA$3K`6}+<~FFTfRx{#9>3*R-CEL!pVmy zx4GV^aHl|sy5~Wt!kJ#sHLAP@QN}@Cqq!wDUT&Lz0sz0lNU3pM*JQkq&5LlAvij?V z%BuZyc&ns6rdt_N;$t4kM@T0Yv6fuW*x#Kj>R2Gc%Iych%w@#48rK_V>{-!0JE~pTZVeT4gQDSroLDPt zyPeVCL$Qqd!4caTt{c14=i(UZCfSDZUEuD3`9}1pa=C3vj=3iN0 zSX*{#`UxZQIipwSvB<`R4|i4b5{E2s`55%B1qJjpNPLdE8j{U!BPxPLu-SpRWSlj3 zutIlqiJO{OU;A!tIa2s0PtVE^YPFBj{)ndm!Z+V=o68;*YVJWPZvTEvmMf2(OP|CU zQiTt`9iR3?>5sb0HUwI(BCa;%mWies>1`LX@F~?jmn#y5F>iBu>V_a12wEB0v~D?> zmjmj+ED5Dhj*Pn8u2n1K%G#fyUyqD2H*PX9Paz`@qxm+JD{`%fd$Aqep_L+a=EH{E z2)Lha;eE-X^lM7?TsZyt6@$41#cd8&WmfQtE0K@u+K^f4_eWCOmGqK$4T@))?r?2( zvEjV$vCL?G`hy1CG7?aw0Y)?+JT2ARVxNjfQR5fX{~JgNJKdq#JF~NRM`7ODI#|Ks z-TI?$(~_+gAZu2dw3SEIVn0M}FGx`cu}-+8&wsndFu4`yj>Whw#-m_O8{%q$eIDM- zOJir_)Le2wSM!(^>C_@@{tPV~-sSWr8+O7Xz|`}6W$iZk2*TY$MNEm;!qrATD7U#v zeA_S$P!BHW6~pR{uc4e1({CgdouF?e%w9+PW4B@*jK^J{uf#kqr_ zYeW*$Q!><8gDs{3MbSfEFLYumr0;@mqObX&Ztl%o;H5mr0cA(>5%E^#9S%Q>US`kH@^o6yk|N7s>!c+0s#@KA7e+o^Jb%OIT4V4o%% zon*%MkNd^4sLnU@bf&&CD%N+_Wv4cXNv^F{`nc@^0_wciWFwB)T_j0P8V#Hb zKMWCCUD1LARRuDsqM4*J%+J(*P-YQ0~;uB4u5e$08Q%XxAst05-+<)Mhu?&Jkp-Mekd> zvz?d~*Rlwd8r<4L7x<9m{}vQBJL6ntwt}J`;ALv($Q>xhVe7)p(m*E>E!dsB@bYWs!ZY6i6&Wji<-k(F_v) z&g2Z$o|h$z6CY7Q*@316CjAhr{fAb7F{2TF_+-tght+;ePqtN34OF;;rH9vQdR~>u z?Q`TUppu=}UBMZm|D9JXYX6UU7aJtSIMBBdNsxBid+(xM60bg+^{PAplrT|aT{pUU zT>5R{*jVho>^T2ufU5+A@ZOW~Q=Oq2x!UyP3&8@6rALjrYQ%_GHF09O;`fs^5FUT9 zGsMHpGC~MlpT(Baq9~N3e+T}XvNX|@y94~%f7WBUYpitfs~0`U-hj(!Bh>M0yoH>~ zA)jtJh(DSDUYR6Er>+YO?}Mrf5RWXU4)ja`xo9U$6`4l-IHy6O0fFstFTw;L^W>lU zeuA+q^H{cl3q4nf8Q)KEi?tIWmx-IPz%#e9 zxLRNT8$4PdJZUtlrU&=NaKE;kbeHvNjIW@cPN5`(3Lq^0{$Jz5_{`H!$NN=2QquEP XcknAHCJ^>MGQnq%et3UjwC?`^sVsA- diff --git a/cli/modules/test.jpg b/cli/modules/test.jpg deleted file mode 100644 index b4add9c5f78e790043d96f42bfdce66f1a49e440..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17054 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 X*OAI4-n3M6kE(