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 të gjendjes opsionale që modeli mund ta shtojë dhe ta përdorë si referencë për gjenerim. Gjeneruesi i imazheve mund të gjenerojë gjithashtu imazhe bazuar në koncepte specifike që i janë dhënë modelit gjatë trajnimit ose rikualifikimit. Për më shumë informacion, shihni personalizo 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 i shembullit të MediaPipe Tasks është një zbatim bazë i një aplikacioni të Gjeneratorit të Imazheve për Android. Mund ta përdorni aplikacionin si pikënisje për aplikacionin tuaj Android ose t'i referoheni kur modifikoni një aplikacion ekzistues. Shembulli i kodit të Gjeneratorit të Imazhit është pritur në GitHub .

Shkarkoni 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 shembull:

  1. Klononi depon e git duke përdorur komandën e mëposhtme:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opsionale, konfiguroni shembullin tuaj të git për të përdorur arkëtimin e rrallë, në mënyrë që të keni vetëm skedarët për shembullin e aplikacionit të Gjeneratorit të Imazheve:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generation/android
    

Pas krijimit të një versioni lokal të kodit shembull, mund ta importoni projektin në Android Studio dhe të 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 vendimtar për këtë aplikacion shembulli të gjenerimit të imazheve:

  • ImageGenerationHelper.kt : Inicializon detyrën dhe trajton gjenerimin e imazhit.
  • DiffusionActivity.kt : Gjeneron imazhe kur shtojcat ose peshat LoRA nuk janë të aktivizuara.
  • PluginActivity.kt : Zbaton modelet e shtojcave, të cilat u mundësojnë përdoruesve të ofrojnë një imazh të gjendjes si hyrje.
  • LoRAWeightActivity.kt : Qas dhe trajton peshat LoRA, të cilat përdoren për të personalizuar modelet e themelit dhe për t'u 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 në mënyrë specifike për të përdorur Gjeneratorin e Imazheve. Për informacion të përgjithshëm mbi konfigurimin e mjedisit tuaj të zhvillimit për përdorimin e detyrave të MediaPipe, duke përfshirë kërkesat e versionit të platformës, shihni udhëzuesin e konfigurimit për Android .

varësitë

Detyra "Generatori i imazheve" 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ë origjinale të bibliotekës OpenCL. Për më shumë informacion, shihni dokumentacionin në 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 MediaPipe Image Generator kërkon një model themeli të trajnuar që është në përputhje me këtë detyrë. Pasi të keni shkarkuar një model, instaloni varësitë e kërkuara dhe shndërroni modelin në një format të përshtatshëm. Më pas, shtyjeni modelin e konvertuar në pajisjen Android.

Për më shumë informacion mbi modelet e trajnuara të disponueshme për Gjeneratorin e Imazheve, shihni seksionin Modelet e përmbledhjes së detyrave.

Shkarkoni modelin e fondacionit

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

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>

Push modelin e konvertuar në pajisje

Shtyni 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 shtojcave dhe shtoni peshat LoRA (Opsionale)

Nëse keni ndërmend të përdorni një model shtesë , kontrolloni nëse modeli duhet të shkarkohet. Për shtojcat që kërkojnë një model shtesë, modelet e shtojcave duhet ose të grumbullohen në APK ose të shkarkohen sipas kërkesës. Modelet e shtojcave janë të lehta (~23 MB) dhe mund të bashkohen drejtpërdrejt në APK. Sidoqoftë, ne rekomanduam shkarkimin e modeleve të shtojcave sipas kërkesës.

Nëse keni personalizuar një model me LoRA , shkarkoni ato 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 vlerat 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 Gama e vlerave
imageGeneratorModelDirectory Drejtoria e modelit të gjeneratorit të imazhit që ruan peshat e modelit. PATH
loraWeightsFilePath Përcakton shtegun për skedarin e peshave LoRA. Opsionale dhe e zbatueshme vetëm nëse modeli është personalizuar me LoRA. PATH
errorListener Vendos një dëgjues opsional gabimi. N/A

Detyra gjithashtu mbështet modelet e shtojcave, të cilat i lejojnë përdoruesit të përfshijnë imazhe të kushteve në hyrjen e detyrës, të cilat modeli i themelit mund t'i shtojë dhe t'i përdorë si referencë për gjenerim. Këto imazhe të gjendjes mund të jenë pika referimi të fytyrës, skica të skajeve 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 shtesë në modelin e themelimit, konfiguroni gjithashtu opsionet e shtojcave. Shtojca shtesë Face pikë referimi përdor faceConditionOptions , plugin Canny edge përdor edgeConditionOptions dhe plugin Depth përdor depthConditionOptions .

Opsione të këndshme të skajeve

Konfiguro opsionet e mëposhtme në edgeConditionOptions .

Emri i opsionit Përshkrimi Gama e vlerave Vlera e paracaktuar
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 hapjes për operatorin Sobel. Gama tipike ë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ë paracaktuar L1. BOOLEAN False
EdgePluginModelBaseOptions Objekti BaseOptions që përcakton shtegun për modelin e shtojcave. Objekti i BaseOptions N/A

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

Opsionet e pikë referimi të fytyrës

Konfiguro opsionet e mëposhtme në faceConditionOptions .

Emri i opsionit Përshkrimi Gama e vlerave Vlera e paracaktuar
minFaceDetectionConfidence Rezultati minimal i besimit për zbulimin e fytyrës për t'u konsideruar 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 pikës referimi të fytyrës. Float [0.0,1.0] 0.5
faceModelBaseOptions Objekti BaseOptions që përcakton shtegun për modelin që krijon imazhin e kushtit. Objekti i BaseOptions N/A
FacePluginModelBaseOptions Objekti BaseOptions që përcakton shtegun për modelin e shtojcave. Objekti i BaseOptions N/A

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

Opsionet e thellësisë

Konfiguro opsionet e mëposhtme në depthConditionOptions .

Emri i opsionit Përshkrimi Gama e vlerave Vlera e paracaktuar
depthModelBaseOptions Objekti BaseOptions që përcakton shtegun për modelin që krijon imazhin e kushtit. Objekti i BaseOptions N/A
depthPluginModelBaseOptions Objekti BaseOptions që përcakton shtegun për modelin e shtojcave. Objekti i BaseOptions N/A

Krijo vetëm me modelin e themelit

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

imageGenerator = ImageGenerator.createFromOptions(context, options)

Krijo me shtojca

Nëse po aplikoni një model shtesë shtesë opsionale, vendosni opsionet bazë për modelin e shtojcave me setPluginModelBaseOptions . Nëse modeli i shtojcës kërkon një model shtesë të shkarkuar për të krijuar imazhin e gjendjes, specifikoni shtegun në BaseOptions .

Pikë referimi fytyre

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)
    

Krijoni me pesha LoRA

Nëse jeni duke përfshirë 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 hyrjet e mëposhtme:

  • prompt (kërkohet): Prompt teksti që përshkruan imazhin që do të krijohet.
  • përsëritjet (kërkohen): Përsëritjet totale për të gjeneruar imazhin. Një pikënisje e mirë është 20.
  • fara (kërkohet): Fara e rastësishme e përdorur gjatë gjenerimit të imazhit.
  • imazhi i gjendjes (opsionale): Imazhi që modeli përdor si referencë për gjenerimin. Zbatohet vetëm kur përdorni një model shtesë.
  • lloji i gjendjes (opsionale): Lloji i modelit të shtojcës së përdorur me detyrën. Zbatohet vetëm kur përdorni një model shtesë.

Inputet vetëm me modelin e themelit

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

Inputet me shtojca

Nëse po aplikoni një model shtesë shtesë opsionale, përdorni gjithashtu parametrin conditionType për të zgjedhur modelin e shtojcës dhe parametrin sourceConditionImage për të gjeneruar imazhin e gjendjes.

Emri i opsionit Përshkrimi Vlera
conditionType Modeli i shtojcës aplikohet në modelin e themelit. {"FACE", "EDGE", "DEPTH"}
sourceConditionImage Imazhi burim i përdorur për të krijuar imazhin e kushtit. Objekti i imazhit MPImage

Nëse jeni duke përdorur një model plugin, përdorni createConditionImage për të krijuar imazhin e gjendjes:

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

Pas krijimit të imazhit të gjendjes, përfshini si hyrje së bashku me kërkesën, fillimin dhe numrin e përsëritjeve.

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

Inputet me pesha LoRA

Nëse jeni duke përdorur peshat LoRA, sigurohuni që token të jetë në mesazhin e tekstit 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)
}

Drejtoni detyrën

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

Gjeneroni vetëm me modelin e themelit

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

Gjeneroni 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 pesha LoRA

Procesi i gjenerimit të imazheve me një model të personalizuar me pesha LoRA është i ngjashëm me procesin me një model themeli standard. Sigurohuni që token të përfshihet në prompt 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
}

Brez përsëritës

Gjeneruesi i imazhit mund të nxjerrë gjithashtu imazhet e ndërmjetme të krijuara gjatë çdo përsëritjeje, siç përcaktohet në parametrin e hyrjes iterations . Për të parë këto rezultate të ndërmjetme, thirrni metodën setInputs , më pas 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

Gjeneruesi i imazhit kthen një ImageGeneratorResult , i cili përfshin imazhin e krijuar, një vulë kohore të kohës së përfundimit dhe imazhin e kushtëzuar nëse një i tillë është dhënë si hyrje.

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

Imazhi i mëposhtëm u krijua nga inputet e mëposhtme, duke përdorur vetëm një model themeli.

Inputet:

  • Njoftim : "një rakun vizatimor shumëngjyrësh i veshur me një kapelë me buzë të gjerë, duke mbajtur një shkop duke ecur nëpër pyll, i animuar, pamje treçerekëshe, pikturë"
  • Fara : 312687592
  • Përsëritjet : 20

Imazhi i krijuar:

Imazhi i krijuar i një rakuni që përputhet me kërkesën