Drejtoni LiteRT Next në Android me Kotlin

API-të LiteRT Next janë të disponueshme në Kotlin, e cila u ofron zhvilluesve të Android një përvojë zhvillimi pa probleme me akses në API të nivelit të lartë.

Për një shembull të një aplikacioni LiteRT Next në Kotlin, shihni segmentimin e imazhit me demonstrimin e Kotlin .

Filloni

Përdorni hapat e mëposhtëm për të shtuar LiteRT Next në aplikacionin tuaj Android.

Shto paketën Maven

Shtoni varësinë LiteRT Next në aplikacionin tuaj:

dependencies {
  ...
  implementation `com.google.ai.edge.litert:litert:2.0.0-alpha`
}

Krijoni modelin e përpiluar

Duke përdorur API- CompiledModel , inicializoni kohën e ekzekutimit me një model dhe zgjedhjen tuaj të përshpejtimit të harduerit:

val  model =
  CompiledModel.create(
    context.assets,
    "mymodel.tflite",
    CompiledModel.Options(Accelerator.CPU),
    env,
  )

Krijoni bufera hyrëse dhe dalëse

Krijoni strukturat e nevojshme të të dhënave (buffers) për të mbajtur të dhënat hyrëse që do të futni në model për konkluzion, dhe të dhënat dalëse që modeli prodhon pas ekzekutimit të konkluzionit.

val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

Nëse jeni duke përdorur memorie CPU, plotësoni hyrjet duke shkruar të dhënat direkt në buferin e parë të hyrjes.

inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })

Thirrni modelin

Duke siguruar buferët e hyrjes dhe daljes, ekzekutoni Modelin e Përpiluar.

model.run(inputBuffers, outputBuffers)

Merr rezultatet

Merrni rezultatet duke lexuar drejtpërdrejt daljen e modelit nga memoria.

val outputFloatArray = outputBuffers[0].readFloat()

Konceptet dhe komponentët kryesorë

Referojuni seksioneve të mëposhtme për informacion mbi konceptet dhe përbërësit kryesorë të API-ve LiteRT Next Kotlin.

Konkluzioni bazë (CPU)

Më poshtë është një zbatim i kondensuar, i thjeshtuar i konkluzionit me LiteRT Next.

// Load model and initialize runtime
val  model =
    CompiledModel.create(
        context.assets,
        "mymodel.tflite"
    )

// Preallocate input/output buffers
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

// Fill the first input
inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })

// Invoke
model.run(inputBuffers, outputBuffers)

// Read the output
val outputFloatArray = outputBuffers[0].readFloat()

// Clean up buffers and model
inputBuffers.forEach { it.close() }
outputBuffers.forEach { it.close() }
model.close()

Modeli i përpiluar (Model i përpiluar)

API-ja e modelit të përpiluar ( CompiledModel ) është përgjegjëse për ngarkimin e një modeli, aplikimin e përshpejtimit të harduerit, instancimin e kohës së funksionimit, krijimin e buferave të hyrjes dhe daljes dhe ekzekutimin e konkluzioneve.

Pjesa e mëposhtme e thjeshtuar e kodit demonstron se si API e Modelit të Përpiluar merr një model LiteRT ( .tflite ) dhe krijon një model të përpiluar që është gati për të ekzekutuar konkluzionet.

val  model =
  CompiledModel.create(
    context.assets,
    "mymodel.tflite"
  )

Pjesa e mëposhtme e thjeshtuar e kodit demonstron se si API CompiledModel merr një buffer hyrëse dhe dalëse dhe ekzekuton konkluzionet me modelin e përpiluar.

// Preallocate input/output buffers
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

// Fill the first input
inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })
// Invoke
model.run(inputBuffers, outputBuffers)
// Read the output
val outputFloatArray = outputBuffers[0].readFloat()

// Clean up buffers and model
inputBuffers.forEach { it.close() }
outputBuffers.forEach { it.close() }
model.close()

Për një pamje më të plotë se si zbatohet API CompiledModel , shihni kodin burim në Model.kt .

Buffer tensor (TensorBuffer)

LiteRT Next ofron mbështetje të integruar për ndërveprimin e tamponit I/O, duke përdorur API-në e Bufferit Tensor ( TensorBuffer ) për të trajtuar rrjedhën e të dhënave brenda dhe jashtë CompiledModel . API Tensor Buffer ofron mundësinë për të shkruar ( Write<T>() ) dhe lexuar ( Read<T>() ), dhe për të kyçur buferat.

Për një pamje më të plotë se si zbatohet Tensor Buffer API, shihni kodin burim në TensorBuffer.kt .