createCompiledFromBuffer static method

Future<SelfieSegmentation> createCompiledFromBuffer(
  1. Uint8List modelBytes, {
  2. SegmentationConfig config = const SegmentationConfig(),
  3. Set<Accelerator> accelerators = const {Accelerator.gpu, Accelerator.cpu},
  4. Precision precision = Precision.fp16,
})

Creates a selfie segmentation model backed by LiteRT CompiledModel.

All variants compile, including the binary general/landscape models built on the Convolution2DTransposeBias custom op (verified to match the Interpreter output on macOS arm64). Should a platform's LiteRT runtime reject a model, this throws a SegmentationException; callers that need guaranteed availability should fall back to createFromBuffer, as FaceDetector's segmentation isolate does.

Implementation

static Future<SelfieSegmentation> createCompiledFromBuffer(
  Uint8List modelBytes, {
  SegmentationConfig config = const SegmentationConfig(),
  Set<Accelerator> accelerators = const {Accelerator.gpu, Accelerator.cpu},
  Precision precision = Precision.fp16,
}) async {
  final effectiveModel = config.model;
  final inW = _segmentationInputWidth;
  final inH = _inputHeightFor(effectiveModel);
  final outChannels = _expectedOutputChannels(effectiveModel);

  final CompiledModel compiledModel;
  try {
    compiledModel = _isDefaultAccelerators(accelerators)
        ? CompiledModel.fromBufferWithGpuFallback(
            modelBytes,
            precision: precision,
            onFallback: _onGpuFallback,
          )
        : CompiledModel.fromBuffer(
            modelBytes,
            accelerators: accelerators,
            precision: precision,
          );
  } catch (e) {
    throw SegmentationException(
      SegmentationError.interpreterCreationFailed,
      'Failed to compile ${effectiveModel.name} segmentation model: $e',
      e,
    );
  }
  final obj = SelfieSegmentation._compiled(
    compiledModel,
    inW,
    inH,
    outChannels,
    config,
    effectiveModel,
  );
  try {
    obj._initializeCompiledModel();
    return obj;
  } catch (_) {
    obj.dispose();
    rethrow;
  }
}