| name | sam-cell-seg |
| description | Guidance for SAM-based cell segmentation and mask conversion tasks involving MobileSAM, mask-to-polygon conversion, CSV processing, and command-line interface design. This skill applies when working with Segment Anything Model (SAM) for biological image segmentation, converting binary masks to polygon coordinates, processing microscopy data, or building CLI tools that interface with deep learning models. (project) |
SAM Cell Segmentation Skill
This skill provides guidance for tasks involving SAM (Segment Anything Model) based cell segmentation, mask processing, and polygon conversion pipelines.
Task Characteristics
This skill applies to tasks that involve:
- Using MobileSAM or SAM models for image segmentation
- Converting binary masks to polygon/polyline representations
- Processing CSV files containing coordinate data
- Building command-line tools for deep learning inference pipelines
- Cell or object segmentation in microscopy images
Critical Pre-Implementation Steps
1. Interface Requirements Discovery
Before writing any code, verify the exact interface requirements:
-
Check how the script will be invoked:
- Read test files or evaluation harnesses to understand expected argument format
- Determine if arguments should be positional or keyword (
--arg_name)
- Verify exact argument names expected by the test framework
-
Verify output format specifications:
- Check input file format and match output format exactly
- Pay attention to data types: lists vs tuples, strings vs numbers
- Verify column names, ordering, and delimiters in CSV outputs
-
Understand the evaluation criteria:
- Identify metrics used (IoU, accuracy, etc.) and their thresholds
- Understand what constitutes pass/fail conditions
2. Environment Assumptions
- Trust that specified packages will be available in the test environment
- Do not spend excessive time on environment setup or package installation
- If package installation fails or times out, proceed with code development assuming packages exist
- Focus on code correctness over environment debugging
Implementation Approach
Argument Parsing Pattern
When building CLI tools for ML pipelines, use keyword arguments with explicit flags:
import argparse
def parse_args():
parser = argparse.ArgumentParser(description='Process masks with SAM')
parser.add_argument('--weights_path', type=str, required=True,
help='Path to model weights')
parser.add_argument('--csv_path', type=str, required=True,
help='Path to input CSV')
parser.add_argument('--rgb_path', type=str, required=True,
help='Path to RGB image')
parser.add_argument('--output_path', type=str, required=True,
help='Path for output CSV')
return parser.parse_args()
Data Type Consistency
Ensure consistent data types throughout the pipeline:
def mask_to_polygon(mask):
return [[int(x), int(y)] for x, y in coordinates]
def save_coordinates(coords, output_path):
formatted_coords = [list(c) if isinstance(c, tuple) else c for c in coords]
SAM/MobileSAM Integration Pattern
def load_sam_model(weights_path, device='cuda'):
"""Load SAM model with proper device handling."""
if device == 'cuda' and not torch.cuda.is_available():
device = 'cpu'
model = sam_model_registry[model_type](checkpoint=weights_path)
model.to(device)
model.eval()
return model, device
def refine_mask_with_sam(sam_model, image, initial_mask, device):
"""Use SAM to refine an initial mask."""
predictor = SamPredictor(sam_model)
predictor.set_image(image)
masks, scores, _ = predictor.predict(
point_coords=point_coords,
point_labels=point_labels,
box=box,
multimask_output=True
)
best_mask = select_best_mask(masks, scores, initial_mask)
return best_mask
Mask-to-Polygon Conversion
import cv2
import numpy as np
def mask_to_polygon(binary_mask, simplify_tolerance=1.0):
"""Convert binary mask to polygon coordinates."""
mask = (binary_mask > 0).astype(np.uint8) * 255
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if not contours:
return []
largest_contour = max(contours, key=cv2.contourArea)
epsilon = simplify_tolerance * cv2.arcLength(largest_contour, True)
simplified = cv2.approxPolyDP(largest_contour, epsilon, True)
polygon = [[int(pt[0][0]), int(pt[0][1])] for pt in simplified]
return polygon
Verification Checklist
Before Submission
-
Interface Verification:
-
Output Format Verification:
-
End-to-End Testing:
-
Quality Metrics:
Code Review Points
- Argument Parser: Uses
--flag format, not positional arguments
- Data Types: Coordinates stored as lists, not tuples
- Error Handling: Graceful handling of edge cases (empty masks, missing files)
- Device Handling: Proper CUDA/CPU fallback logic
Common Pitfalls
1. Argument Format Mismatch
Problem: Using positional arguments when tests expect keyword arguments.
Detection: Script fails with "unrecognized arguments" or similar errors.
Solution: Always check test invocation format before implementing argparse.
2. Data Type Inconsistency
Problem: Storing coordinates as tuples when lists are expected.
Detection: Test failures related to coordinate format or JSON serialization issues.
Solution: Explicitly convert to lists before saving: [list(coord) for coord in coords]
3. Incomplete Processing
Problem: Not all input rows appear in output.
Detection: Row count mismatch between input and output.
Solution: Verify loop processes all rows; add logging to track progress.
4. Environment Debugging Trap
Problem: Spending excessive time on package installation when it times out.
Detection: Multiple failed installation attempts.
Solution: Trust the test environment; focus on code correctness. If packages fail to install locally, proceed assuming they exist.
5. Premature Completion Declaration
Problem: Declaring task complete without end-to-end verification.
Detection: Fundamental errors discovered only during test evaluation.
Solution: Always run the actual command with test arguments before declaring completion.
6. Truncated File Reading
Problem: Not reading entire file contents, missing critical code sections.
Detection: Code review misses obvious errors in unread sections.
Solution: When file output is truncated, read in chunks or use offset/limit parameters.
Testing Strategy
Unit Test Priority Order
- Argument parsing: Verify CLI interface matches expectations
- Input/Output format: Verify data flows correctly through pipeline
- Core functionality: Test mask processing and polygon conversion
- Integration: End-to-end pipeline test
Minimum Viable Test
import subprocess
import sys
def test_cli_interface():
"""Verify script accepts expected arguments."""
result = subprocess.run(
[sys.executable, 'script.py', '--help'],
capture_output=True,
text=True
)
assert result.returncode == 0
assert '--weights_path' in result.stdout
assert '--csv_path' in result.stdout
assert '--rgb_path' in result.stdout
assert '--output_path' in result.stdout
Task Execution Order
- Read test files or evaluation harness to understand interface requirements
- Identify exact argument format and output format specifications
- Implement argument parsing matching discovered requirements
- Implement core functionality (SAM loading, mask processing, polygon conversion)
- Verify interface with
--help flag
- Run end-to-end test with sample data
- Verify output format matches specifications exactly
- Check all quality metrics meet thresholds