seika 0.1.0 copy "seika: ^0.1.0" to clipboard
seika: ^0.1.0 copied to clipboard

Smart inpainting for Flutter. Routes automatically between PatchMatch and LaMa neural based on mask complexity analysis.

seika #

pub version pub points license platform

Smart on-device image inpainting for Flutter.

Seika combines a zero-MB PatchMatch engine (works offline, no download needed) with downloadable neural models โ€” LaMa and MI-GAN โ€” running via ONNX Runtime. Pick the engine manually or let seika route automatically based on mask complexity.


Features #

  • ๐Ÿ–ผ Three engines โ€” PatchMatch (0 MB), LaMa (209 MB), MI-GAN (80 MB)
  • ๐Ÿ“ฆ On-demand model downloads โ€” models are stored on device, not bundled in the APK or IPA. Your app stays small.
  • ๐Ÿ”„ Auto routing โ€” analyzes texture variance and edge coherence to pick the best engine automatically
  • ๐ŸŽญ Mask dilation โ€” expands the mask 8 px before neural inference to reduce edge artifacts
  • ๐Ÿชก Soft boundary blending โ€” BFS distance-field blend for seamless transitions between filled and original regions
  • ๐Ÿ”’ SHA-256 verification โ€” model integrity checked after download
  • ๐Ÿงต Isolate-safe โ€” PatchMatch runs in a background isolate, neural inference runs via OrtSession.runAsync. Both are safe to call from the UI thread.
  • ๐Ÿ“ฑ Android & iOS โ€” native C compiled as .so on Android and as seika.framework on iOS via Flutter native assets

Platform support #

Platform PatchMatch LaMa MI-GAN Min version
Android โœ… โœ… โœ… API 21
iOS โœ… โœ… โœ… iOS 16.0

Installation #

dependencies:
  seika: ^0.1.0

Android #

Add to android/app/src/main/AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

iOS #

Set the minimum deployment target to iOS 16.0 in ios/Podfile:

platform :ios, '16.0'

onnxruntime-objc 1.23.0 (used internally) requires iOS 16.0 or higher.


Quick start #

import 'package:seika/seika.dart';

final seika = Seika();

if (!await seika.modelManager.isAvailable()) {
  await for (final p in seika.modelManager.download()) {
    print('${(p.fraction * 100).toStringAsFixed(0)}%');
  }
}

// 2. Inpaint โ€” auto-selects the best engine
final result = await seika.inpaint(
  rgbaBytes,  // Uint8List โ€” RGBA pixels, width ร— height ร— 4 bytes
  maskBytes,  // Uint8List โ€” grayscale mask, width ร— height bytes
              //             255 = fill this pixel, 0 = keep original
  width,
  height,
);

print(result.engineUsed);  // SeikaEngine.neural
print(result.duration);    // Duration(milliseconds: 1200)
// result.image โ†’ Uint8List RGBA ready for display

Engines #

Engine Download Quality Speed Best for
PatchMatch 0 MB โ˜…โ˜…โ˜…โ˜† Fast Textures, sky, walls, simple backgrounds
LaMa 209 MB โ˜…โ˜…โ˜…โ˜… Medium Object removal, watermarks, text
MI-GAN 80 MB โ˜…โ˜…โ˜…โ˜† Fast Mobile deployments, small objects

PatchMatch #

Pure C implementation โ€” no model files required, works fully offline. Uses a multi-scale pyramid, bidirectional NNF with EM voting, and seam blending.

LaMa #

Large Mask inpainting via Fast Fourier Convolutions (WACV 2022). ONNX model from Carve/LaMa-ONNX.

MI-GAN #

Mobile Inpainting GAN (ICCV 2023) by Picsart AI Research. Pipeline ONNX with built-in pre/post-processing. 7ร— smaller than LaMa.


API reference #

Seika #

The main entry point.

// Default model: LaMa
final seika = Seika();

// Start with a specific model
final seika = Seika(model: SeikaModelInfo.migan);

inpaint

Future<SeikaInpaintResult> inpaint(
  Uint8List rgba,
  Uint8List mask,
  int width,
  int height, {
  SeikaInpaintOptions options = const SeikaInpaintOptions(),
})
Parameter Type Description
rgba Uint8List RGBA pixels, width ร— height ร— 4 bytes
mask Uint8List Grayscale mask, width ร— height bytes. 255 = fill, 0 = keep
options.engine SeikaEngine auto (default), patchMatch, or neural
options.quality SeikaQuality fast, balanced (default), or quality

Returns SeikaInpaintResult:

Field Type Description
image Uint8List Output RGBA pixels
engineUsed SeikaEngine Which engine ran
duration Duration Wall-clock time
analysis SeikaAnalysis Mask complexity metrics

analyze

Runs the complexity analyzer without inpainting:

final analysis = await seika.analyze(rgba, mask, width, height);
print(analysis.recommended);     // SeikaEngine.neural
print(analysis.maskRatio);       // 0.12
print(analysis.textureVariance); // 340.5
print(analysis.edgeCoherence);   // 0.87

switchModel

await seika.switchModel(SeikaModelInfo.migan);

Disposes the current ONNX session and prepares a different model for the next inpaint() call. The previous model file on disk is not deleted.

unloadModel

await seika.unloadModel();

Releases the ONNX session from memory without changing the selected model. Useful when the app goes to background. The next inpaint() call reloads the model from disk.


SeikaModelManager #

Manages the lifecycle of a downloadable ONNX model.

final manager = SeikaModelManager(info: SeikaModelInfo.lama);

// Check if the model file is already on disk
final ready = await manager.isAvailable();

// Download with progress
await for (final p in manager.download()) {
  print('${(p.fraction * 100).toInt()}% โ€” ${p.bytesReceived} bytes');
}

// Get the local file path (to load manually)
final path = await manager.localPath();

// Delete from disk to free storage
await manager.delete();

SeikaModelInfo #

Static model descriptors. Extend the catalog by adding your own entries.

SeikaModelInfo.lama   // LaMa FP32, 209 MB
SeikaModelInfo.migan  // MI-GAN pipeline v2, 80 MB
SeikaModelInfo.all    // List<SeikaModelInfo> of all built-in models

Each entry exposes:

model.id          // 'lama-fp32'
model.name        // 'LaMa'
model.description // 'High quality inpainting...'
model.sizeMb      // '209 MB'
model.tags        // ['high quality', 'uniform backgrounds', 'watermarks']
model.type        // SeikaModelType.lama

SeikaInpaintOptions #

const SeikaInpaintOptions({
  SeikaEngine  engine  = SeikaEngine.auto,
  SeikaQuality quality = SeikaQuality.balanced,
})
Quality PatchMatch config Neural
fast patch=5, 2 iterations, single-scale same model
balanced patch=7, 5 iterations, 3-level pyramid same model
quality patch=9, 8 iterations, 4-level pyramid same model

Quality only affects PatchMatch. LaMa and MI-GAN always run the same ONNX model regardless of quality setting.


Model catalog โ€” adding a custom model #

static const myModel = SeikaModelInfo(
  id:          'my-model-v1',
  name:        'My Model',
  description: 'Custom inpainting model.',
  url:         'https://example.com/model.onnx',
  sha256:      'abc123...',    // leave empty to skip verification
  sizeBytes:   50_000_000,
  version:     'my-model-v1',
  type:        SeikaModelType.lama,   // or SeikaModelType.migan
  tags:        ['custom'],
);

LaMa-compatible models must accept:

  • image: Float32[1, 3, 512, 512] normalized to [0, 1]
  • mask: Float32[1, 1, 512, 512] binary (1.0 = fill)
  • Output: Float32[1, 3, 512, 512] in [0, 255] range

MI-GAN-compatible models must accept:

  • image: Uint8[1, 3, H, W] RGB (CHW)
  • mask: Uint8[1, 1, H, W] โ€” 0 = fill, 255 = keep
  • Output: Uint8[1, 3, H, W] RGB

Neural path improvements (applied automatically) #

Seika applies two improvements on every neural inference call:

1. Mask dilation โ€” expands the user mask by 8 px before passing it to the model. The model receives more boundary context and produces better fills at the edges of the masked region.

2. Soft boundary blending โ€” after inference, a BFS distance field computes the distance from the mask boundary for each pixel. Pixels near the boundary blend smoothly between the neural output and the original image over a 10 px transition zone, eliminating visible seams.

Both improvements use the original (non-dilated) mask for the final pixel restoration, so the fill is precise to what the user painted.


License #

MIT โ€” see LICENSE.

1
likes
150
points
12
downloads

Documentation

API reference

Publisher

verified publishergearscrafter.dev

Weekly Downloads

Smart inpainting for Flutter. Routes automatically between PatchMatch and LaMa neural based on mask complexity analysis.

Repository (GitHub)
View/report issues

Topics

#image #inpainting #machine-learning #onnx #computer-vision

License

Apache-2.0 (license)

Dependencies

code_assets, crypto, ffi, flutter, hooks, http, image, logging, native_toolchain_c, onnxruntime_v2, path_provider

More

Packages that depend on seika