Buckets:
| import"../chunks/DsnmJJEf.js";import{i as v,h as I,C,H as s,a,E as _,s as V}from"../chunks/CFM6C53a.js";import{p as R,o as X,s as l,f as Y,a as G,b as S,c as j,n as N}from"../chunks/CNc7KuUZ.js";const H='{"title":"다양한 Stable Diffusion 포맷 불러오기","local":"다양한-stable-diffusion-포맷-불러오기","sections":[{"title":"PyTorch .ckpt","local":"pytorch-ckpt","sections":[{"title":"Space로 변환하기","local":"space로-변환하기","sections":[],"depth":3},{"title":"스크립트로 변환하기","local":"스크립트로-변환하기","sections":[],"depth":3}],"depth":2},{"title":"Keras .pb or .h5","local":"keras-pb-or-h5","sections":[],"depth":2},{"title":"A1111 LoRA files","local":"a1111-lora-files","sections":[],"depth":2}],"depth":1}';var Q=j('<meta name="hf:doc:metadata"/>'),z=j(`<p></p> <!> <!> <p>Stable Diffusion 모델들은 학습 및 저장된 프레임워크와 다운로드 위치에 따라 다양한 형식으로 제공됩니다. 이러한 형식을 🤗 Diffusers에서 사용할 수 있도록 변환하면 추론을 위한 <a href="schedulers">다양한 스케줄러 사용</a>, 사용자 지정 파이프라인 구축, 추론 속도 최적화를 위한 다양한 기법과 방법 등 라이브러리에서 지원하는 모든 기능을 사용할 수 있습니다.</p> <blockquote class="tip"><p>우리는 <code>.safetensors</code> 형식을 추천합니다. 왜냐하면 기존의 pickled 파일은 취약하고 머신에서 코드를 실행할 때 악용될 수 있는 것에 비해 훨씬 더 안전합니다. (safetensors 불러오기 가이드에서 자세히 알아보세요.)</p></blockquote> <p>이 가이드에서는 다른 Stable Diffusion 형식을 🤗 Diffusers와 호환되도록 변환하는 방법을 설명합니다.</p> <!> <p>체크포인트 또는 <code>.ckpt</code> 형식은 일반적으로 모델을 저장하는 데 사용됩니다. <code>.ckpt</code> 파일은 전체 모델을 포함하며 일반적으로 크기가 몇 GB입니다. <code>.ckpt</code> 파일을 [~StableDiffusionPipeline.from_ckpt] 메서드를 사용하여 직접 불러와서 사용할 수도 있지만, 일반적으로 두 가지 형식을 모두 사용할 수 있도록 <code>.ckpt</code> 파일을 🤗 Diffusers로 변환하는 것이 더 좋습니다.</p> <p><code>.ckpt</code> 파일을 변환하는 두 가지 옵션이 있습니다. Space를 사용하여 체크포인트를 변환하거나 스크립트를 사용하여 <code>.ckpt</code> 파일을 변환합니다.</p> <!> <p><code>.ckpt</code> 파일을 변환하는 가장 쉽고 편리한 방법은 SD에서 Diffusers로 스페이스를 사용하는 것입니다. Space의 지침에 따라 .ckpt 파일을 변환 할 수 있습니다.</p> <p>이 접근 방식은 기본 모델에서는 잘 작동하지만 더 많은 사용자 정의 모델에서는 어려움을 겪을 수 있습니다. 빈 pull request나 오류를 반환하면 Space가 실패한 것입니다. | |
| 이 경우 스크립트를 사용하여 <code>.ckpt</code> 파일을 변환해 볼 수 있습니다.</p> <!> <p>🤗 Diffusers는 <code>.ckpt</code> 파일 변환을 위한 변환 스크립트를 제공합니다. 이 접근 방식은 위의 Space보다 더 안정적입니다.</p> <p>시작하기 전에 스크립트를 실행할 🤗 Diffusers의 로컬 클론(clone)이 있는지 확인하고 Hugging Face 계정에 로그인하여 pull request를 열고 변환된 모델을 허브에 푸시할 수 있도록 하세요.</p> <!> <p>스크립트를 사용하려면:</p> <ol><li>변환하려는 <code>.ckpt</code> 파일이 포함된 리포지토리를 Git으로 클론(clone)합니다.</li></ol> <p>이 예제에서는 TemporalNet .ckpt 파일을 변환해 보겠습니다:</p> <!> <ol start="2"><li>체크포인트를 변환할 리포지토리에서 pull request를 엽니다:</li></ol> <!> <ol start="3"><li>변환 스크립트에서 구성할 입력 인수는 여러 가지가 있지만 가장 중요한 인수는 다음과 같습니다:</li></ol> <ul><li><code>checkpoint_path</code>: 변환할 <code>.ckpt</code> 파일의 경로를 입력합니다.</li> <li><code>original_config_file</code>: 원래 아키텍처의 구성을 정의하는 YAML 파일입니다. 이 파일을 찾을 수 없는 경우 <code>.ckpt</code> 파일을 찾은 GitHub 리포지토리에서 YAML 파일을 검색해 보세요.</li> <li><code>dump_path</code>: 변환된 모델의 경로</li></ul> <p>예를 들어, TemporalNet 모델은 Stable Diffusion v1.5 및 ControlNet 모델이기 때문에 ControlNet 리포지토리에서 cldm_v15.yaml 파일을 가져올 수 있습니다.</p> <ol start="4"><li>이제 스크립트를 실행하여 .ckpt 파일을 변환할 수 있습니다:</li></ol> <!> <ol start="5"><li>변환이 완료되면 변환된 모델을 업로드하고 결과물을 pull request <a href="https://huggingface.co/CiaraRowles/TemporalNet/discussions/13" rel="nofollow">pull request</a>를 테스트하세요!</li></ol> <!> <!> <p>🧪 이 기능은 실험적인 기능입니다. 현재로서는 Stable Diffusion v1 체크포인트만 변환 KerasCV Space에서 지원됩니다.</p> <p><a href="https://keras.io/keras_cv/" rel="nofollow">KerasCV</a>는 <a href="https://github.com/keras-team/keras-cv/blob/master/keras_cv/models/stable_diffusion" rel="nofollow">Stable Diffusion</a> v1 및 v2에 대한 학습을 지원합니다. 그러나 추론 및 배포를 위한 Stable Diffusion 모델 실험을 제한적으로 지원하는 반면, 🤗 Diffusers는 다양한 <a href="https://huggingface.co/docs/diffusers/using-diffusers/schedulers" rel="nofollow">noise schedulers</a>, <a href="https://huggingface.co/docs/diffusers/optimization/xformers" rel="nofollow">flash attention</a>, and <a href="https://huggingface.co/docs/diffusers/optimization/fp16" rel="nofollow">other optimization techniques</a> 등 이러한 목적을 위한 보다 완벽한 기능을 갖추고 있습니다.</p> <p><a href="https://huggingface.co/spaces/sayakpaul/convert-kerascv-sd-diffusers" rel="nofollow">Convert KerasCV</a> Space 변환은 <code>.pb</code> 또는 <code>.h5</code>을 PyTorch로 변환한 다음, 추론할 수 있도록 <code>StableDiffusionPipeline</code> 으로 감싸서 준비합니다. 변환된 체크포인트는 Hugging Face Hub의 리포지토리에 저장됩니다.</p> <p>예제로, textual-inversion으로 학습된 <code>[sayakpaul/textual-inversion-kerasio](https://huggingface.co/sayakpaul/textual-inversion-kerasio/tree/main)</code> 체크포인트를 변환해 보겠습니다. 이것은 특수 토큰 <code><my-funny-cat></code>을 사용하여 고양이로 이미지를 개인화합니다.</p> <p>KerasCV Space 변환에서는 다음을 입력할 수 있습니다:</p> <ul><li>Hugging Face 토큰.</li> <li>UNet 과 텍스트 인코더(text encoder) 가중치를 다운로드하는 경로입니다. 모델을 어떻게 학습할지 방식에 따라, UNet과 텍스트 인코더의 경로를 모두 제공할 필요는 없습니다. 예를 들어, textual-inversion에는 텍스트 인코더의 임베딩만 필요하고 텍스트-이미지(text-to-image) 모델 변환에는 UNet 가중치만 필요합니다.</li> <li>Placeholder 토큰은 textual-inversion 모델에만 적용됩니다.</li> <li><code>output_repo_prefix</code>는 변환된 모델이 저장되는 리포지토리의 이름입니다.</li></ul> <p><strong>Submit</strong> (제출) 버튼을 클릭하면 KerasCV 체크포인트가 자동으로 변환됩니다! 체크포인트가 성공적으로 변환되면, 변환된 체크포인트가 포함된 새 리포지토리로 연결되는 링크가 표시됩니다. 새 리포지토리로 연결되는 링크를 따라가면 변환된 모델을 사용해 볼 수 있는 추론 위젯이 포함된 모델 카드가 생성된 KerasCV Space 변환을 확인할 수 있습니다.</p> <p>코드를 사용하여 추론을 실행하려면 모델 카드의 오른쪽 상단 모서리에 있는 <strong>Use in Diffusers</strong> 버튼을 클릭하여 예시 코드를 복사하여 붙여넣습니다:</p> <!> <p>그러면 다음과 같은 이미지를 생성할 수 있습니다:</p> <!> <!> <p><a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui" rel="nofollow">Automatic1111</a> (A1111)은 Stable Diffusion을 위해 널리 사용되는 웹 UI로, <a href="https://civitai.com/" rel="nofollow">Civitai</a> 와 같은 모델 공유 플랫폼을 지원합니다. 특히 LoRA 기법으로 학습된 모델은 학습 속도가 빠르고 완전히 파인튜닝된 모델보다 파일 크기가 훨씬 작기 때문에 인기가 높습니다.</p> <p>🤗 Diffusers는 <code>load_lora_weights()</code>:를 사용하여 A1111 LoRA 체크포인트 불러오기를 지원합니다:</p> <!> <p>Civitai에서 LoRA 체크포인트를 다운로드하세요; 이 예제에서는 <a href="https://civitai.com/models/14605?modelVersionId=19998" rel="nofollow">Howls Moving Castle,Interior/Scenery LoRA (Ghibli Stlye)</a> 체크포인트를 사용했지만, 어떤 LoRA 체크포인트든 자유롭게 사용해 보세요!</p> <!> <p>메서드를 사용하여 파이프라인에 LoRA 체크포인트를 불러옵니다:</p> <!> <p>이제 파이프라인을 사용하여 이미지를 생성할 수 있습니다:</p> <!> <p>마지막으로, 디스플레이에 이미지를 표시하는 헬퍼 함수를 만듭니다:</p> <!> <div class="flex justify-center"><img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/a1111-lora-sf.png"/></div> <!> <p></p>`,1);function F(k,W){R(W,!1),X(()=>{new URLSearchParams(window.location.search).get("fw")}),v();var e=z();I("oq4mu7",T=>{var Z=Q();V(Z,"content",H),G(T,Z)});var o=l(Y(e),2);C(o,{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"});var i=l(o,2);s(i,{title:"다양한 Stable Diffusion 포맷 불러오기",local:"다양한-stable-diffusion-포맷-불러오기",headingTag:"h1"});var t=l(i,8);s(t,{title:"PyTorch .ckpt",local:"pytorch-ckpt",headingTag:"h2"});var n=l(t,6);s(n,{title:"Space로 변환하기",local:"space로-변환하기",headingTag:"h3"});var p=l(n,6);s(p,{title:"스크립트로 변환하기",local:"스크립트로-변환하기",headingTag:"h3"});var c=l(p,6);a(c,{code:"aGYlMjBhdXRoJTIwbG9naW4=",highlighted:"hf auth login",lang:"bash",wrap:!1});var r=l(c,8);a(r,{code:"Z2l0JTIwbGZzJTIwaW5zdGFsbCUwQWdpdCUyMGNsb25lJTIwaHR0cHMlM0ElMkYlMkZodWdnaW5nZmFjZS5jbyUyRkNpYXJhUm93bGVzJTJGVGVtcG9yYWxOZXQ=",highlighted:`git lfs install | |
| git <span class="hljs-built_in">clone</span> https://huggingface.co/CiaraRowles/TemporalNet`,lang:"bash",wrap:!1});var d=l(r,4);a(d,{code:"Y2QlMjBUZW1wb3JhbE5ldCUyMCUyNiUyNiUyMGdpdCUyMGZldGNoJTIwb3JpZ2luJTIwcmVmcyUyRnByJTJGMTMlM0FwciUyRjEzJTBBZ2l0JTIwY2hlY2tvdXQlMjBwciUyRjEz",highlighted:`<span class="hljs-built_in">cd</span> TemporalNet && git fetch origin refs/pr/13:<span class="hljs-built_in">pr</span>/13 | |
| git checkout <span class="hljs-built_in">pr</span>/13`,lang:"bash",wrap:!1});var h=l(d,10);a(h,{code:"cHl0aG9uJTIwLi4lMkZkaWZmdXNlcnMlMkZzY3JpcHRzJTJGY29udmVydF9vcmlnaW5hbF9zdGFibGVfZGlmZnVzaW9uX3RvX2RpZmZ1c2Vycy5weSUyMC0tY2hlY2twb2ludF9wYXRoJTIwdGVtcG9yYWxuZXR2My5ja3B0JTIwLS1vcmlnaW5hbF9jb25maWdfZmlsZSUyMGNsZG1fdjE1LnlhbWwlMjAtLWR1bXBfcGF0aCUyMC4lMkYlMjAtLWNvbnRyb2xuZXQ=",highlighted:"python ../diffusers/scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path temporalnetv3.ckpt --original_config_file cldm_v15.yaml --dump_path ./ --controlnet",lang:"bash",wrap:!1});var y=l(h,4);a(y,{code:"Z2l0JTIwcHVzaCUyMG9yaWdpbiUyMHByJTJGMTMlM0FyZWZzJTJGcHIlMkYxMw==",highlighted:'git push origin <span class="hljs-built_in">pr</span>/13:refs/pr/13',lang:"bash",wrap:!1});var u=l(y,2);s(u,{title:"Keras .pb or .h5",local:"keras-pb-or-h5",headingTag:"h2"});var M=l(u,18);a(M,{code:"ZnJvbSUyMGRpZmZ1c2VycyUyMGltcG9ydCUyMERpZmZ1c2lvblBpcGVsaW5lJTBBJTBBcGlwZWxpbmUlMjAlM0QlMjBEaWZmdXNpb25QaXBlbGluZS5mcm9tX3ByZXRyYWluZWQoJTIyc2F5YWtwYXVsJTJGdGV4dHVhbC1pbnZlcnNpb24tY2F0LWtlcmFzY3Zfc2RfZGlmZnVzZXJzX3BpcGVsaW5lJTIyKQ==",highlighted:`<span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> DiffusionPipeline | |
| pipeline = DiffusionPipeline.from_pretrained(<span class="hljs-string">"sayakpaul/textual-inversion-cat-kerascv_sd_diffusers_pipeline"</span>)`,lang:"py",wrap:!1});var f=l(M,4);a(f,{code:"ZnJvbSUyMGRpZmZ1c2VycyUyMGltcG9ydCUyMERpZmZ1c2lvblBpcGVsaW5lJTBBJTBBcGlwZWxpbmUlMjAlM0QlMjBEaWZmdXNpb25QaXBlbGluZS5mcm9tX3ByZXRyYWluZWQoJTIyc2F5YWtwYXVsJTJGdGV4dHVhbC1pbnZlcnNpb24tY2F0LWtlcmFzY3Zfc2RfZGlmZnVzZXJzX3BpcGVsaW5lJTIyKSUwQXBpcGVsaW5lLnRvKCUyMmN1ZGElMjIpJTBBJTBBcGxhY2Vob2xkZXJfdG9rZW4lMjAlM0QlMjAlMjIlM0NteS1mdW5ueS1jYXQtdG9rZW4lM0UlMjIlMEFwcm9tcHQlMjAlM0QlMjBmJTIydHdvJTIwJTdCcGxhY2Vob2xkZXJfdG9rZW4lN0QlMjBnZXR0aW5nJTIwbWFycmllZCUyQyUyMHBob3RvcmVhbGlzdGljJTJDJTIwaGlnaCUyMHF1YWxpdHklMjIlMEFpbWFnZSUyMCUzRCUyMHBpcGVsaW5lKHByb21wdCUyQyUyMG51bV9pbmZlcmVuY2Vfc3RlcHMlM0Q1MCkuaW1hZ2VzJTVCMCU1RA==",highlighted:`<span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> DiffusionPipeline | |
| pipeline = DiffusionPipeline.from_pretrained(<span class="hljs-string">"sayakpaul/textual-inversion-cat-kerascv_sd_diffusers_pipeline"</span>) | |
| pipeline.to(<span class="hljs-string">"cuda"</span>) | |
| placeholder_token = <span class="hljs-string">"<my-funny-cat-token>"</span> | |
| prompt = <span class="hljs-string">f"two <span class="hljs-subst">{placeholder_token}</span> getting married, photorealistic, high quality"</span> | |
| image = pipeline(prompt, num_inference_steps=<span class="hljs-number">50</span>).images[<span class="hljs-number">0</span>]`,lang:"py",wrap:!1});var m=l(f,2);s(m,{title:"A1111 LoRA files",local:"a1111-lora-files",headingTag:"h2"});var J=l(m,6);a(J,{code:"ZnJvbSUyMGRpZmZ1c2VycyUyMGltcG9ydCUyMERpZmZ1c2lvblBpcGVsaW5lJTJDJTIwVW5pUENNdWx0aXN0ZXBTY2hlZHVsZXIlMEFpbXBvcnQlMjB0b3JjaCUwQSUwQXBpcGVsaW5lJTIwJTNEJTIwRGlmZnVzaW9uUGlwZWxpbmUuZnJvbV9wcmV0cmFpbmVkKCUwQSUyMCUyMCUyMCUyMCUyMmFuZGl0ZSUyRmFueXRoaW5nLXY0LjAlMjIlMkMlMjBkdHlwZSUzRHRvcmNoLmZsb2F0MTYlMkMlMjBzYWZldHlfY2hlY2tlciUzRE5vbmUlMEEpLnRvKCUyMmN1ZGElMjIpJTBBcGlwZWxpbmUuc2NoZWR1bGVyJTIwJTNEJTIwVW5pUENNdWx0aXN0ZXBTY2hlZHVsZXIuZnJvbV9jb25maWcocGlwZWxpbmUuc2NoZWR1bGVyLmNvbmZpZyk=",highlighted:`<span class="hljs-keyword">from</span> diffusers <span class="hljs-keyword">import</span> DiffusionPipeline, UniPCMultistepScheduler | |
| <span class="hljs-keyword">import</span> torch | |
| pipeline = DiffusionPipeline.from_pretrained( | |
| <span class="hljs-string">"andite/anything-v4.0"</span>, dtype=torch.float16, safety_checker=<span class="hljs-literal">None</span> | |
| ).to(<span class="hljs-string">"cuda"</span>) | |
| pipeline.scheduler = UniPCMultistepScheduler.from_config(pipeline.scheduler.config)`,lang:"py",wrap:!1});var b=l(J,4);a(b,{code:"IXdnZXQlMjBodHRwcyUzQSUyRiUyRmNpdml0YWkuY29tJTJGYXBpJTJGZG93bmxvYWQlMkZtb2RlbHMlMkYxOTk5OCUyMC1PJTIwaG93bHNfbW92aW5nX2Nhc3RsZS5zYWZldGVuc29ycw==",highlighted:"!wget https://civitai.com/api/download/models/19998 -O howls_moving_castle.safetensors",lang:"bash",wrap:!1});var g=l(b,4);a(g,{code:"cGlwZWxpbmUubG9hZF9sb3JhX3dlaWdodHMoJTIyLiUyMiUyQyUyMHdlaWdodF9uYW1lJTNEJTIyaG93bHNfbW92aW5nX2Nhc3RsZS5zYWZldGVuc29ycyUyMik=",highlighted:'pipeline.load_lora_weights(<span class="hljs-string">"."</span>, weight_name=<span class="hljs-string">"howls_moving_castle.safetensors"</span>)',lang:"py",wrap:!1});var w=l(g,4);a(w,{code:"cHJvbXB0JTIwJTNEJTIwJTIybWFzdGVycGllY2UlMkMlMjBpbGx1c3RyYXRpb24lMkMlMjB1bHRyYS1kZXRhaWxlZCUyQyUyMGNpdHlzY2FwZSUyQyUyMHNhbiUyMGZyYW5jaXNjbyUyQyUyMGdvbGRlbiUyMGdhdGUlMjBicmlkZ2UlMkMlMjBjYWxpZm9ybmlhJTJDJTIwYmF5JTIwYXJlYSUyQyUyMGluJTIwdGhlJTIwc25vdyUyQyUyMGJlYXV0aWZ1bCUyMGRldGFpbGVkJTIwc3RhcnJ5JTIwc2t5JTIyJTBBbmVnYXRpdmVfcHJvbXB0JTIwJTNEJTIwJTIybG93cmVzJTJDJTIwY3JvcHBlZCUyQyUyMHdvcnN0JTIwcXVhbGl0eSUyQyUyMGxvdyUyMHF1YWxpdHklMkMlMjBub3JtYWwlMjBxdWFsaXR5JTJDJTIwYXJ0aWZhY3RzJTJDJTIwc2lnbmF0dXJlJTJDJTIwd2F0ZXJtYXJrJTJDJTIwdXNlcm5hbWUlMkMlMjBibHVycnklMkMlMjBtb3JlJTIwdGhhbiUyMG9uZSUyMGJyaWRnZSUyQyUyMGJhZCUyMGFyY2hpdGVjdHVyZSUyMiUwQSUwQWltYWdlcyUyMCUzRCUyMHBpcGVsaW5lKCUwQSUyMCUyMCUyMCUyMHByb21wdCUzRHByb21wdCUyQyUwQSUyMCUyMCUyMCUyMG5lZ2F0aXZlX3Byb21wdCUzRG5lZ2F0aXZlX3Byb21wdCUyQyUwQSUyMCUyMCUyMCUyMHdpZHRoJTNENTEyJTJDJTBBJTIwJTIwJTIwJTIwaGVpZ2h0JTNENTEyJTJDJTBBJTIwJTIwJTIwJTIwbnVtX2luZmVyZW5jZV9zdGVwcyUzRDI1JTJDJTBBJTIwJTIwJTIwJTIwbnVtX2ltYWdlc19wZXJfcHJvbXB0JTNENCUyQyUwQSUyMCUyMCUyMCUyMGdlbmVyYXRvciUzRHRvcmNoLm1hbnVhbF9zZWVkKDApJTJDJTBBKS5pbWFnZXM=",highlighted:`prompt = <span class="hljs-string">"masterpiece, illustration, ultra-detailed, cityscape, san francisco, golden gate bridge, california, bay area, in the snow, beautiful detailed starry sky"</span> | |
| negative_prompt = <span class="hljs-string">"lowres, cropped, worst quality, low quality, normal quality, artifacts, signature, watermark, username, blurry, more than one bridge, bad architecture"</span> | |
| images = pipeline( | |
| prompt=prompt, | |
| negative_prompt=negative_prompt, | |
| width=<span class="hljs-number">512</span>, | |
| height=<span class="hljs-number">512</span>, | |
| num_inference_steps=<span class="hljs-number">25</span>, | |
| num_images_per_prompt=<span class="hljs-number">4</span>, | |
| generator=torch.manual_seed(<span class="hljs-number">0</span>), | |
| ).images`,lang:"py",wrap:!1});var U=l(w,4);a(U,{code:"ZnJvbSUyMFBJTCUyMGltcG9ydCUyMEltYWdlJTBBJTBBJTBBZGVmJTIwaW1hZ2VfZ3JpZChpbWdzJTJDJTIwcm93cyUzRDIlMkMlMjBjb2xzJTNEMiklM0ElMEElMjAlMjAlMjAlMjB3JTJDJTIwaCUyMCUzRCUyMGltZ3MlNUIwJTVELnNpemUlMEElMjAlMjAlMjAlMjBncmlkJTIwJTNEJTIwSW1hZ2UubmV3KCUyMlJHQiUyMiUyQyUyMHNpemUlM0QoY29scyUyMColMjB3JTJDJTIwcm93cyUyMColMjBoKSklMEElMEElMjAlMjAlMjAlMjBmb3IlMjBpJTJDJTIwaW1nJTIwaW4lMjBlbnVtZXJhdGUoaW1ncyklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBncmlkLnBhc3RlKGltZyUyQyUyMGJveCUzRChpJTIwJTI1JTIwY29scyUyMColMjB3JTJDJTIwaSUyMCUyRiUyRiUyMGNvbHMlMjAqJTIwaCkpJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwZ3JpZCUwQSUwQSUwQWltYWdlX2dyaWQoaW1hZ2VzKQ==",highlighted:`<span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">image_grid</span>(<span class="hljs-params">imgs, rows=<span class="hljs-number">2</span>, cols=<span class="hljs-number">2</span></span>): | |
| w, h = imgs[<span class="hljs-number">0</span>].size | |
| grid = Image.new(<span class="hljs-string">"RGB"</span>, size=(cols * w, rows * h)) | |
| <span class="hljs-keyword">for</span> i, img <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(imgs): | |
| grid.paste(img, box=(i % cols * w, i // cols * h)) | |
| <span class="hljs-keyword">return</span> grid | |
| image_grid(images)`,lang:"py",wrap:!1});var B=l(U,4);_(B,{source:"https://github.com/huggingface/diffusers/blob/main/docs/source/ko/using-diffusers/other-formats.md"}),N(2),G(k,e),S()}export{F as component}; | |
Xet Storage Details
- Size:
- 19.1 kB
- Xet hash:
- 096f7055548210351bada1f92e54e1cdcd7fd809991d80bd710b577287a52a6f
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.