mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-24 14:31:48 +00:00
300 lines
11 KiB
Swift
300 lines
11 KiB
Swift
//
|
|
// AgeNet.swift
|
|
//
|
|
// This file was automatically generated and should not be edited.
|
|
//
|
|
|
|
import CoreML
|
|
|
|
|
|
/// Model Prediction Input Type
|
|
@available(macOS 12.0, iOS 15.0, tvOS 15.0, watchOS 8.0, visionOS 1.0, *)
|
|
class AgeNetInput : MLFeatureProvider {
|
|
|
|
/// input as color (kCVPixelFormatType_32BGRA) image buffer, 112 pixels wide by 112 pixels high
|
|
var input: CVPixelBuffer
|
|
|
|
var featureNames: Set<String> { ["input"] }
|
|
|
|
func featureValue(for featureName: String) -> MLFeatureValue? {
|
|
if featureName == "input" {
|
|
return MLFeatureValue(pixelBuffer: input)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
init(input: CVPixelBuffer) {
|
|
self.input = input
|
|
}
|
|
|
|
convenience init(inputWith input: CGImage) throws {
|
|
self.init(input: try MLFeatureValue(cgImage: input, pixelsWide: 112, pixelsHigh: 112, pixelFormatType: kCVPixelFormatType_32ARGB, options: nil).imageBufferValue!)
|
|
}
|
|
|
|
convenience init(inputAt input: URL) throws {
|
|
self.init(input: try MLFeatureValue(imageAt: input, pixelsWide: 112, pixelsHigh: 112, pixelFormatType: kCVPixelFormatType_32ARGB, options: nil).imageBufferValue!)
|
|
}
|
|
|
|
func setInput(with input: CGImage) throws {
|
|
self.input = try MLFeatureValue(cgImage: input, pixelsWide: 112, pixelsHigh: 112, pixelFormatType: kCVPixelFormatType_32ARGB, options: nil).imageBufferValue!
|
|
}
|
|
|
|
func setInput(with input: URL) throws {
|
|
self.input = try MLFeatureValue(imageAt: input, pixelsWide: 112, pixelsHigh: 112, pixelFormatType: kCVPixelFormatType_32ARGB, options: nil).imageBufferValue!
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/// Model Prediction Output Type
|
|
@available(macOS 12.0, iOS 15.0, tvOS 15.0, watchOS 8.0, visionOS 1.0, *)
|
|
class AgeNetOutput : MLFeatureProvider {
|
|
|
|
/// Source provided by CoreML
|
|
private let provider : MLFeatureProvider
|
|
|
|
/// Identity as 1 by 1 matrix of floats
|
|
var Identity: MLMultiArray {
|
|
provider.featureValue(for: "Identity")!.multiArrayValue!
|
|
}
|
|
|
|
/// Identity as 1 by 1 matrix of floats
|
|
var IdentityShapedArray: MLShapedArray<Float> {
|
|
MLShapedArray<Float>(Identity)
|
|
}
|
|
|
|
var featureNames: Set<String> {
|
|
provider.featureNames
|
|
}
|
|
|
|
func featureValue(for featureName: String) -> MLFeatureValue? {
|
|
provider.featureValue(for: featureName)
|
|
}
|
|
|
|
init(Identity: MLMultiArray) {
|
|
self.provider = try! MLDictionaryFeatureProvider(dictionary: ["Identity" : MLFeatureValue(multiArray: Identity)])
|
|
}
|
|
|
|
init(features: MLFeatureProvider) {
|
|
self.provider = features
|
|
}
|
|
}
|
|
|
|
|
|
/// Class for model loading and prediction
|
|
@available(macOS 12.0, iOS 15.0, tvOS 15.0, watchOS 8.0, visionOS 1.0, *)
|
|
class AgeNet {
|
|
let model: MLModel
|
|
|
|
/// URL of model assuming it was installed in the same bundle as this class
|
|
class var urlOfModelInThisBundle : URL {
|
|
let bundle = Bundle(for: self)
|
|
return bundle.url(forResource: "AgeNet", withExtension:"mlmodelc")!
|
|
}
|
|
|
|
/**
|
|
Construct AgeNet instance with an existing MLModel object.
|
|
|
|
Usually the application does not use this initializer unless it makes a subclass of AgeNet.
|
|
Such application may want to use `MLModel(contentsOfURL:configuration:)` and `AgeNet.urlOfModelInThisBundle` to create a MLModel object to pass-in.
|
|
|
|
- parameters:
|
|
- model: MLModel object
|
|
*/
|
|
init(model: MLModel) {
|
|
self.model = model
|
|
}
|
|
|
|
/**
|
|
Construct a model with configuration
|
|
|
|
- parameters:
|
|
- configuration: the desired model configuration
|
|
|
|
- throws: an NSError object that describes the problem
|
|
*/
|
|
convenience init(configuration: MLModelConfiguration = MLModelConfiguration()) throws {
|
|
try self.init(contentsOf: type(of:self).urlOfModelInThisBundle, configuration: configuration)
|
|
}
|
|
|
|
/**
|
|
Construct AgeNet instance with explicit path to mlmodelc file
|
|
- parameters:
|
|
- modelURL: the file url of the model
|
|
|
|
- throws: an NSError object that describes the problem
|
|
*/
|
|
convenience init(contentsOf modelURL: URL) throws {
|
|
try self.init(model: MLModel(contentsOf: modelURL))
|
|
}
|
|
|
|
/**
|
|
Construct a model with URL of the .mlmodelc directory and configuration
|
|
|
|
- parameters:
|
|
- modelURL: the file url of the model
|
|
- configuration: the desired model configuration
|
|
|
|
- throws: an NSError object that describes the problem
|
|
*/
|
|
convenience init(contentsOf modelURL: URL, configuration: MLModelConfiguration) throws {
|
|
try self.init(model: MLModel(contentsOf: modelURL, configuration: configuration))
|
|
}
|
|
|
|
/**
|
|
Construct AgeNet instance asynchronously with optional configuration.
|
|
|
|
Model loading may take time when the model content is not immediately available (e.g. encrypted model). Use this factory method especially when the caller is on the main thread.
|
|
|
|
- parameters:
|
|
- configuration: the desired model configuration
|
|
- handler: the completion handler to be called when the model loading completes successfully or unsuccessfully
|
|
*/
|
|
class func load(configuration: MLModelConfiguration = MLModelConfiguration(), completionHandler handler: @escaping (Swift.Result<AgeNet, Error>) -> Void) {
|
|
load(contentsOf: self.urlOfModelInThisBundle, configuration: configuration, completionHandler: handler)
|
|
}
|
|
|
|
/**
|
|
Construct AgeNet instance asynchronously with optional configuration.
|
|
|
|
Model loading may take time when the model content is not immediately available (e.g. encrypted model). Use this factory method especially when the caller is on the main thread.
|
|
|
|
- parameters:
|
|
- configuration: the desired model configuration
|
|
*/
|
|
class func load(configuration: MLModelConfiguration = MLModelConfiguration()) async throws -> AgeNet {
|
|
try await load(contentsOf: self.urlOfModelInThisBundle, configuration: configuration)
|
|
}
|
|
|
|
/**
|
|
Construct AgeNet instance asynchronously with URL of the .mlmodelc directory with optional configuration.
|
|
|
|
Model loading may take time when the model content is not immediately available (e.g. encrypted model). Use this factory method especially when the caller is on the main thread.
|
|
|
|
- parameters:
|
|
- modelURL: the URL to the model
|
|
- configuration: the desired model configuration
|
|
- handler: the completion handler to be called when the model loading completes successfully or unsuccessfully
|
|
*/
|
|
class func load(contentsOf modelURL: URL, configuration: MLModelConfiguration = MLModelConfiguration(), completionHandler handler: @escaping (Swift.Result<AgeNet, Error>) -> Void) {
|
|
MLModel.load(contentsOf: modelURL, configuration: configuration) { result in
|
|
switch result {
|
|
case .failure(let error):
|
|
handler(.failure(error))
|
|
case .success(let model):
|
|
handler(.success(AgeNet(model: model)))
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
Construct AgeNet instance asynchronously with URL of the .mlmodelc directory with optional configuration.
|
|
|
|
Model loading may take time when the model content is not immediately available (e.g. encrypted model). Use this factory method especially when the caller is on the main thread.
|
|
|
|
- parameters:
|
|
- modelURL: the URL to the model
|
|
- configuration: the desired model configuration
|
|
*/
|
|
class func load(contentsOf modelURL: URL, configuration: MLModelConfiguration = MLModelConfiguration()) async throws -> AgeNet {
|
|
let model = try await MLModel.load(contentsOf: modelURL, configuration: configuration)
|
|
return AgeNet(model: model)
|
|
}
|
|
|
|
/**
|
|
Make a prediction using the structured interface
|
|
|
|
It uses the default function if the model has multiple functions.
|
|
|
|
- parameters:
|
|
- input: the input to the prediction as AgeNetInput
|
|
|
|
- throws: an NSError object that describes the problem
|
|
|
|
- returns: the result of the prediction as AgeNetOutput
|
|
*/
|
|
func prediction(input: AgeNetInput) throws -> AgeNetOutput {
|
|
try prediction(input: input, options: MLPredictionOptions())
|
|
}
|
|
|
|
/**
|
|
Make a prediction using the structured interface
|
|
|
|
It uses the default function if the model has multiple functions.
|
|
|
|
- parameters:
|
|
- input: the input to the prediction as AgeNetInput
|
|
- options: prediction options
|
|
|
|
- throws: an NSError object that describes the problem
|
|
|
|
- returns: the result of the prediction as AgeNetOutput
|
|
*/
|
|
func prediction(input: AgeNetInput, options: MLPredictionOptions) throws -> AgeNetOutput {
|
|
let outFeatures = try model.prediction(from: input, options: options)
|
|
return AgeNetOutput(features: outFeatures)
|
|
}
|
|
|
|
/**
|
|
Make an asynchronous prediction using the structured interface
|
|
|
|
It uses the default function if the model has multiple functions.
|
|
|
|
- parameters:
|
|
- input: the input to the prediction as AgeNetInput
|
|
- options: prediction options
|
|
|
|
- throws: an NSError object that describes the problem
|
|
|
|
- returns: the result of the prediction as AgeNetOutput
|
|
*/
|
|
@available(macOS 14.0, iOS 17.0, tvOS 17.0, watchOS 10.0, visionOS 1.0, *)
|
|
func prediction(input: AgeNetInput, options: MLPredictionOptions = MLPredictionOptions()) async throws -> AgeNetOutput {
|
|
let outFeatures = try await model.prediction(from: input, options: options)
|
|
return AgeNetOutput(features: outFeatures)
|
|
}
|
|
|
|
/**
|
|
Make a prediction using the convenience interface
|
|
|
|
It uses the default function if the model has multiple functions.
|
|
|
|
- parameters:
|
|
- input: color (kCVPixelFormatType_32BGRA) image buffer, 112 pixels wide by 112 pixels high
|
|
|
|
- throws: an NSError object that describes the problem
|
|
|
|
- returns: the result of the prediction as AgeNetOutput
|
|
*/
|
|
func prediction(input: CVPixelBuffer) throws -> AgeNetOutput {
|
|
let input_ = AgeNetInput(input: input)
|
|
return try prediction(input: input_)
|
|
}
|
|
|
|
/**
|
|
Make a batch prediction using the structured interface
|
|
|
|
It uses the default function if the model has multiple functions.
|
|
|
|
- parameters:
|
|
- inputs: the inputs to the prediction as [AgeNetInput]
|
|
- options: prediction options
|
|
|
|
- throws: an NSError object that describes the problem
|
|
|
|
- returns: the result of the prediction as [AgeNetOutput]
|
|
*/
|
|
func predictions(inputs: [AgeNetInput], options: MLPredictionOptions = MLPredictionOptions()) throws -> [AgeNetOutput] {
|
|
let batchIn = MLArrayBatchProvider(array: inputs)
|
|
let batchOut = try model.predictions(from: batchIn, options: options)
|
|
var results : [AgeNetOutput] = []
|
|
results.reserveCapacity(inputs.count)
|
|
for i in 0..<batchOut.count {
|
|
let outProvider = batchOut.features(at: i)
|
|
let result = AgeNetOutput(features: outProvider)
|
|
results.append(result)
|
|
}
|
|
return results
|
|
}
|
|
}
|