--- license: apache-2.0 language: - en tags: - image-enhancement - real-estate - photo-enhancement - nafnet - image-restoration - pytorch - onnx - coreml - ios pipeline_tag: image-to-image library_name: pytorch datasets: - custom metrics: - psnr - ssim model-index: - name: NAFNet Real Estate Enhancement results: - task: type: image-enhancement name: Image Enhancement metrics: - type: psnr value: 21.69 name: PSNR - type: ssim value: 0.8968 name: SSIM --- # NAFNet Real Estate Enhancement A fine-tuned NAFNet model for enhancing real estate photography. Trained on 577 before/after image pairs to improve lighting, color, and overall image quality. ## Model Details | Metric | Value | |--------|-------| | **Architecture** | NAFNet (width=32) | | **Parameters** | 29.2 million | | **Model Size** | 111 MB (FP32) / 56 MB (FP16) | | **Training Time** | 5 hours | | **Training Images** | 577 pairs | | **Final PSNR** | 21.69 dB | | **Final SSIM** | 0.8968 | ## Available Formats | Format | File | Size | Use Case | |--------|------|------|----------| | PyTorch | `nafnet_realestate.pth` | 117 MB | Training, fine-tuning | | ONNX | `nafnet_realestate.onnx` | 117 MB | Cross-platform deployment | | Core ML | Convert from ONNX | ~56 MB | iOS/macOS apps | ## Performance Benchmarks Tested on 100 high-resolution real estate images (avg 7.25 megapixels): ### Timing | Metric | Value | |--------|-------| | Average per image | 4.0 seconds | | Throughput | 0.25 images/second | | Megapixels/second | 1.81 MP/s | ### Memory Usage | Resource | Usage | |----------|-------| | **RAM** | 581 MB total | | **GPU VRAM** | 8.3 GB peak | ### Scaling by Resolution | Resolution | RAM | GPU | Time | |------------|-----|-----|------| | 1080p (2.1 MP) | 150-250 MB | ~2.5 GB | ~1.2s | | 1440p (3.7 MP) | 250-400 MB | ~4.3 GB | ~2.0s | | 3K (7.3 MP) | 500-800 MB | ~8.3 GB | ~4.0s | | 4K (8.3 MP) | 600-900 MB | ~9.5 GB | ~4.6s | ## Usage ### PyTorch ```python import torch from PIL import Image import numpy as np # Load model model = NAFNet(img_channel=3, width=32, middle_blk_num=12, enc_blk_nums=[2, 2, 4, 8], dec_blk_nums=[2, 2, 2, 2]) checkpoint = torch.load("nafnet_realestate.pth", map_location="cpu") model.load_state_dict(checkpoint["params"]) model.eval() # Process image img = Image.open("input.jpg") img_tensor = torch.from_numpy(np.array(img)).permute(2, 0, 1).unsqueeze(0).float() / 255.0 with torch.no_grad(): output = model(img_tensor) output_img = (output.squeeze(0).permute(1, 2, 0).numpy() * 255).astype(np.uint8) Image.fromarray(output_img).save("enhanced.jpg") ``` ### ONNX Runtime ```python import onnxruntime as ort import numpy as np from PIL import Image sess = ort.InferenceSession("nafnet_realestate.onnx") img = np.array(Image.open("input.jpg")).astype(np.float32) / 255.0 img = img.transpose(2, 0, 1)[np.newaxis, ...] output = sess.run(None, {"input": img})[0] output_img = (output[0].transpose(1, 2, 0) * 255).astype(np.uint8) Image.fromarray(output_img).save("enhanced.jpg") ``` ## Mobile Deployment (iOS) All resolutions fit within typical mobile RAM budgets (3-4 GB): 1. Convert ONNX to Core ML on macOS: ```bash pip install coremltools python convert_on_mac.py ``` 2. Add `.mlpackage` to Xcode project 3. Use Vision framework for inference ## Training - **Framework**: BasicSR + PyTorch - **Base Model**: NAFNet-SIDD-width32 (pretrained on denoising) - **Loss**: L1 + Perceptual (VGG19) - **Optimizer**: AdamW (lr=1e-3) - **Iterations**: 12,000 ## License Apache 2.0 ## Citation ```bibtex @article{chen2022simple, title={Simple Baselines for Image Restoration}, author={Chen, Liangyu and Chu, Xiaojie and Zhang, Xiangyu and Sun, Jian}, journal={arXiv preprint arXiv:2204.04676}, year={2022} } ``` ## Links - **GitHub**: [SebRincon/pixel-sorcery](https://github.com/SebRincon/pixel-sorcery/tree/sebastian/nafnet-realestate) - **Original NAFNet**: [megvii-research/NAFNet](https://github.com/megvii-research/NAFNet)