unidisc_demo / index.html
aswerdlow's picture
update
6cfd402
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- Meta tags for social media banners -->
<meta name="description" content="UniDisc: Unified Multimodal Discrete Diffusion">
<meta property="og:title" content="UniDisc: Unified Multimodal Discrete Diffusion"/>
<meta property="og:description" content="UniDisc is a unified multimodal discrete diffusion model capable of jointly processing text and images for various tasks."/>
<meta property="og:url" content="https://yourwebsite.com"/>
<!-- Path to banner image -->
<meta property="og:image" content="static/images/banner_image.webp" />
<meta property="og:image:width" content="1200"/>
<meta property="og:image:height" content="630"/>
<meta name="twitter:title" content="UniDisc: Unified Multimodal Discrete Diffusion">
<meta name="twitter:description" content="UniDisc is a unified multimodal discrete diffusion model capable of jointly processing text and images for various tasks.">
<!-- Path to banner image -->
<meta name="twitter:image" content="static/images/banner_image.webp">
<meta name="twitter:card" content="summary_large_image">
<!-- Keywords -->
<meta name="keywords" content="UniDisc, Multimodal, Discrete Diffusion, Machine Learning, AI, Text Generation, Image Generation">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>UniDisc: Unified Multimodal Discrete Diffusion</title>
<!-- <link rel="icon" type="image/x-icon" href="static/images/favicon.ico"> -->
<link href="https://fonts.googleapis.com/css?family=Google+Sans|Noto+Sans|Castoro"
rel="stylesheet">
<link rel="stylesheet" href="static/css/bulma.min.css">
<link rel="stylesheet" href="static/css/bulma-carousel.min.css">
<link rel="stylesheet" href="static/css/bulma-slider.min.css">
<link rel="stylesheet" href="static/css/fontawesome.all.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css">
<link rel="stylesheet" href="static/css/index.css">
<style>
.container p {
padding-top: 1rem;
}
/* Add new custom column class */
.is-five-sixths {
flex: none;
width: 87.5%;
}
html {
scroll-behavior: smooth;
}
a.anchor-link {
margin-left: 0.15em;
color: inherit;
text-decoration: none;
opacity: 0;
transition: opacity 0.2s;
font-size: 0.6em;
position: relative;
top: -0.15em;
cursor: pointer;
}
/* Show the anchor link on hover */
h2[id]:hover a.anchor-link {
opacity: 1;
}
.progressive-image-container {
position: relative;
overflow: hidden;
}
.progressive-image {
opacity: 0;
transition: opacity 0.3s ease-in;
}
.progressive-image.loaded {
opacity: 1;
}
.image-placeholder {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #f0f0f0;
display: flex;
align-items: center;
justify-content: center;
}
.spinner {
width: 40px;
height: 40px;
border: 4px solid #f3f3f3;
border-top: 4px solid #3273dc;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Update the cached-sentence-builder width and layout */
#cached-section .cached-sentence-builder {
flex-grow: 1;
width: 100%; /* Changed from fixed 512px to 100% */
padding: 0px 23px; /* Keep existing padding */
max-width: 512px; /* Add max-width that matches the grid container */
}
/* Update the current sentence display */
#cached-section #cached-current-sentence {
margin-top: 10px;
padding: 15px;
background-color: #f5f5f5;
border-radius: 8px;
min-height: 30px;
font-family: monospace;
width: 100%; /* Ensure it takes full width of its container */
box-sizing: border-box; /* Include padding in width calculation */
white-space: pre-wrap; /* Allow text to wrap */
word-break: break-word; /* Break long words if needed */
}
/* Add styles for the response text */
#cached-section #cached-response-text {
margin-top: 8px;
padding: 15px;
background-color: #e6f7ff;
border-radius: 8px;
min-height: 30px;
font-family: monospace;
width: 100%;
box-sizing: border-box;
white-space: pre-wrap;
word-break: break-word;
display: block; /* Changed from none to block */
}
/* Adjust the main container spacing */
#cached-section .cached-main-container {
display: flex;
max-width: 1050px; /* Reduced from 1200px */
margin: 0 auto; /* Center the container */
gap: 40px; /* Increased from 20px for more balanced spacing */
align-items: flex-start;
padding: 0 20px; /* Add padding to prevent edge touching */
}
#cached-section .cached-grid-container {
position: relative;
width: 512px;
height: 512px;
}
/* Add styles for the reset buttons */
#cached-section .cached-reset-buttons {
display: flex;
gap: 10px;
margin-top: 5px;
margin-bottom: 15px;
justify-content: flex-start;
flex-wrap: wrap; /* Changed from nowrap to wrap to handle different screen sizes */
overflow-x: visible; /* Changed from auto to visible since we're allowing wrapping */
padding-bottom: 5px;
width: 100%; /* Added to ensure it takes full width */
}
#cached-section .cached-reset-button {
padding: 8px 15px;
background-color: #f5f5f5;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
transition: all 0.2s ease;
}
#cached-section .cached-reset-button:hover {
background-color: #e0e0e0;
}
/* Add styles for the grey overlay */
#cached-section .cached-grey-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #888888; /* Solid grey color */
z-index: 10; /* Ensure it's above the grid */
display: none; /* Initially hidden */
}
/* Scoped styles for the cached section */
#cached-section {
font-family: Arial, sans-serif;
}
/* Restore bolder text for headers and word options */
#cached-section h2,
#cached-section .cached-word-option {
font-weight: 700;
}
#cached-section .cached-main-container {
display: flex;
max-width: 1200px; /* Increased width to accommodate side-by-side layout */
margin: 0 auto;
gap: 40px;
align-items: flex-start;
padding: 0 20px;
}
/* Updated to have input and output sides */
#cached-section .cached-side {
flex: 1;
display: flex;
flex-direction: column;
gap: 10px; /* Reduced from 20px */
width: 50%;
}
/* Left side (input) - left aligned */
#cached-section .cached-input-side {
align-items: flex-start;
}
/* Right side (output) - center aligned */
#cached-section .cached-output-side {
align-items: center;
}
#cached-section .cached-side-title {
text-align: center;
font-weight: bold;
margin-bottom: 10px;
font-size: 1.2rem;
width: 100%;
}
#cached-section .cached-grid-container {
position: relative;
width: 512px;
height: 512px;
margin: 0 auto;
}
#cached-section .cached-image {
width: 100%;
height: 100%;
object-fit: cover;
}
#cached-section .cached-grid {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: grid;
/* TODO: Grid define */
grid-template-columns: repeat(8, 1fr);
grid-template-rows: repeat(8, 1fr);
}
#cached-section .cached-grid-cell {
border: 1px solid black;
transition: background-color 0.1s ease;
}
#cached-section .cached-highlighted {
background-color: rgba(128, 128, 128, 0.9);
}
#cached-section .cached-sentence-builder {
width: 512px; /* Match width with image container */
padding: 0px 23px; /* Reduced top padding from 20px to 10px */
}
#cached-section .cached-output-container {
width: 512px; /* Match width with image container */
}
#cached-section .cached-sentence-row {
margin: 10px 0; /* Reduced from 15px to 10px */
display: flex;
gap: 15px;
flex-wrap: wrap;
justify-content: flex-start; /* Align items to the start of the row */
width: 100%; /* Ensure the row takes full width of its container */
}
#cached-section .cached-word-option {
padding: 5px 8px; /* Reduced padding from 12px 20px */
cursor: pointer;
transition: all 0.2s ease;
color: #666;
border-radius: 4px;
font-weight: 600;
background: #f5f5f5;
margin-bottom: 5px; /* Add bottom margin for better spacing when wrapped */
font-size: 0.8rem; /* Added smaller font size */
}
#cached-section .cached-word-option:hover {
color: #000;
font-weight: 600;
background: #e5e5e5;
}
#cached-section .cached-word-option.cached-selected {
color: #886a6a;
font-weight: 600;
background: #e0e0e0;
}
#cached-section .cached-text-display {
margin-top: 20px;
padding: 15px;
background-color: #f5f5f5;
border-radius: 8px;
min-height: 30px;
font-family: monospace;
width: 100%;
box-sizing: border-box;
white-space: pre-wrap;
word-break: break-word;
}
#cached-section .cached-output-display {
margin-top: 10px;
padding: 15px;
background-color: #e6f7ff;
border-radius: 8px;
min-height: 30px;
font-family: monospace;
width: 100%;
box-sizing: border-box;
white-space: pre-wrap;
word-break: break-word;
}
#cached-section .cached-grey-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #888888;
z-index: 10;
display: none;
}
#cached-section .cached-reset-buttons {
display: flex;
gap: 10px;
margin-top: 5px;
margin-bottom: 15px;
justify-content: flex-start;
flex-wrap: nowrap; /* Prevent wrapping */
overflow-x: auto; /* Allow horizontal scrolling if needed */
padding-bottom: 5px; /* Add space for potential scrollbar */
}
#cached-section .cached-reset-button {
padding: 8px 15px;
background-color: #f5f5f5;
border: 1px solid #ddd;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
transition: all 0.2s ease;
}
#cached-section .cached-reset-button:hover {
background-color: #e0e0e0;
}
#cached-section .cached-mask-size-container {
display: flex;
align-items: center;
margin-left: 10px;
}
#cached-section .cached-mask-size-label {
font-size: 12px;
margin-right: 5px;
white-space: nowrap;
}
#cached-section .cached-mask-size-input {
width: 50px;
padding: 6px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 12px;
text-align: center;
}
#cached-section .cached-output-container h2 {
margin-top: 5px;
/* margin-bottom: 10px; */
}
/* Add new styles for the sentence groups layout */
#cached-section .cached-sentence-group {
display: flex;
gap: 10px;
margin-bottom: 0px;
flex-wrap: wrap;
}
#cached-section .cached-sentence-row {
margin: 4px 0px; /* Reduced from 10px to 5px */
display: flex;
gap: 6px;
flex-wrap: wrap;
justify-content: flex-start;
width: calc(50% - 10px); /* Take up roughly half minus gap space */
min-width: 200px; /* Ensure minimum width for readability */
}
@media (max-width: 768px) {
#cached-section .cached-sentence-row {
width: 100%; /* Full width on small screens */
}
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://documentcloud.adobe.com/view-sdk/main.js"></script>
<script defer src="static/js/fontawesome.all.min.js"></script>
<script src="static/js/bulma-carousel.min.js"></script>
<script src="static/js/bulma-slider.min.js"></script>
<script src="static/js/index.js"></script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
</head>
<body>
<section id="cached-section" class="section">
<div class="cached-main-container">
<div class="cached-side cached-input-side">
<div class="cached-side-title">Input</div>
<div class="cached-grid-container">
<img src="static/images/giraffe.png" alt="Input Image" class="cached-image" id="cached-input-image">
<div id="cached-grid" class="cached-grid"></div>
<div id="cached-grey-overlay" class="cached-grey-overlay"></div>
</div>
<div class="cached-sentence-builder">
<div class="cached-reset-buttons">
<button id="cached-reset-image" class="cached-reset-button">Restore Image</button>
<button id="cached-clear-mask" class="cached-reset-button">Clear Mask</button>
<button id="cached-remove-image" class="cached-reset-button">Fully Mask</button>
<div class="cached-mask-size-container" style="display: none;">
<label for="cached-mask-size" class="cached-mask-size-label">Mask Size:</label>
<input type="number" id="cached-mask-size" class="cached-mask-size-input" min="2" max="8" value="7">
</div>
</div>
<h2 style="margin-bottom: 5px;">Build your sentence:</h2>
<div class="cached-sentence-group">
<div class="cached-sentence-row">
<span class="cached-word-option" data-row="0" data-word="a tall">a tall</span>
<span class="cached-word-option" data-row="0" data-word="a happy">a happy</span>
<span class="cached-word-option" data-row="0" data-word="&lt;mask&gt;&lt;mask&gt;&lt;mask&gt;">&lt;mask&gt;</span>
</div>
<div class="cached-sentence-row">
<span class="cached-word-option" data-row="1" data-word="giraffe">giraffe</span>
<span class="cached-word-option" data-row="1" data-word="puppy">puppy</span>
<span class="cached-word-option" data-row="1" data-word="&lt;mask&gt;&lt;mask&gt;&lt;mask&gt;">&lt;mask&gt;</span>
</div>
</div>
<div class="cached-sentence-group">
<div class="cached-sentence-row">
<span class="cached-word-option" data-row="2" data-word="wearing a">wearing a</span>
<span class="cached-word-option" data-row="2" data-word="with a">with a</span>
<span class="cached-word-option" data-row="2" data-word="&lt;mask&gt;&lt;mask&gt;">&lt;mask&gt;</span>
</div>
<div class="cached-sentence-row">
<span class="cached-word-option" data-row="3" data-word="green shirt">green shirt</span>
<span class="cached-word-option" data-row="3" data-word="top hat">top hat</span>
<span class="cached-word-option" data-row="3" data-word="&lt;mask&gt;&lt;mask&gt;">&lt;mask&gt;</span>
</div>
</div>
<div class="cached-sentence-group">
<div class="cached-sentence-row">
<span class="cached-word-option" data-row="4" data-word=", detailed portrait">detailed</span>
<span class="cached-word-option" data-row="4" data-word=", cartoon style">cartoon</span>
<span class="cached-word-option" data-row="4" data-word="&lt;mask&gt;&lt;mask&gt;">&lt;mask&gt;</span>
</div>
</div>
<div id="cached-current-sentence" class="cached-text-display">Click word pairs above to build your sentence!</div>
</div>
</div>
<!-- Right side - Output -->
<div class="cached-side cached-output-side">
<div class="cached-side-title">Output</div>
<div class="cached-grid-container">
<img src="static/images/giraffe.png" alt="Output Image" class="cached-image" id="cached-output-image">
<div id="cached-output-overlay" class="cached-grey-overlay" style="display: block;"></div>
</div>
<div class="cached-output-container">
<h2>Model Response:</h2>
<div id="cached-response-text" class="cached-output-display">Select words and interact with the input image to see results here.</div>
</div>
</div>
</div>
<script src="static/js/cached_section.js"></script>
</section>
<!-- BibTeX Citation -->
<section class="section" id="BibTeX">
<div class="container is-max-desktop content">
<h2 class="title">BibTeX</h2>
<pre><code>@article{swerdlow2025unidisc,
title = {Unified Multimodal Discrete Diffusion},
author = {Swerdlow, Alexander and Prabhudesai, Mihir and Gandhi, Siddharth and Pathak, Deepak and Fragkiadaki, Katerina},
journal = {arXiv preprint arXiv:2503.20853},
year = {2025},
doi = {10.48550/arXiv.2503.20853},
}</code></pre>
</div>
</section>
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="columns is-centered">
<div class="column is-8">
<div class="content">
<p>
This page was built using the <a href="https://github.com/eliahuhorwitz/Academic-project-page-template" target="_blank">Academic Project Page Template</a> which was adopted from the <a href="https://nerfies.github.io" target="_blank">Nerfies</a> project page. This website is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/" target="_blank">Creative
Commons Attribution-ShareAlike 4.0 International License</a>.
</p>
</div>
</div>
</div>
</div>
</footer>
</body>
</html>