- Fixed dimension mismatch between mask and display image after undo - Mask was being created at original image size, but displayImage is at preview scale after undo/redo (renderPreview scales images > 2048px) - Now create mask at actual displayImage dimensions, ensuring mask and image sizes match for inpainting - Also fixed edge refinement gradient to recompute when image changes
CheapRetouch
A privacy-first iOS photo editor for removing unwanted elements from your photos — powered by on-device machine learning.
Features
🧑 Person Removal
Tap on any person in your photo to instantly remove them. The app uses Apple's Vision framework to generate precise segmentation masks, then fills the removed area seamlessly.
📦 Object Removal
Remove unwanted foreground objects with a single tap. When automatic detection isn't possible, use the smart brush tool with edge-aware refinement for manual selection.
⚡ Wire & Line Removal
Easily remove power lines, cables, and other thin linear objects. The app detects contours and automatically selects wire-like shapes, or you can trace them manually with the line brush.
How It Works
CheapRetouch combines Apple's Vision framework for intelligent object detection with an AI-powered inpainting engine:
Object Detection (Vision Framework)
VNGenerateForegroundInstanceMaskRequest— Generates pixel-accurate masks for people and salient foreground objectsVNDetectContoursRequest— Detects edges and contours for wire/line detection- Tap-based selection — Simply tap on what you want to remove
AI-Powered Inpainting (LaMa Model)
The app uses LaMa (Large Mask Inpainting), a state-of-the-art deep learning model optimized for removing objects from images:
- Model:
LaMaFP16_512.mlpackage— A Core ML-optimized neural network running entirely on-device - Architecture: Fourier convolutions that capture both local textures and global image structure
- Processing: Runs on the Neural Engine (ANE) for fast, efficient inference
- Quality: Produces natural-looking results even for large masked areas
Technical Details:
- Input resolution: 512×512 pixels (automatically crops and scales around masked regions)
- Quantization: FP16 for optimal balance of quality and performance
- Fallback: Metal-accelerated exemplar-based inpainting when needed
Processing Pipeline
1. User taps object → Vision generates mask
2. Mask is dilated and feathered for smooth edges
3. Region is cropped and scaled to 512×512
4. LaMa model inpaints the masked area
5. Result is composited back into original image
Privacy
🔒 100% On-Device Processing
- No photos leave your device
- No cloud services or network calls
- No analytics or telemetry
- Photo library access via secure PHPicker
Technical Stack
| Component | Technology |
|---|---|
| UI | SwiftUI + UIKit |
| Object Detection | Vision Framework |
| ML Inference | Core ML (Neural Engine) |
| GPU Processing | Metal |
| Image Pipeline | Core Image |
| Fallback Processing | Accelerate/vImage |
Requirements
- iOS 17.0 or later
- iPhone or iPad with A14 chip or newer (for optimal Neural Engine performance)
Performance
| Operation | Target Time | Device |
|---|---|---|
| Preview inpaint | < 300ms | iPhone 12+ |
| Full resolution (12MP) | < 4 seconds | iPhone 12+ |
| Full resolution (48MP) | < 12 seconds | iPhone 15 Pro+ |
Non-Destructive Editing
All edits are stored as an operation stack — your original photos are never modified. Full undo/redo support included.
License
MIT License — see LICENSE for details.