diff --git a/README.md b/README.md index cf14c46..5762f21 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,40 @@ Available commands: | --port | Port for flask web server | 8080 | | --debug | Enable debug mode for flask web server | | +## Settings + +You can change the configs of inpainting process in the settings interface of the web page. + + + +### Inpainting Model + +Select the inpainting model to use, and set the configs corresponding to the model. + +LaMa model has no configs that can be specified at runtime. + +LDM model has two configs to control the quality of final result: +1. Steps: You can get better result with large steps, but it will be more time-consuming +2. Sampler: ddim or [plms](https://arxiv.org/abs/2202.09778). In general plms can get better results with fewer steps + + +### High Resolution Strategy + +There are three strategies for handling high-resolution images. + +- **Original**: Use the original resolution of the picture, suitable for picture size below 2K. +- **Resize**: Resize the longer side of the image to a specific size(keep ratio), then do inpainting on the resized image. +The inpainting result will be pasted back on the original image to make sure other part of image not loss quality. +- **Crop**: Crop masking area from the original image to do inpainting, and paste the result back. +Mainly for performance and memory reasons on high resolution image. This strategy may give better results for ldm model. + + ## Model Comparison -Diffusion model(ldm) is **MUCH MORE** slower than GANs(lama)(1080x720 image takes 8s on 3090), but it's possible to get better -result, see below example: +| Model | Pron | Corn | +|-------|-----------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| +| LaMa | - Perform will on high resolution image(~2k)
- Faster than diffusion model | | +| LDM | - It's possible to get better and more detail result, see example below
- The balance of time and quality can be achieved by steps | - Slower than GAN model
- Need more GPU memory
- Not good for high resolution images | | Original Image | LaMa | LDM | | ----------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | diff --git a/assets/settings.png b/assets/settings.png new file mode 100644 index 0000000..6ed3258 Binary files /dev/null and b/assets/settings.png differ diff --git a/lama_cleaner/app/build/asset-manifest.json b/lama_cleaner/app/build/asset-manifest.json index c01cc13..ad15f15 100644 --- a/lama_cleaner/app/build/asset-manifest.json +++ b/lama_cleaner/app/build/asset-manifest.json @@ -1,7 +1,7 @@ { "files": { - "main.css": "/static/css/main.d1028b29.chunk.css", - "main.js": "/static/js/main.2711860b.chunk.js", + "main.css": "/static/css/main.bdd774f1.chunk.css", + "main.js": "/static/js/main.9f4ed6dc.chunk.js", "runtime-main.js": "/static/js/runtime-main.5e86ac81.js", "static/js/2.1b1d3019.chunk.js": "/static/js/2.1b1d3019.chunk.js", "index.html": "/index.html", @@ -11,7 +11,7 @@ "entrypoints": [ "static/js/runtime-main.5e86ac81.js", "static/js/2.1b1d3019.chunk.js", - "static/css/main.d1028b29.chunk.css", - "static/js/main.2711860b.chunk.js" + "static/css/main.bdd774f1.chunk.css", + "static/js/main.9f4ed6dc.chunk.js" ] } \ No newline at end of file diff --git a/lama_cleaner/app/build/index.html b/lama_cleaner/app/build/index.html index 14a8333..1c69c5b 100644 --- a/lama_cleaner/app/build/index.html +++ b/lama_cleaner/app/build/index.html @@ -1 +1 @@ -lama-cleaner - Image inpainting powered by LaMa
\ No newline at end of file +lama-cleaner - Image inpainting powered by LaMa
\ No newline at end of file diff --git a/lama_cleaner/app/build/static/css/main.d1028b29.chunk.css b/lama_cleaner/app/build/static/css/main.bdd774f1.chunk.css similarity index 85% rename from lama_cleaner/app/build/static/css/main.d1028b29.chunk.css rename to lama_cleaner/app/build/static/css/main.bdd774f1.chunk.css index 1d231a0..bbc62d6 100644 --- a/lama_cleaner/app/build/static/css/main.d1028b29.chunk.css +++ b/lama_cleaner/app/build/static/css/main.bdd774f1.chunk.css @@ -1 +1 @@ -@font-face{font-family:"WorkSans";src:url(/static/media/WorkSans-Regular.bb287b89.ttf)}@font-face{font-family:"WorkSans-Semibold";src:url(/static/media/WorkSans-SemiBold.1e98db4e.ttf)}@font-face{font-family:"WorkSans-Bold";src:url(/static/media/WorkSans-Bold.2bea7a7f.ttf)}@font-face{font-family:"WorkSans-Black";src:url(/static/media/WorkSans-Black.67c2c5a1.ttf)}:root{--page-bg:#fff;--page-bg-light:hsla(0,0%,100%,0.5);--page-text-color:#040404;--link-color:#000;--border-color:#646478;--border-color-light:rgba(100,100,120,0.5);--tooltip-bg:#e6e6ea;--tooltip-text-color:#000;--error-color:#ef4444;--success-color:#10b981;--editor-toolkit-bg:hsla(0,0%,100%,0.5);--editor-options-bg:#e6e6ea;--editor-size-border-color:var(--border-color);--editor-toolkit-panel-border:0;--modal-bg:var(--page-bg);--modal-text-color:#000;--modal-hotkey-border-color:#000;--model-mask-bg:rgba(209,213,219,0.4);--text-color:#040404;--text-color-gray:#6b6f76;--btn-primary-bg:#d2d2dc;--btn-text-color:var(--text-color);--btn-text-hover-color:#040404;--btn-border-color:#646478;--btn-primary-hover-bg:var(--yellow-accent);--animation-pulsing-bg:hsla(0,0%,100%,0.5);--switch-root-background-color:#dfe1e4;--switch-thumb-color:var(--page-bg);--switch-thumb-checked-color:var(--page-bg)}:root,[data-theme=dark]{--yellow-accent:#fc0;--options-text-color:var(--page-text-color)}[data-theme=dark]{--page-bg:#040404;--page-bg-light:rgba(4,4,4,0.5333333333333333);--page-text-color:#f9f9f9;--link-color:var(--yellow-accent);--border-color:#646478;--border-color-light:#666;--tooltip-bg:#212121;--tooltip-text-color:#d2d2d2;--editor-toolkit-bg:rgba(0,0,0,0.5);--editor-options-bg:#212121;--editor-size-border-color:var(--yellow-accent);--editor-toolkit-panel-border:1px solid rgba(100,100,120,0.4);--modal-bg:var(--page-bg);--modal-text-color:var(--page-text-color);--modal-hotkey-border-color:var(--page-text-color);--model-mask-bg:rgba(76,76,87,0.4);--text-color:#fff;--text-color-gray:#8a8f98;--btn-primary-bg:#8c8cb4;--btn-text-color:var(--text-color);--btn-text-hover-color:var(--page-bg);--btn-border-color:var(--yellow-accent);--btn-primary-hover-bg:var(--yellow-accent);--animation-pulsing-bg:#f0f0ff;--switch-root-background-color:#3c3f44;--switch-thumb-color:#1f2023;--switch-thumb-checked-color:#fff}@-webkit-keyframes pulsing{0%{opacity:1}50%{opacity:.75;background-color:hsla(0,0%,100%,.5);background-color:var(--animation-pulsing-bg)}to{opacity:1}}@keyframes pulsing{0%{opacity:1}50%{opacity:.75;background-color:hsla(0,0%,100%,.5);background-color:var(--animation-pulsing-bg)}to{opacity:1}}@-webkit-keyframes opacityReveal{0%{opacity:0}to{opacity:1}}@keyframes opacityReveal{0%{opacity:0}to{opacity:1}}@-webkit-keyframes slideDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideIn{0%{-webkit-transform:translateX(calc(100% + 25px));transform:translateX(calc(100% + 25px))}to{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideIn{0%{-webkit-transform:translateX(calc(100% + 25px));transform:translateX(calc(100% + 25px))}to{-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.lama-cleaner{display:grid;grid-template-areas:"main-content";width:100vw;height:100vh;background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--page-text-color);transition-property:background-color,color;transition-duration:.2s;transition-timing-function:repeat(2,ease-out)}.editor-container{display:flex;width:100vw;height:100vh;justify-content:center;align-items:center}.react-transform-wrapper{display:grid!important;width:100%!important;height:100%!important}.editor-canvas-container{display:grid;grid-template-areas:"editor-content";grid-row-gap:1rem;row-gap:1rem}.editor-canvas{grid-area:editor-content;z-index:2}.original-image-container{grid-area:editor-content;pointer-events:none;display:grid;grid-template-areas:"original-image-content"}.original-image-container img{grid-area:original-image-content}.original-image-container .editor-slider{grid-area:original-image-content;height:100%;width:6px;justify-self:end;background-color:#fc0;background-color:var(--yellow-accent);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:2}.editor-canvas-loading{pointer-events:none;-webkit-animation:pulsing .75s infinite;animation:pulsing .75s infinite}.editor-toolkit-panel{position:fixed;bottom:.5rem;border-radius:3rem;padding:1rem 3rem;display:grid;grid-template-areas:"toolkit-size-selector toolkit-brush-slider toolkit-btns";grid-column-gap:2rem;-webkit-column-gap:2rem;column-gap:2rem;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background-color:hsla(0,0%,100%,.5);background-color:var(--page-bg-light);-webkit-animation:slideUp .2s ease-out;animation:slideUp .2s ease-out;border:0;border:var(--editor-toolkit-panel-border);box-shadow:0 0 0 1px rgba(0,0,0,.1019607843),0 3px 16px rgba(0,0,0,.0784313725),0 2px 6px 1px rgba(0,0,0,.0901960784)}@media screen and (max-width:767px){.editor-toolkit-panel{padding:1rem 2rem;grid-template-areas:"toolkit-size-selector toolkit-size-selector" "toolkit-brush-slider toolkit-brush-slider" "toolkit-btns toolkit-btns";grid-row-gap:2rem;row-gap:2rem;justify-items:center}}.editor-toolkit-panel .eyeicon-active{background-color:#fc0;background-color:var(--yellow-accent);color:#040404;color:var(--btn-text-hover-color)}.editor-brush-slider{grid-area:toolkit-brush-slider;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:grid;grid-template-columns:repeat(2,-webkit-max-content);grid-template-columns:repeat(2,max-content);height:-webkit-max-content;height:max-content;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem;align-items:center}.editor-brush-slider input[type=range]{-webkit-appearance:none;appearance:none;width:100%;cursor:pointer;background:transparent;border-color:transparent;color:transparent}.editor-brush-slider input[type=range]:focus{outline:none}.editor-brush-slider input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;height:1.2rem;width:1.2rem;border-radius:50%;border:1px solid #000;z-index:2;background:#fc0;background:var(--yellow-accent);margin-top:-.5rem}.editor-brush-slider input[type=range]::-webkit-slider-runnable-track{border-radius:2rem;height:.2rem;background:#d2d2dc;background:var(--btn-primary-bg)}.editor-brush-slider input[type=range]::-moz-range-track{border-radius:2rem;background:#d2d2dc;background:var(--btn-primary-bg)}.editor-brush-slider input[type=range]::-moz-range-progress{background:#fc0;background:var(--yellow-accent)}.editor-toolkit-btns{grid-area:toolkit-btns;display:grid;grid-auto-flow:column;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem}.brush-shape{position:absolute;border-radius:50%;background-color:rgba(255,204,0,.7333333333);border:1px solid #fc0;border:1px solid var(--yellow-accent);pointer-events:none}.landing-page{display:grid;place-self:center;justify-items:center;grid-row-gap:2rem;row-gap:2rem;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}@media screen and (max-width:767px){.landing-page{padding:1rem}}.landing-page h1{text-align:center;font-size:1.4rem}@media screen and (max-width:767px){.landing-page h1{font-size:1.2rem}}.landing-page a{color:#000;color:var(--link-color)}.landing-file-selector{display:grid}header{height:60px;padding:1rem 2rem;position:absolute;top:0;display:flex;justify-content:space-between;align-items:center;width:100%;z-index:20;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid rgba(100,100,120,.2);background-color:hsla(0,0%,100%,.5);background-color:var(--page-bg-light)}.shortcuts{z-index:1}.header-icons-wrapper{grid-gap:12px;gap:12px}.header-icons,.header-icons-wrapper{display:flex;justify-content:center;align-items:center;justify-self:end}.header-icons{grid-gap:6px;gap:6px}.theme-toggle-ui{z-index:10;transition:all .2s ease-in;-webkit-user-select:none;-ms-user-select:none;user-select:none}.theme-toggle-ui .theme-btn{display:flex;justify-content:center;align-items:center;cursor:pointer;outline:none}.theme-toggle-ui .theme-btn svg{width:22px;height:22px}.modal-shortcuts{grid-area:main-content;background-color:#fff;background-color:var(--modal-bg);color:#000;color:var(--modal-text-color);box-shadow:0 0 20px rgba(0,0,40,.2)}@media screen and (max-width:767px){.modal-shortcuts{display:grid;width:100%;height:auto;margin-top:-11rem;-webkit-animation:slideDown .2s ease-out;animation:slideDown .2s ease-out}}.shortcut-options{display:grid;grid-row-gap:1rem;row-gap:1rem}.shortcut-options .shortcut-option{display:grid;grid-template-columns:repeat(2,auto);grid-column-gap:6rem;-webkit-column-gap:6rem;column-gap:6rem;align-items:center}@media screen and (max-width:767px){.shortcut-options .shortcut-option{grid-template-columns:auto;grid-column-gap:0;-webkit-column-gap:0;column-gap:0;grid-row-gap:.6rem;row-gap:.6rem}}.shortcut-options .shortcut-key{justify-self:end;border:1px solid #000;border:1px solid var(--modal-hotkey-border-color);padding:.4rem;width:-webkit-max-content;width:max-content;border-radius:.2rem}@media screen and (max-width:767px){.shortcut-options .shortcut-key{padding:.2rem .4rem}}.shortcut-options .shortcut-description{justify-self:start;text-align:left}@media screen and (max-width:767px){.shortcut-options .shortcut-description{text-align:left;width:auto;justify-self:start}}.setting-block{display:flex;flex-direction:column}.setting-block .option-desc{color:#6b6f76;color:var(--text-color-gray);margin-top:12px;border:1px solid #646478;border:1px solid var(--border-color);border-radius:.3rem;padding:1rem}.setting-block .option-desc .sub-setting-block{margin-top:8px;color:#040404;color:var(--text-color)}.setting-block-content{display:flex;justify-content:space-between;align-items:center;grid-gap:12rem;gap:12rem}.setting-block-content-title{display:flex;flex-direction:column;justify-content:space-between}.setting-block-desc{font-size:1rem;margin-top:8px;color:#6b6f76;color:var(--text-color-gray)}.hd-setting-block .inline-tip{display:inline;cursor:pointer;color:#040404;color:var(--text-color)}.model-desc-link{color:#6b6f76;color:var(--text-color-gray);text-decoration:none}.modal-setting{grid-area:main-content;background-color:#fff;background-color:var(--modal-bg);color:#000;color:var(--modal-text-color);box-shadow:0 0 20px rgba(0,0,40,.2);width:700px}@media screen and (max-width:767px){.modal-setting{display:grid;width:100%;height:auto;margin-top:-11rem;-webkit-animation:slideDown .2s ease-out;animation:slideDown .2s ease-out}}.file-select-label{display:grid;cursor:pointer;border:2px dashed #646478;border:2px dashed var(--border-color);border-radius:.5rem;min-width:600px}@media screen and (max-width:767px){.file-select-label{min-width:300px}}.file-select-label .file-select-label-hover,.file-select-label:hover{color:#000;background-color:#fc0;background-color:var(--yellow-accent)}.file-select-container{display:grid;padding:4rem;width:100%;height:100%}.file-select-container input{display:none}.file-select-message{font-family:"WorkSans";text-align:center}.btn-primary{display:grid;grid-auto-flow:column;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem;color:#040404;color:var(--btn-text-color);font-family:"WorkSans",sans-serif;width:-webkit-max-content;width:max-content;padding:.5rem;place-items:center;border-radius:.5rem;z-index:1;cursor:pointer}.btn-primary:hover{background-color:#fc0;background-color:var(--btn-primary-hover-bg);color:#040404;color:var(--btn-text-hover-color)}.btn-primary svg{width:20px;height:auto}.btn-primary-disabled{pointer-events:none;opacity:.5}.modal-mask{position:fixed;z-index:9998;inset:0;background-color:rgba(209,213,219,.4);background-color:var(--model-mask-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@media(prefers-reduced-motion:no-preference){.modal-mask{-webkit-animation:opacityReveal .15s cubic-bezier(.16,1,.3,1) forwards;animation:opacityReveal .15s cubic-bezier(.16,1,.3,1) forwards}}@-webkit-keyframes contentShow{0%{opacity:0;-webkit-transform:translate(-50%,-48%) scale(.96);transform:translate(-50%,-48%) scale(.96)}to{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@keyframes contentShow{0%{opacity:0;-webkit-transform:translate(-50%,-48%) scale(.96);transform:translate(-50%,-48%) scale(.96)}to{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}.modal{background-color:#fff;background-color:var(--page-bg);z-index:9999;position:fixed;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:grid;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content;grid-row-gap:2rem;row-gap:2rem;place-self:center;padding:2rem;border-radius:.95rem}.modal:focus{outline:none}.modal .modal-header{display:grid;grid-template-columns:repeat(2,auto);align-items:center}.modal .modal-header .btn-primary{justify-self:end}@media(prefers-reduced-motion:no-preference){.modal{-webkit-animation:contentShow .15s cubic-bezier(.16,1,.3,1) forwards;animation:contentShow .15s cubic-bezier(.16,1,.3,1) forwards}}.select-trigger{all:unset;display:inline-flex;align-items:center;justify-content:space-between;border-radius:.5rem;height:38px;grid-gap:8px;gap:8px;padding:0 .8rem;border:1px solid #646478;border:1px solid var(--border-color);background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--options-text-color)}.select-trigger svg{width:1rem;height:1rem;margin-top:.25rem}.select-trigger:hover{border-color:#fc0;border-color:var(--yellow-accent)}.select-content{overflow:hidden;background-color:#fff;background-color:var(--page-bg);border-radius:.5rem}.select-viewport{border:1px solid #646478;border:1px solid var(--border-color);border-radius:.5rem;padding:5px}.select-item{all:unset;background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--options-text-color);display:flex;align-items:center;border-radius:.5rem;padding:6px 6px 6px 25px;position:relative;-webkit-user-select:none;-ms-user-select:none;user-select:none}.select-item:focus{color:#040404;color:var(--btn-text-hover-color);background-color:#fc0;background-color:var(--yellow-accent)}.select-item-indicator{position:absolute;left:0;width:25px;padding-right:4px;display:inline-flex;align-items:center;justify-content:center}.switch-root{all:"unset";width:42px;height:25px;background-color:#dfe1e4;background-color:var(--switch-root-background-color);border-radius:9999px;border:none;position:relative;transition:background-color .1s;-webkit-tap-highlight-color:rgba(0,0,0,0)}.switch-root:focus-visible{outline:none}.switch-root[data-state=checked]{background-color:#fc0;background-color:var(--yellow-accent)}.switch-thumb{display:block;width:17px;height:17px;background-color:#fff;background-color:var(--switch-thumb-color);border-radius:9999px;transition:-webkit-transform .1s;transition:transform .1s;transition:transform .1s,-webkit-transform .1s;-webkit-transform:translateX(4px);transform:translateX(4px);will-change:transform}.switch-thumb[data-state=checked]{-webkit-transform:translateX(21px);transform:translateX(21px);background-color:#fff;background-color:var(--switch-thumb-checked-color);outline:1px solid rgba(100,100,120,.5)}.number-input{all:unset;flex:1 0 auto;border-radius:.5rem;padding:.4rem .8rem;outline:1px solid #646478;outline:1px solid var(--border-color)}.number-input:focus-visible{outline:1px solid #fc0;outline:1px solid var(--yellow-accent)}.toast-viewpoint{position:fixed;top:48px;right:0;display:flex;flex-direction:row;padding:25px;grid-gap:10px;gap:10px;max-width:100vw;margin:0;z-index:999999}.toast-viewpoint:focus-visible{outline:none}.toast-root{border:1px solid rgba(100,100,120,.5);border:1px solid var(--border-color-light);background-color:#fff;background-color:var(--page-bg);border-radius:.6rem;padding:15px;display:flex;align-items:center;grid-gap:12px;gap:12px}.toast-root[data-state=open]{-webkit-animation:slideIn .15s cubic-bezier(.16,1,.3,1);animation:slideIn .15s cubic-bezier(.16,1,.3,1)}.toast-root[data-state=close]{-webkit-animation:opacityReveal .1s ease-in forwards;animation:opacityReveal .1s ease-in forwards}.toast-root[data-state=cancel]{-webkit-transform:translateX(0);transform:translateX(0);-webkit-animation:transform .1s ease-out;animation:transform .1s ease-out}.toast-root.error{border:1px solid #ef4444;border:1px solid var(--error-color)}.toast-root.success{border:1px solid #10b981;border:1px solid var(--success-color)}.error-icon{height:24px;width:24px;color:#ef4444;color:var(--error-color)}.success-icon{height:24px;width:24px;color:#10b981;color:var(--success-color)}.loading-icon{-webkit-animation-name:spin;animation-name:spin;-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation-timing-function:linear;animation-timing-function:linear}.loading-icon,.toast-desc,.toast-icon{display:flex;align-items:center}.toast-desc{margin:0;color:#040404;color:var(--text-color);min-width:240px}.info-tooltip:hover:before{content:attr(data-tooltip);position:absolute;background-color:#e6e6ea;background-color:var(--tooltip-bg);color:#000;color:var(--tooltip-text-color);padding:.5rem;border-radius:.3rem;z-index:2;opacity:0;-webkit-animation-name:opacityReveal;animation-name:opacityReveal;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.info-tooltip-top:hover:before{-webkit-transform:translateY(-100%);transform:translateY(-100%);margin-bottom:1.5rem}.info-tooltip-bottom:hover:before{-webkit-transform:translateY(100%);transform:translateY(100%);margin-top:1.5rem}*,:after,:before{box-sizing:border-box;margin:0;padding:0}body,html{font-family:"WorkSans",sans-serif} \ No newline at end of file +@font-face{font-family:"WorkSans";src:url(/static/media/WorkSans-Regular.bb287b89.ttf)}@font-face{font-family:"WorkSans-Semibold";src:url(/static/media/WorkSans-SemiBold.1e98db4e.ttf)}@font-face{font-family:"WorkSans-Bold";src:url(/static/media/WorkSans-Bold.2bea7a7f.ttf)}@font-face{font-family:"WorkSans-Black";src:url(/static/media/WorkSans-Black.67c2c5a1.ttf)}:root{--page-bg:#fff;--page-bg-light:hsla(0,0%,100%,0.5);--page-text-color:#040404;--link-color:#000;--border-color:#646478;--border-color-light:rgba(100,100,120,0.5);--tooltip-bg:#e6e6ea;--tooltip-text-color:#000;--error-color:#ef4444;--success-color:#10b981;--editor-toolkit-bg:hsla(0,0%,100%,0.5);--editor-options-bg:#e6e6ea;--editor-size-border-color:var(--border-color);--editor-toolkit-panel-border:0;--modal-bg:var(--page-bg);--modal-text-color:#000;--modal-hotkey-border-color:#000;--model-mask-bg:rgba(209,213,219,0.4);--text-color:#040404;--text-color-gray:#6b6f76;--btn-primary-bg:#d2d2dc;--btn-text-color:var(--text-color);--btn-text-hover-color:#040404;--btn-border-color:#646478;--btn-primary-hover-bg:var(--yellow-accent);--animation-pulsing-bg:hsla(0,0%,100%,0.5);--switch-root-background-color:#dfe1e4;--switch-thumb-color:var(--page-bg);--switch-thumb-checked-color:var(--page-bg)}:root,[data-theme=dark]{--yellow-accent:#fc0;--options-text-color:var(--page-text-color)}[data-theme=dark]{--page-bg:#040404;--page-bg-light:rgba(4,4,4,0.5333333333333333);--page-text-color:#f9f9f9;--link-color:var(--yellow-accent);--border-color:#646478;--border-color-light:#666;--tooltip-bg:#212121;--tooltip-text-color:#d2d2d2;--editor-toolkit-bg:rgba(0,0,0,0.5);--editor-options-bg:#212121;--editor-size-border-color:var(--yellow-accent);--editor-toolkit-panel-border:1px solid rgba(100,100,120,0.4);--modal-bg:var(--page-bg);--modal-text-color:var(--page-text-color);--modal-hotkey-border-color:var(--page-text-color);--model-mask-bg:rgba(76,76,87,0.4);--text-color:#fff;--text-color-gray:#8a8f98;--btn-primary-bg:#8c8cb4;--btn-text-color:var(--text-color);--btn-text-hover-color:var(--page-bg);--btn-border-color:var(--yellow-accent);--btn-primary-hover-bg:var(--yellow-accent);--animation-pulsing-bg:#f0f0ff;--switch-root-background-color:#3c3f44;--switch-thumb-color:#1f2023;--switch-thumb-checked-color:#fff}@-webkit-keyframes pulsing{0%{opacity:1}50%{opacity:.75;background-color:hsla(0,0%,100%,.5);background-color:var(--animation-pulsing-bg)}to{opacity:1}}@keyframes pulsing{0%{opacity:1}50%{opacity:.75;background-color:hsla(0,0%,100%,.5);background-color:var(--animation-pulsing-bg)}to{opacity:1}}@-webkit-keyframes opacityReveal{0%{opacity:0}to{opacity:1}}@keyframes opacityReveal{0%{opacity:0}to{opacity:1}}@-webkit-keyframes slideDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slideIn{0%{-webkit-transform:translateX(calc(100% + 25px));transform:translateX(calc(100% + 25px))}to{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideIn{0%{-webkit-transform:translateX(calc(100% + 25px));transform:translateX(calc(100% + 25px))}to{-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.lama-cleaner{display:grid;grid-template-areas:"main-content";width:100vw;height:100vh;background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--page-text-color);transition-property:background-color,color;transition-duration:.2s;transition-timing-function:repeat(2,ease-out)}.editor-container{display:flex;width:100vw;height:100vh;justify-content:center;align-items:center}.react-transform-wrapper{display:grid!important;width:100%!important;height:100%!important}.editor-canvas-container{display:grid;grid-template-areas:"editor-content";grid-row-gap:1rem;row-gap:1rem}.editor-canvas{grid-area:editor-content;z-index:2}.original-image-container{grid-area:editor-content;pointer-events:none;display:grid;grid-template-areas:"original-image-content"}.original-image-container img{grid-area:original-image-content}.original-image-container .editor-slider{grid-area:original-image-content;height:100%;width:6px;justify-self:end;background-color:#fc0;background-color:var(--yellow-accent);transition:all .3s cubic-bezier(.4,0,.2,1);z-index:2}.editor-canvas-loading{pointer-events:none;-webkit-animation:pulsing .75s infinite;animation:pulsing .75s infinite}.editor-toolkit-panel{position:fixed;bottom:.5rem;border-radius:3rem;padding:1rem 3rem;display:grid;grid-template-areas:"toolkit-size-selector toolkit-brush-slider toolkit-btns";grid-column-gap:2rem;-webkit-column-gap:2rem;column-gap:2rem;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background-color:hsla(0,0%,100%,.5);background-color:var(--page-bg-light);-webkit-animation:slideUp .2s ease-out;animation:slideUp .2s ease-out;border:0;border:var(--editor-toolkit-panel-border);box-shadow:0 0 0 1px rgba(0,0,0,.1019607843),0 3px 16px rgba(0,0,0,.0784313725),0 2px 6px 1px rgba(0,0,0,.0901960784)}@media screen and (max-width:767px){.editor-toolkit-panel{padding:1rem 2rem;grid-template-areas:"toolkit-size-selector toolkit-size-selector" "toolkit-brush-slider toolkit-brush-slider" "toolkit-btns toolkit-btns";grid-row-gap:2rem;row-gap:2rem;justify-items:center}}.editor-toolkit-panel .eyeicon-active{background-color:#fc0;background-color:var(--yellow-accent);color:#040404;color:var(--btn-text-hover-color)}.editor-brush-slider{grid-area:toolkit-brush-slider;-webkit-user-select:none;-ms-user-select:none;user-select:none;display:grid;grid-template-columns:repeat(2,-webkit-max-content);grid-template-columns:repeat(2,max-content);height:-webkit-max-content;height:max-content;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem;align-items:center}.editor-brush-slider input[type=range]{-webkit-appearance:none;appearance:none;width:100%;cursor:pointer;background:transparent;border-color:transparent;color:transparent}.editor-brush-slider input[type=range]:focus{outline:none}.editor-brush-slider input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;height:1.2rem;width:1.2rem;border-radius:50%;border:1px solid #000;z-index:2;background:#fc0;background:var(--yellow-accent);margin-top:-.5rem}.editor-brush-slider input[type=range]::-webkit-slider-runnable-track{border-radius:2rem;height:.2rem;background:#d2d2dc;background:var(--btn-primary-bg)}.editor-brush-slider input[type=range]::-moz-range-track{border-radius:2rem;background:#d2d2dc;background:var(--btn-primary-bg)}.editor-brush-slider input[type=range]::-moz-range-progress{background:#fc0;background:var(--yellow-accent)}.editor-toolkit-btns{grid-area:toolkit-btns;display:grid;grid-auto-flow:column;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem}.brush-shape{position:absolute;border-radius:50%;background-color:rgba(255,204,0,.7333333333);border:1px solid #fc0;border:1px solid var(--yellow-accent);pointer-events:none}.landing-page{display:grid;place-self:center;justify-items:center;grid-row-gap:2rem;row-gap:2rem;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}@media screen and (max-width:767px){.landing-page{padding:1rem}}.landing-page h1{text-align:center;font-size:1.4rem}@media screen and (max-width:767px){.landing-page h1{font-size:1.2rem}}.landing-page a{color:#000;color:var(--link-color)}.landing-file-selector{display:grid}header{height:60px;padding:1rem 2rem;position:absolute;top:0;display:flex;justify-content:space-between;align-items:center;width:100%;z-index:20;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid rgba(100,100,120,.2);background-color:hsla(0,0%,100%,.5);background-color:var(--page-bg-light)}.shortcuts{z-index:1}.header-icons-wrapper{grid-gap:12px;gap:12px}.header-icons,.header-icons-wrapper{display:flex;justify-content:center;align-items:center;justify-self:end}.header-icons{grid-gap:6px;gap:6px}.theme-toggle-ui{z-index:10;transition:all .2s ease-in;-webkit-user-select:none;-ms-user-select:none;user-select:none}.theme-toggle-ui .theme-btn{display:flex;justify-content:center;align-items:center;cursor:pointer;outline:none}.theme-toggle-ui .theme-btn svg{width:22px;height:22px}.modal-shortcuts{grid-area:main-content;background-color:#fff;background-color:var(--modal-bg);color:#000;color:var(--modal-text-color);box-shadow:0 0 20px rgba(0,0,40,.2)}@media screen and (max-width:767px){.modal-shortcuts{display:grid;width:100%;height:auto;margin-top:-11rem;-webkit-animation:slideDown .2s ease-out;animation:slideDown .2s ease-out}}.shortcut-options{display:grid;grid-row-gap:1rem;row-gap:1rem}.shortcut-options .shortcut-option{display:grid;grid-template-columns:repeat(2,auto);grid-column-gap:6rem;-webkit-column-gap:6rem;column-gap:6rem;align-items:center}@media screen and (max-width:767px){.shortcut-options .shortcut-option{grid-template-columns:auto;grid-column-gap:0;-webkit-column-gap:0;column-gap:0;grid-row-gap:.6rem;row-gap:.6rem}}.shortcut-options .shortcut-key{justify-self:end;border:1px solid #000;border:1px solid var(--modal-hotkey-border-color);padding:.4rem;width:-webkit-max-content;width:max-content;border-radius:.2rem}@media screen and (max-width:767px){.shortcut-options .shortcut-key{padding:.2rem .4rem}}.shortcut-options .shortcut-description{justify-self:start;text-align:left}@media screen and (max-width:767px){.shortcut-options .shortcut-description{text-align:left;width:auto;justify-self:start}}.setting-block{display:flex;flex-direction:column}.setting-block .option-desc{color:#6b6f76;color:var(--text-color-gray);margin-top:12px;border:1px solid #646478;border:1px solid var(--border-color);border-radius:.3rem;padding:1rem}.setting-block .option-desc .sub-setting-block{margin-top:8px;color:#040404;color:var(--text-color)}.setting-block-content{display:flex;justify-content:space-between;align-items:center;grid-gap:12rem;gap:12rem}.setting-block-content-title{display:flex;flex-direction:column;justify-content:space-between}.setting-block-desc{font-size:1rem;margin-top:8px;color:#6b6f76;color:var(--text-color-gray)}.hd-setting-block .inline-tip{display:inline;cursor:pointer;color:#040404;color:var(--text-color)}.model-desc-link{color:#6b6f76;color:var(--text-color-gray);text-decoration:none}.modal-setting{grid-area:main-content;background-color:#fff;background-color:var(--modal-bg);color:#000;color:var(--modal-text-color);box-shadow:0 0 20px rgba(0,0,40,.2);width:700px}@media screen and (max-width:767px){.modal-setting{display:grid;width:100%;height:auto;margin-top:-11rem;-webkit-animation:slideDown .2s ease-out;animation:slideDown .2s ease-out}}.file-select-label{display:grid;cursor:pointer;border:2px dashed #646478;border:2px dashed var(--border-color);border-radius:.5rem;min-width:600px}@media screen and (max-width:767px){.file-select-label{min-width:300px}}.file-select-label .file-select-label-hover,.file-select-label:hover{color:#000;background-color:#fc0;background-color:var(--yellow-accent)}.file-select-container{display:grid;padding:4rem;width:100%;height:100%}.file-select-container input{display:none}.file-select-message{font-family:"WorkSans";text-align:center}.btn-primary{display:grid;grid-auto-flow:column;grid-column-gap:1rem;-webkit-column-gap:1rem;column-gap:1rem;color:#040404;color:var(--btn-text-color);font-family:"WorkSans",sans-serif;width:-webkit-max-content;width:max-content;padding:.5rem;place-items:center;border-radius:.5rem;z-index:1;cursor:pointer}.btn-primary:hover{background-color:#fc0;background-color:var(--btn-primary-hover-bg);color:#040404;color:var(--btn-text-hover-color)}.btn-primary svg{width:20px;height:auto}.btn-primary-disabled{pointer-events:none;opacity:.5}.modal-mask{position:fixed;z-index:9998;inset:0;background-color:rgba(209,213,219,.4);background-color:var(--model-mask-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@media(prefers-reduced-motion:no-preference){.modal-mask{-webkit-animation:opacityReveal .15s cubic-bezier(.16,1,.3,1) forwards;animation:opacityReveal .15s cubic-bezier(.16,1,.3,1) forwards}}@-webkit-keyframes contentShow{0%{opacity:0;-webkit-transform:translate(-50%,-48%) scale(.96);transform:translate(-50%,-48%) scale(.96)}to{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@keyframes contentShow{0%{opacity:0;-webkit-transform:translate(-50%,-48%) scale(.96);transform:translate(-50%,-48%) scale(.96)}to{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}.modal{background-color:#fff;background-color:var(--page-bg);z-index:9999;position:fixed;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:grid;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content;grid-row-gap:2rem;row-gap:2rem;place-self:center;padding:2rem;border-radius:.95rem}.modal:focus{outline:none}.modal .modal-header{display:grid;grid-template-columns:repeat(2,auto);align-items:center}.modal .modal-header .btn-primary{justify-self:end}@media(prefers-reduced-motion:no-preference){.modal{-webkit-animation:contentShow .15s cubic-bezier(.16,1,.3,1) forwards;animation:contentShow .15s cubic-bezier(.16,1,.3,1) forwards}}.select-trigger{all:unset;display:inline-flex;align-items:center;justify-content:space-between;border-radius:.5rem;height:38px;grid-gap:8px;gap:8px;padding:0 .8rem;border:1px solid #646478;border:1px solid var(--border-color);background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--options-text-color)}.select-trigger svg{width:1rem;height:1rem;margin-top:.25rem}.select-trigger:hover{border-color:#fc0;border-color:var(--yellow-accent)}.select-content{overflow:hidden;background-color:#fff;background-color:var(--page-bg);border-radius:.5rem}.select-viewport{border:1px solid #646478;border:1px solid var(--border-color);border-radius:.5rem;padding:5px}.select-item{all:unset;background-color:#fff;background-color:var(--page-bg);color:#040404;color:var(--options-text-color);display:flex;align-items:center;border-radius:.5rem;padding:6px 6px 6px 25px;position:relative;-webkit-user-select:none;-ms-user-select:none;user-select:none}.select-item:focus{color:#040404;color:var(--btn-text-hover-color);background-color:#fc0;background-color:var(--yellow-accent)}.select-item-indicator{position:absolute;left:0;width:25px;padding-right:4px;display:inline-flex;align-items:center;justify-content:center}.switch-root{all:"unset";width:42px;height:25px;background-color:#dfe1e4;background-color:var(--switch-root-background-color);border-radius:9999px;border:none;position:relative;transition:background-color .1s;-webkit-tap-highlight-color:rgba(0,0,0,0)}.switch-root:focus-visible{outline:none}.switch-root[data-state=checked]{background-color:#fc0;background-color:var(--yellow-accent)}.switch-thumb{display:block;width:17px;height:17px;background-color:#fff;background-color:var(--switch-thumb-color);border-radius:9999px;transition:-webkit-transform .1s;transition:transform .1s;transition:transform .1s,-webkit-transform .1s;-webkit-transform:translateX(4px);transform:translateX(4px);will-change:transform}.switch-thumb[data-state=checked]{-webkit-transform:translateX(21px);transform:translateX(21px);background-color:#fff;background-color:var(--switch-thumb-checked-color);outline:1px solid rgba(100,100,120,.5)}.number-input{all:unset;flex:1 0 auto;border-radius:.5rem;padding:0 .8rem;outline:1px solid #646478;outline:1px solid var(--border-color);height:36px}.number-input:focus-visible{outline:1px solid #fc0;outline:1px solid var(--yellow-accent)}.toast-viewpoint{position:fixed;top:48px;right:0;display:flex;flex-direction:row;padding:25px;grid-gap:10px;gap:10px;max-width:100vw;margin:0;z-index:999999}.toast-viewpoint:focus-visible{outline:none}.toast-root{border:1px solid rgba(100,100,120,.5);border:1px solid var(--border-color-light);background-color:#fff;background-color:var(--page-bg);border-radius:.6rem;padding:15px;display:flex;align-items:center;grid-gap:12px;gap:12px}.toast-root[data-state=open]{-webkit-animation:slideIn .15s cubic-bezier(.16,1,.3,1);animation:slideIn .15s cubic-bezier(.16,1,.3,1)}.toast-root[data-state=close]{-webkit-animation:opacityReveal .1s ease-in forwards;animation:opacityReveal .1s ease-in forwards}.toast-root[data-state=cancel]{-webkit-transform:translateX(0);transform:translateX(0);-webkit-animation:transform .1s ease-out;animation:transform .1s ease-out}.toast-root.error{border:1px solid #ef4444;border:1px solid var(--error-color)}.toast-root.success{border:1px solid #10b981;border:1px solid var(--success-color)}.error-icon{height:24px;width:24px;color:#ef4444;color:var(--error-color)}.success-icon{height:24px;width:24px;color:#10b981;color:var(--success-color)}.loading-icon{-webkit-animation-name:spin;animation-name:spin;-webkit-animation-duration:1.5s;animation-duration:1.5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-transform-origin:center center;transform-origin:center center;-webkit-animation-timing-function:linear;animation-timing-function:linear}.loading-icon,.toast-desc,.toast-icon{display:flex;align-items:center}.toast-desc{margin:0;color:#040404;color:var(--text-color);min-width:240px}.info-tooltip:hover:before{content:attr(data-tooltip);position:absolute;background-color:#e6e6ea;background-color:var(--tooltip-bg);color:#000;color:var(--tooltip-text-color);padding:.5rem;border-radius:.3rem;z-index:2;opacity:0;-webkit-animation-name:opacityReveal;animation-name:opacityReveal;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.info-tooltip-top:hover:before{-webkit-transform:translateY(-100%);transform:translateY(-100%);margin-bottom:1.5rem}.info-tooltip-bottom:hover:before{-webkit-transform:translateY(100%);transform:translateY(100%);margin-top:1.5rem}*,:after,:before{box-sizing:border-box;margin:0;padding:0}body,html{font-family:"WorkSans",sans-serif} \ No newline at end of file diff --git a/lama_cleaner/app/build/static/js/main.2711860b.chunk.js b/lama_cleaner/app/build/static/js/main.2711860b.chunk.js deleted file mode 100644 index a92fb81..0000000 --- a/lama_cleaner/app/build/static/js/main.2711860b.chunk.js +++ /dev/null @@ -1 +0,0 @@ -(this["webpackJsonplama-cleaner"]=this["webpackJsonplama-cleaner"]||[]).push([[0],{48:function(e,t,n){},51:function(e,t,n){"use strict";n.r(t);var a=n(0),c=n.n(a),i=n(15),r=n.n(i),o=(n(48),n(10)),s=n(2),l=n(55),u=n(8),j=n.n(u),d=n(14);var b=n(3),h=n(16),f=n(21),p=n(1),v=function(e){var t=e.width,n=e.value,c=e.chevronDirection,i=e.options,r=e.autoFocusAfterClose,o=e.onChange,s=Object(a.useRef)(null);return Object(p.jsxs)(f.f,{value:n,onValueChange:o,onOpenChange:function(e){e||r||window.setTimeout((function(){var e;null===s||void 0===s||null===(e=s.current)||void 0===e||e.blur()}),100)},children:[Object(p.jsxs)(f.g,{className:"select-trigger",style:{width:t},ref:s,children:[Object(p.jsx)(f.h,{}),Object(p.jsx)(f.b,{children:"up"===c?Object(p.jsx)(h.e,{}):Object(p.jsx)(h.d,{})})]}),Object(p.jsx)(f.a,{className:"select-content",children:Object(p.jsx)(f.i,{className:"select-viewport",children:i.map((function(e){return Object(p.jsxs)(f.c,{value:e,className:"select-item",children:[Object(p.jsx)(f.e,{children:e}),Object(p.jsx)(f.d,{className:"select-item-indicator",children:Object(p.jsx)(h.c,{})})]},e)}))})})]})};v.defaultProps={chevronDirection:"down",autoFocusAfterClose:!0};var O=v,g=n(4),x=["value","onValue"],m=c.a.forwardRef((function(e,t){var n=e.value,a=e.onValue,c=Object(g.a)(e,x);return Object(p.jsx)("input",Object(b.a)(Object(b.a)({value:n,onInput:function(e){var t=e.target.value.replace(/\D/g,"");null===a||void 0===a||a(t)},className:"number-input"},c),{},{ref:t,type:"text"}))}));var w=function(e){var t=e.title,n=e.desc,a=e.input,c=e.optionDesc,i=e.className;return Object(p.jsxs)("div",{className:"setting-block ".concat(i),children:[Object(p.jsxs)("div",{className:"setting-block-content",children:[Object(p.jsxs)("div",{className:"setting-block-content-title",children:[Object(p.jsx)("span",{children:t}),n&&Object(p.jsx)("span",{className:"setting-block-desc",children:n})]}),a]}),c&&Object(p.jsx)("div",{className:"option-desc",children:c})]})};var y,k=function(e){var t=e.title,n=e.value,a=e.suffix,c=e.onValue;return Object(p.jsx)(w,{className:"sub-setting-block",title:t,input:Object(p.jsxs)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:"8px"},children:[Object(p.jsx)(m,{style:{width:"80px"},value:"".concat(n),onValue:c}),a&&Object(p.jsx)("span",{children:a})]})})};!function(e){e.ORIGINAL="Original",e.RESIZE="Resize",e.CROP="Crop"}(y||(y={}));var S,C=function(){var e=Object(o.c)(D),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(e){a((function(t){return Object(b.a)(Object(b.a)({},t),{},{hdStrategy:e})}))},i=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyResizeLimit:t})}))},r=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyCropTrigerSize:t})}))},l=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyCropMargin:t})}))},u=function(){return Object(p.jsxs)("div",{children:["Use the original resolution of the picture, suitable for picture size below 2K. Try"," ",Object(p.jsx)("div",{tabIndex:0,role:"button",className:"inline-tip",onClick:function(){return c(y.RESIZE)},children:"Resize Strategy"})," ","if you do not get good results on high resolution images."]})};return Object(p.jsx)(w,{className:"hd-setting-block",title:"High Resolution Strategy",input:Object(p.jsx)(O,{width:80,value:n.hdStrategy,options:Object.values(y),onChange:function(e){return c(e)}}),optionDesc:function(){switch(n.hdStrategy){case y.ORIGINAL:return u();case y.CROP:return Object(p.jsxs)("div",{children:[Object(p.jsx)("div",{children:"Crop masking area from the original image to do inpainting, and paste the result back. Mainly for performance and memory reasons on high resolution image."}),Object(p.jsx)(k,{title:"Trigger size",value:"".concat(n.hdStrategyCropTrigerSize),suffix:"pixel",onValue:r}),Object(p.jsx)(k,{title:"Crop margin",value:"".concat(n.hdStrategyCropMargin),suffix:"pixel",onValue:l})]});case y.RESIZE:return Object(p.jsxs)("div",{children:[Object(p.jsx)("div",{children:"Resize the longer side of the image to a specific size(keep ratio), then do inpainting on the resized image."}),Object(p.jsx)(k,{title:"Size limit",value:"".concat(n.hdStrategyResizeLimit),suffix:"pixel",onValue:i})]});default:return u()}}()})};!function(e){e.LAMA="lama",e.LDM="ldm"}(S||(S={}));var M,L=function(){var e=Object(o.c)(D),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(e,t,n){return Object(p.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"4px"},children:[Object(p.jsx)("a",{className:"model-desc-link",href:t,target:"_blank",rel:"noreferrer noopener",children:e}),Object(p.jsx)("a",{className:"model-desc-link",href:n,target:"_blank",rel:"noreferrer noopener",children:n})]})};return Object(p.jsx)(w,{className:"model-setting-block",title:"Inpainting Model",input:Object(p.jsx)(O,{width:80,value:n.model,options:Object.values(S),onChange:function(e){return t=e,void a((function(e){return Object(b.a)(Object(b.a)({},e),{},{model:t})}));var t}}),optionDesc:function(){switch(n.model){case S.LAMA:return c("Resolution-robust Large Mask Inpainting with Fourier Convolutions","https://arxiv.org/abs/2109.07161","https://github.com/saic-mdal/lama");case S.LDM:return Object(p.jsxs)("div",{children:[c("High-Resolution Image Synthesis with Latent Diffusion Models","https://arxiv.org/abs/2112.10752","https://github.com/CompVis/latent-diffusion"),Object(p.jsx)(k,{title:"Steps",value:"".concat(n.ldmSteps),onValue:function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{ldmSteps:t})}))}})]});default:return Object(p.jsx)(p.Fragment,{})}}()})},N=Object(o.b)({key:"fileState",default:void 0}),z=Object(o.b)({key:"toastState",default:{open:!1,desc:"",state:"default",duration:3e3}}),I=Object(o.b)({key:"shortcutsState",default:!1}),E={show:!1,runInpaintingManually:!1,model:S.LAMA,ldmSteps:50,hdStrategy:y.RESIZE,hdStrategyResizeLimit:2048,hdStrategyCropTrigerSize:2048,hdStrategyCropMargin:128},D=Object(o.b)({key:"settingsState",default:E,effects:[(M="settingsState",function(e){var t=e.setSelf,n=e.onSet,a=localStorage.getItem(M);if(null!=a){var c=JSON.parse(a);c.show=!1,t(c)}n((function(e,t,n){return n?localStorage.removeItem(M):localStorage.setItem(M,JSON.stringify(e))}))})]}),R=n(9),T=function(){var e=Object(a.useState)(window.innerWidth),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(a.useCallback)((function(){c(window.innerWidth)}),[]);return Object(a.useEffect)((function(){return window.addEventListener("resize",i),function(){window.removeEventListener("resize",i)}})),n<768?"mobile":n>=768&&n<1224?"tablet":n>=1224?"desktop":void 0};function A(e){var t=e.onSelection,n=Object(a.useState)(!1),c=Object(s.a)(n,2),i=c[0],r=c[1],o=Object(a.useState)("file-upload-".concat(Math.random().toString())),l=Object(s.a)(o,1)[0],u=T();function b(e){if(e&&e.type.match("image.*"))try{if(e.size>20971520)throw new Error("file too large");t(e)}catch(n){alert("error: ".concat(n.message))}}function h(e){return f.apply(this,arguments)}function f(){return(f=Object(d.a)(j.a.mark((function e(t){return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){t.file((function(t){return e(t)}))})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function v(e){return O.apply(this,arguments)}function O(){return(O=Object(d.a)(j.a.mark((function e(t){var n,a,c,i,r;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(n=[],a=[],c=0;c0)){e.next=23;break}if(!(null===(i=a.shift())||void 0===i?void 0:i.isFile)){e.next=12;break}return e.next=8,h(i);case 8:r=e.sent,n.push(r),e.next=21;break;case 12:if(!(null===i||void 0===i?void 0:i.isDirectory)){e.next=21;break}return e.t0=a.push,e.t1=a,e.t2=R.a,e.next=18,g(i.createReader());case 18:e.t3=e.sent,e.t4=(0,e.t2)(e.t3),e.t0.apply.call(e.t0,e.t1,e.t4);case 21:e.next=3;break;case 23:return e.abrupt("return",n);case 24:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function g(e){return x.apply(this,arguments)}function x(){return(x=Object(d.a)(j.a.mark((function e(t){var n,a;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=[],e.next=3,m(t);case 3:a=e.sent;case 4:if(!(a.length>0)){e.next=11;break}return n.push.apply(n,Object(R.a)(a)),e.next=8,m(t);case 8:a=e.sent,e.next=4;break;case 11:return e.abrupt("return",n);case 12:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function m(e){return w.apply(this,arguments)}function w(){return(w=Object(d.a)(j.a.mark((function e(t){return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e,n){t.readEntries(e,n)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function y(){return(y=Object(d.a)(j.a.mark((function e(t){var n;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),e.next=3,v(t.dataTransfer.items);case 3:n=e.sent,r(!1),b(n[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(p.jsx)("label",{htmlFor:l,className:"file-select-label",children:Object(p.jsxs)("div",{className:["file-select-container",i?"file-select-label-hover":""].join(" "),onDrop:function(e){return y.apply(this,arguments)},onDragOver:function(e){e.stopPropagation(),e.preventDefault(),r(!0)},onDragLeave:function(){return r(!1)},children:[Object(p.jsx)("input",{id:l,name:l,type:"file",onChange:function(e){var t,n=null===(t=e.currentTarget.files)||void 0===t?void 0:t[0];n&&b(n)},accept:"image/png, image/jpeg"}),Object(p.jsx)("p",{className:"file-select-message",children:"desktop"===u?"Click here or drag an image file":"Tap here to load your picture"})]})})}var Z=function(){var e=Object(o.e)(N);return Object(p.jsxs)("div",{className:"landing-page",children:[Object(p.jsxs)("h1",{children:["Image inpainting powered by \ud83e\udd99",Object(p.jsx)("a",{href:"https://github.com/saic-mdal/lama",children:"LaMa"})]}),Object(p.jsx)("div",{className:"landing-file-selector",children:Object(p.jsx)(A,{onSelection:function(){var t=Object(d.a)(j.a.mark((function t(n){return j.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e(n);case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()})})]})},P=Object(o.b)({key:"themeState",default:"light"}),H=function(){var e=Object(o.c)(P),t=Object(s.a)(e,2),n=t[0],c=t[1];Object(a.useEffect)((function(){window.matchMedia("(prefers-color-scheme: dark)").matches?c("dark"):c("light")}),[c]);return Object(p.jsx)("div",{className:"theme-toggle-ui",children:Object(p.jsx)("div",{className:"theme-btn",onClick:function(){c("light"===n?"dark":"light")},role:"button",tabIndex:0,"aria-hidden":"true",children:"light"===n?Object(p.jsx)(h.i,{}):Object(p.jsx)(h.j,{style:{color:"#ffcc00"}})})})},V=n(38),F=n(54),W=n(40);function U(e){for(var t=e.split(",")[0].split(":")[1].split(";")[0],n=atob(e.split(",")[1]),a=[],c=0;ct){var c=Math.ceil(t*a);return"".concat(e,"x").concat(c)}var i=Math.ceil(n*a);return"".concat(i,"x").concat(e)}),[n,t,u]),d=Object(a.useCallback)((function(){for(var e=[],t=0;tt?(l(a[0]),c(parseInt(a[0],10))):(l(a[1]),c(parseInt(a[1],10)))},chevronDirection:"up"})}var ne="#ffcc00bb";function ae(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ne;e.strokeStyle=n,e.lineCap="round",e.lineJoin="round",t.forEach((function(t){(null===t||void 0===t?void 0:t.pts.length)&&t.size&&(e.lineWidth=t.size,e.beginPath(),e.moveTo(t.pts[0].x,t.pts[0].y),t.pts.forEach((function(t){return e.lineTo(t.x,t.y)})),e.stroke())}))}function ce(e){var t=e.nativeEvent;return{x:t.offsetX,y:t.offsetY}}function ie(e){var t=e.file,n=Object(o.d)(D),c=Object(a.useState)(40),i=Object(s.a)(c,2),r=i[0],u=i[1],b=function(e){var t=Object(a.useState)(new Image),n=Object(s.a)(t,1)[0],c=Object(a.useState)(!1),i=Object(s.a)(c,2),r=i[0],o=i[1];return Object(a.useEffect)((function(){return n.onload=function(){o(!0)},o(!1),n.src=URL.createObjectURL(e),function(){n.onload=null}}),[e,n]),[n,r]}(t),f=Object(s.a)(b,2),v=f[0],O=f[1],g=Object(a.useState)([]),x=Object(s.a)(g,2),m=x[0],w=x[1],y=Object(a.useState)(),k=Object(s.a)(y,2),S=k[0],C=k[1],M=Object(a.useState)((function(){return document.createElement("canvas")})),L=Object(s.a)(M,1)[0],N=Object(a.useState)([]),z=Object(s.a)(N,2),I=z[0],E=z[1],T=Object(a.useState)([]),A=Object(s.a)(T,2),Z=A[0],P=A[1],H=Object(a.useState)({x:-1,y:-1}),U=Object(s.a)(H,2),J=U[0],_=J.x,Y=J.y,X=U[1],$=Object(a.useState)(!1),ee=Object(s.a)($,2),ne=ee[0],ie=ee[1],re=Object(a.useState)(!1),oe=Object(s.a)(re,2),se=oe[0],le=oe[1],ue=Object(a.useState)(!1),je=Object(s.a)(ue,2),de=je[0],be=je[1],he=Object(a.useState)(!1),fe=Object(s.a)(he,2),pe=fe[0],ve=fe[1],Oe=Object(a.useState)(!1),ge=Object(s.a)(Oe,2),xe=ge[0],me=ge[1],we=Object(a.useState)(1),ye=Object(s.a)(we,2),ke=ye[0],Se=ye[1],Ce=Object(a.useState)(!1),Me=Object(s.a)(Ce,2),Le=Me[0],Ne=Me[1],ze=Object(a.useState)(1),Ie=Object(s.a)(ze,2),Ee=Ie[0],De=Ie[1],Re=Object(a.useState)(1080),Te=Object(s.a)(Re,2),Ae=Te[0],Ze=Te[1],Pe=Object(F.a)(),He=Pe.width/2,Ve=Pe.height/2,Fe=Object(a.useRef)(),We=Object(a.useState)(!1),Ue=Object(s.a)(We,2),Be=Ue[0],Ge=Ue[1],Je=Object(a.useState)(!1),Ke=Object(s.a)(Je,2),_e=Ke[0],Ye=Ke[1],Xe=Object(a.useState)(!1),$e=Object(s.a)(Xe,2),Qe=$e[0],qe=$e[1],et=Object(a.useState)(0),tt=Object(s.a)(et,2),nt=tt[0],at=tt[1],ct=Object(a.useCallback)((function(e,t){S&&(S.clearRect(0,0,S.canvas.width,S.canvas.height),S.drawImage(e,0,0,v.naturalWidth,v.naturalHeight),ae(S,t))}),[S,v]),it=function(e){if(!(null===S||void 0===S?void 0:S.canvas.width)||!(null===S||void 0===S?void 0:S.canvas.height))throw new Error("canvas has invalid size");L.width=null===S||void 0===S?void 0:S.canvas.width,L.height=null===S||void 0===S?void 0:S.canvas.height;var t=L.getContext("2d");if(!t)throw new Error("could not retrieve mask canvas");e.forEach((function(e){ae(t,e,"white")}))},rt=function(){var e=Object(d.a)(j.a.mark((function e(){var a,c,i,r;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(ot()){e.next=2;break}return e.abrupt("return");case 2:return a=[].concat(Object(R.a)(I),[Z]),E(a),P([]),Ye(!1),me(!0),it(a),e.prev=8,e.next=11,K(t,L.toDataURL(),n,Ae.toString());case 11:if(c=e.sent){e.next=14;break}throw new Error("empty response");case 14:return i=new Image,e.next=17,B(i,c);case 17:r=[].concat(Object(R.a)(m),[i]),w(r),ct(i,[]),e.next=25;break;case 22:e.prev=22,e.t0=e.catch(8),alert(e.t0.message?e.t0.message:e.t0.toString());case 25:me(!1);case 26:case"end":return e.stop()}}),e,null,[[8,22]])})));return function(){return e.apply(this,arguments)}}(),ot=function(){return 0!==Z.length},st=function(){return 0!==m.length},lt=Object(a.useCallback)((function(e){0===m.length?ct(v,e):ct(m[m.length-1],e)}),[v,m,ct]),ut=function(e){return"Control"===e.key||"Meta"===e.key};Object(W.a)(ut,(function(){Qe&&(xe||(qe(!1),n.runInpaintingManually||rt()))}),{event:"keyup"},[xe,Qe,ot]),Object(W.a)(ut,(function(){xe||qe(!0)}),{event:"keydown"},[xe]),Object(a.useEffect)((function(){if(O){var e=Pe.width/v.naturalWidth,t=(Pe.height-200)/v.naturalHeight,n=1;if((e<1||t<1)&&(n=Math.min(e,t)),De(n),Se(n),(null===S||void 0===S?void 0:S.canvas)&&(S.canvas.width=v.naturalWidth,S.canvas.height=v.naturalHeight,lt([])),!Be){var a;null===(a=Fe.current)||void 0===a||a.centerView(n,1),Ge(!0);var c=Math.max(v.width,v.height);Ze(c)}}}),[null===S||void 0===S?void 0:S.canvas,Fe,v,O,Pe,Be,lt]);var jt=Object(a.useCallback)((function(){if(Ee&&v&&Pe){var e=Fe.current;if(!e)throw new Error("no viewport");var t=(Pe.width-v.width*Ee)/2,n=(Pe.height-v.height*Ee)/2;e.setTransform(t,n,Ee,200,"easeOutQuad"),e.state.scale=Ee,Se(Ee),Ne(!1)}}),[Fe,Ee,v,Pe]);Object(a.useEffect)((function(){return window.addEventListener("resize",(function(){jt()})),function(){window.removeEventListener("resize",(function(){jt()}))}}),[Pe,jt]);Object(W.a)("Escape",(function(){xe||(_e||Qe?(Ye(!1),P([]),lt([])):jt())}),{event:"keydown"},[_e,xe,Qe,jt,lt]);var dt=Object(a.useCallback)((function(){if(0!==Z.length){var e=Z.slice(0,Z.length-1);P(e),lt(e)}}),[Z,lt]),bt=Object(a.useCallback)((function(){if(m.length){var e=I.slice(0,I.length-1);E(e),P([]),Ye(!1);var t=m.slice(0,m.length-1);w(t),0===t.length?ct(v,[]):ct(t[t.length-1],[])}}),[ct,m,I,v]),ht=function(){n.runInpaintingManually&&0!==Z.length?dt():bt()};Object(W.a)((function(e){var t=(e.metaKey||e.ctrlKey)&&"z"===e.key;return"Tab"===e.key&&e.preventDefault(),!!t&&(e.preventDefault(),!0)}),ht,void 0,[dt,bt]);Object(l.a)("Tab",(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),st()&&ve((function(){return window.setTimeout((function(){at(100)}),10),!0}))}),(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),st()&&(at(0),window.setTimeout((function(){ve(!1)}),350))}));var ft=function(e){e===ne||de||ie(e)},pt=Object(a.useCallback)((function(){return de?"grab":ne?"none":void 0}),[ne,de]);Object(l.a)("[",(function(){u((function(e){return e>10?e-10:e<=10&&e>0?e-5:e}))})),Object(l.a)("]",(function(){u((function(e){return e+10}))})),Object(l.a)("R",(function(){n.runInpaintingManually&&ot()&&rt()})),Object(l.a)(" ",(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),ie(!1),be(!0)}),(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),ie(!0),be(!1)}));var vt=function(e,t){var n=function(){var e,t,n=Ee;return void 0!==(null===(e=Fe.current)||void 0===e?void 0:e.state.scale)&&(n=null===(t=Fe.current)||void 0===t?void 0:t.state.scale),n}();return{width:"".concat(r*n,"px"),height:"".concat(r*n,"px"),left:"".concat(e,"px"),top:"".concat(t,"px"),transform:"translate(-50%, -50%)"}};return Object(p.jsxs)("div",{className:"editor-container","aria-hidden":"true",onMouseMove:function(e){var t=e.nativeEvent;X({x:t.pageX,y:t.pageY})},onMouseUp:function(e){(G(e)&&be(!1),de)||v.src&&(null===S||void 0===S?void 0:S.canvas)&&(xe||_e&&(Qe||n.runInpaintingManually?Ye(!1):rt()))},children:[Object(p.jsx)(V.b,{ref:function(e){e&&(Fe.current=e)},panning:{disabled:!de,velocityDisabled:!0},wheel:{step:.05},centerZoomedOut:!0,alignmentAnimation:{disabled:!0},limitToBounds:!1,doubleClick:{disabled:!0},initialScale:Ee,minScale:Ee,onPanning:function(e){Le||Ne(!0)},onZoom:function(e){Se(e.state.scale)},children:Object(p.jsx)(V.a,{contentClass:xe?"editor-canvas-loading":"",contentStyle:{visibility:Be?"visible":"hidden"},children:Object(p.jsxs)("div",{className:"editor-canvas-container",children:[Object(p.jsx)("canvas",{className:"editor-canvas",style:{cursor:pt(),clipPath:"inset(0 ".concat(nt,"% 0 0)"),transition:"clip-path 350ms ease-in-out"},onContextMenu:function(e){e.preventDefault()},onMouseOver:function(){ft(!0),le(!1)},onFocus:function(){return ft(!0)},onMouseLeave:function(){return ft(!1)},onMouseDown:function(e){if(!de&&(v.src&&(null===S||void 0===S?void 0:S.canvas)&&!xe&&!function(e){return 2===e.nativeEvent.button}(e)))if(G(e))be(!0);else{Ye(!0);var t=[];(Qe||n.runInpaintingManually)&&(t=Object(R.a)(Z)),t.push({size:r,pts:[ce(e)]}),P(t),lt(t)}},onMouseMove:function(e){if(!de&&_e&&0!==Z.length){var t=Object(R.a)(Z);t[t.length-1].pts.push(ce(e)),P(t),lt(t)}},ref:function(e){if(e&&!S){var t=e.getContext("2d");t&&C(t)}}}),Object(p.jsxs)("div",{className:"original-image-container",style:{width:"".concat(v.naturalWidth,"px"),height:"".concat(v.naturalHeight,"px")},children:[pe&&Object(p.jsx)("div",{className:"editor-slider",style:{marginRight:"".concat(nt,"%")}}),Object(p.jsx)("img",{className:"original-image",src:v.src,alt:"original",style:{width:"".concat(v.naturalWidth,"px"),height:"".concat(v.naturalHeight,"px")}})]})]})})}),ne&&!xe&&!de&&Object(p.jsx)("div",{className:"brush-shape",style:vt(_,Y)}),se&&Object(p.jsx)("div",{className:"brush-shape",style:vt(He,Ve)}),Object(p.jsxs)("div",{className:"editor-toolkit-panel",children:[Object(p.jsx)(te,{onChange:function(e){Ze(e)},originalWidth:v.naturalWidth,originalHeight:v.naturalHeight}),Object(p.jsx)(q,{label:"Brush",min:10,max:150,value:r,onChange:function(e){u(e),se||(le(!0),window.setTimeout((function(){le(!1)}),1e4))},onClick:function(){return le(!1)}}),Object(p.jsxs)("div",{className:"editor-toolkit-btns",children:[Object(p.jsx)(Q,{toolTip:"Reset Zoom & Pan",tooltipPosition:"top",icon:Object(p.jsx)(h.b,{}),disabled:ke===Ee&&!1===Le,onClick:jt}),Object(p.jsx)(Q,{toolTip:"Undo",tooltipPosition:"top",icon:Object(p.jsx)("svg",{width:"19",height:"9",viewBox:"0 0 19 9",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:Object(p.jsx)("path",{d:"M2 1C2 0.447715 1.55228 0 1 0C0.447715 0 0 0.447715 0 1H2ZM1 8H0V9H1V8ZM8 9C8.55228 9 9 8.55229 9 8C9 7.44771 8.55228 7 8 7V9ZM16.5963 7.42809C16.8327 7.92721 17.429 8.14016 17.9281 7.90374C18.4272 7.66731 18.6402 7.07103 18.4037 6.57191L16.5963 7.42809ZM16.9468 5.83205L17.8505 5.40396L16.9468 5.83205ZM0 1V8H2V1H0ZM1 9H8V7H1V9ZM1.66896 8.74329L6.66896 4.24329L5.33104 2.75671L0.331035 7.25671L1.66896 8.74329ZM16.043 6.26014L16.5963 7.42809L18.4037 6.57191L17.8505 5.40396L16.043 6.26014ZM6.65079 4.25926C9.67554 1.66661 14.3376 2.65979 16.043 6.26014L17.8505 5.40396C15.5805 0.61182 9.37523 -0.710131 5.34921 2.74074L6.65079 4.25926Z",fill:"currentColor"})}),onClick:ht,disabled:function(){if(m.length>0)return!1;if(n.runInpaintingManually){if(0===Z.length)return!0}else if(0===m.length)return!0;return!1}()}),Object(p.jsx)(Q,{toolTip:"Show Original",tooltipPosition:"top",icon:Object(p.jsx)(h.h,{}),className:pe?"eyeicon-active":"",onDown:function(e){e.preventDefault(),ve((function(){return window.setTimeout((function(){at(100)}),10),!0}))},onUp:function(){at(0),window.setTimeout((function(){ve(!1)}),350)},disabled:0===m.length}),Object(p.jsx)(Q,{toolTip:"Save Image",tooltipPosition:"top",icon:Object(p.jsx)(h.f,{}),disabled:!m.length,onClick:function(){var e=t.name.replace(/(\.[\w\d_-]+)$/i,"_cleanup$1");!function(e,t){var n=document.createElement("a");n.href=e,n.download=t,n.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window})),setTimeout((function(){n.remove()}),100)}(m[m.length-1].currentSrc,e)}}),n.runInpaintingManually&&Object(p.jsx)(Q,{toolTip:"Run Inpainting",tooltipPosition:"top",icon:Object(p.jsx)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:Object(p.jsx)("path",{d:"M2 13L1.34921 12.2407C1.16773 12.3963 1.04797 12.6117 1.01163 12.8479L2 13ZM22.5 4L23.49 4.14142C23.5309 3.85444 23.4454 3.5638 23.2555 3.3448C23.0655 3.1258 22.7899 3 22.5 3V4ZM12.5 4V3C12.2613 3 12.0305 3.08539 11.8492 3.24074L12.5 4ZM1 19.5L0.0116283 19.3479C-0.0327373 19.6363 0.051055 19.9297 0.241035 20.1511C0.431014 20.3726 0.708231 20.5 1 20.5V19.5ZM11.5 19.5V20.5C11.7373 20.5 11.9668 20.4156 12.1476 20.2619L11.5 19.5ZM21.5 11L22.1476 11.7619C22.3337 11.6038 22.4554 11.3831 22.49 11.1414L21.5 11ZM2 14H12.5V12H2V14ZM13.169 13.7433L23.169 4.74329L21.831 3.25671L11.831 12.2567L13.169 13.7433ZM22.5 3H12.5V5H22.5V3ZM11.8492 3.24074L1.34921 12.2407L2.65079 13.7593L13.1508 4.75926L11.8492 3.24074ZM1.01163 12.8479L0.0116283 19.3479L1.98837 19.6521L2.98837 13.1521L1.01163 12.8479ZM1 20.5H11.5V18.5H1V20.5ZM12.4884 19.6521L13.4884 13.1521L11.5116 12.8479L10.5116 19.3479L12.4884 19.6521ZM21.51 3.85858L20.51 10.8586L22.49 11.1414L23.49 4.14142L21.51 3.85858ZM20.8524 10.2381L10.8524 18.7381L12.1476 20.2619L22.1476 11.7619L20.8524 10.2381Z",fill:"currentColor"})}),disabled:!ot()||xe,onClick:function(){!xe&&ot()&&rt()}})]})]})]})}var re=n(25),oe=c.a.forwardRef((function(e,t){var n=e.show,a=e.children,c=e.onClose,i=e.className,r=e.title;return Object(p.jsx)(re.d,{open:n,onOpenChange:function(e){e||null===c||void 0===c||c()},children:Object(p.jsxs)(re.c,{children:[Object(p.jsx)(re.b,{className:"modal-mask"}),Object(p.jsxs)(re.a,{ref:t,className:"modal ".concat(i),children:[Object(p.jsxs)("div",{className:"modal-header",children:[Object(p.jsx)(re.e,{children:r}),Object(p.jsx)(Q,{icon:Object(p.jsx)(h.k,{}),onClick:c})]}),a]})]})})}));function se(e){var t=e.content,n=e.keys;return Object(p.jsxs)("div",{className:"shortcut-option",children:[Object(p.jsx)("div",{className:"shortcut-description",children:t}),Object(p.jsx)("div",{style:{display:"flex",justifySelf:"end",gap:"8px"},children:n.map((function(e,t){return Object(p.jsx)("div",{className:"shortcut-key",children:e},e)}))})]})}var le=/macintosh|mac os x/i.test(navigator.userAgent),ue=(/windows|win32/i.test(navigator.userAgent),le?"Cmd":"Ctrl");function je(){var e=Object(o.c)(I),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)(oe,{onClose:function(){a(!1)},title:"Hotkeys",className:"modal-shortcuts",show:n,children:Object(p.jsxs)("div",{className:"shortcut-options",children:[Object(p.jsx)(se,{content:"Enable Multi-Stroke Mask Drawing",keys:["Hold ".concat(ue)]}),Object(p.jsx)(se,{content:"Undo Inpainting",keys:[ue,"Z"]}),Object(p.jsx)(se,{content:"Pan",keys:["Space & Drag"]}),Object(p.jsx)(se,{content:"View Original Image",keys:["Hold Tag"]}),Object(p.jsx)(se,{content:"Reset Zoom/Pan",keys:["Esc"]}),Object(p.jsx)(se,{content:"Cancel Mask Drawing",keys:["Esc"]}),Object(p.jsx)(se,{content:"Run Inpainting Manually",keys:["Shift","R"]}),Object(p.jsx)(se,{content:"Decrease Brush Size",keys:["["]}),Object(p.jsx)(se,{content:"Increase Brush Size",keys:["]"]}),Object(p.jsx)(se,{content:"Toggle Dark Mode",keys:["Shift","D"]}),Object(p.jsx)(se,{content:"Toggle Hotkeys Panel",keys:["H"]})]})})}var de=n(39),be=["className"],he=["className"],fe=c.a.forwardRef((function(e,t){var n=e.className,a=Object(g.a)(e,be);return Object(p.jsx)(de.a,Object(b.a)(Object(b.a)({},a),{},{ref:t,className:"switch-root ".concat(n)}))})),pe=c.a.forwardRef((function(e,t){var n=e.className,a=Object(g.a)(e,he);return Object(p.jsx)(de.b,Object(b.a)(Object(b.a)({},a),{},{ref:t,className:"switch-thumb ".concat(n)}))})),ve=function(){var e=Object(o.c)(D),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)(w,{title:"Manual Inpainting Mode",input:Object(p.jsx)(fe,{checked:n.runInpaintingManually,onCheckedChange:function(e){a((function(t){return Object(b.a)(Object(b.a)({},t),{},{runInpaintingManually:e})}))},children:Object(p.jsx)(pe,{})})})};function Oe(e){var t=e.onClose,n=Object(o.c)(D),a=Object(s.a)(n,2),c=a[0],i=a[1];return Object(p.jsxs)(oe,{onClose:function(){i((function(e){return Object(b.a)(Object(b.a)({},e),{},{show:!1})})),t()},title:"Settings",className:"modal-setting",show:c.show,children:[Object(p.jsx)(ve,{}),Object(p.jsx)(L,{}),Object(p.jsx)(C,{})]})}var ge=n(28),xe=["state","desc"],me=function(){return Object(p.jsx)("span",{className:"loading-icon",children:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[Object(p.jsx)("line",{x1:"12",y1:"2",x2:"12",y2:"6"}),Object(p.jsx)("line",{x1:"12",y1:"18",x2:"12",y2:"22"}),Object(p.jsx)("line",{x1:"4.93",y1:"4.93",x2:"7.76",y2:"7.76"}),Object(p.jsx)("line",{x1:"16.24",y1:"16.24",x2:"19.07",y2:"19.07"}),Object(p.jsx)("line",{x1:"2",y1:"12",x2:"6",y2:"12"}),Object(p.jsx)("line",{x1:"18",y1:"12",x2:"22",y2:"12"}),Object(p.jsx)("line",{x1:"4.93",y1:"19.07",x2:"7.76",y2:"16.24"}),Object(p.jsx)("line",{x1:"16.24",y1:"7.76",x2:"19.07",y2:"4.93"})]})})},we=a.forwardRef((function(e,t){var n=e.state,a=e.desc,c=Object(g.a)(e,xe);return Object(p.jsxs)(ge.b,{children:[Object(p.jsxs)(ge.c,Object(b.a)(Object(b.a)({},c),{},{ref:t,className:"toast-root ".concat(n),children:[Object(p.jsx)("div",{className:"toast-icon",children:function(){switch(n){case"error":return Object(p.jsx)(h.g,{className:"error-icon"});case"success":return Object(p.jsx)(h.c,{className:"success-icon"});case"loading":return Object(p.jsx)(me,{});default:return Object(p.jsx)(p.Fragment,{})}}()}),Object(p.jsx)(ge.a,{className:"toast-desc",children:a})]})),Object(p.jsx)(ge.d,{className:"toast-viewpoint"})]})}));we.defaultProps={desc:"",state:"loading"};var ye=we,ke=function(e){var t=e.file,n=Object(o.c)(D),c=Object(s.a)(n,2),i=c[0],r=c[1],l=Object(o.c)(z),u=Object(s.a)(l,2),h=u[0],f=u[1],v=function(){var e=Object(d.a)(j.a.mark((function e(){var t,n,a,c,o;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,X().then((function(e){return e.text()}));case 2:if((t=e.sent)!==i.model){e.next=5;break}return e.abrupt("return");case 5:return e.next=7,(s=i.model,fetch("".concat(J,"/model_downloaded/").concat(s),{method:"GET"})).then((function(e){return e.text()}));case 7:n=e.sent,a=i.model,c="Switching to ".concat(a," model"),o=3e3,"False"===n&&(c="Downloading ".concat(a," model, this may take a while"),o=9999999999),f({open:!0,desc:c,state:"loading",duration:o}),Y(a).then((function(e){if(!e.ok)throw new Error("Server error");f({open:!0,desc:"Switch to ".concat(a," model success"),state:"success",duration:3e3})})).catch((function(){f({open:!0,desc:"Switch to ".concat(a," model failed"),state:"error",duration:3e3}),r((function(e){return Object(b.a)(Object(b.a)({},e),{},{model:t})}))}));case 14:case"end":return e.stop()}var s}),e)})));return function(){return e.apply(this,arguments)}}();return Object(a.useEffect)((function(){X().then((function(e){return e.text()})).then((function(e){r((function(t){return Object(b.a)(Object(b.a)({},t),{},{model:e})}))}))}),[r]),Object(p.jsxs)(p.Fragment,{children:[Object(p.jsx)(ie,{file:t}),Object(p.jsx)(Oe,{onClose:v}),Object(p.jsx)(je,{}),Object(p.jsx)(ye,Object(b.a)(Object(b.a)({},h),{},{onOpenChange:function(e){f((function(t){return Object(b.a)(Object(b.a)({},t),{},{open:e})}))}}))]})},Se=function(){var e=Object(o.c)(I),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(){a((function(e){return!e}))};return Object(l.a)("h",(function(e){null===e||void 0===e||e.preventDefault(),c()})),Object(p.jsx)("div",{className:"shortcuts",children:Object(p.jsx)(Q,{onClick:c,toolTip:"Hotkeys",tooltipPosition:"bottom",disabled:n,style:{border:0},icon:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",width:"28",height:"28",preserveAspectRatio:"xMidYMid meet",viewBox:"0 0 16 16",children:[Object(p.jsx)("rect",{x:"0",y:"0",width:"16",height:"16",fill:"none",stroke:"none"}),Object(p.jsxs)("g",{fill:"currentColor",children:[Object(p.jsx)("path",{d:"M14 5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h12zM2 4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H2z"}),Object(p.jsx)("path",{d:"M13 10.25a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm0-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5 0A.25.25 0 0 1 8.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 8 8.75v-.5zm2 0a.25.25 0 0 1 .25-.25h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5a.25.25 0 0 1-.25-.25v-.5zm1 2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5-2A.25.25 0 0 1 6.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 6 8.75v-.5zm-2 0A.25.25 0 0 1 4.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 4 8.75v-.5zm-2 0A.25.25 0 0 1 2.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 2 8.75v-.5zm11-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0A.25.25 0 0 1 9.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 9 6.75v-.5zm-2 0A.25.25 0 0 1 7.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 7 6.75v-.5zm-2 0A.25.25 0 0 1 5.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 5 6.75v-.5zm-3 0A.25.25 0 0 1 2.25 6h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5A.25.25 0 0 1 2 6.75v-.5zm0 4a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm2 0a.25.25 0 0 1 .25-.25h5.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-5.5a.25.25 0 0 1-.25-.25v-.5z"})]})]})})})},Ce=function(){var e=Object(o.c)(D),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)("div",{children:Object(p.jsx)(Q,{onClick:function(){a(Object(b.a)(Object(b.a)({},n),{},{show:!n.show}))},toolTip:"Settings",tooltipPosition:"bottom",style:{border:0},icon:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",role:"img",width:"28",height:"28",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2",children:[Object(p.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),Object(p.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]})})})},Me=function(){var e=Object(o.c)(N),t=Object(s.a)(e,2),n=t[0],a=t[1],c=T();return Object(p.jsxs)("header",{children:[Object(p.jsx)("div",{style:{visibility:n?"visible":"hidden"},children:Object(p.jsx)(Q,{icon:Object(p.jsx)(h.a,{}),onClick:function(){a(void 0)},style:{border:0},children:"desktop"===c?"Start New":void 0})}),Object(p.jsxs)("div",{className:"header-icons-wrapper",children:[Object(p.jsx)(H,{}),n&&Object(p.jsxs)("div",{className:"header-icons",children:[Object(p.jsx)(Se,{}),Object(p.jsx)(Ce,{})]})]})]})};!function(){function e(){return e=Object(d.a)(j.a.mark((function e(){var t,n,a=arguments;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=a.length>0&&void 0!==a[0]?a[0]:"",e.next=3,fetch(t,{method:"GET",cache:"no-cache"});case 3:return n=e.sent,e.abrupt("return",n.json());case 5:case"end":return e.stop()}}),e)}))),e.apply(this,arguments)}var t=function(){(function(){return e.apply(this,arguments)})(document.location+"/flaskwebgui-keep-server-alive").then((function(e){return e}))};document.addEventListener("DOMContentLoaded",(function(){t(),setInterval(t,3e3)}))}();var Le=function(){var e=Object(o.c)(N),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(o.c)(P),r=Object(s.a)(i,2),u=r[0],b=r[1],h=function(){var e=Object(a.useState)(),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(a.useCallback)((function(){var e=new Headers;e.append("pragma","no-cache"),e.append("cache-control","no-cache"),fetch("/inputimage",{headers:e}).then(function(){var e=Object(d.a)(j.a.mark((function e(t){var n,a,i,r;return j.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=null===(n=t.headers.get("content-disposition"))||void 0===n?void 0:n.split("filename=")[1].split(";")[0],e.next=3,t.blob();case 3:(i=e.sent)&&i.type.startsWith("image")&&(r=new File([i],void 0!==a?a:"inputImage"),c(r));case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}),[c]);return Object(a.useEffect)((function(){i()}),[i]),n}();return Object(a.useEffect)((function(){c(h)}),[h,c]),Object(l.a)("D",(function(e){null===e||void 0===e||e.preventDefault(),b("light"===u?"dark":"light")})),Object(a.useEffect)((function(){document.body.setAttribute("data-theme",u)}),[u]),Object(p.jsxs)("div",{className:"lama-cleaner",children:[Object(p.jsx)(Me,{}),n?Object(p.jsx)(ke,{file:n}):Object(p.jsx)(Z,{})]})};r.a.render(Object(p.jsx)(c.a.StrictMode,{children:Object(p.jsx)(o.a,{children:Object(p.jsx)(Le,{})})}),document.getElementById("root"))}},[[51,1,2]]]); \ No newline at end of file diff --git a/lama_cleaner/app/build/static/js/main.9f4ed6dc.chunk.js b/lama_cleaner/app/build/static/js/main.9f4ed6dc.chunk.js new file mode 100644 index 0000000..7863418 --- /dev/null +++ b/lama_cleaner/app/build/static/js/main.9f4ed6dc.chunk.js @@ -0,0 +1 @@ +(this["webpackJsonplama-cleaner"]=this["webpackJsonplama-cleaner"]||[]).push([[0],{48:function(e,t,n){},51:function(e,t,n){"use strict";n.r(t);var a=n(0),c=n.n(a),i=n(15),r=n.n(i),o=(n(48),n(10)),s=n(2),l=n(55),u=n(8),d=n.n(u),j=n(14);var b=n(3),h=n(16),f=n(21),p=n(1),v=function(e){var t=e.width,n=e.value,c=e.chevronDirection,i=e.options,r=e.autoFocusAfterClose,o=e.onChange,s=Object(a.useRef)(null);return Object(p.jsxs)(f.f,{value:n,onValueChange:o,onOpenChange:function(e){e||r||window.setTimeout((function(){var e;null===s||void 0===s||null===(e=s.current)||void 0===e||e.blur()}),100)},children:[Object(p.jsxs)(f.g,{className:"select-trigger",style:{width:t},ref:s,children:[Object(p.jsx)(f.h,{}),Object(p.jsx)(f.b,{children:"up"===c?Object(p.jsx)(h.e,{}):Object(p.jsx)(h.d,{})})]}),Object(p.jsx)(f.a,{className:"select-content",children:Object(p.jsx)(f.i,{className:"select-viewport",children:i.map((function(e){return Object(p.jsxs)(f.c,{value:e,className:"select-item",children:[Object(p.jsx)(f.e,{children:e}),Object(p.jsx)(f.d,{className:"select-item-indicator",children:Object(p.jsx)(h.c,{})})]},e)}))})})]})};v.defaultProps={chevronDirection:"down",autoFocusAfterClose:!0};var O=v,g=n(4),m=["value","onValue"],x=c.a.forwardRef((function(e,t){var n=e.value,a=e.onValue,c=Object(g.a)(e,m);return Object(p.jsx)("input",Object(b.a)(Object(b.a)({value:n,onInput:function(e){var t=e.target.value.replace(/\D/g,"");null===a||void 0===a||a(t)},className:"number-input"},c),{},{ref:t,type:"text"}))}));var w=function(e){var t=e.title,n=e.desc,a=e.input,c=e.optionDesc,i=e.className;return Object(p.jsxs)("div",{className:"setting-block ".concat(i),children:[Object(p.jsxs)("div",{className:"setting-block-content",children:[Object(p.jsxs)("div",{className:"setting-block-content-title",children:[Object(p.jsx)("span",{children:t}),n&&Object(p.jsx)("span",{className:"setting-block-desc",children:n})]}),a]}),c&&Object(p.jsx)("div",{className:"option-desc",children:c})]})};var y,k,S=function(e){var t=e.title,n=e.value,a=e.suffix,c=e.onValue;return Object(p.jsx)(w,{className:"sub-setting-block",title:t,input:Object(p.jsxs)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",gap:"8px"},children:[Object(p.jsx)(x,{style:{width:"80px"},value:"".concat(n),onValue:c}),a&&Object(p.jsx)("span",{children:a})]})})};!function(e){e.ORIGINAL="Original",e.RESIZE="Resize",e.CROP="Crop"}(y||(y={})),function(e){e.ddim="ddim",e.plms="plms"}(k||(k={}));var C,M=function(){var e=Object(o.c)(R),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(e){a((function(t){return Object(b.a)(Object(b.a)({},t),{},{hdStrategy:e})}))},i=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyResizeLimit:t})}))},r=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyCropTrigerSize:t})}))},l=function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{hdStrategyCropMargin:t})}))},u=function(){return Object(p.jsxs)("div",{children:["Use the original resolution of the picture, suitable for picture size below 2K. Try"," ",Object(p.jsx)("div",{tabIndex:0,role:"button",className:"inline-tip",onClick:function(){return c(y.RESIZE)},children:"Resize Strategy"})," ","if you do not get good results on high resolution images."]})};return Object(p.jsx)(w,{className:"hd-setting-block",title:"High Resolution Strategy",input:Object(p.jsx)(O,{width:80,value:n.hdStrategy,options:Object.values(y),onChange:function(e){return c(e)}}),optionDesc:function(){switch(n.hdStrategy){case y.ORIGINAL:return u();case y.CROP:return Object(p.jsxs)("div",{children:[Object(p.jsx)("div",{children:"Crop masking area from the original image to do inpainting, and paste the result back. Mainly for performance and memory reasons on high resolution image."}),Object(p.jsx)(S,{title:"Trigger size",value:"".concat(n.hdStrategyCropTrigerSize),suffix:"pixel",onValue:r}),Object(p.jsx)(S,{title:"Crop margin",value:"".concat(n.hdStrategyCropMargin),suffix:"pixel",onValue:l})]});case y.RESIZE:return Object(p.jsxs)("div",{children:[Object(p.jsx)("div",{children:"Resize the longer side of the image to a specific size(keep ratio), then do inpainting on the resized image."}),Object(p.jsx)(S,{title:"Size limit",value:"".concat(n.hdStrategyResizeLimit),suffix:"pixel",onValue:i})]});default:return u()}}()})};!function(e){e.LAMA="lama",e.LDM="ldm"}(C||(C={}));var L,N=function(){var e=Object(o.c)(R),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(e,t,n){return Object(p.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"4px"},children:[Object(p.jsx)("a",{className:"model-desc-link",href:t,target:"_blank",rel:"noreferrer noopener",children:e}),Object(p.jsx)("a",{className:"model-desc-link",href:n,target:"_blank",rel:"noreferrer noopener",children:n})]})},i=function(){return Object(p.jsxs)("div",{children:[c("High-Resolution Image Synthesis with Latent Diffusion Models","https://arxiv.org/abs/2112.10752","https://github.com/CompVis/latent-diffusion"),Object(p.jsx)(S,{title:"Steps",value:"".concat(n.ldmSteps),onValue:function(e){var t=0===e.length?0:parseInt(e,10);a((function(e){return Object(b.a)(Object(b.a)({},e),{},{ldmSteps:t})}))}}),Object(p.jsx)(w,{className:"sub-setting-block",title:"Sampler",input:Object(p.jsx)(O,{width:80,value:n.ldmSampler,options:Object.values(k),onChange:function(e){return t=e,void a((function(e){return Object(b.a)(Object(b.a)({},e),{},{ldmSampler:t})}));var t}})})]})};return Object(p.jsx)(w,{className:"model-setting-block",title:"Inpainting Model",input:Object(p.jsx)(O,{width:80,value:n.model,options:Object.values(C),onChange:function(e){return t=e,void a((function(e){return Object(b.a)(Object(b.a)({},e),{},{model:t})}));var t}}),optionDesc:function(){switch(n.model){case C.LAMA:return c("Resolution-robust Large Mask Inpainting with Fourier Convolutions","https://arxiv.org/abs/2109.07161","https://github.com/saic-mdal/lama");case C.LDM:return i();default:return Object(p.jsx)(p.Fragment,{})}}()})},z=Object(o.b)({key:"fileState",default:void 0}),E=Object(o.b)({key:"toastState",default:{open:!1,desc:"",state:"default",duration:3e3}}),I=Object(o.b)({key:"shortcutsState",default:!1}),D={show:!1,runInpaintingManually:!1,model:C.LAMA,ldmSteps:50,ldmSampler:k.plms,hdStrategy:y.RESIZE,hdStrategyResizeLimit:2048,hdStrategyCropTrigerSize:2048,hdStrategyCropMargin:128},R=Object(o.b)({key:"settingsState",default:D,effects:[(L="settingsState",function(e){var t=e.setSelf,n=e.onSet,a=localStorage.getItem(L);if(null!=a){var c=JSON.parse(a);c.show=!1,t(c)}n((function(e,t,n){return n?localStorage.removeItem(L):localStorage.setItem(L,JSON.stringify(e))}))})]}),T=n(9),A=function(){var e=Object(a.useState)(window.innerWidth),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(a.useCallback)((function(){c(window.innerWidth)}),[]);return Object(a.useEffect)((function(){return window.addEventListener("resize",i),function(){window.removeEventListener("resize",i)}})),n<768?"mobile":n>=768&&n<1224?"tablet":n>=1224?"desktop":void 0};function Z(e){var t=e.onSelection,n=Object(a.useState)(!1),c=Object(s.a)(n,2),i=c[0],r=c[1],o=Object(a.useState)("file-upload-".concat(Math.random().toString())),l=Object(s.a)(o,1)[0],u=A();function b(e){if(e&&e.type.match("image.*"))try{if(e.size>20971520)throw new Error("file too large");t(e)}catch(n){alert("error: ".concat(n.message))}}function h(e){return f.apply(this,arguments)}function f(){return(f=Object(j.a)(d.a.mark((function e(t){return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){t.file((function(t){return e(t)}))})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function v(e){return O.apply(this,arguments)}function O(){return(O=Object(j.a)(d.a.mark((function e(t){var n,a,c,i,r;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:for(n=[],a=[],c=0;c0)){e.next=23;break}if(!(null===(i=a.shift())||void 0===i?void 0:i.isFile)){e.next=12;break}return e.next=8,h(i);case 8:r=e.sent,n.push(r),e.next=21;break;case 12:if(!(null===i||void 0===i?void 0:i.isDirectory)){e.next=21;break}return e.t0=a.push,e.t1=a,e.t2=T.a,e.next=18,g(i.createReader());case 18:e.t3=e.sent,e.t4=(0,e.t2)(e.t3),e.t0.apply.call(e.t0,e.t1,e.t4);case 21:e.next=3;break;case 23:return e.abrupt("return",n);case 24:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function g(e){return m.apply(this,arguments)}function m(){return(m=Object(j.a)(d.a.mark((function e(t){var n,a;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=[],e.next=3,x(t);case 3:a=e.sent;case 4:if(!(a.length>0)){e.next=11;break}return n.push.apply(n,Object(T.a)(a)),e.next=8,x(t);case 8:a=e.sent,e.next=4;break;case 11:return e.abrupt("return",n);case 12:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function x(e){return w.apply(this,arguments)}function w(){return(w=Object(j.a)(d.a.mark((function e(t){return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e,n){t.readEntries(e,n)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function y(){return(y=Object(j.a)(d.a.mark((function e(t){var n;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),e.next=3,v(t.dataTransfer.items);case 3:n=e.sent,r(!1),b(n[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(p.jsx)("label",{htmlFor:l,className:"file-select-label",children:Object(p.jsxs)("div",{className:["file-select-container",i?"file-select-label-hover":""].join(" "),onDrop:function(e){return y.apply(this,arguments)},onDragOver:function(e){e.stopPropagation(),e.preventDefault(),r(!0)},onDragLeave:function(){return r(!1)},children:[Object(p.jsx)("input",{id:l,name:l,type:"file",onChange:function(e){var t,n=null===(t=e.currentTarget.files)||void 0===t?void 0:t[0];n&&b(n)},accept:"image/png, image/jpeg"}),Object(p.jsx)("p",{className:"file-select-message",children:"desktop"===u?"Click here or drag an image file":"Tap here to load your picture"})]})})}var P=function(){var e=Object(o.e)(z);return Object(p.jsxs)("div",{className:"landing-page",children:[Object(p.jsxs)("h1",{children:["Image inpainting powered by \ud83e\udd99",Object(p.jsx)("a",{href:"https://github.com/saic-mdal/lama",children:"LaMa"})]}),Object(p.jsx)("div",{className:"landing-file-selector",children:Object(p.jsx)(Z,{onSelection:function(){var t=Object(j.a)(d.a.mark((function t(n){return d.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e(n);case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()})})]})},H=Object(o.b)({key:"themeState",default:"light"}),V=function(){var e=Object(o.c)(H),t=Object(s.a)(e,2),n=t[0],c=t[1];Object(a.useEffect)((function(){window.matchMedia("(prefers-color-scheme: dark)").matches?c("dark"):c("light")}),[c]);return Object(p.jsx)("div",{className:"theme-toggle-ui",children:Object(p.jsx)("div",{className:"theme-btn",onClick:function(){c("light"===n?"dark":"light")},role:"button",tabIndex:0,"aria-hidden":"true",children:"light"===n?Object(p.jsx)(h.i,{}):Object(p.jsx)(h.j,{style:{color:"#ffcc00"}})})})},F=n(38),W=n(54),U=n(40);function B(e){for(var t=e.split(",")[0].split(":")[1].split(";")[0],n=atob(e.split(",")[1]),a=[],c=0;ct){var c=Math.ceil(t*a);return"".concat(e,"x").concat(c)}var i=Math.ceil(n*a);return"".concat(i,"x").concat(e)}),[n,t,u]),j=Object(a.useCallback)((function(){for(var e=[],t=0;tt?(l(a[0]),c(parseInt(a[0],10))):(l(a[1]),c(parseInt(a[1],10)))},chevronDirection:"up"})}var ae="#ffcc00bb";function ce(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ae;e.strokeStyle=n,e.lineCap="round",e.lineJoin="round",t.forEach((function(t){(null===t||void 0===t?void 0:t.pts.length)&&t.size&&(e.lineWidth=t.size,e.beginPath(),e.moveTo(t.pts[0].x,t.pts[0].y),t.pts.forEach((function(t){return e.lineTo(t.x,t.y)})),e.stroke())}))}function ie(e){var t=e.nativeEvent;return{x:t.offsetX,y:t.offsetY}}function re(e){var t=e.file,n=Object(o.d)(R),c=Object(o.c)(E),i=Object(s.a)(c,2),r=(i[0],i[1]),u=Object(a.useState)(40),b=Object(s.a)(u,2),f=b[0],v=b[1],O=function(e){var t=Object(a.useState)(new Image),n=Object(s.a)(t,1)[0],c=Object(a.useState)(!1),i=Object(s.a)(c,2),r=i[0],o=i[1];return Object(a.useEffect)((function(){return n.onload=function(){o(!0)},o(!1),n.src=URL.createObjectURL(e),function(){n.onload=null}}),[e,n]),[n,r]}(t),g=Object(s.a)(O,2),m=g[0],x=g[1],w=Object(a.useState)([]),y=Object(s.a)(w,2),k=y[0],S=y[1],C=Object(a.useState)(),M=Object(s.a)(C,2),L=M[0],N=M[1],z=Object(a.useState)((function(){return document.createElement("canvas")})),I=Object(s.a)(z,1)[0],D=Object(a.useState)([]),A=Object(s.a)(D,2),Z=A[0],P=A[1],H=Object(a.useState)([]),V=Object(s.a)(H,2),B=V[0],K=V[1],Y=Object(a.useState)({x:-1,y:-1}),X=Object(s.a)(Y,2),$=X[0],Q=$.x,te=$.y,ae=X[1],re=Object(a.useState)(!1),oe=Object(s.a)(re,2),se=oe[0],le=oe[1],ue=Object(a.useState)(!1),de=Object(s.a)(ue,2),je=de[0],be=de[1],he=Object(a.useState)(!1),fe=Object(s.a)(he,2),pe=fe[0],ve=fe[1],Oe=Object(a.useState)(!1),ge=Object(s.a)(Oe,2),me=ge[0],xe=ge[1],we=Object(a.useState)(!1),ye=Object(s.a)(we,2),ke=ye[0],Se=ye[1],Ce=Object(a.useState)(1),Me=Object(s.a)(Ce,2),Le=Me[0],Ne=Me[1],ze=Object(a.useState)(!1),Ee=Object(s.a)(ze,2),Ie=Ee[0],De=Ee[1],Re=Object(a.useState)(1),Te=Object(s.a)(Re,2),Ae=Te[0],Ze=Te[1],Pe=Object(a.useState)(1080),He=Object(s.a)(Pe,2),Ve=He[0],Fe=He[1],We=Object(W.a)(),Ue=We.width/2,Be=We.height/2,Ge=Object(a.useRef)(),Je=Object(a.useState)(!1),Ke=Object(s.a)(Je,2),_e=Ke[0],Ye=Ke[1],Xe=Object(a.useState)(!1),$e=Object(s.a)(Xe,2),Qe=$e[0],qe=$e[1],et=Object(a.useState)(!1),tt=Object(s.a)(et,2),nt=tt[0],at=tt[1],ct=Object(a.useState)(0),it=Object(s.a)(ct,2),rt=it[0],ot=it[1],st=Object(a.useCallback)((function(e,t){L&&(L.clearRect(0,0,L.canvas.width,L.canvas.height),L.drawImage(e,0,0,m.naturalWidth,m.naturalHeight),ce(L,t))}),[L,m]),lt=function(e){if(!(null===L||void 0===L?void 0:L.canvas.width)||!(null===L||void 0===L?void 0:L.canvas.height))throw new Error("canvas has invalid size");I.width=null===L||void 0===L?void 0:L.canvas.width,I.height=null===L||void 0===L?void 0:L.canvas.height;var t=I.getContext("2d");if(!t)throw new Error("could not retrieve mask canvas");e.forEach((function(e){ce(t,e,"white")}))},ut=function(){var e=Object(j.a)(d.a.mark((function e(){var a,c,i,o;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(dt()){e.next=2;break}return e.abrupt("return");case 2:return a=[].concat(Object(T.a)(Z),[B]),K([]),qe(!1),Se(!0),lt(a),e.prev=7,e.next=10,_(t,I.toDataURL(),n,Ve.toString());case 10:if(c=e.sent){e.next=13;break}throw new Error("empty response");case 13:return i=new Image,e.next=16,G(i,c);case 16:o=[].concat(Object(T.a)(k),[i]),S(o),st(i,[]),P(a),e.next=26;break;case 22:e.prev=22,e.t0=e.catch(7),r({open:!0,desc:e.t0.message?e.t0.message:e.t0.toString(),state:"error",duration:2e3}),bt([]);case 26:Se(!1);case 27:case"end":return e.stop()}}),e,null,[[7,22]])})));return function(){return e.apply(this,arguments)}}(),dt=function(){return 0!==B.length},jt=function(){return 0!==k.length},bt=Object(a.useCallback)((function(e){0===k.length?st(m,e):st(k[k.length-1],e)}),[m,k,st]),ht=function(e){return"Control"===e.key||"Meta"===e.key};Object(U.a)(ht,(function(){nt&&(ke||(at(!1),n.runInpaintingManually||ut()))}),{event:"keyup"},[ke,nt,dt]),Object(U.a)(ht,(function(){ke||at(!0)}),{event:"keydown"},[ke]),Object(a.useEffect)((function(){if(x){var e=We.width/m.naturalWidth,t=(We.height-200)/m.naturalHeight,n=1;if((e<1||t<1)&&(n=Math.min(e,t)),Ze(n),Ne(n),(null===L||void 0===L?void 0:L.canvas)&&(L.canvas.width=m.naturalWidth,L.canvas.height=m.naturalHeight,bt([])),!_e){var a;null===(a=Ge.current)||void 0===a||a.centerView(n,1),Ye(!0);var c=Math.max(m.width,m.height);Fe(c)}}}),[null===L||void 0===L?void 0:L.canvas,Ge,m,x,We,_e,bt]);var ft=Object(a.useCallback)((function(){if(Ae&&m&&We){var e=Ge.current;if(!e)throw new Error("no viewport");var t=(We.width-m.width*Ae)/2,n=(We.height-m.height*Ae)/2;e.setTransform(t,n,Ae,200,"easeOutQuad"),e.state.scale=Ae,Ne(Ae),De(!1)}}),[Ge,Ae,m,We]);Object(a.useEffect)((function(){return window.addEventListener("resize",(function(){ft()})),function(){window.removeEventListener("resize",(function(){ft()}))}}),[We,ft]);Object(U.a)("Escape",(function(){ke||(Qe||nt?(qe(!1),K([]),bt([])):ft())}),{event:"keydown"},[Qe,ke,nt,ft,bt]);var pt=Object(a.useCallback)((function(){if(0!==B.length){var e=B.slice(0,B.length-1);K(e),bt(e)}}),[B,bt]),vt=Object(a.useCallback)((function(){if(k.length){var e=Z.slice(0,Z.length-1);P(e),K([]),qe(!1);var t=k.slice(0,k.length-1);S(t),0===t.length?st(m,[]):st(t[t.length-1],[])}}),[st,k,Z,m]),Ot=function(){n.runInpaintingManually&&0!==B.length?pt():vt()};Object(U.a)((function(e){var t=(e.metaKey||e.ctrlKey)&&"z"===e.key;return"Tab"===e.key&&e.preventDefault(),!!t&&(e.preventDefault(),!0)}),Ot,void 0,[pt,vt]);Object(l.a)("Tab",(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),jt()&&xe((function(){return window.setTimeout((function(){ot(100)}),10),!0}))}),(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),jt()&&(ot(0),window.setTimeout((function(){xe(!1)}),350))}));var gt=function(e){e===se||pe||le(e)},mt=Object(a.useCallback)((function(){return pe?"grab":se?"none":void 0}),[se,pe]);Object(l.a)("[",(function(){v((function(e){return e>10?e-10:e<=10&&e>0?e-5:e}))})),Object(l.a)("]",(function(){v((function(e){return e+10}))})),Object(l.a)("R",(function(){n.runInpaintingManually&&dt()&&ut()})),Object(l.a)(" ",(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),le(!1),ve(!0)}),(function(e){null===e||void 0===e||e.preventDefault(),null===e||void 0===e||e.stopPropagation(),le(!0),ve(!1)}));var xt=function(e,t){var n=function(){var e,t,n=Ae;return void 0!==(null===(e=Ge.current)||void 0===e?void 0:e.state.scale)&&(n=null===(t=Ge.current)||void 0===t?void 0:t.state.scale),n}();return{width:"".concat(f*n,"px"),height:"".concat(f*n,"px"),left:"".concat(e,"px"),top:"".concat(t,"px"),transform:"translate(-50%, -50%)"}};return Object(p.jsxs)("div",{className:"editor-container","aria-hidden":"true",onMouseMove:function(e){var t=e.nativeEvent;ae({x:t.pageX,y:t.pageY})},onMouseUp:function(e){(J(e)&&ve(!1),pe)||m.src&&(null===L||void 0===L?void 0:L.canvas)&&(ke||Qe&&(nt||n.runInpaintingManually?qe(!1):ut()))},children:[Object(p.jsx)(F.b,{ref:function(e){e&&(Ge.current=e)},panning:{disabled:!pe,velocityDisabled:!0},wheel:{step:.05},centerZoomedOut:!0,alignmentAnimation:{disabled:!0},limitToBounds:!1,doubleClick:{disabled:!0},initialScale:Ae,minScale:Ae,onPanning:function(e){Ie||De(!0)},onZoom:function(e){Ne(e.state.scale)},children:Object(p.jsx)(F.a,{contentClass:ke?"editor-canvas-loading":"",contentStyle:{visibility:_e?"visible":"hidden"},children:Object(p.jsxs)("div",{className:"editor-canvas-container",children:[Object(p.jsx)("canvas",{className:"editor-canvas",style:{cursor:mt(),clipPath:"inset(0 ".concat(rt,"% 0 0)"),transition:"clip-path 350ms ease-in-out"},onContextMenu:function(e){e.preventDefault()},onMouseOver:function(){gt(!0),be(!1)},onFocus:function(){return gt(!0)},onMouseLeave:function(){return gt(!1)},onMouseDown:function(e){if(!pe&&(m.src&&(null===L||void 0===L?void 0:L.canvas)&&!ke&&!function(e){return 2===e.nativeEvent.button}(e)))if(J(e))ve(!0);else{qe(!0);var t=[];(nt||n.runInpaintingManually)&&(t=Object(T.a)(B)),t.push({size:f,pts:[ie(e)]}),K(t),bt(t)}},onMouseMove:function(e){if(!pe&&Qe&&0!==B.length){var t=Object(T.a)(B);t[t.length-1].pts.push(ie(e)),K(t),bt(t)}},ref:function(e){if(e&&!L){var t=e.getContext("2d");t&&N(t)}}}),Object(p.jsxs)("div",{className:"original-image-container",style:{width:"".concat(m.naturalWidth,"px"),height:"".concat(m.naturalHeight,"px")},children:[me&&Object(p.jsx)("div",{className:"editor-slider",style:{marginRight:"".concat(rt,"%")}}),Object(p.jsx)("img",{className:"original-image",src:m.src,alt:"original",style:{width:"".concat(m.naturalWidth,"px"),height:"".concat(m.naturalHeight,"px")}})]})]})})}),se&&!ke&&!pe&&Object(p.jsx)("div",{className:"brush-shape",style:xt(Q,te)}),je&&Object(p.jsx)("div",{className:"brush-shape",style:xt(Ue,Be)}),Object(p.jsxs)("div",{className:"editor-toolkit-panel",children:[Object(p.jsx)(ne,{onChange:function(e){Fe(e)},originalWidth:m.naturalWidth,originalHeight:m.naturalHeight}),Object(p.jsx)(ee,{label:"Brush",min:10,max:150,value:f,onChange:function(e){v(e),je||(be(!0),window.setTimeout((function(){be(!1)}),1e4))},onClick:function(){return be(!1)}}),Object(p.jsxs)("div",{className:"editor-toolkit-btns",children:[Object(p.jsx)(q,{toolTip:"Reset Zoom & Pan",tooltipPosition:"top",icon:Object(p.jsx)(h.b,{}),disabled:Le===Ae&&!1===Ie,onClick:ft}),Object(p.jsx)(q,{toolTip:"Undo",tooltipPosition:"top",icon:Object(p.jsx)("svg",{width:"19",height:"9",viewBox:"0 0 19 9",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:Object(p.jsx)("path",{d:"M2 1C2 0.447715 1.55228 0 1 0C0.447715 0 0 0.447715 0 1H2ZM1 8H0V9H1V8ZM8 9C8.55228 9 9 8.55229 9 8C9 7.44771 8.55228 7 8 7V9ZM16.5963 7.42809C16.8327 7.92721 17.429 8.14016 17.9281 7.90374C18.4272 7.66731 18.6402 7.07103 18.4037 6.57191L16.5963 7.42809ZM16.9468 5.83205L17.8505 5.40396L16.9468 5.83205ZM0 1V8H2V1H0ZM1 9H8V7H1V9ZM1.66896 8.74329L6.66896 4.24329L5.33104 2.75671L0.331035 7.25671L1.66896 8.74329ZM16.043 6.26014L16.5963 7.42809L18.4037 6.57191L17.8505 5.40396L16.043 6.26014ZM6.65079 4.25926C9.67554 1.66661 14.3376 2.65979 16.043 6.26014L17.8505 5.40396C15.5805 0.61182 9.37523 -0.710131 5.34921 2.74074L6.65079 4.25926Z",fill:"currentColor"})}),onClick:Ot,disabled:function(){if(k.length>0)return!1;if(n.runInpaintingManually){if(0===B.length)return!0}else if(0===k.length)return!0;return!1}()}),Object(p.jsx)(q,{toolTip:"Show Original",tooltipPosition:"top",icon:Object(p.jsx)(h.h,{}),className:me?"eyeicon-active":"",onDown:function(e){e.preventDefault(),xe((function(){return window.setTimeout((function(){ot(100)}),10),!0}))},onUp:function(){ot(0),window.setTimeout((function(){xe(!1)}),350)},disabled:0===k.length}),Object(p.jsx)(q,{toolTip:"Save Image",tooltipPosition:"top",icon:Object(p.jsx)(h.f,{}),disabled:!k.length,onClick:function(){var e=t.name.replace(/(\.[\w\d_-]+)$/i,"_cleanup$1");!function(e,t){var n=document.createElement("a");n.href=e,n.download=t,n.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window})),setTimeout((function(){n.remove()}),100)}(k[k.length-1].currentSrc,e)}}),n.runInpaintingManually&&Object(p.jsx)(q,{toolTip:"Run Inpainting",tooltipPosition:"top",icon:Object(p.jsx)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:Object(p.jsx)("path",{d:"M2 13L1.34921 12.2407C1.16773 12.3963 1.04797 12.6117 1.01163 12.8479L2 13ZM22.5 4L23.49 4.14142C23.5309 3.85444 23.4454 3.5638 23.2555 3.3448C23.0655 3.1258 22.7899 3 22.5 3V4ZM12.5 4V3C12.2613 3 12.0305 3.08539 11.8492 3.24074L12.5 4ZM1 19.5L0.0116283 19.3479C-0.0327373 19.6363 0.051055 19.9297 0.241035 20.1511C0.431014 20.3726 0.708231 20.5 1 20.5V19.5ZM11.5 19.5V20.5C11.7373 20.5 11.9668 20.4156 12.1476 20.2619L11.5 19.5ZM21.5 11L22.1476 11.7619C22.3337 11.6038 22.4554 11.3831 22.49 11.1414L21.5 11ZM2 14H12.5V12H2V14ZM13.169 13.7433L23.169 4.74329L21.831 3.25671L11.831 12.2567L13.169 13.7433ZM22.5 3H12.5V5H22.5V3ZM11.8492 3.24074L1.34921 12.2407L2.65079 13.7593L13.1508 4.75926L11.8492 3.24074ZM1.01163 12.8479L0.0116283 19.3479L1.98837 19.6521L2.98837 13.1521L1.01163 12.8479ZM1 20.5H11.5V18.5H1V20.5ZM12.4884 19.6521L13.4884 13.1521L11.5116 12.8479L10.5116 19.3479L12.4884 19.6521ZM21.51 3.85858L20.51 10.8586L22.49 11.1414L23.49 4.14142L21.51 3.85858ZM20.8524 10.2381L10.8524 18.7381L12.1476 20.2619L22.1476 11.7619L20.8524 10.2381Z",fill:"currentColor"})}),disabled:!dt()||ke,onClick:function(){!ke&&dt()&&ut()}})]})]})]})}var oe=n(25),se=c.a.forwardRef((function(e,t){var n=e.show,a=e.children,c=e.onClose,i=e.className,r=e.title;return Object(p.jsx)(oe.d,{open:n,onOpenChange:function(e){e||null===c||void 0===c||c()},children:Object(p.jsxs)(oe.c,{children:[Object(p.jsx)(oe.b,{className:"modal-mask"}),Object(p.jsxs)(oe.a,{ref:t,className:"modal ".concat(i),children:[Object(p.jsxs)("div",{className:"modal-header",children:[Object(p.jsx)(oe.e,{children:r}),Object(p.jsx)(q,{icon:Object(p.jsx)(h.k,{}),onClick:c})]}),a]})]})})}));function le(e){var t=e.content,n=e.keys;return Object(p.jsxs)("div",{className:"shortcut-option",children:[Object(p.jsx)("div",{className:"shortcut-description",children:t}),Object(p.jsx)("div",{style:{display:"flex",justifySelf:"end",gap:"8px"},children:n.map((function(e,t){return Object(p.jsx)("div",{className:"shortcut-key",children:e},e)}))})]})}var ue=/macintosh|mac os x/i.test(navigator.userAgent),de=(/windows|win32/i.test(navigator.userAgent),ue?"Cmd":"Ctrl");function je(){var e=Object(o.c)(I),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)(se,{onClose:function(){a(!1)},title:"Hotkeys",className:"modal-shortcuts",show:n,children:Object(p.jsxs)("div",{className:"shortcut-options",children:[Object(p.jsx)(le,{content:"Enable Multi-Stroke Mask Drawing",keys:["Hold ".concat(de)]}),Object(p.jsx)(le,{content:"Undo Inpainting",keys:[de,"Z"]}),Object(p.jsx)(le,{content:"Pan",keys:["Space & Drag"]}),Object(p.jsx)(le,{content:"View Original Image",keys:["Hold Tab"]}),Object(p.jsx)(le,{content:"Reset Zoom/Pan",keys:["Esc"]}),Object(p.jsx)(le,{content:"Cancel Mask Drawing",keys:["Esc"]}),Object(p.jsx)(le,{content:"Run Inpainting Manually",keys:["Shift","R"]}),Object(p.jsx)(le,{content:"Decrease Brush Size",keys:["["]}),Object(p.jsx)(le,{content:"Increase Brush Size",keys:["]"]}),Object(p.jsx)(le,{content:"Toggle Dark Mode",keys:["Shift","D"]}),Object(p.jsx)(le,{content:"Toggle Hotkeys Panel",keys:["H"]})]})})}var be=n(39),he=["className"],fe=["className"],pe=c.a.forwardRef((function(e,t){var n=e.className,a=Object(g.a)(e,he);return Object(p.jsx)(be.a,Object(b.a)(Object(b.a)({},a),{},{ref:t,className:"switch-root ".concat(n)}))})),ve=c.a.forwardRef((function(e,t){var n=e.className,a=Object(g.a)(e,fe);return Object(p.jsx)(be.b,Object(b.a)(Object(b.a)({},a),{},{ref:t,className:"switch-thumb ".concat(n)}))})),Oe=function(){var e=Object(o.c)(R),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)(w,{title:"Manual Inpainting Mode",input:Object(p.jsx)(pe,{checked:n.runInpaintingManually,onCheckedChange:function(e){a((function(t){return Object(b.a)(Object(b.a)({},t),{},{runInpaintingManually:e})}))},children:Object(p.jsx)(ve,{})})})};function ge(e){var t=e.onClose,n=Object(o.c)(R),a=Object(s.a)(n,2),c=a[0],i=a[1];return Object(p.jsxs)(se,{onClose:function(){i((function(e){return Object(b.a)(Object(b.a)({},e),{},{show:!1})})),t()},title:"Settings",className:"modal-setting",show:c.show,children:[Object(p.jsx)(Oe,{}),Object(p.jsx)(N,{}),Object(p.jsx)(M,{})]})}var me=n(28),xe=["state","desc"],we=function(){return Object(p.jsx)("span",{className:"loading-icon",children:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[Object(p.jsx)("line",{x1:"12",y1:"2",x2:"12",y2:"6"}),Object(p.jsx)("line",{x1:"12",y1:"18",x2:"12",y2:"22"}),Object(p.jsx)("line",{x1:"4.93",y1:"4.93",x2:"7.76",y2:"7.76"}),Object(p.jsx)("line",{x1:"16.24",y1:"16.24",x2:"19.07",y2:"19.07"}),Object(p.jsx)("line",{x1:"2",y1:"12",x2:"6",y2:"12"}),Object(p.jsx)("line",{x1:"18",y1:"12",x2:"22",y2:"12"}),Object(p.jsx)("line",{x1:"4.93",y1:"19.07",x2:"7.76",y2:"16.24"}),Object(p.jsx)("line",{x1:"16.24",y1:"7.76",x2:"19.07",y2:"4.93"})]})})},ye=a.forwardRef((function(e,t){var n=e.state,a=e.desc,c=Object(g.a)(e,xe);return Object(p.jsxs)(me.b,{children:[Object(p.jsxs)(me.c,Object(b.a)(Object(b.a)({},c),{},{ref:t,className:"toast-root ".concat(n),children:[Object(p.jsx)("div",{className:"toast-icon",children:function(){switch(n){case"error":return Object(p.jsx)(h.g,{className:"error-icon"});case"success":return Object(p.jsx)(h.c,{className:"success-icon"});case"loading":return Object(p.jsx)(we,{});default:return Object(p.jsx)(p.Fragment,{})}}()}),Object(p.jsx)(me.a,{className:"toast-desc",children:a})]})),Object(p.jsx)(me.d,{className:"toast-viewpoint"})]})}));ye.defaultProps={desc:"",state:"loading"};var ke=ye,Se=function(e){var t=e.file,n=Object(o.c)(R),c=Object(s.a)(n,2),i=c[0],r=c[1],l=Object(o.c)(E),u=Object(s.a)(l,2),h=u[0],f=u[1],v=function(){var e=Object(j.a)(d.a.mark((function e(){var t,n,a,c,o;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,$().then((function(e){return e.text()}));case 2:if((t=e.sent)!==i.model){e.next=5;break}return e.abrupt("return");case 5:return e.next=7,(s=i.model,fetch("".concat(K,"/model_downloaded/").concat(s),{method:"GET"})).then((function(e){return e.text()}));case 7:n=e.sent,a=i.model,c="Switching to ".concat(a," model"),o=3e3,"False"===n&&(c="Downloading ".concat(a," model, this may take a while"),o=9999999999),f({open:!0,desc:c,state:"loading",duration:o}),X(a).then((function(e){if(!e.ok)throw new Error("Server error");f({open:!0,desc:"Switch to ".concat(a," model success"),state:"success",duration:3e3})})).catch((function(){f({open:!0,desc:"Switch to ".concat(a," model failed"),state:"error",duration:3e3}),r((function(e){return Object(b.a)(Object(b.a)({},e),{},{model:t})}))}));case 14:case"end":return e.stop()}var s}),e)})));return function(){return e.apply(this,arguments)}}();return Object(a.useEffect)((function(){$().then((function(e){return e.text()})).then((function(e){r((function(t){return Object(b.a)(Object(b.a)({},t),{},{model:e})}))}))}),[r]),Object(p.jsxs)(p.Fragment,{children:[Object(p.jsx)(re,{file:t}),Object(p.jsx)(ge,{onClose:v}),Object(p.jsx)(je,{}),Object(p.jsx)(ke,Object(b.a)(Object(b.a)({},h),{},{onOpenChange:function(e){f((function(t){return Object(b.a)(Object(b.a)({},t),{},{open:e})}))}}))]})},Ce=function(){var e=Object(o.c)(I),t=Object(s.a)(e,2),n=t[0],a=t[1],c=function(){a((function(e){return!e}))};return Object(l.a)("h",(function(e){null===e||void 0===e||e.preventDefault(),c()})),Object(p.jsx)("div",{className:"shortcuts",children:Object(p.jsx)(q,{onClick:c,toolTip:"Hotkeys",tooltipPosition:"bottom",disabled:n,style:{border:0},icon:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",width:"28",height:"28",preserveAspectRatio:"xMidYMid meet",viewBox:"0 0 16 16",children:[Object(p.jsx)("rect",{x:"0",y:"0",width:"16",height:"16",fill:"none",stroke:"none"}),Object(p.jsxs)("g",{fill:"currentColor",children:[Object(p.jsx)("path",{d:"M14 5a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h12zM2 4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2H2z"}),Object(p.jsx)("path",{d:"M13 10.25a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm0-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5 0A.25.25 0 0 1 8.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 8 8.75v-.5zm2 0a.25.25 0 0 1 .25-.25h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5a.25.25 0 0 1-.25-.25v-.5zm1 2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-5-2A.25.25 0 0 1 6.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 6 8.75v-.5zm-2 0A.25.25 0 0 1 4.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 4 8.75v-.5zm-2 0A.25.25 0 0 1 2.25 8h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 2 8.75v-.5zm11-2a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm-2 0A.25.25 0 0 1 9.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 9 6.75v-.5zm-2 0A.25.25 0 0 1 7.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 7 6.75v-.5zm-2 0A.25.25 0 0 1 5.25 6h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5A.25.25 0 0 1 5 6.75v-.5zm-3 0A.25.25 0 0 1 2.25 6h1.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-1.5A.25.25 0 0 1 2 6.75v-.5zm0 4a.25.25 0 0 1 .25-.25h.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-.5a.25.25 0 0 1-.25-.25v-.5zm2 0a.25.25 0 0 1 .25-.25h5.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-5.5a.25.25 0 0 1-.25-.25v-.5z"})]})]})})})},Me=function(){var e=Object(o.c)(R),t=Object(s.a)(e,2),n=t[0],a=t[1];return Object(p.jsx)("div",{children:Object(p.jsx)(q,{onClick:function(){a(Object(b.a)(Object(b.a)({},n),{},{show:!n.show}))},toolTip:"Settings",tooltipPosition:"bottom",style:{border:0},icon:Object(p.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",role:"img",width:"28",height:"28",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:"2",children:[Object(p.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"}),Object(p.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"})]})})})},Le=function(){var e=Object(o.c)(z),t=Object(s.a)(e,2),n=t[0],a=t[1],c=A();return Object(p.jsxs)("header",{children:[Object(p.jsx)("div",{style:{visibility:n?"visible":"hidden"},children:Object(p.jsx)(q,{icon:Object(p.jsx)(h.a,{}),onClick:function(){a(void 0)},style:{border:0},children:"desktop"===c?"Start New":void 0})}),Object(p.jsxs)("div",{className:"header-icons-wrapper",children:[Object(p.jsx)(V,{}),n&&Object(p.jsxs)("div",{className:"header-icons",children:[Object(p.jsx)(Ce,{}),Object(p.jsx)(Me,{})]})]})]})};!function(){function e(){return e=Object(j.a)(d.a.mark((function e(){var t,n,a=arguments;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=a.length>0&&void 0!==a[0]?a[0]:"",e.next=3,fetch(t,{method:"GET",cache:"no-cache"});case 3:return n=e.sent,e.abrupt("return",n.json());case 5:case"end":return e.stop()}}),e)}))),e.apply(this,arguments)}var t=function(){(function(){return e.apply(this,arguments)})(document.location+"/flaskwebgui-keep-server-alive").then((function(e){return e}))};document.addEventListener("DOMContentLoaded",(function(){t(),setInterval(t,3e3)}))}();var Ne=function(){var e=Object(o.c)(z),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(o.c)(H),r=Object(s.a)(i,2),u=r[0],b=r[1],h=function(){var e=Object(a.useState)(),t=Object(s.a)(e,2),n=t[0],c=t[1],i=Object(a.useCallback)((function(){var e=new Headers;e.append("pragma","no-cache"),e.append("cache-control","no-cache"),fetch("/inputimage",{headers:e}).then(function(){var e=Object(j.a)(d.a.mark((function e(t){var n,a,i,r;return d.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=null===(n=t.headers.get("content-disposition"))||void 0===n?void 0:n.split("filename=")[1].split(";")[0],e.next=3,t.blob();case 3:(i=e.sent)&&i.type.startsWith("image")&&(r=new File([i],void 0!==a?a:"inputImage"),c(r));case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}),[c]);return Object(a.useEffect)((function(){i()}),[i]),n}();return Object(a.useEffect)((function(){c(h)}),[h,c]),Object(l.a)("D",(function(e){null===e||void 0===e||e.preventDefault(),b("light"===u?"dark":"light")})),Object(a.useEffect)((function(){document.body.setAttribute("data-theme",u)}),[u]),Object(p.jsxs)("div",{className:"lama-cleaner",children:[Object(p.jsx)(Le,{}),n?Object(p.jsx)(Se,{file:n}):Object(p.jsx)(P,{})]})};r.a.render(Object(p.jsx)(c.a.StrictMode,{children:Object(p.jsx)(o.a,{children:Object(p.jsx)(Ne,{})})}),document.getElementById("root"))}},[[51,1,2]]]); \ No newline at end of file diff --git a/lama_cleaner/app/src/adapters/inpainting.ts b/lama_cleaner/app/src/adapters/inpainting.ts index cac4bb4..3965d54 100644 --- a/lama_cleaner/app/src/adapters/inpainting.ts +++ b/lama_cleaner/app/src/adapters/inpainting.ts @@ -16,6 +16,7 @@ export default async function inpaint( fd.append('mask', mask) fd.append('ldmSteps', settings.ldmSteps.toString()) + fd.append('ldmSampler', settings.ldmSampler.toString()) fd.append('hdStrategy', settings.hdStrategy) fd.append('hdStrategyCropMargin', settings.hdStrategyCropMargin.toString()) fd.append( @@ -34,7 +35,11 @@ export default async function inpaint( method: 'POST', body: fd, }).then(async r => { - return r.blob() + console.log(r) + if (r.ok) { + return r.blob() + } + throw new Error('Something went wrong on server side.') }) return URL.createObjectURL(res) diff --git a/lama_cleaner/app/src/components/Editor/Editor.tsx b/lama_cleaner/app/src/components/Editor/Editor.tsx index 9cebfe2..8d08b8b 100644 --- a/lama_cleaner/app/src/components/Editor/Editor.tsx +++ b/lama_cleaner/app/src/components/Editor/Editor.tsx @@ -15,7 +15,7 @@ import { TransformComponent, TransformWrapper, } from 'react-zoom-pan-pinch' -import { useRecoilValue } from 'recoil' +import { useRecoilState, useRecoilValue } from 'recoil' import { useWindowSize, useKey, useKeyPressEvent } from 'react-use' import inpaint from '../../adapters/inpainting' import Button from '../shared/Button' @@ -28,7 +28,7 @@ import { loadImage, useImage, } from '../../utils' -import { settingState } from '../../store/Atoms' +import { settingState, toastState } from '../../store/Atoms' const TOOLBAR_SIZE = 200 const BRUSH_COLOR = '#ffcc00bb' @@ -73,6 +73,7 @@ function mouseXY(ev: SyntheticEvent) { export default function Editor(props: EditorProps) { const { file } = props const settings = useRecoilValue(settingState) + const [toastVal, setToastState] = useRecoilState(toastState) const [brushSize, setBrushSize] = useState(40) const [original, isOriginalLoaded] = useImage(file) const [renders, setRenders] = useState([]) @@ -144,12 +145,11 @@ export default function Editor(props: EditorProps) { } const newLineGroups = [...lineGroups, curLineGroup] - setLineGroups(newLineGroups) setCurLineGroup([]) setIsDraging(false) setIsInpaintingLoading(true) - drawAllLinesOnMask(newLineGroups) + try { const res = await inpaint( file, @@ -165,9 +165,16 @@ export default function Editor(props: EditorProps) { const newRenders = [...renders, newRender] setRenders(newRenders) draw(newRender, []) + // Only append new LineGroup after inpainting success + setLineGroups(newLineGroups) } catch (e: any) { - // eslint-disable-next-line - alert(e.message ? e.message : e.toString()) + setToastState({ + open: true, + desc: e.message ? e.message : e.toString(), + state: 'error', + duration: 2000, + }) + drawOnCurrentRender([]) } setIsInpaintingLoading(false) } diff --git a/lama_cleaner/app/src/components/Settings/HDSettingBlock.tsx b/lama_cleaner/app/src/components/Settings/HDSettingBlock.tsx index 565950f..57fed00 100644 --- a/lama_cleaner/app/src/components/Settings/HDSettingBlock.tsx +++ b/lama_cleaner/app/src/components/Settings/HDSettingBlock.tsx @@ -11,6 +11,11 @@ export enum HDStrategy { CROP = 'Crop', } +export enum LDMSampler { + ddim = 'ddim', + plms = 'plms', +} + function HDSettingBlock() { const [setting, setSettingState] = useRecoilState(settingState) diff --git a/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx b/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx index aac6e1b..2d7a1f9 100644 --- a/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx +++ b/lama_cleaner/app/src/components/Settings/ModelSettingBlock.tsx @@ -2,6 +2,7 @@ import React, { ReactNode } from 'react' import { useRecoilState } from 'recoil' import { settingState } from '../../store/Atoms' import Selector from '../shared/Selector' +import { LDMSampler } from './HDSettingBlock' import NumberInputSetting from './NumberInputSetting' import SettingBlock from './SettingBlock' @@ -19,6 +20,12 @@ function ModelSettingBlock() { }) } + const onLDMSamplerChange = (value: LDMSampler) => { + setSettingState(old => { + return { ...old, ldmSampler: value } + }) + } + const renderModelDesc = ( name: string, paperUrl: string, @@ -65,6 +72,19 @@ function ModelSettingBlock() { }) }} /> + + onLDMSamplerChange(val as LDMSampler)} + /> + } + /> ) } diff --git a/lama_cleaner/app/src/components/Shortcuts/ShortcutsModal.tsx b/lama_cleaner/app/src/components/Shortcuts/ShortcutsModal.tsx index ef8efbb..643c47b 100644 --- a/lama_cleaner/app/src/components/Shortcuts/ShortcutsModal.tsx +++ b/lama_cleaner/app/src/components/Shortcuts/ShortcutsModal.tsx @@ -56,7 +56,7 @@ export default function ShortcutsModal() { /> - + diff --git a/lama_cleaner/app/src/components/shared/NumberInput.scss b/lama_cleaner/app/src/components/shared/NumberInput.scss index d51dc32..673cb98 100644 --- a/lama_cleaner/app/src/components/shared/NumberInput.scss +++ b/lama_cleaner/app/src/components/shared/NumberInput.scss @@ -2,8 +2,9 @@ all: unset; flex: 1 0 auto; border-radius: 0.5rem; - padding: 0.4rem 0.8rem; + padding: 0 0.8rem; outline: 1px solid var(--border-color); + height: 36px; &:focus-visible { outline: 1px solid var(--yellow-accent); diff --git a/lama_cleaner/app/src/store/Atoms.tsx b/lama_cleaner/app/src/store/Atoms.tsx index 01efff2..5317637 100644 --- a/lama_cleaner/app/src/store/Atoms.tsx +++ b/lama_cleaner/app/src/store/Atoms.tsx @@ -1,5 +1,5 @@ import { atom } from 'recoil' -import { HDStrategy } from '../components/Settings/HDSettingBlock' +import { HDStrategy, LDMSampler } from '../components/Settings/HDSettingBlock' import { AIModel } from '../components/Settings/ModelSettingBlock' import { ToastState } from '../components/shared/Toast' @@ -43,6 +43,7 @@ export interface Settings { // For LDM ldmSteps: number + ldmSampler: LDMSampler } export const settingStateDefault = { @@ -50,6 +51,7 @@ export const settingStateDefault = { runInpaintingManually: false, model: AIModel.LAMA, ldmSteps: 50, + ldmSampler: LDMSampler.plms, hdStrategy: HDStrategy.RESIZE, hdStrategyResizeLimit: 2048, hdStrategyCropTrigerSize: 2048, diff --git a/lama_cleaner/model/ddim_sampler.py b/lama_cleaner/model/ddim_sampler.py new file mode 100644 index 0000000..d1e4400 --- /dev/null +++ b/lama_cleaner/model/ddim_sampler.py @@ -0,0 +1,193 @@ +import torch +import numpy as np +from tqdm import tqdm + +from lama_cleaner.model.utils import make_ddim_timesteps, make_ddim_sampling_parameters, noise_like + +from loguru import logger + + +class DDIMSampler(object): + def __init__(self, model, schedule="linear"): + super().__init__() + self.model = model + self.ddpm_num_timesteps = model.num_timesteps + self.schedule = schedule + + def register_buffer(self, name, attr): + setattr(self, name, attr) + + def make_schedule( + self, ddim_num_steps, ddim_discretize="uniform", ddim_eta=0.0, verbose=True + ): + self.ddim_timesteps = make_ddim_timesteps( + ddim_discr_method=ddim_discretize, + num_ddim_timesteps=ddim_num_steps, + # array([1]) + num_ddpm_timesteps=self.ddpm_num_timesteps, + verbose=verbose, + ) + alphas_cumprod = self.model.alphas_cumprod # torch.Size([1000]) + assert ( + alphas_cumprod.shape[0] == self.ddpm_num_timesteps + ), "alphas have to be defined for each timestep" + to_torch = lambda x: x.clone().detach().to(torch.float32).to(self.model.device) + + self.register_buffer("betas", to_torch(self.model.betas)) + self.register_buffer("alphas_cumprod", to_torch(alphas_cumprod)) + self.register_buffer( + "alphas_cumprod_prev", to_torch(self.model.alphas_cumprod_prev) + ) + + # calculations for diffusion q(x_t | x_{t-1}) and others + self.register_buffer( + "sqrt_alphas_cumprod", to_torch(np.sqrt(alphas_cumprod.cpu())) + ) + self.register_buffer( + "sqrt_one_minus_alphas_cumprod", + to_torch(np.sqrt(1.0 - alphas_cumprod.cpu())), + ) + self.register_buffer( + "log_one_minus_alphas_cumprod", to_torch(np.log(1.0 - alphas_cumprod.cpu())) + ) + self.register_buffer( + "sqrt_recip_alphas_cumprod", to_torch(np.sqrt(1.0 / alphas_cumprod.cpu())) + ) + self.register_buffer( + "sqrt_recipm1_alphas_cumprod", + to_torch(np.sqrt(1.0 / alphas_cumprod.cpu() - 1)), + ) + + # ddim sampling parameters + ddim_sigmas, ddim_alphas, ddim_alphas_prev = make_ddim_sampling_parameters( + alphacums=alphas_cumprod.cpu(), + ddim_timesteps=self.ddim_timesteps, + eta=ddim_eta, + verbose=verbose, + ) + self.register_buffer("ddim_sigmas", ddim_sigmas) + self.register_buffer("ddim_alphas", ddim_alphas) + self.register_buffer("ddim_alphas_prev", ddim_alphas_prev) + self.register_buffer("ddim_sqrt_one_minus_alphas", np.sqrt(1.0 - ddim_alphas)) + sigmas_for_original_sampling_steps = ddim_eta * torch.sqrt( + (1 - self.alphas_cumprod_prev) + / (1 - self.alphas_cumprod) + * (1 - self.alphas_cumprod / self.alphas_cumprod_prev) + ) + self.register_buffer( + "ddim_sigmas_for_original_num_steps", sigmas_for_original_sampling_steps + ) + + @torch.no_grad() + def sample(self, steps, conditioning, batch_size, shape): + self.make_schedule(ddim_num_steps=steps, ddim_eta=0, verbose=False) + # sampling + C, H, W = shape + size = (batch_size, C, H, W) + + # samples: 1,3,128,128 + return self.ddim_sampling( + conditioning, + size, + quantize_denoised=False, + ddim_use_original_steps=False, + noise_dropout=0, + temperature=1.0, + ) + + @torch.no_grad() + def ddim_sampling( + self, + cond, + shape, + ddim_use_original_steps=False, + quantize_denoised=False, + temperature=1.0, + noise_dropout=0.0, + ): + device = self.model.betas.device + b = shape[0] + img = torch.randn(shape, device=device, dtype=cond.dtype) + timesteps = ( + self.ddpm_num_timesteps if ddim_use_original_steps else self.ddim_timesteps + ) + + time_range = ( + reversed(range(0, timesteps)) + if ddim_use_original_steps + else np.flip(timesteps) + ) + total_steps = timesteps if ddim_use_original_steps else timesteps.shape[0] + logger.info(f"Running DDIM Sampling with {total_steps} timesteps") + + iterator = tqdm(time_range, desc="DDIM Sampler", total=total_steps) + + for i, step in enumerate(iterator): + index = total_steps - i - 1 + ts = torch.full((b,), step, device=device, dtype=torch.long) + + outs = self.p_sample_ddim( + img, + cond, + ts, + index=index, + use_original_steps=ddim_use_original_steps, + quantize_denoised=quantize_denoised, + temperature=temperature, + noise_dropout=noise_dropout, + ) + img, _ = outs + + return img + + @torch.no_grad() + def p_sample_ddim( + self, + x, + c, + t, + index, + repeat_noise=False, + use_original_steps=False, + quantize_denoised=False, + temperature=1.0, + noise_dropout=0.0, + ): + b, *_, device = *x.shape, x.device + e_t = self.model.apply_model(x, t, c) + + alphas = self.model.alphas_cumprod if use_original_steps else self.ddim_alphas + alphas_prev = ( + self.model.alphas_cumprod_prev + if use_original_steps + else self.ddim_alphas_prev + ) + sqrt_one_minus_alphas = ( + self.model.sqrt_one_minus_alphas_cumprod + if use_original_steps + else self.ddim_sqrt_one_minus_alphas + ) + sigmas = ( + self.model.ddim_sigmas_for_original_num_steps + if use_original_steps + else self.ddim_sigmas + ) + # select parameters corresponding to the currently considered timestep + a_t = torch.full((b, 1, 1, 1), alphas[index], device=device) + a_prev = torch.full((b, 1, 1, 1), alphas_prev[index], device=device) + sigma_t = torch.full((b, 1, 1, 1), sigmas[index], device=device) + sqrt_one_minus_at = torch.full( + (b, 1, 1, 1), sqrt_one_minus_alphas[index], device=device + ) + + # current prediction for x_0 + pred_x0 = (x - sqrt_one_minus_at * e_t) / a_t.sqrt() + if quantize_denoised: # 没用 + pred_x0, _, *_ = self.model.first_stage_model.quantize(pred_x0) + # direction pointing to x_t + dir_xt = (1.0 - a_prev - sigma_t ** 2).sqrt() * e_t + noise = sigma_t * noise_like(x.shape, device, repeat_noise) * temperature + if noise_dropout > 0.0: # 没用 + noise = torch.nn.functional.dropout(noise, p=noise_dropout) + x_prev = a_prev.sqrt() * pred_x0 + dir_xt + noise + return x_prev, pred_x0 diff --git a/lama_cleaner/model/ldm.py b/lama_cleaner/model/ldm.py index 2fea7c0..7720092 100644 --- a/lama_cleaner/model/ldm.py +++ b/lama_cleaner/model/ldm.py @@ -5,17 +5,15 @@ import torch from loguru import logger from lama_cleaner.model.base import InpaintModel -from lama_cleaner.schema import Config +from lama_cleaner.model.ddim_sampler import DDIMSampler +from lama_cleaner.model.plms_sampler import PLMSSampler +from lama_cleaner.schema import Config, LDMSampler torch.manual_seed(42) import torch.nn as nn -from tqdm import tqdm from lama_cleaner.helper import download_model, norm_img, get_cache_path_by_url from lama_cleaner.model.utils import ( make_beta_schedule, - make_ddim_timesteps, - make_ddim_sampling_parameters, - noise_like, timestep_embedding, ) @@ -94,7 +92,7 @@ class DDPM(nn.Module): self.linear_start = linear_start self.linear_end = linear_end assert ( - alphas_cumprod.shape[0] == self.num_timesteps + alphas_cumprod.shape[0] == self.num_timesteps ), "alphas have to be defined for each timestep" to_torch = lambda x: torch.tensor(x, dtype=torch.float32).to(self.device) @@ -120,7 +118,7 @@ class DDPM(nn.Module): # calculations for posterior q(x_{t-1} | x_t, x_0) posterior_variance = (1 - self.v_posterior) * betas * ( - 1.0 - alphas_cumprod_prev + 1.0 - alphas_cumprod_prev ) / (1.0 - alphas_cumprod) + self.v_posterior * betas # above: equal to 1. / (1. / (1. - alpha_cumprod_tm1) + alpha_t / beta_t) self.register_buffer("posterior_variance", to_torch(posterior_variance)) @@ -142,16 +140,16 @@ class DDPM(nn.Module): if self.parameterization == "eps": lvlb_weights = self.betas ** 2 / ( - 2 - * self.posterior_variance - * to_torch(alphas) - * (1 - self.alphas_cumprod) + 2 + * self.posterior_variance + * to_torch(alphas) + * (1 - self.alphas_cumprod) ) elif self.parameterization == "x0": lvlb_weights = ( - 0.5 - * np.sqrt(torch.Tensor(alphas_cumprod)) - / (2.0 * 1 - torch.Tensor(alphas_cumprod)) + 0.5 + * np.sqrt(torch.Tensor(alphas_cumprod)) + / (2.0 * 1 - torch.Tensor(alphas_cumprod)) ) else: raise NotImplementedError("mu not supported") @@ -221,192 +219,6 @@ class LatentDiffusion(DDPM): return x_recon -class DDIMSampler(object): - def __init__(self, model, schedule="linear"): - super().__init__() - self.model = model - self.ddpm_num_timesteps = model.num_timesteps - self.schedule = schedule - - def register_buffer(self, name, attr): - setattr(self, name, attr) - - def make_schedule( - self, ddim_num_steps, ddim_discretize="uniform", ddim_eta=0.0, verbose=True - ): - self.ddim_timesteps = make_ddim_timesteps( - ddim_discr_method=ddim_discretize, - num_ddim_timesteps=ddim_num_steps, - # array([1]) - num_ddpm_timesteps=self.ddpm_num_timesteps, - verbose=verbose, - ) - alphas_cumprod = self.model.alphas_cumprod # torch.Size([1000]) - assert ( - alphas_cumprod.shape[0] == self.ddpm_num_timesteps - ), "alphas have to be defined for each timestep" - to_torch = lambda x: x.clone().detach().to(torch.float32).to(self.model.device) - - self.register_buffer("betas", to_torch(self.model.betas)) - self.register_buffer("alphas_cumprod", to_torch(alphas_cumprod)) - self.register_buffer( - "alphas_cumprod_prev", to_torch(self.model.alphas_cumprod_prev) - ) - - # calculations for diffusion q(x_t | x_{t-1}) and others - self.register_buffer( - "sqrt_alphas_cumprod", to_torch(np.sqrt(alphas_cumprod.cpu())) - ) - self.register_buffer( - "sqrt_one_minus_alphas_cumprod", - to_torch(np.sqrt(1.0 - alphas_cumprod.cpu())), - ) - self.register_buffer( - "log_one_minus_alphas_cumprod", to_torch(np.log(1.0 - alphas_cumprod.cpu())) - ) - self.register_buffer( - "sqrt_recip_alphas_cumprod", to_torch(np.sqrt(1.0 / alphas_cumprod.cpu())) - ) - self.register_buffer( - "sqrt_recipm1_alphas_cumprod", - to_torch(np.sqrt(1.0 / alphas_cumprod.cpu() - 1)), - ) - - # ddim sampling parameters - ddim_sigmas, ddim_alphas, ddim_alphas_prev = make_ddim_sampling_parameters( - alphacums=alphas_cumprod.cpu(), - ddim_timesteps=self.ddim_timesteps, - eta=ddim_eta, - verbose=verbose, - ) - self.register_buffer("ddim_sigmas", ddim_sigmas) - self.register_buffer("ddim_alphas", ddim_alphas) - self.register_buffer("ddim_alphas_prev", ddim_alphas_prev) - self.register_buffer("ddim_sqrt_one_minus_alphas", np.sqrt(1.0 - ddim_alphas)) - sigmas_for_original_sampling_steps = ddim_eta * torch.sqrt( - (1 - self.alphas_cumprod_prev) - / (1 - self.alphas_cumprod) - * (1 - self.alphas_cumprod / self.alphas_cumprod_prev) - ) - self.register_buffer( - "ddim_sigmas_for_original_num_steps", sigmas_for_original_sampling_steps - ) - - @torch.no_grad() - def sample(self, steps, conditioning, batch_size, shape): - self.make_schedule(ddim_num_steps=steps, ddim_eta=0, verbose=False) - # sampling - C, H, W = shape - size = (batch_size, C, H, W) - - # samples: 1,3,128,128 - return self.ddim_sampling( - conditioning, - size, - quantize_denoised=False, - ddim_use_original_steps=False, - noise_dropout=0, - temperature=1.0, - ) - - @torch.no_grad() - def ddim_sampling( - self, - cond, - shape, - ddim_use_original_steps=False, - quantize_denoised=False, - temperature=1.0, - noise_dropout=0.0, - ): - device = self.model.betas.device - b = shape[0] - img = torch.randn(shape, device=device, dtype=cond.dtype) - timesteps = ( - self.ddpm_num_timesteps if ddim_use_original_steps else self.ddim_timesteps - ) - - time_range = ( - reversed(range(0, timesteps)) - if ddim_use_original_steps - else np.flip(timesteps) - ) - total_steps = timesteps if ddim_use_original_steps else timesteps.shape[0] - logger.info(f"Running DDIM Sampling with {total_steps} timesteps") - - iterator = tqdm(time_range, desc="DDIM Sampler", total=total_steps) - - for i, step in enumerate(iterator): - index = total_steps - i - 1 - ts = torch.full((b,), step, device=device, dtype=torch.long) - - outs = self.p_sample_ddim( - img, - cond, - ts, - index=index, - use_original_steps=ddim_use_original_steps, - quantize_denoised=quantize_denoised, - temperature=temperature, - noise_dropout=noise_dropout, - ) - img, _ = outs - - return img - - @torch.no_grad() - def p_sample_ddim( - self, - x, - c, - t, - index, - repeat_noise=False, - use_original_steps=False, - quantize_denoised=False, - temperature=1.0, - noise_dropout=0.0, - ): - b, *_, device = *x.shape, x.device - e_t = self.model.apply_model(x, t, c) - - alphas = self.model.alphas_cumprod if use_original_steps else self.ddim_alphas - alphas_prev = ( - self.model.alphas_cumprod_prev - if use_original_steps - else self.ddim_alphas_prev - ) - sqrt_one_minus_alphas = ( - self.model.sqrt_one_minus_alphas_cumprod - if use_original_steps - else self.ddim_sqrt_one_minus_alphas - ) - sigmas = ( - self.model.ddim_sigmas_for_original_num_steps - if use_original_steps - else self.ddim_sigmas - ) - # select parameters corresponding to the currently considered timestep - a_t = torch.full((b, 1, 1, 1), alphas[index], device=device) - a_prev = torch.full((b, 1, 1, 1), alphas_prev[index], device=device) - sigma_t = torch.full((b, 1, 1, 1), sigmas[index], device=device) - sqrt_one_minus_at = torch.full( - (b, 1, 1, 1), sqrt_one_minus_alphas[index], device=device - ) - - # current prediction for x_0 - pred_x0 = (x - sqrt_one_minus_at * e_t) / a_t.sqrt() - if quantize_denoised: # 没用 - pred_x0, _, *_ = self.model.first_stage_model.quantize(pred_x0) - # direction pointing to x_t - dir_xt = (1.0 - a_prev - sigma_t ** 2).sqrt() * e_t - noise = sigma_t * noise_like(x.shape, device, repeat_noise) * temperature - if noise_dropout > 0.0: # 没用 - noise = torch.nn.functional.dropout(noise, p=noise_dropout) - x_prev = a_prev.sqrt() * pred_x0 + dir_xt + noise - return x_prev, pred_x0 - - def load_jit_model(url, device): model_path = download_model(url) logger.info(f"Load LDM model from: {model_path}") @@ -432,8 +244,7 @@ class LDM(InpaintModel): self.cond_stage_model_decode = self.cond_stage_model_decode.half() self.cond_stage_model_encode = self.cond_stage_model_encode.half() - model = LatentDiffusion(self.diffusion_model, device) - self.sampler = DDIMSampler(model) + self.model = LatentDiffusion(self.diffusion_model, device) @staticmethod def is_downloaded() -> bool: @@ -454,6 +265,13 @@ class LDM(InpaintModel): # image [1,3,512,512] float32 # mask: [1,1,512,512] float32 # masked_image: [1,3,512,512] float32 + if config.ldm_sampler == LDMSampler.ddim: + sampler = DDIMSampler(self.model) + elif config.ldm_sampler == LDMSampler.plms: + sampler = PLMSSampler(self.model) + else: + raise ValueError() + steps = config.ldm_steps image = norm_img(image) mask = norm_img(mask) @@ -465,7 +283,6 @@ class LDM(InpaintModel): mask = torch.from_numpy(mask).unsqueeze(0).to(self.device) masked_image = (1 - mask) * image - image = self._norm(image) mask = self._norm(mask) masked_image = self._norm(masked_image) @@ -476,7 +293,7 @@ class LDM(InpaintModel): c = torch.cat((c, cc), dim=1) # 1,4,128,128 shape = (c.shape[1] - 1,) + c.shape[2:] - samples_ddim = self.sampler.sample( + samples_ddim = sampler.sample( steps=steps, conditioning=c, batch_size=c.shape[0], shape=shape ) torch.cuda.empty_cache() diff --git a/lama_cleaner/model/plms_sampler.py b/lama_cleaner/model/plms_sampler.py new file mode 100644 index 0000000..d9c0416 --- /dev/null +++ b/lama_cleaner/model/plms_sampler.py @@ -0,0 +1,225 @@ +# From: https://github.com/CompVis/latent-diffusion/blob/main/ldm/models/diffusion/plms.py +import torch +import numpy as np +from lama_cleaner.model.utils import make_ddim_timesteps, make_ddim_sampling_parameters, noise_like +from tqdm import tqdm + + +class PLMSSampler(object): + def __init__(self, model, schedule="linear", **kwargs): + super().__init__() + self.model = model + self.ddpm_num_timesteps = model.num_timesteps + self.schedule = schedule + + def register_buffer(self, name, attr): + setattr(self, name, attr) + + def make_schedule(self, ddim_num_steps, ddim_discretize="uniform", ddim_eta=0., verbose=True): + if ddim_eta != 0: + raise ValueError('ddim_eta must be 0 for PLMS') + self.ddim_timesteps = make_ddim_timesteps(ddim_discr_method=ddim_discretize, num_ddim_timesteps=ddim_num_steps, + num_ddpm_timesteps=self.ddpm_num_timesteps, verbose=verbose) + alphas_cumprod = self.model.alphas_cumprod + assert alphas_cumprod.shape[0] == self.ddpm_num_timesteps, 'alphas have to be defined for each timestep' + to_torch = lambda x: x.clone().detach().to(torch.float32).to(self.model.device) + + self.register_buffer('betas', to_torch(self.model.betas)) + self.register_buffer('alphas_cumprod', to_torch(alphas_cumprod)) + self.register_buffer('alphas_cumprod_prev', to_torch(self.model.alphas_cumprod_prev)) + + # calculations for diffusion q(x_t | x_{t-1}) and others + self.register_buffer('sqrt_alphas_cumprod', to_torch(np.sqrt(alphas_cumprod.cpu()))) + self.register_buffer('sqrt_one_minus_alphas_cumprod', to_torch(np.sqrt(1. - alphas_cumprod.cpu()))) + self.register_buffer('log_one_minus_alphas_cumprod', to_torch(np.log(1. - alphas_cumprod.cpu()))) + self.register_buffer('sqrt_recip_alphas_cumprod', to_torch(np.sqrt(1. / alphas_cumprod.cpu()))) + self.register_buffer('sqrt_recipm1_alphas_cumprod', to_torch(np.sqrt(1. / alphas_cumprod.cpu() - 1))) + + # ddim sampling parameters + ddim_sigmas, ddim_alphas, ddim_alphas_prev = make_ddim_sampling_parameters(alphacums=alphas_cumprod.cpu(), + ddim_timesteps=self.ddim_timesteps, + eta=ddim_eta, verbose=verbose) + self.register_buffer('ddim_sigmas', ddim_sigmas) + self.register_buffer('ddim_alphas', ddim_alphas) + self.register_buffer('ddim_alphas_prev', ddim_alphas_prev) + self.register_buffer('ddim_sqrt_one_minus_alphas', np.sqrt(1. - ddim_alphas)) + sigmas_for_original_sampling_steps = ddim_eta * torch.sqrt( + (1 - self.alphas_cumprod_prev) / (1 - self.alphas_cumprod) * ( + 1 - self.alphas_cumprod / self.alphas_cumprod_prev)) + self.register_buffer('ddim_sigmas_for_original_num_steps', sigmas_for_original_sampling_steps) + + @torch.no_grad() + def sample(self, + steps, + batch_size, + shape, + conditioning=None, + callback=None, + normals_sequence=None, + img_callback=None, + quantize_x0=False, + eta=0., + mask=None, + x0=None, + temperature=1., + noise_dropout=0., + score_corrector=None, + corrector_kwargs=None, + verbose=False, + x_T=None, + log_every_t=100, + unconditional_guidance_scale=1., + unconditional_conditioning=None, + # this has to come in the same format as the conditioning, # e.g. as encoded tokens, ... + **kwargs + ): + if conditioning is not None: + if isinstance(conditioning, dict): + cbs = conditioning[list(conditioning.keys())[0]].shape[0] + if cbs != batch_size: + print(f"Warning: Got {cbs} conditionings but batch-size is {batch_size}") + else: + if conditioning.shape[0] != batch_size: + print(f"Warning: Got {conditioning.shape[0]} conditionings but batch-size is {batch_size}") + + self.make_schedule(ddim_num_steps=steps, ddim_eta=eta, verbose=verbose) + # sampling + C, H, W = shape + size = (batch_size, C, H, W) + print(f'Data shape for PLMS sampling is {size}') + + samples = self.plms_sampling(conditioning, size, + callback=callback, + img_callback=img_callback, + quantize_denoised=quantize_x0, + mask=mask, x0=x0, + ddim_use_original_steps=False, + noise_dropout=noise_dropout, + temperature=temperature, + score_corrector=score_corrector, + corrector_kwargs=corrector_kwargs, + x_T=x_T, + log_every_t=log_every_t, + unconditional_guidance_scale=unconditional_guidance_scale, + unconditional_conditioning=unconditional_conditioning, + ) + return samples + + @torch.no_grad() + def plms_sampling(self, cond, shape, + x_T=None, ddim_use_original_steps=False, + callback=None, timesteps=None, quantize_denoised=False, + mask=None, x0=None, img_callback=None, log_every_t=100, + temperature=1., noise_dropout=0., score_corrector=None, corrector_kwargs=None, + unconditional_guidance_scale=1., unconditional_conditioning=None, ): + device = self.model.betas.device + b = shape[0] + if x_T is None: + img = torch.randn(shape, device=device) + else: + img = x_T + + if timesteps is None: + timesteps = self.ddpm_num_timesteps if ddim_use_original_steps else self.ddim_timesteps + elif timesteps is not None and not ddim_use_original_steps: + subset_end = int(min(timesteps / self.ddim_timesteps.shape[0], 1) * self.ddim_timesteps.shape[0]) - 1 + timesteps = self.ddim_timesteps[:subset_end] + + time_range = list(reversed(range(0, timesteps))) if ddim_use_original_steps else np.flip(timesteps) + total_steps = timesteps if ddim_use_original_steps else timesteps.shape[0] + print(f"Running PLMS Sampling with {total_steps} timesteps") + + iterator = tqdm(time_range, desc='PLMS Sampler', total=total_steps) + old_eps = [] + + for i, step in enumerate(iterator): + index = total_steps - i - 1 + ts = torch.full((b,), step, device=device, dtype=torch.long) + ts_next = torch.full((b,), time_range[min(i + 1, len(time_range) - 1)], device=device, dtype=torch.long) + + if mask is not None: + assert x0 is not None + img_orig = self.model.q_sample(x0, ts) # TODO: deterministic forward pass? + img = img_orig * mask + (1. - mask) * img + + outs = self.p_sample_plms(img, cond, ts, index=index, use_original_steps=ddim_use_original_steps, + quantize_denoised=quantize_denoised, temperature=temperature, + noise_dropout=noise_dropout, score_corrector=score_corrector, + corrector_kwargs=corrector_kwargs, + unconditional_guidance_scale=unconditional_guidance_scale, + unconditional_conditioning=unconditional_conditioning, + old_eps=old_eps, t_next=ts_next) + img, pred_x0, e_t = outs + old_eps.append(e_t) + if len(old_eps) >= 4: + old_eps.pop(0) + if callback: callback(i) + if img_callback: img_callback(pred_x0, i) + + return img + + @torch.no_grad() + def p_sample_plms(self, x, c, t, index, repeat_noise=False, use_original_steps=False, quantize_denoised=False, + temperature=1., noise_dropout=0., score_corrector=None, corrector_kwargs=None, + unconditional_guidance_scale=1., unconditional_conditioning=None, old_eps=None, t_next=None): + b, *_, device = *x.shape, x.device + + def get_model_output(x, t): + if unconditional_conditioning is None or unconditional_guidance_scale == 1.: + e_t = self.model.apply_model(x, t, c) + else: + x_in = torch.cat([x] * 2) + t_in = torch.cat([t] * 2) + c_in = torch.cat([unconditional_conditioning, c]) + e_t_uncond, e_t = self.model.apply_model(x_in, t_in, c_in).chunk(2) + e_t = e_t_uncond + unconditional_guidance_scale * (e_t - e_t_uncond) + + if score_corrector is not None: + assert self.model.parameterization == "eps" + e_t = score_corrector.modify_score(self.model, e_t, x, t, c, **corrector_kwargs) + + return e_t + + alphas = self.model.alphas_cumprod if use_original_steps else self.ddim_alphas + alphas_prev = self.model.alphas_cumprod_prev if use_original_steps else self.ddim_alphas_prev + sqrt_one_minus_alphas = self.model.sqrt_one_minus_alphas_cumprod if use_original_steps else self.ddim_sqrt_one_minus_alphas + sigmas = self.model.ddim_sigmas_for_original_num_steps if use_original_steps else self.ddim_sigmas + + def get_x_prev_and_pred_x0(e_t, index): + # select parameters corresponding to the currently considered timestep + a_t = torch.full((b, 1, 1, 1), alphas[index], device=device) + a_prev = torch.full((b, 1, 1, 1), alphas_prev[index], device=device) + sigma_t = torch.full((b, 1, 1, 1), sigmas[index], device=device) + sqrt_one_minus_at = torch.full((b, 1, 1, 1), sqrt_one_minus_alphas[index], device=device) + + # current prediction for x_0 + pred_x0 = (x - sqrt_one_minus_at * e_t) / a_t.sqrt() + if quantize_denoised: + pred_x0, _, *_ = self.model.first_stage_model.quantize(pred_x0) + # direction pointing to x_t + dir_xt = (1. - a_prev - sigma_t ** 2).sqrt() * e_t + noise = sigma_t * noise_like(x.shape, device, repeat_noise) * temperature + if noise_dropout > 0.: + noise = torch.nn.functional.dropout(noise, p=noise_dropout) + x_prev = a_prev.sqrt() * pred_x0 + dir_xt + noise + return x_prev, pred_x0 + + e_t = get_model_output(x, t) + if len(old_eps) == 0: + # Pseudo Improved Euler (2nd order) + x_prev, pred_x0 = get_x_prev_and_pred_x0(e_t, index) + e_t_next = get_model_output(x_prev, t_next) + e_t_prime = (e_t + e_t_next) / 2 + elif len(old_eps) == 1: + # 2nd order Pseudo Linear Multistep (Adams-Bashforth) + e_t_prime = (3 * e_t - old_eps[-1]) / 2 + elif len(old_eps) == 2: + # 3nd order Pseudo Linear Multistep (Adams-Bashforth) + e_t_prime = (23 * e_t - 16 * old_eps[-1] + 5 * old_eps[-2]) / 12 + elif len(old_eps) >= 3: + # 4nd order Pseudo Linear Multistep (Adams-Bashforth) + e_t_prime = (55 * e_t - 59 * old_eps[-1] + 37 * old_eps[-2] - 9 * old_eps[-3]) / 24 + + x_prev, pred_x0 = get_x_prev_and_pred_x0(e_t_prime, index) + + return x_prev, pred_x0, e_t diff --git a/lama_cleaner/schema.py b/lama_cleaner/schema.py index 0d6fad8..a66afa1 100644 --- a/lama_cleaner/schema.py +++ b/lama_cleaner/schema.py @@ -9,8 +9,14 @@ class HDStrategy(str, Enum): CROP = 'Crop' +class LDMSampler(str, Enum): + ddim = 'ddim' + plms = 'plms' + + class Config(BaseModel): ldm_steps: int + ldm_sampler: str hd_strategy: str hd_strategy_crop_margin: int hd_strategy_crop_trigger_size: int diff --git a/lama_cleaner/server.py b/lama_cleaner/server.py index 64e21e4..79b8a0b 100644 --- a/lama_cleaner/server.py +++ b/lama_cleaner/server.py @@ -93,6 +93,7 @@ def process(): config = Config( ldm_steps=form["ldmSteps"], + ldm_sampler=form["ldmSampler"], hd_strategy=form["hdStrategy"], hd_strategy_crop_margin=form["hdStrategyCropMargin"], hd_strategy_crop_trigger_size=form["hdStrategyCropTrigerSize"], diff --git a/setup.py b/setup.py index 0d6c2fc..fcb3830 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ def load_requirements(): # https://setuptools.readthedocs.io/en/latest/setuptools.html#including-data-files setuptools.setup( name="lama-cleaner", - version="0.12.0", + version="0.13.0", author="PanicByte", author_email="cwq1913@gmail.com", description="Image inpainting tool powered by SOTA AI Model",