diff --git a/.github/workflows/test-real-models.yml b/.github/workflows/test-real-models.yml
index ef26f77..c28cccc 100644
--- a/.github/workflows/test-real-models.yml
+++ b/.github/workflows/test-real-models.yml
@@ -101,3 +101,26 @@ jobs:
destination_dir: ${{ github.run_number }}
keep_files: true
enable_jekyll: false
+
+ - name: Checkout gh-pages branch
+ if: always()
+ uses: actions/checkout@v4
+ with:
+ ref: gh-pages
+ path: gh-pages-content
+
+ - name: Generate central index page
+ if: always()
+ run: |
+ mkdir -p deploy-index
+ python tests/generate_index_page.py gh-pages-content deploy-index/index.html ${{ github.repository }}
+ ls -la deploy-index/
+
+ - name: Deploy index page to root
+ if: always()
+ uses: peaceiris/actions-gh-pages@v3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: ./deploy-index
+ keep_files: true
+ enable_jekyll: false
diff --git a/.gitignore b/.gitignore
index 29bb157..eb07a56 100644
--- a/.gitignore
+++ b/.gitignore
@@ -208,3 +208,7 @@ cython_debug/
marimo/_static/
marimo/_lsp/
__marimo__/
+
+# Local marker files (machine-specific installation state)
+.flash_attn_attempted
+.assets_copied
diff --git a/__init__.py b/__init__.py
index 8be8640..c6bacc3 100644
--- a/__init__.py
+++ b/__init__.py
@@ -45,12 +45,12 @@ NODE_CLASS_MAPPINGS = {
}
NODE_DISPLAY_NAME_MAPPINGS = {
- "GroundingModelLoader": "Grounding Model Loader",
+ "GroundingModelLoader": "Grounding Model (down)Loader",
"GroundingDetector": "Grounding Detector",
"BboxVisualizer": "Bounding Box Visualizer",
"DownloadAndLoadSAM2Model": "(Down)Load SAM2Model",
"Sam2Segmentation": "Sam2 Segmentation",
- "GroundingMaskModelLoader": "Grounding Mask Model Loader",
+ "GroundingMaskModelLoader": "Grounding Mask Model (down)Loader",
"GroundingMaskDetector": "Grounding Mask Detector",
"BatchCropAndPadFromMask": "Batch Crop and Pad From Mask",
}
diff --git a/assets/brekkie.jpg b/assets/brekkie.jpg
new file mode 100644
index 0000000..52b6cf6
Binary files /dev/null and b/assets/brekkie.jpg differ
diff --git a/prestartup_script.py b/prestartup_script.py
index 9efed0f..ffc7176 100644
--- a/prestartup_script.py
+++ b/prestartup_script.py
@@ -1,14 +1,11 @@
"""
PreStartup Script for ComfyUI-Grounding
-- Attempts to install flash_attn (optional dependency) on first run
- Copies example assets and workflows to ComfyUI directories on first run
"""
import os
import shutil
-import subprocess
import sys
-from pathlib import Path
# Import folder_paths from ComfyUI
try:
@@ -28,11 +25,6 @@ def get_marker_file():
return os.path.join(get_node_dir(), ".assets_copied")
-def get_flash_attn_marker():
- """Get path to marker file that tracks if flash_attn installation was attempted"""
- return os.path.join(get_node_dir(), ".flash_attn_attempted")
-
-
def has_assets_been_copied():
"""Check if assets have already been copied"""
return os.path.exists(get_marker_file())
@@ -47,72 +39,6 @@ def mark_assets_as_copied():
print(f"[ComfyUI-Grounding] Warning: Could not create marker file: {e}")
-def mark_flash_attn_attempted(success):
- """Create marker file to indicate flash_attn installation was attempted"""
- try:
- with open(get_flash_attn_marker(), 'w') as f:
- if success:
- f.write("flash_attn installed successfully\n")
- else:
- f.write("flash_attn installation failed (optional)\n")
- except Exception as e:
- print(f"[ComfyUI-Grounding] Warning: Could not create flash_attn marker: {e}")
-
-
-def try_install_flash_attn():
- """
- Attempt to install flash_attn (optional dependency for faster inference).
- Only runs once - uses marker file to track attempts.
- """
- # Check if already attempted
- if os.path.exists(get_flash_attn_marker()):
- return True # Already attempted, skip
-
- print("[ComfyUI-Grounding] Checking for flash_attn...")
-
- # Check if already installed
- try:
- import flash_attn
- print("[ComfyUI-Grounding] ✅ flash_attn already installed")
- mark_flash_attn_attempted(True)
- return True
- except ImportError:
- pass
-
- print("[ComfyUI-Grounding] Attempting to install flash_attn (optional)...")
- print("[ComfyUI-Grounding] Note: This may take 5-10 minutes and requires CUDA GPU")
-
- try:
- result = subprocess.run(
- [sys.executable, "-m", "pip", "install", "flash-attn", "--prefer-binary"],
- capture_output=True,
- text=True,
- timeout=300 # 5 minute timeout
- )
-
- if result.returncode == 0:
- print("[ComfyUI-Grounding] ✅ flash_attn installed successfully")
- print("[ComfyUI-Grounding] Florence-2 and SA2VA will use faster inference")
- mark_flash_attn_attempted(True)
- return True
- else:
- print("[ComfyUI-Grounding] ⚠️ flash_attn installation failed")
- print("[ComfyUI-Grounding] This is optional - nodes will work without it")
- mark_flash_attn_attempted(False)
- return False
-
- except subprocess.TimeoutExpired:
- print("[ComfyUI-Grounding] ⚠️ flash_attn installation timed out")
- print("[ComfyUI-Grounding] Continuing without it (nodes will still work)")
- mark_flash_attn_attempted(False)
- return False
- except Exception as e:
- print(f"[ComfyUI-Grounding] ⚠️ flash_attn installation error: {e}")
- print("[ComfyUI-Grounding] Continuing without flash_attn")
- mark_flash_attn_attempted(False)
- return False
-
-
def copy_assets():
"""Copy example assets recursively to ComfyUI input directory"""
node_dir = get_node_dir()
@@ -254,9 +180,6 @@ def main():
"""Main initialization function"""
print("[ComfyUI-Grounding] PreStartup Script Running...")
- # Try to install flash_attn (optional, only on first run)
- try_install_flash_attn()
-
# Copy assets and workflows (skips files that already exist)
print("[ComfyUI-Grounding] Checking assets and workflows...")
assets_ok = copy_assets()
diff --git a/requirements.txt b/requirements.txt
index bdec250..8b4d4b9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,7 +9,6 @@ einops>=0.6.0 # Required by Florence-2 and SA2VA model architectures
ultralytics>=8.2.0
hf_transfer
peft
-# flash_attn # Optional - improves SA2VA performance but not required
# Image processing (usually already installed with ComfyUI)
# pillow>=10.0.0
@@ -26,4 +25,4 @@ tqdm>=4.65.0
torch<=2.8.0
torchvision
torchaudio
-# flash_attn # Optional - improves SA2VA inference speed but not required
+flash_attn
\ No newline at end of file
diff --git a/tests/generate_index_page.py b/tests/generate_index_page.py
new file mode 100644
index 0000000..10047f9
--- /dev/null
+++ b/tests/generate_index_page.py
@@ -0,0 +1,335 @@
+#!/usr/bin/env python3
+"""
+Generate central landing page for all test runs
+"""
+import os
+import json
+import re
+from pathlib import Path
+from datetime import datetime, timezone
+
+
+def scan_gh_pages_runs(gh_pages_dir):
+ """Scan gh-pages directory for all run directories and extract metadata"""
+
+ gh_pages_path = Path(gh_pages_dir)
+ if not gh_pages_path.exists():
+ print(f"Warning: {gh_pages_dir} does not exist")
+ return []
+
+ runs = []
+
+ # Find all directories that are numeric (run numbers)
+ for item in gh_pages_path.iterdir():
+ if item.is_dir() and item.name.isdigit():
+ run_number = int(item.name)
+
+ # Count PNG images
+ png_files = list(item.glob("*.png"))
+ image_count = len(png_files)
+
+ # Try to get timestamp from index.html if it exists
+ index_file = item / "index.html"
+ timestamp = None
+ if index_file.exists():
+ try:
+ content = index_file.read_text()
+ # Extract timestamp from "Generated: YYYY-MM-DD HH:MM:SS UTC"
+ match = re.search(r'Generated: ([\d\-: ]+) UTC', content)
+ if match:
+ timestamp = match.group(1)
+ except Exception as e:
+ print(f"Warning: Could not read timestamp from {index_file}: {e}")
+
+ # If no timestamp found, use directory modification time
+ if not timestamp:
+ mtime = item.stat().st_mtime
+ timestamp = datetime.fromtimestamp(mtime).strftime("%Y-%m-%d %H:%M:%S")
+
+ runs.append({
+ "run_number": run_number,
+ "timestamp": timestamp,
+ "image_count": image_count,
+ "has_gallery": index_file.exists()
+ })
+
+ # Sort by run number (descending - newest first)
+ runs.sort(key=lambda x: x["run_number"], reverse=True)
+
+ return runs
+
+
+def generate_index_html(runs, output_file, repo_name="ComfyUI-Grounding"):
+ """Generate the central landing page HTML"""
+
+ total_images = sum(run["image_count"] for run in runs)
+
+ html = f"""
+
+
+
+
+ ComfyUI-Grounding Test Results
+
+
+
+
+
🧪 Test Results Gallery
+
Visual outputs from ComfyUI-Grounding automated tests
+
+
+
+
{len(runs)}
+
Test Runs
+
+
+
{total_images}
+
Total Images
+
+
+
{runs[0]['image_count'] if runs else 0}
+
Latest Run Images
+
+
+
+
+
All Test Runs
+"""
+
+ if runs:
+ html += '
\n'
+ else:
+ html += """
+
+
📭
+
No test runs found yet. Check back after the first workflow execution!
+
+"""
+
+ html += f"""
+
+
+
+
+
+
+"""
+
+ # Write the HTML file
+ output_path = Path(output_file)
+ output_path.write_text(html)
+ print(f"✅ Generated index page at {output_path}")
+ print(f"📊 {len(runs)} runs listed")
+ print(f"🖼️ {total_images} total images")
+
+
+def main():
+ import sys
+
+ if len(sys.argv) < 2:
+ print("Usage: python generate_index_page.py [output-file] [repo-name]")
+ print("Example: python generate_index_page.py ./gh-pages index.html ComfyUI-Grounding")
+ sys.exit(1)
+
+ gh_pages_dir = sys.argv[1]
+ output_file = sys.argv[2] if len(sys.argv) > 2 else "index.html"
+ repo_name = sys.argv[3] if len(sys.argv) > 3 else "ComfyUI-Grounding"
+
+ print(f"🔍 Scanning {gh_pages_dir} for test runs...")
+ runs = scan_gh_pages_runs(gh_pages_dir)
+
+ print(f"📝 Generating index page...")
+ generate_index_html(runs, output_file, repo_name)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/workflows/mask_grounding.json b/workflows/mask_grounding.json
index f91584e..7ab0d88 100644
--- a/workflows/mask_grounding.json
+++ b/workflows/mask_grounding.json
@@ -1,58 +1,59 @@
{
"id": "38945c5c-4e77-4d6c-b916-6a2f0a1b6a89",
"revision": 0,
- "last_node_id": 32,
- "last_link_id": 39,
+ "last_node_id": 36,
+ "last_link_id": 44,
"nodes": [
{
- "id": 28,
- "type": "InvertMask",
+ "id": 33,
+ "type": "LoadImage",
"pos": [
- 98.71468314873522,
- -76.55255233775446
+ -303.3027379792829,
+ 92.61863567718751
],
"size": [
- 140,
- 26
+ 274.080078125,
+ 314
],
"flags": {},
- "order": 3,
+ "order": 0,
"mode": 0,
- "inputs": [
- {
- "name": "mask",
- "type": "MASK",
- "link": 33
- }
- ],
+ "inputs": [],
"outputs": [
+ {
+ "name": "IMAGE",
+ "type": "IMAGE",
+ "links": [
+ 42
+ ]
+ },
{
"name": "MASK",
"type": "MASK",
- "links": [
- 34
- ]
+ "links": null
}
],
"properties": {
- "cnr_id": "comfy-core",
- "ver": "0.3.67",
- "Node name for S&R": "InvertMask"
- }
+ "Node name for S&R": "LoadImage"
+ },
+ "widgets_values": [
+ "brekkie.jpg",
+ "image"
+ ]
},
{
"id": 31,
"type": "PreviewAny",
"pos": [
- 110.50039305540561,
- 281.573065740487
+ 580.0735093941091,
+ 291.1285668669379
],
"size": [
- 140,
- 76
+ 210,
+ 88
],
"flags": {},
- "order": 5,
+ "order": 4,
"mode": 0,
"inputs": [
{
@@ -63,9 +64,9 @@
],
"outputs": [],
"properties": {
+ "Node name for S&R": "PreviewAny",
"cnr_id": "comfy-core",
- "ver": "0.3.67",
- "Node name for S&R": "PreviewAny"
+ "ver": "0.3.67"
},
"widgets_values": []
},
@@ -73,15 +74,15 @@
"id": 29,
"type": "PreviewImage",
"pos": [
- 533.6126667407317,
- 103.92480629195937
+ 564.3432225749335,
+ -58.75360697114505
],
"size": [
279.1381383513526,
299.2129823737602
],
"flags": {},
- "order": 4,
+ "order": 3,
"mode": 0,
"inputs": [
{
@@ -92,202 +93,12 @@
],
"outputs": [],
"properties": {
+ "Node name for S&R": "PreviewImage",
"cnr_id": "comfy-core",
- "ver": "0.3.67",
- "Node name for S&R": "PreviewImage"
+ "ver": "0.3.67"
},
"widgets_values": []
},
- {
- "id": 30,
- "type": "PreviewImage",
- "pos": [
- 532.7368358026316,
- -228.9107803208185
- ],
- "size": [
- 289.0763407319919,
- 290.26959173790755
- ],
- "flags": {},
- "order": 7,
- "mode": 0,
- "inputs": [
- {
- "name": "images",
- "type": "IMAGE",
- "link": 36
- }
- ],
- "outputs": [],
- "properties": {
- "cnr_id": "comfy-core",
- "ver": "0.3.67",
- "Node name for S&R": "PreviewImage"
- },
- "widgets_values": []
- },
- {
- "id": 32,
- "type": "LoadImagesFromFolderKJ",
- "pos": [
- -309.5514298801789,
- 161.68998793772164
- ],
- "size": [
- 290.5201171875,
- 262
- ],
- "flags": {},
- "order": 0,
- "mode": 0,
- "inputs": [],
- "outputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "links": [
- 38,
- 39
- ]
- },
- {
- "name": "mask",
- "type": "MASK",
- "links": null
- },
- {
- "name": "count",
- "type": "INT",
- "links": null
- },
- {
- "name": "image_path",
- "type": "STRING",
- "links": null
- }
- ],
- "properties": {
- "cnr_id": "comfyui-kjnodes",
- "ver": "1.1.9",
- "Node name for S&R": "LoadImagesFromFolderKJ"
- },
- "widgets_values": [
- "input/tobatch",
- 1024,
- 1024,
- "pad",
- 0,
- 0,
- false
- ]
- },
- {
- "id": 26,
- "type": "JoinImageWithAlpha",
- "pos": [
- 259.332162129211,
- -105.19057150244885
- ],
- "size": [
- 176.86484375,
- 46
- ],
- "flags": {},
- "order": 6,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 39
- },
- {
- "name": "alpha",
- "type": "MASK",
- "link": 34
- }
- ],
- "outputs": [
- {
- "name": "IMAGE",
- "type": "IMAGE",
- "links": [
- 36
- ]
- }
- ],
- "properties": {
- "cnr_id": "comfy-core",
- "ver": "0.3.67",
- "Node name for S&R": "JoinImageWithAlpha"
- }
- },
- {
- "id": 19,
- "type": "GroundingMaskDetector",
- "pos": [
- 106.9620845129382,
- -14.471635853967237
- ],
- "size": [
- 400,
- 248
- ],
- "flags": {},
- "order": 2,
- "mode": 0,
- "inputs": [
- {
- "name": "model",
- "type": "MASK_MODEL",
- "link": 21
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 38
- }
- ],
- "outputs": [
- {
- "name": "masks",
- "type": "MASK",
- "links": [
- 33
- ]
- },
- {
- "name": "overlaid_mask",
- "type": "IMAGE",
- "links": [
- 35
- ]
- },
- {
- "name": "text",
- "type": "STRING",
- "links": [
- 37
- ]
- }
- ],
- "properties": {
- "aux_id": "PozzettiAndrea/ComfyUI-Grounding",
- "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0",
- "Node name for S&R": "GroundingMaskDetector"
- },
- "widgets_values": [
- "segment the main object in the image.",
- 0.3,
- 1024,
- 3,
- 2048,
- 1,
- 42,
- "fixed"
- ]
- },
{
"id": 18,
"type": "GroundingMaskModelLoader",
@@ -313,14 +124,75 @@
}
],
"properties": {
+ "Node name for S&R": "GroundingMaskModelLoader",
"aux_id": "PozzettiAndrea/ComfyUI-Grounding",
- "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0",
- "Node name for S&R": "GroundingMaskModelLoader"
+ "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0"
},
"widgets_values": [
- "SA2VA: 1B",
+ "SA2VA: 4B",
"bf16"
]
+ },
+ {
+ "id": 19,
+ "type": "GroundingMaskDetector",
+ "pos": [
+ 106.9620845129382,
+ -14.471635853967237
+ ],
+ "size": [
+ 400,
+ 248
+ ],
+ "flags": {},
+ "order": 2,
+ "mode": 0,
+ "inputs": [
+ {
+ "name": "model",
+ "type": "MASK_MODEL",
+ "link": 21
+ },
+ {
+ "name": "image",
+ "type": "IMAGE",
+ "link": 42
+ }
+ ],
+ "outputs": [
+ {
+ "name": "masks",
+ "type": "MASK",
+ "links": []
+ },
+ {
+ "name": "overlaid_mask",
+ "type": "IMAGE",
+ "links": [
+ 35
+ ]
+ },
+ {
+ "name": "text",
+ "type": "STRING",
+ "links": [
+ 37
+ ]
+ }
+ ],
+ "properties": {
+ "Node name for S&R": "GroundingMaskDetector",
+ "aux_id": "PozzettiAndrea/ComfyUI-Grounding",
+ "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0"
+ },
+ "widgets_values": [
+ "Segment the food with the most vitamin C",
+ 0.3,
+ 2048,
+ 1,
+ 42,
+ "fixed"
+ ]
}
],
"links": [
@@ -332,22 +204,6 @@
0,
"MASK_MODEL"
],
- [
- 33,
- 19,
- 0,
- 28,
- 0,
- "MASK"
- ],
- [
- 34,
- 28,
- 0,
- 26,
- 1,
- "MASK"
- ],
[
35,
19,
@@ -356,14 +212,6 @@
0,
"IMAGE"
],
- [
- 36,
- 26,
- 0,
- 30,
- 0,
- "IMAGE"
- ],
[
37,
19,
@@ -373,30 +221,22 @@
"*"
],
[
- 38,
- 32,
+ 42,
+ 33,
0,
19,
1,
"IMAGE"
- ],
- [
- 39,
- 32,
- 0,
- 26,
- 0,
- "IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
- "scale": 1.2894499156462411,
+ "scale": 1.0656610873109524,
"offset": [
- 386.94731260454324,
- 226.3186553038392
+ 315.358950162618,
+ 142.88899383901187
]
},
"frontendVersion": "1.28.8"
diff --git a/workflows/normal_grounding.json b/workflows/normal_grounding.json
index 706b5c0..8b1465c 100644
--- a/workflows/normal_grounding.json
+++ b/workflows/normal_grounding.json
@@ -1,8 +1,8 @@
{
"id": "23662dd8-0bfd-4ab0-833e-1775efda6729",
"revision": 0,
- "last_node_id": 17,
- "last_link_id": 19,
+ "last_node_id": 19,
+ "last_link_id": 21,
"nodes": [
{
"id": 3,
@@ -13,7 +13,7 @@
],
"size": [
270,
- 82
+ 58
],
"flags": {},
"order": 0,
@@ -29,163 +29,49 @@
}
],
"properties": {
+ "Node name for S&R": "GroundingModelLoader",
"aux_id": "PozzettiAndrea/ComfyUI-Grounding",
- "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0",
- "Node name for S&R": "GroundingModelLoader"
+ "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0"
},
"widgets_values": [
- "Florence-2: Large (0.77B params)",
- "eager"
+ "Florence-2: Large (0.77B params)"
]
},
{
- "id": 12,
- "type": "DownloadAndLoadSAM2Model",
+ "id": 18,
+ "type": "LoadImage",
"pos": [
- 134.1244248881893,
- -152.4815917189195
+ -361.5061512509591,
+ 112.76113420046104
],
"size": [
- 270,
- 130
+ 274.080078125,
+ 314
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
- "outputs": [
- {
- "name": "sam2_model",
- "type": "SAM2MODEL",
- "links": [
- 10
- ]
- }
- ],
- "properties": {
- "aux_id": "PozzettiAndrea/ComfyUI-Grounding",
- "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0",
- "Node name for S&R": "DownloadAndLoadSAM2Model"
- },
- "widgets_values": [
- "sam2.1_hiera_large.safetensors",
- "single_image",
- "cuda",
- "fp16"
- ]
- },
- {
- "id": 14,
- "type": "JoinImageWithAlpha",
- "pos": [
- 806.4560194385198,
- 47.17325913006609
- ],
- "size": [
- 176.86484375,
- 46
- ],
- "flags": {},
- "order": 6,
- "mode": 0,
- "inputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "link": 13
- },
- {
- "name": "alpha",
- "type": "MASK",
- "link": 17
- }
- ],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
- 19
+ 20
]
+ },
+ {
+ "name": "MASK",
+ "type": "MASK",
+ "links": null
}
],
"properties": {
- "cnr_id": "comfy-core",
- "ver": "0.3.67",
- "Node name for S&R": "JoinImageWithAlpha"
- },
- "widgets_values": []
- },
- {
- "id": 11,
- "type": "Sam2Segmentation",
- "pos": [
- 507.4435292430558,
- 34.683721146105555
- ],
- "size": [
- 272.087890625,
- 254
- ],
- "flags": {},
- "order": 4,
- "mode": 0,
- "inputs": [
- {
- "name": "sam2_model",
- "type": "SAM2MODEL",
- "link": 10
- },
- {
- "name": "image",
- "type": "IMAGE",
- "link": 11
- },
- {
- "name": "coordinates_positive",
- "shape": 7,
- "type": "STRING",
- "link": null
- },
- {
- "name": "coordinates_negative",
- "shape": 7,
- "type": "STRING",
- "link": null
- },
- {
- "name": "bboxes",
- "shape": 7,
- "type": "BBOX",
- "link": 12
- },
- {
- "name": "mask",
- "shape": 7,
- "type": "MASK",
- "link": null
- }
- ],
- "outputs": [
- {
- "name": "mask",
- "type": "MASK",
- "links": [
- 16
- ]
- }
- ],
- "properties": {
- "aux_id": "PozzettiAndrea/ComfyUI-Grounding",
- "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0",
- "Node name for S&R": "Sam2Segmentation"
+ "Node name for S&R": "LoadImage"
},
"widgets_values": [
- false,
- false,
- 0,
- 0,
- 0
+ "plantpot.png",
+ "image"
]
},
{
@@ -197,10 +83,10 @@
],
"size": [
400,
- 364
+ 340
],
"flags": {},
- "order": 3,
+ "order": 2,
"mode": 0,
"inputs": [
{
@@ -211,21 +97,21 @@
{
"name": "image",
"type": "IMAGE",
- "link": 8
+ "link": 20
}
],
"outputs": [
{
"name": "bboxes",
"type": "BBOX",
- "links": [
- 12
- ]
+ "links": []
},
{
"name": "annotated_image",
"type": "IMAGE",
- "links": []
+ "links": [
+ 21
+ ]
},
{
"name": "labels",
@@ -239,144 +125,45 @@
}
],
"properties": {
+ "Node name for S&R": "GroundingDetector",
"aux_id": "PozzettiAndrea/ComfyUI-Grounding",
- "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0",
- "Node name for S&R": "GroundingDetector"
+ "ver": "a947f4961c39cc150a98738fa83a0494e52f3de0"
},
"widgets_values": [
- "main object",
+ "plant. watering can",
0.3,
false,
true,
"list_only",
- 0.25,
1024,
3,
- 0.45,
- false,
- 300,
42,
"fixed"
]
},
{
- "id": 15,
- "type": "InvertMask",
- "pos": [
- 634.4085072101292,
- -31.37835895949953
- ],
- "size": [
- 140,
- 26
- ],
- "flags": {},
- "order": 5,
- "mode": 0,
- "inputs": [
- {
- "name": "mask",
- "type": "MASK",
- "link": 16
- }
- ],
- "outputs": [
- {
- "name": "MASK",
- "type": "MASK",
- "links": [
- 17
- ]
- }
- ],
- "properties": {
- "cnr_id": "comfy-core",
- "ver": "0.3.67",
- "Node name for S&R": "InvertMask"
- },
- "widgets_values": []
- },
- {
- "id": 9,
- "type": "LoadImagesFromFolderKJ",
- "pos": [
- -319.8692780804565,
- 159.9365003928532
- ],
- "size": [
- 290.5201171875,
- 262
- ],
- "flags": {},
- "order": 2,
- "mode": 0,
- "inputs": [],
- "outputs": [
- {
- "name": "image",
- "type": "IMAGE",
- "links": [
- 8,
- 11,
- 13
- ]
- },
- {
- "name": "mask",
- "type": "MASK",
- "links": null
- },
- {
- "name": "count",
- "type": "INT",
- "links": null
- },
- {
- "name": "image_path",
- "type": "STRING",
- "links": null
- }
- ],
- "properties": {
- "cnr_id": "comfyui-kjnodes",
- "ver": "1.1.9",
- "Node name for S&R": "LoadImagesFromFolderKJ"
- },
- "widgets_values": [
- "input/tobatch",
- 1024,
- 1024,
- "pad",
- 0,
- 0,
- false
- ]
- },
- {
- "id": 17,
+ "id": 19,
"type": "PreviewImage",
"pos": [
- 1001.6651677560029,
- 55.417983277011885
+ 530.6472534980396,
+ 42.682752634548045
],
"size": [
- 330.90445054815405,
- 258
+ 339.1799683347449,
+ 401.7374663149234
],
"flags": {},
- "order": 7,
+ "order": 3,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
- "link": 19
+ "link": 21
}
],
"outputs": [],
"properties": {
- "cnr_id": "comfy-core",
- "ver": "0.3.67",
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
@@ -392,66 +179,18 @@
"GROUNDING_MODEL"
],
[
- 8,
- 9,
+ 20,
+ 18,
0,
1,
1,
"IMAGE"
],
[
- 10,
- 12,
- 0,
- 11,
- 0,
- "SAM2MODEL"
- ],
- [
- 11,
- 9,
- 0,
- 11,
+ 21,
1,
- "IMAGE"
- ],
- [
- 12,
1,
- 0,
- 11,
- 4,
- "BBOX"
- ],
- [
- 13,
- 9,
- 0,
- 14,
- 0,
- "IMAGE"
- ],
- [
- 16,
- 11,
- 0,
- 15,
- 0,
- "MASK"
- ],
- [
- 17,
- 15,
- 0,
- 14,
- 1,
- "MASK"
- ],
- [
19,
- 14,
- 0,
- 17,
0,
"IMAGE"
]
@@ -460,10 +199,10 @@
"config": {},
"extra": {
"ds": {
- "scale": 0.9278994587027772,
+ "scale": 0.8435449624570703,
"offset": [
- 508.01216790085954,
- 282.0476732486773
+ 425.7123038653443,
+ 180.08680307006819
]
},
"frontendVersion": "1.28.8"