# Ffacenerf Few Shot Face Editing

> Edit 3D faces with flexible mask layouts using only a few training samples. FFaceNeRF employs geometry adapters with feature injection and latent mixing for tri-plane augmentation, enabling rapid NeRF adaptation without fixed segmentation masks. Ideal for personalized medical imaging, creative face editing, and applications requiring user-defined mask control.

- Skill: `adu2021/ffacenerf-few-shot-face-editing` (Agent Skill)
- Install (CLI): `npx skillmds@latest add adu2021/ffacenerf-few-shot-face-editing`
- Raw SKILL.md: https://api.skillmd.com/api/skills/adu2021/ffacenerf-few-shot-face-editing/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: adu2021 (https://skillmd.com/u/adu2021)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/adu2021/ffacenerf-few-shot-face-editing

---


## Core Concept

FFaceNeRF tackles a fundamental limitation in NeRF-based 3D face editing: existing methods rely on fixed segmentation masks predefined during training, severely restricting user control. Changing mask layouts requires retraining with large datasets—impractical for personalized applications like medical imaging or creative editing. FFaceNeRF introduces a flexible NeRF editing framework that adapts to arbitrary mask layouts using only a handful of training images. The key innovation combines two complementary techniques: geometry adapters with feature injection (for precise geometric control) and latent mixing for tri-plane augmentation (enabling training with few samples). This empowers applications where custom masks and rapid adaptation are critical.

## Architecture Overview

The system integrates four essential components:

- **Geometry Adapter with Feature Injection**: Parameterized module that modulates geometry attributes without full NeRF retraining, enabling manipulation of face shape while preserving appearance
- **Latent Mixing for Tri-Plane Augmentation**: Augmentation strategy in latent space that synthesizes diverse training views from few samples, expanding effective training data
- **Mask-Guided Editing Pipeline**: Accepts user-defined masks and applies geometry changes selectively to masked regions
- **Rapid Model Adaptation**: Few-shot fine-tuning that converges quickly on new mask layouts and editing targets

## Implementation Steps

### 1. Initialize NeRF and Geometry Adapter

Set up base NeRF model and attach geometry adapter for targeted manipulation:

```python
import torch
import torch.nn as nn
from typing import Tuple

class GeometryAdapter(nn.Module):
    """
    Learnable adapter for geometry modification in NeRF.
    Uses feature injection to modulate density and position shifts.
    """
    def __init__(self, hidden_dim: int = 64, input_dim: int = 3):
        super().__init__()
        self.input_dim = input_dim
        self.hidden_dim = hidden_dim

        # Feature injection layers
        self.fc1 = nn.Linear(input_dim, hidden_dim)
        self.fc2 = nn.Linear(hidden_dim, hidden_dim)
        self.fc3 = nn.Linear(hidden_dim, input_dim)  # Output: position offset

        # Density modulation head
        self.density_head = nn.Linear(hidden_dim, 1)

    def forward(self, positions: torch.Tensor, features: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
        """
        Modulate geometry via position offsets and density changes.
        Takes 3D positions and extracted features as input.
        """
        x = torch.cat([positions, features], dim=-1) if features is not None else positions
        h = torch.relu(self.fc1(x))
        h = torch.relu(self.fc2(h))

        # Position offset for shape manipulation
        position_offset = torch.tanh(self.fc3(h)) * 0.1  # Bounded offset

        # Density modulation for appearance changes
        density_modulation = self.density_head(h)

        return position_offset, density_modulation
```

### 2. Implement Latent Mixing for Tri-Plane Augmentation

Augment training data in latent space by mixing features from few samples:

```python
def latent_mixing_augmentation(tri_plane_features: torch.Tensor,
                               num_augmentations: int = 5) -> torch.Tensor:
    """
    Synthesize diverse tri-plane features via latent space mixing.
    Enables training effective models from very few input images.
    """
    batch_size, planes, height, width = tri_plane_features.shape  # (B, 3, H, W)
    augmented_features = [tri_plane_features]

    # Interpolate between pairs of tri-plane representations
    for _ in range(num_augmentations):
        # Randomly select two samples and blend coefficient
        idx1 = torch.randint(0, batch_size, (1,)).item()
        idx2 = torch.randint(0, batch_size, (1,)).item()
        alpha = torch.rand(1).item()

        # Linear interpolation in latent space
        mixed = alpha * tri_plane_features[idx1] + (1 - alpha) * tri_plane_features[idx2]
        augmented_features.append(mixed.unsqueeze(0))

    # Concatenate original and augmented features
    augmented_batch = torch.cat(augmented_features, dim=0)  # (B + num_aug, 3, H, W)

    return augmented_batch
```

### 3. Mask-Guided Geometry Editing

Apply selective geometry modifications only to user-defined masked regions:

```python
def apply_mask_guided_editing(ray_positions: torch.Tensor,
                              mask: torch.Tensor,
                              geometry_adapter: GeometryAdapter,
                              features: torch.Tensor) -> torch.Tensor:
    """
    Edit geometry selectively within masked regions.
    Preserves unmasked areas while applying targeted shape changes.
    """
    # Get geometry modifications from adapter
    position_offsets, density_mods = geometry_adapter(ray_positions, features)

    # Apply mask to offsets (only modify masked regions)
    masked_offsets = position_offsets * mask.unsqueeze(-1)
    modified_positions = ray_positions + masked_offsets

    return modified_positions
```

### 4. Few-Shot NeRF Fine-Tuning Pipeline

Train NeRF with geometry adapter and augmentation using minimal samples:

```python
import torch.optim as optim
from torch.utils.data import DataLoader

def train_ffacenerf(nerf_model,
                    geometry_adapter: GeometryAdapter,
                    train_images: torch.Tensor,
                    train_masks: torch.Tensor,
                    target_geometry: torch.Tensor,
                    num_epochs: int = 50,
                    learning_rate: float = 1e-3):
    """
    Few-shot fine-tune NeRF with geometry adapter and latent mixing.
    Rapidly adapts to new mask layouts and editing targets.
    """
    optimizer = optim.Adam([
        {'params': geometry_adapter.parameters(), 'lr': learning_rate},
        {'params': nerf_model.parameters(), 'lr': learning_rate * 0.1}  # Lower LR for base model
    ])

    # Augment training data using latent mixing
    tri_plane_features = nerf_model.encode_tri_plane(train_images)
    augmented_features = latent_mixing_augmentation(tri_plane_features, num_augmentations=8)

    for epoch in range(num_epochs):
        total_loss = 0.0

        # Process augmented batch
        for aug_idx in range(augmented_features.shape[0]):
            features = augmented_features[aug_idx:aug_idx+1]

            # Forward pass: render image from modified NeRF
            ray_positions = nerf_model.sample_rays()
            modified_positions = apply_mask_guided_editing(ray_positions, train_masks,
                                                           geometry_adapter, features)

            # Render with modified geometry
            rendered_image = nerf_model.render(modified_positions, features)

            # Reconstruction loss (match target geometry/appearance)
            recon_loss = torch.nn.functional.mse_loss(rendered_image, train_images)

            # Regularization: encourage smooth geometry offsets
            position_offsets, _ = geometry_adapter(ray_positions, features)
            smooth_loss = torch.mean(torch.abs(torch.diff(position_offsets, dim=0)))

            # Combined loss
            loss = recon_loss + 0.1 * smooth_loss

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            total_loss += loss.item()

        if (epoch + 1) % 10 == 0:
            print(f"Epoch {epoch + 1}: Loss = {total_loss / augmented_features.shape[0]:.4f}")

    return nerf_model, geometry_adapter
```

### 5. Inference with Custom Mask Layouts

Apply trained model to new mask layouts without retraining:

```python
def inference_with_custom_mask(nerf_model,
                               geometry_adapter: GeometryAdapter,
                               input_image: torch.Tensor,
                               new_mask: torch.Tensor,
                               editing_strength: float = 1.0) -> torch.Tensor:
    """
    Generate edited face image with custom mask layout.
    Enables flexible user control without requiring full retraining.
    """
    with torch.no_grad():
        # Encode input image to tri-plane features
        tri_plane_features = nerf_model.encode_tri_plane(input_image)

        # Sample rays for rendering
        ray_positions = nerf_model.sample_rays()

        # Apply mask-guided geometry editing with custom mask
        modified_positions = apply_mask_guided_editing(
            ray_positions,
            new_mask * editing_strength,
            geometry_adapter,
            tri_plane_features
        )

        # Render final edited image
        edited_image = nerf_model.render(modified_positions, tri_plane_features)

    return edited_image
```

## Practical Guidance

### When to Use FFaceNeRF

- **Personalized Medical Imaging**: Surgeons planning procedures with patient-specific mask layouts
- **Creative Face Editing**: Artists and designers requiring flexible, interactive mask control
- **Rapid Prototyping**: Testing multiple editing styles with custom masks quickly
- **Interactive Face Manipulation**: Real-time or near-real-time editing in applications
- **Limited Data Scenarios**: Adapting models when only a few images of target face are available

### When NOT to Use FFaceNeRF

- **Large-Scale Video Processing**: NeRF is computationally expensive for frame-by-frame editing
- **Fixed-Mask Production Pipelines**: If mask layouts are predetermined, standard NeRF methods are simpler and faster
- **Extremely Low-Light Images**: NeRF struggles with insufficient illumination cues for geometry estimation
- **Extreme Facial Expressions**: If target geometry requires dramatic topology changes beyond adapter capacity
- **Real-Time GPU-Constrained Environments**: Rendering NeRF at interactive framerates requires high-end hardware

### Hyperparameter Tuning

- **Geometry Adapter Hidden Dimension**: Default 64; increase to 128 for more expressive geometry changes, reduce to 32 for efficiency
- **Position Offset Bound**: Default 0.1; increase to 0.2 for larger deformations, decrease to 0.05 for subtle changes
- **Latent Mixing Augmentations**: Default 8; use 4-5 for very few samples (3-5 images), 12-15 for slightly larger sets (10+ images)
- **Smooth Loss Weight**: Default 0.1; increase to 0.3 for smoother geometry, decrease to 0.01 for detailed local changes
- **Learning Rate**: Start at 1e-3; reduce to 5e-4 if loss oscillates, increase to 2e-3 for faster convergence with stable training
- **Number of Training Epochs**: Default 50; use 30 for very few samples, 100+ if computational budget allows

### Common Pitfalls

1. **Over-Aggressive Latent Mixing**: Too many augmentations can create unrealistic, inconsistent face geometry. Use moderation
2. **Ignoring Smooth Regularization**: Without smoothness constraints, geometry adapter produces noisy, artifact-prone edits
3. **Mask-Geometry Mismatch**: Masks that don't align with natural facial regions cause unnatural deformations
4. **Insufficient Few-Shot Diversity**: If all training images show similar expressions or lighting, adapter overfits to spurious patterns
5. **Position Offset Over-Scaling**: Large offsets (>0.2) cause topology breaks and rendering artifacts
6. **Neglecting Feature Consistency**: Ensure tri-plane features remain stable across editing strength variations to avoid color shifts

## References

- Neural Radiance Fields (NeRF): Volumetric scene representation for view synthesis
- 3D Face Modeling: Morphable models and geometric manipulation in face space
- Geometry Adapters: Parameter-efficient modules for targeted manipulation in neural representations
- Latent Space Augmentation: Data synthesis through interpolation and mixing in learned representations
- Few-Shot Learning: Training effective models with minimal labeled data
- Tri-Plane Representations: Efficient factorized 3D representation for neural rendering

