
女ã®åãæ©ããŸã§ - Stable DiffusionãšPythonã®ç»ååŠçãšèªåå(1)
AI ã§æ åã¯ãªãšãŒã¿ãŒãå¿ãã¿ãªããã
ãŸãã¯ä»¥äžã®åç»ãèŠãŠã¿ãŸãããã
女ã®åãæ
ããããããªæ åã§ MV ãã€ããããã£ããã§ããã
AVICII ã® Waiting For Love ã® MV ãªããããšãŠãããã§ããã
ãã€ããã®ã¬ãã«ãŸã§ã€ãã£ãŠã¿ãããã®ã§ãããã¡ãã AI ã ãã§ã
èæ¯æ åã¯ãkaiber.ai ã§çæã§ããŸãããããªããã³ãããå
¥ããŸãããã
鳿¥œã¯èªåã§äœããŸãããã誰ã§ã suno.com ã«è¡ãã°äœããŸãã
æ åå
šäœã®ç·šéãªããã¯ãWindows 11 ã«ç¡æã§ã€ããŠã Clipchamp 䜿ãã°ãAdobe ã®ãŽãŒãžã£ã¹ãªããŒã«ãªãããããŸããã
åé¡ã¯ãå·Šäžã®ãæ©ããŠã女ã®åã§ãã
ãŸãã¯ãçµå±ããã«ãããã©ãã©åç»ã
ç¶ããŠããã¬ãŒã éãè£å®ããç»ååŠçãå
¥ããŠã¿ããã®ã
æ®å¿µã§ããããã£ã¡ã¯çµå±äœ¿ããŸããã§ããã
äžèšã®æ åã«ã€ããŠãæ¡çšã§ããªãã£ã説æãå°ããç»ååŠçãšæ°åŠã®è©±ããªã®ã§ãããã人ã ãã©ãããããããªã人ã¯èªã¿é£ã°ããŠãã ããã
è£å®ã¢ã«ãŽãªãºã ã«ïŒæ¬¡é¢æ°ãçšããéç·åœ¢è£å®ãããŠããŸãããã·ã°ã¢ã€ã颿°ã«ããããšããžæ€åºãšä¿æã§èŒªéãä¿æããããšããããã詊ããŠã¿ãŸããããè£å®ããŠããéã®ã¢ã«ãã¡å€ã«ãã£ãŠã©ãããŠãèæ¯ã«åãããŠãç¹ã«è¶³å
ãèæ¯ã«æº¶ããŠããŸããŸãã
ãã¬ãŒã éã®è£å®ã®çšåºŠããç·åœ¢ã«ãããšå
šäœãééããŠèŠã«ãããªãã®ã§ãæ£åŒŠæ³¢ã®ã€ãŒãžã³ã°é¢æ°ã§ãããŠäžéã匷ãããã®ã§ããããããéã«æªãã£ãã®ãããããŸããã
ãã®èŸºãããããè°è«ãããæ¹ããããã²ã³ã¡ã³ããžã
ã¯ããã€ã©ã¹ãã¬ãŒã¿ãŒã®çããããç²ãæ§ã§ãã
ã€ã©ã¹ãã¬ãŒã¿ãŒã®çããã¯ããããŸã§ã§ååã§ãããã
èªåã§ãã©ãã©åç»ãèæ¯ãç·ã«ããæ åã«ãã¡ããã°ãããŸãã§ãã
ãç²ãæ§ã§ãã
çµµãæžããªãïŒ
Stable Diffusion ã§ãããªé¢šã«æ©ã女ã®åãçæãããïŒ
ãšããæ¹ããããããå
ã®èšäºã®å¯Ÿè±¡ã«ãªããŸãã
ãããŸã§ãã©ãçãã®çµæ§é 匵ã£ããã§ãææèšäºã«ããããããã«æã£ããã§ãããäžæŠã¯å
¬éããŸãïŒ
ãã€ãææã«ãªãããïŒ
ãã®æã¯ãããŸããã
æ©ã女ã®åã®åç»ãªãããDeforum 䜿ãã°ç°¡åãããªãïŒ
Motion åç»ã§ AnimateDiff 䜿ãã°ç°¡åã§ããã§ããïŒ
ããèããããªãããã£ãŠã¿ãŠãã ãããããããããã§èæ¯ãééã«ããŠåããã®ãã§ãããªãããéãæãã®ã§æããŠã»ãããããã§ãã
note ã«ããŠãããããææèšäºã§ãèªãŸããŠããã ããŸãã®ã§ãã³ã¡ã³ãããŠæããŠãã ããã
ãããŸã§èªãã§ããã ããŠããããšãããããŸãã
ããã§ãããŸããããªãïŒã§ããªãïŒ
ãšããæ¹ããããããå
ã®èšäºã®å¯Ÿè±¡ã«ãªããŸãã
ãªãããã§ã«ããçšåºŠãStable Diffusion webui ã®äœ¿ãæ¹ã«æ
£ããŠããæ¹ãåæãšããŠããã®ã§ãStable Diffusion webui ã®äœ¿ãæ¹ãåãããªãæ¹ã¯ãä»ã®æ¹ã®èšäºããYouTube ã®è§£èª¬åç»ãªã©ã§ããŸãäœ¿ãæ¹ãå匷ããŠãã ãããèªåã§ãŸããŸããªç»åçæã¯ã§ãããããšããæ¹ã¯ããããå
ã«é²ãã§ãã ããã
åäœç°å¢
ããŒã«ã« PC ã§äœæããŸãããGPU ã¯ãªããšèŸãããã
Google Corab ã Jupyter Notebook ã䜿ã£ãŠããæ¹ã§ãã§ãããšã¯æããŸãã詊ããŠãŸããã
PC ã®ã¹ããã¯
Windows 11
CPU : 11th Gen Intel(R) Core(TM) i7-11700@2.50GHz
ã³ã¢ : 8
è«çããã»ããµæ° : 16
ã¡ã¢ãª : 16GB
GPU : NVIDIA GeForce RTX3060
GPU ã¡ã¢ãª : 19.9 GB
GPU å°çšã¡ã¢ãª : 12 GB
å ±æ GPU ã¡ã¢ãª : 7.9 GB
Stable Diffusion webui ã®æºå
以äžããStable Diffusion webui ã® Extension ã§ãã

ãã®äžã§ãæãéèŠãªã®ã¯ä»¥äžã§ãã
sd-webui-controlnet
https://github.com/Mikubill/sd-webui-controlnet.gitsd-webui-openpose-editor
https://github.com/huchenlei/sd-webui-openpose-editor.gitABG_extension
https://github.com/KutsuyaYuki/ABG_extension.git
äžèšïŒã€ã® Extension ãå ¥ã£ãŠããåæã§ãã®èšäºã¯é²ããŸãã
ä»å䜿ã£ãã¢ãã«ãš VAEãSampler ç
ã¢ãã«ãã VAE ããã¯èªåã§å¥œããªãã®äœ¿ã£ãŠãããã§ãããåèãŸã§ã
Checkpoint : animeGod_v10
VAE : animevae.pt
Sampling method : DDIM
Schedule type : Automatic
人ç©ã®èæ¯ãééã«ãªãç»åã®çæ
æçµçã«æ©ããŠãã女ã®åã®èæ¯ã¯ãåŸãã§æµãå¥ã®æ åã«éãããã®ã§ã女ã®åã®èæ¯ã¯äžèŠã§ãããªã®ã§ãèæ¯ãé€å»ããªããã°ãªããŸããã
ããããªç»åç·šéãœããã§ãã§ããããšã§ãããåŸè¿°ããŸããããã©ãã©åç»ã«ããããã«éã®ããç»åãçæããªããã°ãªããªãã®ã§ããã¡ãã¡ïŒæãã€ãã£ãŠãªããããããŸããã
ABG Remover
ããã¯ãã§ã«ãåãã®æ¹ãå€ãã§ããããABG Remover ã§ããã
ä»ã«ãäœ¿ãæ¹ã説æããŠãããŠãæ
å ±ã¯ãã¡ãã¡ã«ãããŸãããããã§ã説æãããŠããã ããŸãã
ABG Remover ã¯ãç°¡åã«èšããšãçæãã人ç©ã®èæ¯ããæå®ããè²ãéæã«ããŠããããããã¹ã¯ç»åãäœæããŠããããããŸãã
以äžã®ïŒã€ãçæããããšãã§ããŸãã



ä»åã¯èæ¯ãéæã«ããç»åãäœããŸãã
ãšããã女ã®åãçæãã
Stable Diffusion ã§ txt2img ã§ããšãããäœããã人ç©ãäœããŸãããã
ããããã§ãã³ããïŒã€ãããŸãã
èæ¯åšãã® prompt ã« (blurry:2), ãå ¥ãã
èæ¯ããŒãããããŸãããã倧äºã
ABG Remover ãäºç©ãšèæ¯ãåºå¥ãããããªããŸãã
simple_background,nobody_background, ãšããå ¥ãããããããã
ãšãããèæ¯ã¯äœ¿ããªããããããã§ã¯ ADetailer ã¯äœ¿ããªã
ãã¡ãã¡æ¯åãã䜿ã£ãŠãããæéãããããã£ãŠãè¶³ããŸããã
ããšã§äœ¿ãããšã«ããŠããããšããç»åãèŠã€ãããŸã§ã¯äœ¿ããªãããã«ããŸãã
äœã£ãããPNG ç»åã¯ä¿åããŠãã ãããStable Diffusion ã® PNG Info ã§ããã³ããã Seed çã®ãã©ã¡ãŒã¿ãåå©çšããã®ã§ã

ADetailer ã§ããæãã«ãã
人ç©ãã§ããã ADetailer ã§çްéšãããæãã«ãããã§ããã
ããã©ã«ãã§äœ¿ã£ãŠããããã§ãããããã©ã«ãã ãšããŒãããèæ¯ã®äžãããç¡é§ãªæ€åºãããŠåŠçããŠãæéãããããã£ãŠãè¶³ããŸããã
ããã§ã¯ãããªæãã«èšå®ããŸããããããŸããããã£ãšããæå®ããã»ãããããã£ãŠäººãæããŠãã ããã
ADetailer ãæå¹ã«ãã
1st ( é¡ã®èª¿æŽ )
ADetailer detector  : face_yolov8n.pt
Detection
Mask only the top k largest : 1
人ç©ã 1 人ããããªãåæãªã®ã§ 1 ã«ããŸãã
èæ¯ã«ããŸã«é¡ã£ãœããŒãããç»åãŸã§æ€åºãã¡ãããã§ããã®åŠçã¯æéãããããã§ããããããŸããã
Inpainting
ContorolNet Model : control_v11p_sd15_inpaint_fp16
ControlNet module : inpaint_global_harmonious
2nd ( æã®èª¿æŽ )
ADetailer detector  : hand_yolov8n.pt
Detection
Mask only the top k largest : 2
人ç©ã 1 人ããããªãåæãªã®ã§ãæã¯ïŒã€ã®ã¯ããªã®ã§ 2 ã«ããŸããé¡åæ§ãèæ¯ã«ããŸã«æã£ãœããŒãããç»åãŸã§æ€åºãã¡ãããã§ã
Inpainting
( 1st ãšåã )
3rd ( 人ç©å šäœã®èª¿æŽ )
ADetailer detector  : person_yolov8n-seg.pt
Detection
Detection model confidence threshold 3rd : 0.8
ç¡é§ãªäººç©ãæ€åºããªãããã«ãæ€åºãã«ããããŸããMask only the top k largest : 1
人ç©ã 1 人ããããªãåæãªã®ã§ã1 ã«ããŸãã
é¡åæ§ãèæ¯ã«ãŸããŸã人ç©ã£ãœããŒãããç»åããçµæ§æ€åºãã¡ãããã§ããã
Inpainting
( 1st ãšåã )
4th
Enable ã OFF
ABG Remover ã§èæ¯ãééã«ãã
ãããADetailer ã§çްéšã®èª¿æŽã®ãã©ã¡ãŒã¿ããããããèæ¯ãééãããç»åãçæãŸããããABG Remover ãå
¥ã£ãŠãããšãŠãç°¡åã
txt2img ã®äžçªäžã®ãScript ã§ãABG Remover ãéžæããã ãïŒ




æ©ã女ã®åã®ç»åãäœãïŒãã® 1 - ffmpeg ãšã¢ãŒã·ã§ã³åç» )
ããŠãããŒã¹ã®å¥³ã®åã¯ã§ããŸãããã§ããæ©ãããããã§ãããã
ããã³ãããã©ãã ãããããããDeforum ã AnimateDiff 䜿ããããããæãã«ã¯ãªããŸãããäœãäžçªã§ããªãã£ãŠãDeforum ã AnimateDiff ãš ABG Remover ããåæã«äœ¿ããªããã§ããããããAnimateDiff ãšãªã䜿ãããã§ããã©ããŸãŒãæè©® AI ãããããšãããŸãã¡ãªãã§ããã
äœãããŸãã¡ã£ãŠãå·Šå³ã®æè¶³ã®åããããŒãã¡ããã¡ãã
ãããªããšãªããïŒããŸãã§ãããïŒã£ãŠãã人ãæããŠãã ããã
ããã§ ControlNet ã®ç»å Žã§ãã
ãšããã ContorolNet ã§ããããªåãã®ããæ åãçããäœã£ãŠãŸããããã ããããã§ããããããªãïŒãšæãããã®ããªãã
ãããªç°¡åã«ãããªãã®ããæšªåãã§æ©ã女ã®åãªãã§ããã
ã¶ã£ã¡ããããã¡ããåèã«ããŸãããåºæ¬çã«ãã¡ãã®ãµã€ãã®éãã«ããã°ããã§ãã
以éã¯ãäžèšãµã€ãã®æ
å ±ã«å ããŠãä»åã€ããããæšªåãã«æ©ã女ã®åã«ã€ããŠã®è£è¶³ã§ãã
ãšããããControlNet ã§æ©ã女ã®åãäœãããã«ãã¢ãŒã·ã§ã³ã®ããŒã¹ã«ãªãæ©ããŠããæ åãå¿
èŠã§ããäžèšãµã€ãã®èšãéãã« Mootion ã§ã²ããããŸãããã
ããã§ãDiscord ã§ Mootion ã®ãµãŒãã«åå ãããšã倿°ã® ControlNet ã§äœ¿ããããªã¢ãŒã·ã§ã³ã®åç»ãæ¢ããŸããã forward walk cycle ãã§æ€çŽ¢ãããšæšªåãã§ãããã¢ãŒã·ã§ã³åç»ãã¿ã€ããã®ã§ããããããŠã³ããŒãããŠäœ¿ããŸãããã

ããšã¯ãäžèšãµã€ãã®å
容ã«åŸã£ãŠãffmpeg ã§ãã®ç»åã®å·Šååãåãåã£ãŠãControlNet çšã®ã¢ãŒã·ã§ã³åç»ã«ããŸãã
ãµã€ãå
ã«ããããŸãããffmpeg ã®ã³ãã³ãã¯ä»¥äžã
# ã€ã³ããããã¡ã€ã«çšã«ã€ã³ããããã¡ã€ã«åãå®çŸ©
SET input=female_character_walking_towards__bot_left.mp4
# ã¢ãŠãããããã¡ã€ã«çšã«ã€ã³ããããã¡ã€ã«åãå å·¥
SET base_name=%input:~0,-4%
# å·Šååã®åç»ãçæ
ffmpeg -i %input% -vf "crop=in_w/2:in_h:0:0" %base_name%_left.mp4ffmpeg ã®ã€ã³ã¹ããŒã«æ¹æ³ã¯ãã¡ãã
æ©ã女ã®åã®ç»åãäœãïŒãã® 2 - ControlNet ã§è©Šãã )
å®ã¯ãå ã«ç޹ä»ãããµã€ãã®éãã«ããŠããŸããã£ãããªããããã§çµããããã§ãããåãèšäºãæžããŸã§ããªãã
ãããã®æšªåãã®å¥³ã®åãã£ãŠã®ããããç°¡åã«ã¯ãããªãã®ã§ããïŒ
äœåºŠãèšããïŒ
ããŸããããªãã®ïŒã§ãããªãæããŠïŒ
ãšããããããã«äœãããããè¶³ãšããã¡ãã¡ãæ¶ãããšãå«ã ãã
ãµã€ãã®éãã«ãã£ãŠããŸããããªãããã®å
ã¯äœãªãèªãŸãªããŠãããã§ãããäžæããããªãæ¹ã¯ããã®å
ãžã©ããã
ãšããããControlNet ã§ã¢ãŒã·ã§ã³åç»ããã®ãŸãŸäœ¿ã£ãŠãã女ã®åã¯å·Šå³ã®æè¶³ããããã«ååŸã«åãããŠæ©ããŠãããŸããã
ãããã ControlNet ã§ã¢ãŒã·ã§ã³ãååŸããåŸã®ç»åçæã®éçšã§ãå·Šå³ã®æè¶³ãã¡ãããšèªèããŠãããªããã§ãããã
ãã¡ãããã®çµæã§ããããã§æºè¶³ã§ããŸããïŒ
åã¯äžæºã§ãã
ããŠã©ããããã
æ©ã女ã®åã®ç»åãäœãïŒãã® 3 - ãšãããããã©ã·ãŠã¿ã )
Mootion ããååŸããåç»ãã®ãŸãŸã®å
šãã¬ãŒã ã€ãããªããŠããããããªãïŒã«ãŒãã§ããçšåºŠã®ç»åã ãã§æ§æã§ããã°ããããããªãïŒå€å°ã®ãŽãã¯ãããŒãªãããæäœæ¥ã§é€å»ãããšããŠãæå°éã®ç»åã ãã§ã«ãŒããããããšæãè³ããŸãã
ãªã®ã§ããšãããã倿°ã®ç»åãã€ããããšã¯åŸã§èããããšã«ããŠã1 æã®ç»åãã€ããããšãèããŸãã
ãŸã Mootion ã§ååŸããã¢ãŒã·ã§ã³æ åãããã©ãã©ã®ç»åã«ããŸãã
ffmpeg ã䜿ããŸãããªããªãããããå
ãffmpeg ãã¡ããã¡ã䜿ããŸãã
ã³ãã³ãããã³ããã§ä»¥äžãå®è¡ã
mkdir motion_frames_half
ffmpeg -i female_character_walking_towards__bot_left.mp4 -vf "select='not(mod(n,2))',setpts=N/FRAME_RATE/TB" -vsync vfr motion_frames_half\motion_%04d.pngããããã©ãã©ã®ã¢ãŒã·ã§ã³ç»åãã§ããŸããã

ãŸãã¯ãæåã®ãã¬ãŒã ã§ãControlNet ã§ç»åãçæããŠã¿ãŸãããã
æåã«äœã£ãç»åã PNG Info ã§ããã³ããã Seed çã®èšå®ãèªã¿èŸŒã
Send txt2img ãã¯ãªãã¯ã㊠txt2img ãžããã§ã«ããã³ããã Seed çãå ¥ã£ãŠããŸã
ADetailer ãæå¹ã«ãªã£ãŠãã®ã確èª
ControlNet ã® Unit0 ã«ãã¢ãŒã·ã§ã³åç»ãèšå®
ControlNet ã® Unit0 ã®èšå®ãããŸãã
Enable : ãã§ãã¯å ¥ããŸããå ¥ããªããšäœ¿ãããŸãã
Control Type : OpenPose
Preprocessor : dw_openpose_full
Model : control_v11p_sd15_openpose_fp16
Control Weight : 1.75
Control Mode : ControlNet is more importantScript ã« ABG Remover ãæå®
ãããGenerate!
æ©ã女ã®åã®ç»åãäœãïŒãã® 4 - å·Šå³ã®æè¶³ãããæãã«ãã )

ããŒ
ControlNet ã«å
šéšãŸãããŠããŸããããªãåå ããããã§ããããŸããã
å·Šå³ã®æè¶³ããéãªãã§ããã
ããã§ãOpenPose Editor ã®ç»å Žã§ãã
ã¢ãŒã·ã§ã³ã®æ
å ±ããå·Šå³ãã¡ãããšèªèãããçšåºŠã«èª¿æŽããŸãã
ControlUnit ã®ãšãªã¢ã®ãPreprocessor ãš Model ã®éã®ãªãã ãççºãããããªã¢ã€ã³ã³ã®ãã¿ã³ãæŒããšãããªç»é¢ã«ã

ã¢ãŒã·ã§ã³ç»åã®æšªã«ãã¢ãŒã·ã§ã³ãæã倿°ã®ç·ã衚瀺ãããŸãã
ç·ãããããèŽäœã®ããŒããæå³ããŠããŸãããããç·šéã§ãããã§ããã
ãªã®ã§ãã¡ãããšå·Šå³ãããŸãèªèãããããã«ããããç·šéããŸãã
å³ã«å°ãããEditããšããã®ã§ããããã¯ãªãã¯ã

ããã¯ãè¥å¹²è©Šè¡é¯èª€ã§ããããªããšãªããéãªããå¯èœãªéãå°ãªãããŠããå°»ã¯éã«ãã£ã€ããã»ããããããã§ãã
ããšã峿ãšå·Šæãã©ããã£ãŠãéã«èªèããã¡ãããã§ãäœçœ®ãå·Šå³ã©ã¡ãã«ã§ã䜿ããããã«è¿ã¥ããŠã¿ãŸããã
ããšãèäžã« 3 æ¬ç®ã®æãåºãããããã§ããããå°»ã®äœçœ®ã調æŽãããšæ¶ãããããŸãã
ç·šéåŸã¯ãå·Šäžã®ãControlNet ã«ããŒãºãéä¿¡ããå¿ããã«ïŒ
ãã£ããå³äžã®ãããæŒããšããã£ããç·šéããã®ã«æ¶ãã¡ãããŸãã
ããã¯è©Šè¡é¯èª€ãç¹°ãè¿ãã®ã§ãADetailer ã¯äžæŠç¡å¹ã«ããŸãã
ãã®ã¢ãŒã·ã§ã³ã®ç·šéãš Generate ãç¹°ãè¿ããŸãã
詊è¡é¯èª€ã®æ«ããããªé¢šã«ããŠã¿ãŸããã


ãããããå·Šå³ã®è¶³ãã¡ãããšãªã£ãŠããããªãã®ãã
ã§ãã髪ä»è¿ã®ãŒãããéšåãšããæ°ã«æããªãã»ã»ã»
ãŸããããšã§èãããã
èæ¯ãééãªæ©ã女ã®åã®ãã©ãã©ç»åã®çæ - Python ç»å Ž
ããŠã1 æ 1 æã®ç»åãããæãã«äœããããã«ã¯ãªããŸããã
ã§ãããäœãããã®ã¯æ©ã女ã®åã®ãæ åããªã®ã§ãïŒæïŒæãããªããšãã£ãŠãããªããïŒãªããªãæããã»ããæ©ããïŒæããªããã©ã
ãããã©ããããã
ããããããPython ã®ç»å Žã§ãã
ãããããã°ã©ãã³ã°ã®äžçããã£ãŠããŸããã
ããã°ã©ãã³ã°ãªããã§ããªããã»ã»ã»ãšããæ¹ãå®å¿ããŠãã ããã
ãã®ãŸãŸäœ¿ãããœãŒã¹ã³ãŒããšåããæ¹ããã®èšäºã«ãããŸããã
ãåãã®æ¹ãå€ãã§ãããã Stable Diffusion webui 㯠API ãåããŠããŸãã
ãªã®ã§ç»é¢ã§æäœããããšã Python ã§èªååãã¡ãããŸãããã
ãããŠãèªååããã€ãã§ã«ããŒãããç»çŽ ãç»åäžããé€å»ããåŠçãå
¥ãã¡ãããŸãã
ãããã« ControlNet ã® OpenPose Editor ã¯èªååã§ãããšãããããªãã®ã§ãçæåŸã«äžéšã®ç»åã«è¡ãã«ããŠããšãããã¢ãŒã·ã§ã³ããèæ¯ãééã®ãæ©ã女ã®åã®å€æ°ã®ç»åãäœããŸãããã
å®éã«ã¯çµæ§ãªææ°ãäœããŸãããããã§ã¯æäœéæ©ãåäœã«ãªãçšåºŠã§ã

ããŒãPython ã®ã³ãŒãã§ãã
import webuiapi
from PIL import Image
import numpy as np
import os
import glob
PROMPT = '''
( èªåã®ããã³ãã )
'''
NEGATIVE_PROMPT = '''
( èªåã®ãã¬ãã£ãããã³ãã )
'''
SEED = (èªåã® Seed )
CONTROLNET_MOTION_DIR = 'D:\\test_motion'
OUTPUT_DIR = 'D:\\test_png'
def color_distance(pixel1, pixel2):
  return np.sqrt(np.sum((pixel1[:3] - pixel2[:3])**2))
def remove_blur(image, color_threshold=30, alpha_threshold=50, window_size=3):
  """
  ç»åå
šäœã®ãŒãããé€å»ããåŠçãããç»åãè¿ããŸãã
  èããŒãããéšåã广çã«åŠçããŸãã
  :param image: PIL.Image ãªããžã§ã¯ã (RGBA ã¢ãŒã)
  :param color_threshold: ãŒãããšã¿ãªãè²ã®å·®ã®éŸå€
  :param alpha_threshold: éæåºŠã®éŸå€
  :param window_size: æ¯èŒããè¿åã®ãµã€ãº
  :return: åŠçæžã¿ã® PIL.Image ãªããžã§ã¯ã
  """
  # NumPyé
åã«å€æ
  img_array = np.array(image)
  height, width, _ = img_array.shape
 Â
  # ããã£ã³ã°ã远å
  pad = window_size // 2
  padded_image = np.pad(img_array, ((pad, pad), (pad, pad), (0, 0)), mode='edge')
 Â
  # çµæãæ ŒçŽããé
å
  result = np.copy(img_array)
 Â
  for i in range(height):
    for j in range(width):
      neighborhood = padded_image[i:i+window_size, j:j+window_size]
      center = neighborhood[pad, pad]
     Â
      # äžå¿ãã¯ã»ã«ãšè¿åãã¯ã»ã«ã®æå€§è²å·®ãèšç®
      max_diff = 0
      for pixel in neighborhood.reshape(-1, 4):
        if not np.array_equal(pixel, center):
          diff = color_distance(center, pixel)
          max_diff = max(max_diff, diff)
     Â
      # æ¹è¯ãããå€å®åºæº
      if center[3] > 0:  # å®å
šã«éæã§ãªãå Žåã®ã¿åŠç
        if max_diff > color_threshold:
          # è²ã®å·®ã倧ããå Žå
          alpha_factor = min(1.0, max_diff / (2 * color_threshold))
          new_alpha = int(center[3] * (1 - alpha_factor))
          result[i, j] = [*center[:3], new_alpha]
        elif center[3] < alpha_threshold:
          # èããŒããã®å Žå
          result[i, j] = [0, 0, 0, 0]  # å®å
šã«éæã«ãã
 Â
  # åŠçãããç»åã PIL.Image ãªããžã§ã¯ããšããŠè¿ã
  return Image.fromarray(result)
api = webuiapi.WebUIApi(host='127.0.0.1', port=7860)
def make_walking_girl(input_motion_dir, output_dir):
  # ControlNetUnit ã®èšå®
  def create_control_unit(image_path):
    motion_image = Image.open(image_path)
    return webuiapi.ControlNetUnit(
      image=motion_image,
      module='dw_openpose_full',
      model='control_v11p_sd15_openpose_fp16 [73c2b67d]',
      weight=1.75,
      control_mode=2,
      resize_mode='Crop and Resize',
    )
  # ADetailer ã®èšå®
  ads = [
    webuiapi.ADetailer(
      ad_model='face_yolov8n.pt',
      ad_controlnet_model='control_v11p_sd15_inpaint_fp16 [be8bc0ed]',
      ad_controlnet_module='inpaint_global_harmonious',
      ad_mask_k_largest=1,
    ),
    webuiapi.ADetailer(
      ad_model='hand_yolov8n.pt',
      ad_controlnet_model='control_v11p_sd15_inpaint_fp16 [be8bc0ed]',
      ad_controlnet_module='inpaint_global_harmonious',
      ad_mask_k_largest=2,
    ),
    webuiapi.ADetailer(
      ad_model='person_yolov8n-seg.pt',
      ad_controlnet_model='control_v11p_sd15_inpaint_fp16 [be8bc0ed]',
      ad_controlnet_module='inpaint_global_harmonious',
      ad_mask_k_largest=1,
      ad_confidence=0.8
    )
  ]
  # PNG ãã¡ã€ã«ãåŠç
  png_files = sorted(glob.glob(os.path.join(input_motion_dir, '*.png')))
  for png_file in png_files:
    print('Start ' + png_file.split(os.sep)[-1], flush=True)
    control_unit0 = create_control_unit(png_file)
   Â
    print('Generating...', end='', flush=True)
    result = api.txt2img(
      sampler_name='DDIM',
      steps=40,
      prompt=PROMPT,
      negative_prompt=NEGATIVE_PROMPT,
      width=1024, height=1024,
      seed=SEED,
      controlnet_units=[control_unit0],
      adetailer=ads,
      animatediff=webuiapi.AnimateDiff(enable=False),
      script_name='ABG Remover',
      script_args=['True','False'],
    )
    print('Done', flush=True)
   Â
    # ãŒãããé€å»
    print('Removing blur...', end='', flush=True)
    result_image = remove_blur(result.image, color_threshold=30, alpha_threshold=80)
    print('Done', flush=True)
    # åºåãã¡ã€ã«åãå
¥åãã¡ã€ã«åãšåãã«ãã
    output_filename = os.path.basename(png_file)
    output_path = os.path.join(output_dir, output_filename)
   Â
    result_image.save(output_path)
    print(f"Processed and saved: {output_path}")
  print("All images processed successfully.")
def remove_blur_from_dir(target_dir):
  png_files = sorted(glob.glob(os.path.join(target_dir, '*.png')))
  for png_file in png_files:
    print('Start ' + png_file.split(os.sep)[-1], flush=True)
    img = Image.open(png_file).convert('RGBA')
    print('Removing blur...', end='', flush=True)
    result_image = remove_blur(img, color_threshold=30, alpha_threshold=80)
    print('Done', flush=True)
    # åºåãã¡ã€ã«åãå
¥åãã¡ã€ã«åãšåãã«ãã
    output_filename = os.path.basename(png_file)
    output_path = os.path.join(target_dir, output_filename)
   Â
    result_image.save(output_path)
 Â
  print("All images processed successfully.")
if __name__ == "__main__":
  make_walking_girl(CONTROLNET_MOTION_DIR, OUTPUT_DIR)é©åœãªãã¡ã€ã«åã§ãæ¡åŒµåã .py ã«ããŠãStable Diffusion webui ãã€ã³ã¹ããŒã«ãããã£ã¬ã¯ããªã«äžèšã®ãœãŒã¹ã³ãŒããé
眮ããŸããããã§ã¯ walking_test.py ã«ããŸããã
PROMPTãNEGATIVE_PROMPTãSEEDãCONTROLNET_MOTION_DIRãOUTPUT_DIR ããèªåã®äœæããç»åã«åãããŠå€æŽããŠãã ããã
ããã倧éã«ã€ãããŸããã£ãšã
ã³ãã³ãããã³ããã§ä»¥äžãå®è¡ããŸãã
cd stable-diffusion-webui
venv\Scripts\activate
date /T
time /T
python walking_test.pyããŒããªãããåæã«ãStable Diffusion webui ãèµ·åããã³ãã³ãããã³ãããåæã«åãå§ããŸãã

ã¿ã¹ã¯ãããŒãžã£ãšãã§ GPU ãã¢ãã¿ãŒãããšãããããåããŠããŸãã

ãããããã°ã©ã ãçµäºããŸããã
ä»å㯠10 æã ããªã®ã§ã30 åãããã§çµãããŸããã

äžéšã®ç»åã®ä¿®æ£
ã¢ãŒã·ã§ã³ãšã®æ¯èŒ
ãããã§ããç»åãšãå ã®ã¢ãŒã·ã§ã³ã®ç»åãèŠæ¯ã¹ãŠã¿ãŸãããã


ããŒãããªãã»ã©ã
3 ã€ãã®ç»åããäœèšãªè ããã
4 ã€ããš5ã€ç®ã®ç»åã®ãè¶³ãå·Šå³é
6 ã€ãã®ç»åã«ãããªãç»åãæ®ã£ãŠãã
è ã®é€å»ããªããæã£ãŠããã®ãé€å»
3 ã€ããã 5 ã€ãã¯ãStable Diffusion webui ã§ãçŽæ¥çŽããŸãããã
åè¿°ã® ControlNet ã§ OpenPose Editor ã䜿ã£ãŠä¿®æ£ããŠãã ããã
3 ã€ãã®è
ãäœèšã«ãããšãã¯ããå°»ã®äœçœ®ãè¿ã¥ããŠãäœã«é ããŠããæãå°ã衚ã«åºããŸãã


ãªããæã£ãŠãã»ã»ã»ããŒãã¯èµ€ããã
Negative Prompt ã«
(handing_things:2),(handing_stick:2),(handing_black_things:2),
ã远å ããŠãGenerateã

ããŒããã髪ãèµ€ããããã©ããŸãããããããããã³ããã§çŽãããšæããã©ãä»åã¯åããçŠç¹ãªã®ã§ãçŽããã人ã¯ããã³ããã§çŽããŠãã
å¥ã®ãã£ã¬ã¯ããªã«äžæŠä¿åããŠãããŸãã
è¶³ãé
4 ã€ããïŒã€ãã®è¶³ãéãªã®ã¯ãè¶³ã®ç·ã調æŽã
OpenPose Editor ã§ä¿®æ£ããŸãã

ãã»ã»ã»4 ã€ãã¯ãæãé ããŠãŠãã¢ãŒã·ã§ã³ã®äžã«ãªãã
ãšãããããããé ããŠãæããåå¯Ÿã®æãšéãªã£ãŠããã§ããã
èŠããŠãåŽã®è
ãšæãäžåºŠé衚瀺ã«ããŠãéãªã£ãŠããéšåãããæãã®äœçœ®ã«ç§»åããŠãæ¶ããŠãè
ã衚瀺ãããŠæãšãã£ã€ããŸãã
ãã®ãšããã©ãããŠã 3 æ¬ç®ã®è
ãåºçŸãããã§ããªãã§ã ãšããã£ãããOpenPose ã®äžã§ãããã€ãã®è
ãšæãæ¶ããŠãŸããã
ããã埩æ§ãããŸãã


埮åŠã«ãå·Šå³ã®è¶³ãã©ã£ã¡ãªã®ãããããªããã©ãããããªããªããããã
ãããä¿®æ£ããå¥ã®ãã£ã¬ã¯ããªã«ä¿åã
5 ã€ãã¯ãæ®éã«ãå°»ã®ç§»åãããŠãã£ããä¿®æ£ã§ããŸããã
ãããäžã®ãã£ã¬ã¯ããªã«ä¿åã

ãããŸã§ã«ãå¥ã®ãã£ã¬ã¯ããªã«ä¿®æ£ãã 3 ã€ã®ç»åããããŸããã§ããã®ãŸãŸã ãšãPython ã§é€å»ãããã€ãºãæ®ã£ãŠãããã§ããããªã®ã§ãPython ã§ãããã®ç»åãããã€ãºãé€å»ããŸãã
python
from walking_test import remove_blur_from_dir
remove_blur_from_dir('D:\\test_png2')
exit()ã¯ãããã€ãºãæ¶ããŸããããããå ã®ãã£ã¬ã¯ããªã«äžæžãããŸãã

6 ã€ãã¯ãgimp ãšãã®ç»åç·šéãœããã§ãããªãéšåãæ¶ãã ãã
èªãã»ã©ã§ããªãã§ãã
ãããæ¹ããŠæ¯èŒããŠã¿ãŸãããã


ãã£ã± 3 æç®ãã髪ãèµ€ãããããã»ã»ã»
gimp ã§ãèµ€ã匱ãããŸãã


ããŒãŒãŒãŒãªããè²ãã¡ãã£ãšéããã©ããŸããããã

ãŸããããããããªãããªãŒ
Clipchamp ã§äœ¿ãèæ¯ã«ééããåç»ã®çæ
ãããŸã§ããããããšã¯ ffmpeg ã§æ åã«ããã ãã§ãã
ã§ãããã£ãŠã©ãããã®ãŒïŒ
ã¯ãã以äžã®ã³ãã³ãããã³ããã®ããããã¡ã€ã«ãäœæããŠãã£ã¬ã¯ããªå
ã«ãããŠå®è¡ããŸãããã
@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion
:: Default values
set "output_file=output.mp4"
set "file_list=temp_file_list.txt"
set "video_duration=10"
set "file_pattern=*.png"
set "bg_r=00"
set "bg_g=FF"
set "bg_b=00"
echo File pattern: %file_pattern%
echo Output file: %output_file%
echo Video duration: %video_duration% seconds
echo Background color: #%rgb_r%%rgb_g%%rgb_b%
:: Count matching files and calculate framerate
set file_count=0
for %%F in (%file_pattern%) do set /a file_count+=1
set /a framerate=file_count/video_duration
if %framerate% lss 1 set framerate=1
echo Number of matching files: %file_count%
echo Calculated framerate: %framerate%
:: Create a new file list with matching files
if exist "%file_list%" del "%file_list%"
for %%F in (%file_pattern%) do (
  echo file '%%~fF'>>"%file_list%"
)
:: Use FFmpeg to create video from the file list with specified background color, preserving transparency
ffmpeg -y -f concat -safe 0 -r %framerate% -i "%file_list%" ^
-filter_complex "[0:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:color=#00000000,format=rgba[scaled];color=c=0x%bg_r%%bg_g%%bg_b%:s=1920x1080[bg];[bg][scaled]overlay=format=auto,format=yuv420p[v]" ^
-map "[v]" ^
-c:v libx264 ^
-preset ultrafast ^
-crf 23 ^
-t %video_duration% ^
"%output_file%"
echo Video creation complete. Output file: %output_file%
echo File list saved as: %file_list%ã§ããŸãŒãããŒã3 ã³ãç®ãæ°ã«ãªããã©ãä»ã¯ãŸããããã
Clipchamp ã§èæ¯ãééãããåç»ã®äœæ
ããŒãæ©ã女ã®åãã§ããŸããïŒ
Clipchamp ã䜿ã£ãŠãèæ¯åç»ã«éããŠã女ã®åã«æ
ããããŸãããã

é床
é©åºŠãªéãã«ãé床ã調æŽããŠãã ããã4x ã«ããŠã¿ãŸããã

èæ¯ã®éé
ã广ã->ãã°ãªãŒã³ã¹ã¯ãªãŒã³ãã§ãèæ¯ãæ¶ããïŒïŒïŒ
ããã§ããïŒ

ã§ããïŒ
çµããã«
çãããç²ãæ§ã§ãããšãŠãé·ã note ã§ããã
Stable Diffusion 䟿å©ã§ããããæè¿ã¯ããŒãããããåºãŠããŠãŠããã€ãå匷ããªããã§ãã
ããã§ããã¯ããå°æ¥ã¢ãã¡ãŒã¿ãŒã«ã¯ãŸã çšé ãããªãã£ãŠãã€ãæããŸãããAI ã§ããããªã¹ãã·ã£ãªã¹ãã«æãã®ãåãªã®ã§ãã
ããã«ãäžåºŠäœã£ã MV ã®äœæ¥ããã©ã£ãŠ note ã«æŽçã§ããã®ã§ãããã¯ããã§ããã£ãã®ããªã
ãã®ã³ã³ãã³ãããçããã®å©ãã«ãªã£ãŠããã°ãäœããã®å¹žãã§ãã
ããããããæ åã«éãããAI ã§ããããªã¹ãã·ã£ãªã¹ãã«æãã§ããããšæããŸãã
æåŸã«ããäžåºŠå®£äŒãã
ãã£ããäœã£ãããã女ã®åã§ãããæè©ã®äžéšã«ãã£ãææ³äžã®èª€ãããã£ãšæ°ã«ãªã£ãŠããã§ããªãã¹ã¿ãŒããŸããã
æ©ã女ã®åããããã°ã
ãããŸã§èªãã ããããã«ãã£ã³ãã«ç»é²ããé¡ãããŸãïœ
Lofi ãªããããããŸãã®ã§ããã¡ããã©ããã