Udhëzues për gjenerimin e imazheve për Android

Detyra MediaPipe Image Generator ju lejon të gjeneroni imazhe bazuar në një kërkesë teksti. Kjo detyrë përdor një model tekst-në-imazh për të gjeneruar imazhe duke përdorur teknikat e difuzionit.

Detyra pranon një kërkesë teksti si hyrje, së bashku me një imazh opsional të gjendjes që modeli mund ta shtojë dhe ta përdorë si referencë për gjenerim. Gjeneratori i Imazheve gjithashtu mund të gjenerojë imazhe bazuar në koncepte specifike të ofruara modelit gjatë trajnimit ose ritrajnimit. Për më shumë informacion, shihni përshtatjen me LoRA .

Shembulli i kodit i përshkruar në këto udhëzime është i disponueshëm në GitHub . Për më shumë informacion rreth aftësive, modeleve dhe opsioneve të konfigurimit të kësaj detyre, shihni Përmbledhjen .

Shembull kodi

Kodi shembull i MediaPipe Tasks është një implementim bazë i një aplikacioni Image Generator për Android. Mund ta përdorni aplikacionin si pikënisje për aplikacionin tuaj Android ose t'i referoheni atij kur modifikoni një aplikacion ekzistues. Kodi shembull i Image Generator është i vendosur në GitHub .

Shkarko kodin

Udhëzimet e mëposhtme ju tregojnë se si të krijoni një kopje lokale të kodit shembull duke përdorur mjetin e linjës së komandës git .

Për të shkarkuar kodin shembullor:

  1. Klononi repozitorin git duke përdorur komandën e mëposhtme:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opsionalisht, konfiguroni instancën tuaj git për të përdorur kontrollin e rrallë (sparte checkout), në mënyrë që të keni vetëm skedarët për aplikacionin shembullor Image Generator:
    cd mediapipe-samples
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generation/android
    

Pasi të krijoni një version lokal të kodit shembull, mund ta importoni projektin në Android Studio dhe ta ekzekutoni aplikacionin. Për udhëzime, shihni Udhëzuesin e Konfigurimit për Android .

Komponentët kryesorë

Skedarët e mëposhtëm përmbajnë kodin thelbësor për këtë aplikacion shembullor të gjenerimit të imazheve:

  • ImageGenerationHelper.kt : Inicializon detyrën dhe merret me gjenerimin e imazhit.
  • DiffusionActivity.kt : Gjeneron imazhe kur shtojcat ose peshat LoRA nuk janë të aktivizuara.
  • PluginActivity.kt : Implementon modelet e plugin-eve, të cilat u mundësojnë përdoruesve të ofrojnë një imazh kushti si të dhënë hyrëse.
  • LoRAWeightActivity.kt : Qas dhe trajton peshat LoRA, të cilat përdoren për të personalizuar modelet e themeleve dhe për t'i mundësuar atyre të gjenerojnë imazhe të koncepteve specifike.

Konfigurimi

Ky seksion përshkruan hapat kryesorë për konfigurimin e mjedisit tuaj të zhvillimit dhe projekteve të kodit posaçërisht për të përdorur Image Generator. Për informacion të përgjithshëm mbi konfigurimin e mjedisit tuaj të zhvillimit për përdorimin e detyrave MediaPipe, duke përfshirë kërkesat e versionit të platformës, shihni udhëzuesin e konfigurimit për Android .

Varësitë

Detyra Image Generator përdor bibliotekën com.google.mediapipe:tasks-vision-image-generator . Shtoni këtë varësi në skedarin build.gradle të aplikacionit tuaj Android:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision-image-generator:latest.release'
}

Për pajisjet me Android 12 (API 31) ose më të lartë, shtoni varësinë e bibliotekës vendase OpenCL. Për më shumë informacion, shihni dokumentacionin mbi etiketën uses-native-library .

Shtoni etiketat e mëposhtme uses-native-library në skedarin AndroidManifest.xml :

<uses-native-library android:name="libOpenCL.so" android:required="false" />
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false" />

Model

Detyra e MediaPipe Image Generator kërkon një model themelor të trajnuar që është i pajtueshëm me këtë detyrë. Pas shkarkimit të një modeli, instaloni varësitë e kërkuara dhe konvertojeni modelin e tij në një format të përshtatshëm. Pastaj, transferoni modelin e konvertuar në pajisjen Android.

Për më shumë informacion mbi modelet e trajnuara të disponueshme për Image Generator, shihni seksionin Modelet në përmbledhjen e detyrave.

Shkarkoni modelin e themelit

Gjeneratori i Imazhit kërkon që modeli themelor të përputhet me formatin e modelit stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-only , bazuar në modelin e mëposhtëm: stable-diffusion-v1-5/stable-diffusion-v1-5 EMA-only .

Instaloni varësitë dhe konvertoni modelin

$ pip install torch typing_extensions numpy Pillow requests pytorch_lightning absl-py

Ekzekutoni skriptin convert.py :

$ python3 convert.py --ckpt_path <ckpt_path> --output_path <output_path>

Transmetoni modelin e konvertuar në pajisje

Transferoni përmbajtjen e dosjes <output_path> në pajisjen Android.

$ adb shell rm -r /data/local/tmp/image_generator/ # Remove any previously loaded weights
$ adb shell mkdir -p /data/local/tmp/image_generator/
$ adb push <output_path>/. /data/local/tmp/image_generator/bins

Shkarkoni modelet e Plugin-eve dhe shtoni peshat LoRA (Opsionale)

Nëse keni ndërmend të përdorni një model plugin-i , kontrolloni nëse modeli duhet të shkarkohet. Për plugin-et që kërkojnë një model shtesë, modelet e plugin-eve duhet të jenë ose të përfshira në APK ose të shkarkohen sipas kërkesës. Modelet e plugin-eve janë të lehta (~23MB) dhe mund të përfshihen direkt në APK. Megjithatë, ne rekomanduam shkarkimin e modeleve të plugin-eve sipas kërkesës.

Nëse keni personalizuar një model me LoRA , shkarkojeni sipas kërkesës. Për më shumë informacion, shihni modelin e shtojcës së peshave LoRA.

Krijo detyrën

Detyra MediaPipe Image Generator përdor funksionin createFromOptions() për të konfiguruar detyrën. Funksioni createFromOptions() pranon vlera për opsionet e konfigurimit. Për më shumë informacion mbi opsionet e konfigurimit, shihni Opsionet e konfigurimit .

Opsionet e konfigurimit

Kjo detyrë ka opsionet e mëposhtme të konfigurimit për aplikacionet Android:

Emri i opsionit Përshkrimi Diapazoni i Vlerave
imageGeneratorModelDirectory Drejtoria e modelit të gjeneratorit të imazheve që ruan peshat e modelit. PATH
loraWeightsFilePath Cakton shtegun për në skedarin e peshave LoRA. Opsionale dhe e zbatueshme vetëm nëse modeli është personalizuar me LoRA. PATH
errorListener Cakton një dëgjues gabimi opsional. N/A

Detyra mbështet gjithashtu modelet e shtojcave, të cilat u lejojnë përdoruesve të përfshijnë imazhe të kushteve në të dhënat e detyrës, të cilat modeli themelor mund t'i shtojë dhe t'i përdorë si referencë për gjenerim. Këto imazhe të kushteve mund të jenë pika referimi të fytyrës, konture skajesh dhe vlerësime të thellësisë, të cilat modeli i përdor si kontekst dhe informacion shtesë për të gjeneruar imazhe.

Kur shtoni një model plugin-i në modelin themelor, konfiguroni edhe opsionet e plugin-it. Plugin-i Face landmark përdor faceConditionOptions , plugin-i Canny edge përdor edgeConditionOptions dhe plugin-i Depth përdor depthConditionOptions .

Opsione të zgjuara në skaje

Konfiguroni opsionet e mëposhtme në edgeConditionOptions .

Emri i opsionit Përshkrimi Diapazoni i Vlerave Vlera e parazgjedhur
threshold1 Pragu i parë për procedurën e histerezës. Float 100
threshold2 Pragu i dytë për procedurën e histerezës. Float 200
apertureSize Madhësia e aperturës për operatorin Sobel. Diapazoni tipik është midis 3-7. Integer 3
l2Gradient Nëse norma L2 përdoret për të llogaritur madhësinë e gradientit të imazhit, në vend të normës së parazgjedhur L1. BOOLEAN False
EdgePluginModelBaseOptions Objekti BaseOptions që përcakton shtegun për modelin e plugin-it. Objekti BaseOptions N/A

Për më shumë informacion se si funksionojnë këto opsione konfigurimi, shihni Detektorin e skajeve Canny .

Opsionet e pikave të referimit të fytyrës

Konfiguroni opsionet e mëposhtme në faceConditionOptions .

Emri i opsionit Përshkrimi Diapazoni i Vlerave Vlera e parazgjedhur
minFaceDetectionConfidence Rezultati minimal i besimit që zbulimi i fytyrës të konsiderohet i suksesshëm. Float [0.0,1.0] 0.5
minFacePresenceConfidence Rezultati minimal i besimit të rezultatit të pranisë së fytyrës në zbulimin e pikave të referimit të fytyrës. Float [0.0,1.0] 0.5
faceModelBaseOptions Objekti BaseOptions që përcakton rrugën për modelin që krijon imazhin e kushtit. Objekti BaseOptions N/A
FacePluginModelBaseOptions Objekti BaseOptions që përcakton shtegun për modelin e plugin-it. Objekti BaseOptions N/A

Për më shumë informacion se si funksionojnë këto opsione konfigurimi, shihni detyrën Face Landmarker .

Opsionet e thellësisë

Konfiguroni opsionet e mëposhtme në depthConditionOptions .

Emri i opsionit Përshkrimi Diapazoni i Vlerave Vlera e parazgjedhur
depthModelBaseOptions Objekti BaseOptions që përcakton rrugën për modelin që krijon imazhin e kushtit. Objekti BaseOptions N/A
depthPluginModelBaseOptions Objekti BaseOptions që përcakton shtegun për modelin e plugin-it. Objekti BaseOptions N/A

Krijo vetëm me modelin bazë

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

Krijo me shtojca

Nëse po aplikoni një model shtesë opsional, caktoni opsionet bazë për modelin e shtesës me setPluginModelBaseOptions . Nëse modeli i shtesës kërkon një model shtesë të shkarkuar për të krijuar imazhin e kushtit, specifikoni shtegun në BaseOptions .

Pika referuese e fytyrës

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

val faceModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("face_landmarker.task")
    .build()

val facePluginModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("face_landmark_plugin.tflite")
    .build()

val faceConditionOptions = FaceConditionOptions.builder()
    .setFaceModelBaseOptions(faceModelBaseOptions)
    .setPluginModelBaseOptions(facePluginModelBaseOptions)
    .setMinFaceDetectionConfidence(0.3f)
    .setMinFacePresenceConfidence(0.3f)
    .build()

val conditionOptions = ConditionOptions.builder()
    .setFaceConditionOptions(faceConditionOptions)
    .build()

imageGenerator =
    ImageGenerator.createFromOptions(context, options, conditionOptions)
    

Canny Edge

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

val edgePluginModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("canny_edge_plugin.tflite")
    .build()

val edgeConditionOptions = EdgeConditionOptions.builder()
    .setThreshold1(100.0f)
    .setThreshold2(100.0f)
    .setApertureSize(3)
    .setL2Gradient(false)
    .setPluginModelBaseOptions(edgePluginModelBaseOptions)
    .build()

val conditionOptions = ConditionOptions.builder()
    .setEdgeConditionOptions(edgeConditionOptions)
    .build()

imageGenerator =
    ImageGenerator.createFromOptions(context, options, conditionOptions)
    

Thellësia

val options = ImageGeneratorOptions.builder()
    .setImageGeneratorModelDirectory(modelPath)
    .build()

val depthModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("depth_model.tflite")
    .build()

val depthPluginModelBaseOptions = BaseOptions.builder()
    .setModelAssetPath("depth_plugin.tflite")
    .build()

val depthConditionOptions =
    ConditionOptions.DepthConditionOptions.builder()
        .setDepthModelBaseOptions(depthModelBaseOptions)
        .setPluginModelBaseOptions(depthPluginModelBaseOptions)
        .build()

val conditionOptions = ConditionOptions.builder()
    .setDepthConditionOptions(depthConditionOptions)
    .build()

imageGenerator =
    ImageGenerator.createFromOptions(context, options, conditionOptions)
    

Krijo me pesha LoRA

Nëse po përfshini peshat LoRA, përdorni parametrin loraWeightsFilePath për të treguar vendndodhjen e shtegut.

val options = ImageGeneratorOptions.builder()
    .setLoraWeightsFilePath(weightsPath)
    .setImageGeneratorModelDirectory(modelPath)
    .build()

imageGenerator = ImageGenerator.createFromOptions(context, options)

Përgatitni të dhënat

Gjeneratori i Imazhit pranon të dhënat e mëposhtme hyrëse:

  • kërkesë (e detyrueshme): Kërkesa tekstuale që përshkruan imazhin që do të gjenerohet.
  • përsëritje (të detyrueshme): Numri total i përsëritjeve për të gjeneruar imazhin. Një pikënisje e mirë është 20.
  • fara (e detyrueshme): Fara e rastësishme e përdorur gjatë gjenerimit të imazhit.
  • imazhi i gjendjes (opsional): Imazhi që modeli përdor si referencë për gjenerim. I zbatueshëm vetëm kur përdoret një model plugin.
  • lloji i kushtit (opsional): Lloji i modelit të plugin-it të përdorur me detyrën. I zbatueshëm vetëm kur përdoret një model plugin-i.

Të dhënat hyrëse vetëm me modelin themelor

fun setInput(prompt: String, iteration: Int, seed: Int) {
    imageGenerator.setInputs(prompt, iteration, seed)
}

Hyrjet me shtojca

Nëse po aplikoni një model shtesë opsional, përdorni edhe parametrin conditionType për të zgjedhur modelin e shtesës dhe parametrin sourceConditionImage për të gjeneruar imazhin e kushtit.

Emri i opsionit Përshkrimi Vlerë
conditionType Modeli i plugin-it i aplikuar në modelin themelor. {"FACE", "EDGE", "DEPTH"}
sourceConditionImage Imazhi burimor i përdorur për të krijuar imazhin e gjendjes. Objekti MPImage

Nëse po përdorni një model plugin-i, përdorni createConditionImage për të krijuar imazhin e kushtit:

fun createConditionImage(
    inputImage: MPImage,
    conditionType: ConditionType
): Bitmap {
    val result =
        imageGenerator.createConditionImage(inputImage, conditionType)
    return BitmapExtractor.extract(result)
}

Pas krijimit të imazhit të kushtit, përfshijeni si një input së bashku me prompt-in, farën dhe numrin e përsëritjeve.

imageGenerator.setInputs(
    prompt,
    conditionalImage,
    conditionType,
    iteration,
    seed
)

Të dhënat hyrëse me pesha LoRA

Nëse po përdorni pesha LoRA, sigurohuni që token-i të jetë në njoftimin me tekst nëse keni ndërmend të gjeneroni një imazh me konceptin specifik të përfaqësuar nga peshat.

fun setInput(prompt: String, iteration: Int, seed: Int) {
    imageGenerator.setInputs(prompt, iteration, seed)
}

Ekzekuto detyrën

Përdorni metodën generate() për të gjeneruar një imazh duke përdorur të dhënat hyrëse të dhëna në seksionin e mëparshëm. Kjo prodhon një imazh të vetëm të gjeneruar.

Gjeneroni vetëm me modelin bazë

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

Gjenero me shtojca

fun generate(
    prompt: String,
    inputImage: MPImage,
    conditionType: ConditionType,
    iteration: Int,
    seed: Int
): Bitmap {
    val result = imageGenerator.generate(
        prompt,
        inputImage,
        conditionType,
        iteration,
        seed
    )
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

Gjeneroni me peshat LoRA

Procesi i gjenerimit të imazheve me një model të personalizuar me pesha LoRA është i ngjashëm me procesin me një model standard themeli. Sigurohuni që tokeni të përfshihet në kërkesë dhe ekzekutoni të njëjtin kod.

fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
    val result = imageGenerator.generate(prompt, iteration, seed)
    val bitmap = BitmapExtractor.extract(result?.generatedImage())
    return bitmap
}

Gjenerimi iterativ

Gjeneratori i Imazheve mund të nxjerrë gjithashtu imazhet e ndërmjetme të gjeneruara gjatë çdo përsëritjeje, siç përcaktohet në parametrin e hyrjes së iterations . Për të parë këto rezultate të ndërmjetme, thirrni metodën setInputs , pastaj thirrni execute() për të ekzekutuar çdo hap. Vendosni parametrin showResulttrue për të shfaqur rezultatet e ndërmjetme.

fun execute(showResult: Boolean): Bitmap {
    val result = imageGenerator.execute(showResult)

    val bitmap =
        BitmapExtractor.extract(result.generatedImage())

    return bitmap
}

Trajtoni dhe shfaqni rezultatet

Image Generator kthen një ImageGeneratorResult , i cili përfshin imazhin e gjeneruar, një pullë kohore të kohës së përfundimit dhe imazhin e kushtëzuar nëse është dhënë një i tillë si të dhënë hyrëse.

val bitmap = BitmapExtractor.extract(result.generatedImage())

Imazhi i mëposhtëm u gjenerua nga të dhënat e mëposhtme, duke përdorur vetëm një model themeli.

Të dhënat hyrëse:

  • Shtytje : "një rakun vizatimor shumëngjyrësh i veshur me një kapelë të gjerë dhe të varur në dorë, duke ecur nëpër pyll, i animuar, pamje tre të katërta, pikturë"
  • Fara : 312687592
  • Përsëritje : 20

Imazh i gjeneruar:

Imazh i gjeneruar i një rakun që përputhet me kërkesën