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:
- Klononi repozitorin git duke përdorur komandën e mëposhtme:
git clone https://github.com/google-ai-edge/mediapipe-samples
- 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 showResult në true 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:
