Buckets:
| <meta charset="utf-8" /><meta name="hf:doc:metadata" content="{"title":"Building Custom Blocks","local":"building-custom-blocks","sections":[{"title":"Project Structure","local":"project-structure","sections":[],"depth":2},{"title":"Example: Florence 2 Inpainting Block","local":"example-florence-2-inpainting-block","sections":[],"depth":2},{"title":"Using Custom Blocks","local":"using-custom-blocks","sections":[],"depth":2},{"title":"Editing Custom Blocks","local":"editing-custom-blocks","sections":[],"depth":2}],"depth":1}"> | |
| <link href="/docs/diffusers/pr_12448/en/_app/immutable/assets/0.e3b0c442.css" rel="modulepreload"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/entry/start.77018737.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/scheduler.53228c21.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/singletons.5ccd8670.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/index.e93d0901.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/paths.e3119367.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/entry/app.30e12370.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/preload-helper.7a497b25.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/index.100fac89.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/nodes/0.62116836.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/each.e59479a4.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/nodes/264.a4e37f80.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/CopyLLMTxtMenu.88008e00.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/globals.7f7f1b26.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/IconCopy.38cf8f56.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/MermaidChart.svelte_svelte_type_style_lang.afa087fa.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/CodeBlock.d30a6509.js"> | |
| <link rel="modulepreload" href="/docs/diffusers/pr_12448/en/_app/immutable/chunks/HfOption.fad27e59.js"><!-- HEAD_svelte-u9bgzb_START --><meta name="hf:doc:metadata" content="{"title":"Building Custom Blocks","local":"building-custom-blocks","sections":[{"title":"Project Structure","local":"project-structure","sections":[],"depth":2},{"title":"Example: Florence 2 Inpainting Block","local":"example-florence-2-inpainting-block","sections":[],"depth":2},{"title":"Using Custom Blocks","local":"using-custom-blocks","sections":[],"depth":2},{"title":"Editing Custom Blocks","local":"editing-custom-blocks","sections":[],"depth":2}],"depth":1}"><!-- HEAD_svelte-u9bgzb_END --> <p></p> <div class="items-center shrink-0 min-w-[100px] max-sm:min-w-[50px] justify-end ml-auto flex" style="float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"><div class="inline-flex rounded-md max-sm:rounded-sm"><button class="inline-flex items-center gap-1 max-sm:gap-0.5 h-6 max-sm:h-5 px-2 max-sm:px-1.5 text-[11px] max-sm:text-[9px] font-medium text-gray-800 border border-r-0 rounded-l-md max-sm:rounded-l-sm border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-live="polite"><span class="inline-flex items-center justify-center rounded-md p-0.5 max-sm:p-0"><svg class="w-3 h-3 max-sm:w-2.5 max-sm:h-2.5" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg></span> <span>Copy page</span></button> <button class="inline-flex items-center justify-center w-6 max-sm:w-5 h-6 max-sm:h-5 disabled:pointer-events-none text-sm text-gray-500 hover:text-gray-700 dark:hover:text-white rounded-r-md max-sm:rounded-r-sm border border-l transition border-gray-200 bg-white hover:shadow-inner dark:border-gray-850 dark:bg-gray-950 dark:text-gray-200 dark:hover:bg-gray-800" aria-haspopup="menu" aria-expanded="false" aria-label="Open copy menu"><svg class="transition-transform text-gray-400 overflow-visible w-3 h-3 max-sm:w-2.5 max-sm:h-2.5 rotate-0" width="1em" height="1em" viewBox="0 0 12 7" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 1L6 6L11 1" stroke="currentColor"></path></svg></button></div> </div> <h1 class="relative group"><a id="building-custom-blocks" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#building-custom-blocks"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Building Custom Blocks</span></h1> <p data-svelte-h="svelte-1agilxu"><a href="./pipeline_block">ModularPipelineBlocks</a> are the fundamental building blocks of a <a href="/docs/diffusers/pr_12448/en/api/modular_diffusers/pipeline#diffusers.ModularPipeline">ModularPipeline</a>. You can create custom blocks by defining their inputs, outputs, and computation logic. This guide demonstrates how to create and use a custom block.</p> <blockquote class="tip" data-svelte-h="svelte-4vw3mg"><p>Explore the <a href="https://huggingface.co/collections/diffusers/modular-diffusers-custom-blocks" rel="nofollow">Modular Diffusers Custom Blocks</a> collection for official custom modular blocks like Nano Banana.</p></blockquote> <h2 class="relative group"><a id="project-structure" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#project-structure"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Project Structure</span></h2> <p data-svelte-h="svelte-vxw3lv">Your custom block project should use the following structure:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->. | |
| ├── block.py | |
| └── modular_config.json<!-- HTML_TAG_END --></pre></div> <ul data-svelte-h="svelte-lnhirc"><li><code>block.py</code> contains the custom block implementation</li> <li><code>modular_config.json</code> contains the metadata needed to load the block</li></ul> <h2 class="relative group"><a id="example-florence-2-inpainting-block" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#example-florence-2-inpainting-block"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Example: Florence 2 Inpainting Block</span></h2> <p data-svelte-h="svelte-1slfrb7">In this example we will create a custom block that uses the <a href="https://huggingface.co/docs/transformers/model_doc/florence2" rel="nofollow">Florence 2</a> model to process an input image and generate a mask for inpainting.</p> <p data-svelte-h="svelte-1by29uj">The first step is to define the components that the block will use. In this case, we will need to use the <code>Florence2ForConditionalGeneration</code> model and its corresponding processor <code>AutoProcessor</code>. When defining components, we must specify the name of the component within our pipeline, model class via <code>type_hint</code>, and provide a <code>pretrained_model_name_or_path</code> for the component if we intend to load the model weights from a specific repository on the Hub.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-comment"># Inside block.py</span> | |
| <span class="hljs-keyword">from</span> diffusers.modular_pipelines <span class="hljs-keyword">import</span> ( | |
| ModularPipelineBlocks, | |
| ComponentSpec, | |
| ) | |
| <span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoProcessor, Florence2ForConditionalGeneration | |
| <span class="hljs-keyword">class</span> <span class="hljs-title class_">Florence2ImageAnnotatorBlock</span>(<span class="hljs-title class_ inherited__">ModularPipelineBlocks</span>): | |
| <span class="hljs-meta"> @property</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">expected_components</span>(<span class="hljs-params">self</span>): | |
| <span class="hljs-keyword">return</span> [ | |
| ComponentSpec( | |
| name=<span class="hljs-string">"image_annotator"</span>, | |
| type_hint=Florence2ForConditionalGeneration, | |
| pretrained_model_name_or_path=<span class="hljs-string">"florence-community/Florence-2-base-ft"</span>, | |
| ), | |
| ComponentSpec( | |
| name=<span class="hljs-string">"image_annotator_processor"</span>, | |
| type_hint=AutoProcessor, | |
| pretrained_model_name_or_path=<span class="hljs-string">"florence-community/Florence-2-base-ft"</span>, | |
| ), | |
| ]<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-1omm6lj">Next, we define the inputs and outputs of the block. The inputs include the image to be annotated, the annotation task, and the annotation prompt. The outputs include the generated mask image and annotations.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">from</span> typing <span class="hljs-keyword">import</span> <span class="hljs-type">List</span>, <span class="hljs-type">Union</span> | |
| <span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image, ImageDraw | |
| <span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">from</span> diffusers.modular_pipelines <span class="hljs-keyword">import</span> ( | |
| PipelineState, | |
| ModularPipelineBlocks, | |
| InputParam, | |
| ComponentSpec, | |
| OutputParam, | |
| ) | |
| <span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoProcessor, Florence2ForConditionalGeneration | |
| <span class="hljs-keyword">class</span> <span class="hljs-title class_">Florence2ImageAnnotatorBlock</span>(<span class="hljs-title class_ inherited__">ModularPipelineBlocks</span>): | |
| <span class="hljs-meta"> @property</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">expected_components</span>(<span class="hljs-params">self</span>): | |
| <span class="hljs-keyword">return</span> [ | |
| ComponentSpec( | |
| name=<span class="hljs-string">"image_annotator"</span>, | |
| type_hint=Florence2ForConditionalGeneration, | |
| pretrained_model_name_or_path=<span class="hljs-string">"florence-community/Florence-2-base-ft"</span>, | |
| ), | |
| ComponentSpec( | |
| name=<span class="hljs-string">"image_annotator_processor"</span>, | |
| type_hint=AutoProcessor, | |
| pretrained_model_name_or_path=<span class="hljs-string">"florence-community/Florence-2-base-ft"</span>, | |
| ), | |
| ] | |
| <span class="hljs-meta"> @property</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">inputs</span>(<span class="hljs-params">self</span>) -> <span class="hljs-type">List</span>[InputParam]: | |
| <span class="hljs-keyword">return</span> [ | |
| InputParam( | |
| <span class="hljs-string">"image"</span>, | |
| type_hint=<span class="hljs-type">Union</span>[Image.Image, <span class="hljs-type">List</span>[Image.Image]], | |
| required=<span class="hljs-literal">True</span>, | |
| description=<span class="hljs-string">"Image(s) to annotate"</span>, | |
| ), | |
| InputParam( | |
| <span class="hljs-string">"annotation_task"</span>, | |
| type_hint=<span class="hljs-type">Union</span>[<span class="hljs-built_in">str</span>, <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]], | |
| required=<span class="hljs-literal">True</span>, | |
| default=<span class="hljs-string">"<REFERRING_EXPRESSION_SEGMENTATION>"</span>, | |
| description=<span class="hljs-string">"""Annotation Task to perform on the image. | |
| Supported Tasks: | |
| <OD> | |
| <REFERRING_EXPRESSION_SEGMENTATION> | |
| <CAPTION> | |
| <DETAILED_CAPTION> | |
| <MORE_DETAILED_CAPTION> | |
| <DENSE_REGION_CAPTION> | |
| <CAPTION_TO_PHRASE_GROUNDING> | |
| <OPEN_VOCABULARY_DETECTION> | |
| """</span>, | |
| ), | |
| InputParam( | |
| <span class="hljs-string">"annotation_prompt"</span>, | |
| type_hint=<span class="hljs-type">Union</span>[<span class="hljs-built_in">str</span>, <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]], | |
| required=<span class="hljs-literal">True</span>, | |
| description=<span class="hljs-string">"""Annotation Prompt to provide more context to the task. | |
| Can be used to detect or segment out specific elements in the image | |
| """</span>, | |
| ), | |
| InputParam( | |
| <span class="hljs-string">"annotation_output_type"</span>, | |
| type_hint=<span class="hljs-built_in">str</span>, | |
| required=<span class="hljs-literal">True</span>, | |
| default=<span class="hljs-string">"mask_image"</span>, | |
| description=<span class="hljs-string">"""Output type from annotation predictions. Available options are | |
| mask_image: | |
| -black and white mask image for the given image based on the task type | |
| mask_overlay: | |
| - mask overlayed on the original image | |
| bounding_box: | |
| - bounding boxes drawn on the original image | |
| """</span>, | |
| ), | |
| InputParam( | |
| <span class="hljs-string">"annotation_overlay"</span>, | |
| type_hint=<span class="hljs-built_in">bool</span>, | |
| required=<span class="hljs-literal">True</span>, | |
| default=<span class="hljs-literal">False</span>, | |
| description=<span class="hljs-string">""</span>, | |
| ), | |
| ] | |
| <span class="hljs-meta"> @property</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">intermediate_outputs</span>(<span class="hljs-params">self</span>) -> <span class="hljs-type">List</span>[OutputParam]: | |
| <span class="hljs-keyword">return</span> [ | |
| OutputParam( | |
| <span class="hljs-string">"mask_image"</span>, | |
| type_hint=Image, | |
| description=<span class="hljs-string">"Inpainting Mask for input Image(s)"</span>, | |
| ), | |
| OutputParam( | |
| <span class="hljs-string">"annotations"</span>, | |
| type_hint=<span class="hljs-built_in">dict</span>, | |
| description=<span class="hljs-string">"Annotations Predictions for input Image(s)"</span>, | |
| ), | |
| OutputParam( | |
| <span class="hljs-string">"image"</span>, | |
| type_hint=Image, | |
| description=<span class="hljs-string">"Annotated input Image(s)"</span>, | |
| ), | |
| ] | |
| <!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-131wlzd">Now we implement the <code>__call__</code> method, which contains the logic for processing the input image and generating the mask.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">from</span> typing <span class="hljs-keyword">import</span> <span class="hljs-type">List</span>, <span class="hljs-type">Union</span> | |
| <span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image, ImageDraw | |
| <span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np | |
| <span class="hljs-keyword">from</span> diffusers.modular_pipelines <span class="hljs-keyword">import</span> ( | |
| PipelineState, | |
| ModularPipelineBlocks, | |
| InputParam, | |
| ComponentSpec, | |
| OutputParam, | |
| ) | |
| <span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoProcessor, Florence2ForConditionalGeneration | |
| <span class="hljs-keyword">class</span> <span class="hljs-title class_">Florence2ImageAnnotatorBlock</span>(<span class="hljs-title class_ inherited__">ModularPipelineBlocks</span>): | |
| <span class="hljs-meta"> @property</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">expected_components</span>(<span class="hljs-params">self</span>): | |
| <span class="hljs-keyword">return</span> [ | |
| ComponentSpec( | |
| name=<span class="hljs-string">"image_annotator"</span>, | |
| type_hint=Florence2ForConditionalGeneration, | |
| pretrained_model_name_or_path=<span class="hljs-string">"florence-community/Florence-2-base-ft"</span>, | |
| ), | |
| ComponentSpec( | |
| name=<span class="hljs-string">"image_annotator_processor"</span>, | |
| type_hint=AutoProcessor, | |
| pretrained_model_name_or_path=<span class="hljs-string">"florence-community/Florence-2-base-ft"</span>, | |
| ), | |
| ] | |
| <span class="hljs-meta"> @property</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">inputs</span>(<span class="hljs-params">self</span>) -> <span class="hljs-type">List</span>[InputParam]: | |
| <span class="hljs-keyword">return</span> [ | |
| InputParam( | |
| <span class="hljs-string">"image"</span>, | |
| type_hint=<span class="hljs-type">Union</span>[Image.Image, <span class="hljs-type">List</span>[Image.Image]], | |
| required=<span class="hljs-literal">True</span>, | |
| description=<span class="hljs-string">"Image(s) to annotate"</span>, | |
| ), | |
| InputParam( | |
| <span class="hljs-string">"annotation_task"</span>, | |
| type_hint=<span class="hljs-type">Union</span>[<span class="hljs-built_in">str</span>, <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]], | |
| required=<span class="hljs-literal">True</span>, | |
| default=<span class="hljs-string">"<REFERRING_EXPRESSION_SEGMENTATION>"</span>, | |
| description=<span class="hljs-string">"""Annotation Task to perform on the image. | |
| Supported Tasks: | |
| <OD> | |
| <REFERRING_EXPRESSION_SEGMENTATION> | |
| <CAPTION> | |
| <DETAILED_CAPTION> | |
| <MORE_DETAILED_CAPTION> | |
| <DENSE_REGION_CAPTION> | |
| <CAPTION_TO_PHRASE_GROUNDING> | |
| <OPEN_VOCABULARY_DETECTION> | |
| """</span>, | |
| ), | |
| InputParam( | |
| <span class="hljs-string">"annotation_prompt"</span>, | |
| type_hint=<span class="hljs-type">Union</span>[<span class="hljs-built_in">str</span>, <span class="hljs-type">List</span>[<span class="hljs-built_in">str</span>]], | |
| required=<span class="hljs-literal">True</span>, | |
| description=<span class="hljs-string">"""Annotation Prompt to provide more context to the task. | |
| Can be used to detect or segment out specific elements in the image | |
| """</span>, | |
| ), | |
| InputParam( | |
| <span class="hljs-string">"annotation_output_type"</span>, | |
| type_hint=<span class="hljs-built_in">str</span>, | |
| required=<span class="hljs-literal">True</span>, | |
| default=<span class="hljs-string">"mask_image"</span>, | |
| description=<span class="hljs-string">"""Output type from annotation predictions. Available options are | |
| mask_image: | |
| -black and white mask image for the given image based on the task type | |
| mask_overlay: | |
| - mask overlayed on the original image | |
| bounding_box: | |
| - bounding boxes drawn on the original image | |
| """</span>, | |
| ), | |
| InputParam( | |
| <span class="hljs-string">"annotation_overlay"</span>, | |
| type_hint=<span class="hljs-built_in">bool</span>, | |
| required=<span class="hljs-literal">True</span>, | |
| default=<span class="hljs-literal">False</span>, | |
| description=<span class="hljs-string">""</span>, | |
| ), | |
| ] | |
| <span class="hljs-meta"> @property</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">intermediate_outputs</span>(<span class="hljs-params">self</span>) -> <span class="hljs-type">List</span>[OutputParam]: | |
| <span class="hljs-keyword">return</span> [ | |
| OutputParam( | |
| <span class="hljs-string">"mask_image"</span>, | |
| type_hint=Image, | |
| description=<span class="hljs-string">"Inpainting Mask for input Image(s)"</span>, | |
| ), | |
| OutputParam( | |
| <span class="hljs-string">"annotations"</span>, | |
| type_hint=<span class="hljs-built_in">dict</span>, | |
| description=<span class="hljs-string">"Annotations Predictions for input Image(s)"</span>, | |
| ), | |
| OutputParam( | |
| <span class="hljs-string">"image"</span>, | |
| type_hint=Image, | |
| description=<span class="hljs-string">"Annotated input Image(s)"</span>, | |
| ), | |
| ] | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">get_annotations</span>(<span class="hljs-params">self, components, images, prompts, task</span>): | |
| task_prompts = [task + prompt <span class="hljs-keyword">for</span> prompt <span class="hljs-keyword">in</span> prompts] | |
| inputs = components.image_annotator_processor( | |
| text=task_prompts, images=images, return_tensors=<span class="hljs-string">"pt"</span> | |
| ).to(components.image_annotator.device, components.image_annotator.dtype) | |
| generated_ids = components.image_annotator.generate( | |
| input_ids=inputs[<span class="hljs-string">"input_ids"</span>], | |
| pixel_values=inputs[<span class="hljs-string">"pixel_values"</span>], | |
| max_new_tokens=<span class="hljs-number">1024</span>, | |
| early_stopping=<span class="hljs-literal">False</span>, | |
| do_sample=<span class="hljs-literal">False</span>, | |
| num_beams=<span class="hljs-number">3</span>, | |
| ) | |
| annotations = components.image_annotator_processor.batch_decode( | |
| generated_ids, skip_special_tokens=<span class="hljs-literal">False</span> | |
| ) | |
| outputs = [] | |
| <span class="hljs-keyword">for</span> image, annotation <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(images, annotations): | |
| outputs.append( | |
| components.image_annotator_processor.post_process_generation( | |
| annotation, task=task, image_size=(image.width, image.height) | |
| ) | |
| ) | |
| <span class="hljs-keyword">return</span> outputs | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">prepare_mask</span>(<span class="hljs-params">self, images, annotations, overlay=<span class="hljs-literal">False</span>, fill=<span class="hljs-string">"white"</span></span>): | |
| masks = [] | |
| <span class="hljs-keyword">for</span> image, annotation <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(images, annotations): | |
| mask_image = image.copy() <span class="hljs-keyword">if</span> overlay <span class="hljs-keyword">else</span> Image.new(<span class="hljs-string">"L"</span>, image.size, <span class="hljs-number">0</span>) | |
| draw = ImageDraw.Draw(mask_image) | |
| <span class="hljs-keyword">for</span> _, _annotation <span class="hljs-keyword">in</span> annotation.items(): | |
| <span class="hljs-keyword">if</span> <span class="hljs-string">"polygons"</span> <span class="hljs-keyword">in</span> _annotation: | |
| <span class="hljs-keyword">for</span> polygon <span class="hljs-keyword">in</span> _annotation[<span class="hljs-string">"polygons"</span>]: | |
| polygon = np.array(polygon).reshape(-<span class="hljs-number">1</span>, <span class="hljs-number">2</span>) | |
| <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(polygon) < <span class="hljs-number">3</span>: | |
| <span class="hljs-keyword">continue</span> | |
| polygon = polygon.reshape(-<span class="hljs-number">1</span>).tolist() | |
| draw.polygon(polygon, fill=fill) | |
| <span class="hljs-keyword">elif</span> <span class="hljs-string">"bbox"</span> <span class="hljs-keyword">in</span> _annotation: | |
| bbox = _annotation[<span class="hljs-string">"bbox"</span>] | |
| draw.rectangle(bbox, fill=<span class="hljs-string">"white"</span>) | |
| masks.append(mask_image) | |
| <span class="hljs-keyword">return</span> masks | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">prepare_bounding_boxes</span>(<span class="hljs-params">self, images, annotations</span>): | |
| outputs = [] | |
| <span class="hljs-keyword">for</span> image, annotation <span class="hljs-keyword">in</span> <span class="hljs-built_in">zip</span>(images, annotations): | |
| image_copy = image.copy() | |
| draw = ImageDraw.Draw(image_copy) | |
| <span class="hljs-keyword">for</span> _, _annotation <span class="hljs-keyword">in</span> annotation.items(): | |
| bbox = _annotation[<span class="hljs-string">"bbox"</span>] | |
| label = _annotation[<span class="hljs-string">"label"</span>] | |
| draw.rectangle(bbox, outline=<span class="hljs-string">"red"</span>, width=<span class="hljs-number">3</span>) | |
| draw.text((bbox[<span class="hljs-number">0</span>], bbox[<span class="hljs-number">1</span>] - <span class="hljs-number">20</span>), label, fill=<span class="hljs-string">"red"</span>) | |
| outputs.append(image_copy) | |
| <span class="hljs-keyword">return</span> outputs | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">prepare_inputs</span>(<span class="hljs-params">self, images, prompts</span>): | |
| prompts = prompts <span class="hljs-keyword">or</span> <span class="hljs-string">""</span> | |
| <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(images, Image.Image): | |
| images = [images] | |
| <span class="hljs-keyword">if</span> <span class="hljs-built_in">isinstance</span>(prompts, <span class="hljs-built_in">str</span>): | |
| prompts = [prompts] | |
| <span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(images) != <span class="hljs-built_in">len</span>(prompts): | |
| <span class="hljs-keyword">raise</span> ValueError(<span class="hljs-string">"Number of images and annotation prompts must match."</span>) | |
| <span class="hljs-keyword">return</span> images, prompts | |
| <span class="hljs-meta"> @torch.no_grad()</span> | |
| <span class="hljs-keyword">def</span> <span class="hljs-title function_">__call__</span>(<span class="hljs-params">self, components, state: PipelineState</span>) -> PipelineState: | |
| block_state = self.get_block_state(state) | |
| images, annotation_task_prompt = self.prepare_inputs( | |
| block_state.image, block_state.annotation_prompt | |
| ) | |
| task = block_state.annotation_task | |
| fill = block_state.fill | |
| annotations = self.get_annotations( | |
| components, images, annotation_task_prompt, task | |
| ) | |
| block_state.annotations = annotations | |
| <span class="hljs-keyword">if</span> block_state.annotation_output_type == <span class="hljs-string">"mask_image"</span>: | |
| block_state.mask_image = self.prepare_mask(images, annotations) | |
| <span class="hljs-keyword">else</span>: | |
| block_state.mask_image = <span class="hljs-literal">None</span> | |
| <span class="hljs-keyword">if</span> block_state.annotation_output_type == <span class="hljs-string">"mask_overlay"</span>: | |
| block_state.image = self.prepare_mask(images, annotations, overlay=<span class="hljs-literal">True</span>, fill=fill) | |
| <span class="hljs-keyword">elif</span> block_state.annotation_output_type == <span class="hljs-string">"bounding_box"</span>: | |
| block_state.image = self.prepare_bounding_boxes(images, annotations) | |
| self.set_block_state(state, block_state) | |
| <span class="hljs-keyword">return</span> components, state | |
| <!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-vykhta">Once we have defined our custom block, we can save it to the Hub, using either the CLI or the <code>push_to_hub</code> method. This will make it easy to share and reuse our custom block with other pipelines.</p> <div class="flex space-x-2 items-center my-1.5 mr-8 h-7 !pl-0 -mx-3 md:mx-0"><div class="flex items-center border rounded-lg px-1.5 py-1 leading-none select-none text-smd border-gray-800 bg-black dark:bg-gray-700 text-white">hf CLI </div><div class="flex items-center border rounded-lg px-1.5 py-1 leading-none select-none text-smd text-gray-500 cursor-pointer opacity-90 hover:text-gray-700 dark:hover:text-gray-200 hover:shadow-sm">push_to_hub </div></div> <div class="language-select"><div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-meta prompt_"># </span><span class="language-bash">In the folder with the `block.py` file, run:</span> | |
| diffusers-cli custom_block<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-itpmab">Then upload the block to the Hub:</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START -->hf upload <your repo id> . .<!-- HTML_TAG_END --></pre></div> </div> <h2 class="relative group"><a id="using-custom-blocks" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#using-custom-blocks"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Using Custom Blocks</span></h2> <p data-svelte-h="svelte-n2ss7u">Load the custom block with <code>from_pretrained()</code> and set <code>trust_remote_code=True</code>.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> diffusers.modular_pipelines <span class="hljs-keyword">import</span> ModularPipelineBlocks, SequentialPipelineBlocks | |
| <span class="hljs-keyword">from</span> diffusers.modular_pipelines.stable_diffusion_xl <span class="hljs-keyword">import</span> INPAINT_BLOCKS | |
| <span class="hljs-keyword">from</span> diffusers.utils <span class="hljs-keyword">import</span> load_image | |
| <span class="hljs-comment"># Fetch the Florence2 image annotator block that will create our mask</span> | |
| image_annotator_block = ModularPipelineBlocks.from_pretrained(<span class="hljs-string">"diffusers/florence-2-custom-block"</span>, trust_remote_code=<span class="hljs-literal">True</span>) | |
| my_blocks = INPAINT_BLOCKS.copy() | |
| <span class="hljs-comment"># insert the annotation block before the image encoding step</span> | |
| my_blocks.insert(<span class="hljs-string">"image_annotator"</span>, image_annotator_block, <span class="hljs-number">1</span>) | |
| <span class="hljs-comment"># Create our initial set of inpainting blocks</span> | |
| blocks = SequentialPipelineBlocks.from_blocks_dict(my_blocks) | |
| repo_id = <span class="hljs-string">"diffusers/modular-stable-diffusion-xl-base-1.0"</span> | |
| pipe = blocks.init_pipeline(repo_id) | |
| pipe.load_components(torch_dtype=torch.float16, device_map=<span class="hljs-string">"cuda"</span>, trust_remote_code=<span class="hljs-literal">True</span>) | |
| image = load_image(<span class="hljs-string">"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/car.jpg?download=true"</span>) | |
| image = image.resize((<span class="hljs-number">1024</span>, <span class="hljs-number">1024</span>)) | |
| prompt = [<span class="hljs-string">"A red car"</span>] | |
| annotation_task = <span class="hljs-string">"<REFERRING_EXPRESSION_SEGMENTATION>"</span> | |
| annotation_prompt = [<span class="hljs-string">"the car"</span>] | |
| output = pipe( | |
| prompt=prompt, | |
| image=image, | |
| annotation_task=annotation_task, | |
| annotation_prompt=annotation_prompt, | |
| annotation_output_type=<span class="hljs-string">"mask_image"</span>, | |
| num_inference_steps=<span class="hljs-number">35</span>, | |
| guidance_scale=<span class="hljs-number">7.5</span>, | |
| strength=<span class="hljs-number">0.95</span>, | |
| output=<span class="hljs-string">"images"</span> | |
| ) | |
| output[<span class="hljs-number">0</span>].save(<span class="hljs-string">"florence-inpainting.png"</span>)<!-- HTML_TAG_END --></pre></div> <h2 class="relative group"><a id="editing-custom-blocks" class="header-link block pr-1.5 text-lg no-hover:hidden with-hover:absolute with-hover:p-1.5 with-hover:opacity-0 with-hover:group-hover:opacity-100 with-hover:right-full" href="#editing-custom-blocks"><span><svg class="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path d="M167.594 88.393a8.001 8.001 0 0 1 0 11.314l-67.882 67.882a8 8 0 1 1-11.314-11.315l67.882-67.881a8.003 8.003 0 0 1 11.314 0zm-28.287 84.86l-28.284 28.284a40 40 0 0 1-56.567-56.567l28.284-28.284a8 8 0 0 0-11.315-11.315l-28.284 28.284a56 56 0 0 0 79.196 79.197l28.285-28.285a8 8 0 1 0-11.315-11.314zM212.852 43.14a56.002 56.002 0 0 0-79.196 0l-28.284 28.284a8 8 0 1 0 11.314 11.314l28.284-28.284a40 40 0 0 1 56.568 56.567l-28.285 28.285a8 8 0 0 0 11.315 11.314l28.284-28.284a56.065 56.065 0 0 0 0-79.196z" fill="currentColor"></path></svg></span></a> <span>Editing Custom Blocks</span></h2> <p data-svelte-h="svelte-1bfjoip">By default, custom blocks are saved in your cache directory. Use the <code>local_dir</code> argument to download and edit a custom block in a specific folder.</p> <div class="code-block relative "><div class="absolute top-2.5 right-4"><button class="inline-flex items-center relative text-sm focus:text-green-500 cursor-pointer focus:outline-none transition duration-200 ease-in-out opacity-0 mx-0.5 text-gray-600 " title="code excerpt" type="button"><svg class="" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z" transform="translate(0)"></path><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z" transform="translate(0)"></path><rect fill="none" width="32" height="32"></rect></svg> <div class="absolute pointer-events-none transition-opacity bg-black text-white py-1 px-2 leading-tight rounded font-normal shadow left-1/2 top-full transform -translate-x-1/2 translate-y-2 opacity-0"><div class="absolute bottom-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-black border-4 border-t-0" style="border-left-color: transparent; border-right-color: transparent; "></div> Copied</div></button></div> <pre class=""><!-- HTML_TAG_START --><span class="hljs-keyword">import</span> torch | |
| <span class="hljs-keyword">from</span> diffusers.modular_pipelines <span class="hljs-keyword">import</span> ModularPipelineBlocks, SequentialPipelineBlocks | |
| <span class="hljs-keyword">from</span> diffusers.modular_pipelines.stable_diffusion_xl <span class="hljs-keyword">import</span> INPAINT_BLOCKS | |
| <span class="hljs-keyword">from</span> diffusers.utils <span class="hljs-keyword">import</span> load_image | |
| <span class="hljs-comment"># Fetch the Florence2 image annotator block that will create our mask</span> | |
| image_annotator_block = ModularPipelineBlocks.from_pretrained(<span class="hljs-string">"diffusers/florence-2-custom-block"</span>, trust_remote_code=<span class="hljs-literal">True</span>, local_dir=<span class="hljs-string">"/my-local-folder"</span>)<!-- HTML_TAG_END --></pre></div> <p data-svelte-h="svelte-fe2x3t">Any changes made to the block files in this folder will be reflected when you load the block again.</p> <a class="!text-gray-400 !no-underline text-sm flex items-center not-prose mt-4" href="https://github.com/huggingface/diffusers/blob/main/docs/source/en/modular_diffusers/custom_blocks.md" target="_blank"><svg class="mr-1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" fill="currentColor" focusable="false" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 32 32"><path d="M31,16l-7,7l-1.41-1.41L28.17,16l-5.58-5.59L24,9l7,7z"></path><path d="M1,16l7-7l1.41,1.41L3.83,16l5.58,5.59L8,23l-7-7z"></path><path d="M12.419,25.484L17.639,6.552l1.932,0.518L14.351,26.002z"></path></svg> <span data-svelte-h="svelte-zjs2n5"><span class="underline">Update</span> on GitHub</span></a> <p></p> | |
| <script> | |
| { | |
| __sveltekit_n9i9q2 = { | |
| assets: "/docs/diffusers/pr_12448/en", | |
| base: "/docs/diffusers/pr_12448/en", | |
| env: {} | |
| }; | |
| const element = document.currentScript.parentElement; | |
| const data = [null,null]; | |
| Promise.all([ | |
| import("/docs/diffusers/pr_12448/en/_app/immutable/entry/start.77018737.js"), | |
| import("/docs/diffusers/pr_12448/en/_app/immutable/entry/app.30e12370.js") | |
| ]).then(([kit, app]) => { | |
| kit.start(app, element, { | |
| node_ids: [0, 264], | |
| data, | |
| form: null, | |
| error: null | |
| }); | |
| }); | |
| } | |
| </script> | |
Xet Storage Details
- Size:
- 51.2 kB
- Xet hash:
- 13a4d9745887e693da4ebbcf530c00e8e98998c14576b56220cbe6e379499f3b
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.