Mit der Aufgabe „MediaPipe Image Generator“ können Sie Bilder basierend auf einem Text-Prompt generieren. Dieses wird ein Text-zu-Bild-Modell verwendet, um Bilder mithilfe von Diffusionstechniken zu generieren.
Die Aufgabe akzeptiert einen Text-Prompt und ein optionales Bedingungsbild als Eingabe die das Modell erweitern und als Referenz für die Generierung verwenden kann. Bildgenerator können auch Bilder basierend auf bestimmten Konzepten generieren, die dem Modell während oder Umschulungen. Weitere Informationen findest du unter Anpassen mit LoRA
Das in dieser Anleitung beschriebene Codebeispiel ist auf GitHub Weitere Informationen zu Funktionen, Modellen und Konfigurationsoptionen Sehen Sie sich die Übersicht an.
Codebeispiel
Der MediaPipe Tasks-Beispielcode ist eine einfache Implementierung eines Image Generators. für Android. Du kannst die App als Ausgangspunkt für dein eigenes Android-Gerät verwenden. oder beim Ändern einer vorhandenen App darauf zu verweisen. Beispiel für einen Image Generator gehostet wird auf GitHub
Code herunterladen
In der folgenden Anleitung erfahren Sie, wie Sie eine lokale Kopie des Beispiels erstellen. mit dem Befehlszeilentool git erstellen.
<ph type="x-smartling-placeholder">So laden Sie den Beispielcode herunter:
- Klonen Sie das Git-Repository mit dem folgenden Befehl:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Konfigurieren Sie optional Ihre Git-Instanz für den Sparse-Checkout, damit Sie
nur die Dateien für die Beispiel-App "Image Generator":
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/image_generator/android
Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie das Projekt importieren in Android Studio ein und führen die App aus. Anweisungen hierzu finden Sie im Einrichtungsleitfaden für Android-Geräte
Schlüsselkomponenten
Die folgenden Dateien enthalten den wichtigen Code für dieses Beispiel zur Bildgenerierung Anwendung:
- ImageGenerationHelper.kt: Initialisiert die Aufgabe und übernimmt die Bildgenerierung.
- DiffusionActivity.kt: Generiert Bilder, wenn Plug-ins oder LoRA-Gewichtungen nicht aktiviert sind.
- PluginActivity.kt Implementiert die Plug-in-Modelle, mit denen Nutzer eine Bedingung angeben können Bild als Eingabe verwenden.
- LoRAWeightActivity.kt: Greift auf LoRA-Gewichtungen zu und verarbeitet sie, die zur Anpassung der Grundlage verwendet werden und ermöglichen es ihnen, Bilder bestimmter Konzepte zu generieren.
Einrichtung
In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Code-Projekte zur Verwendung des Image Generator. Allgemeine Informationen zu Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Anforderungen an die Plattformversion finden Sie im Einrichtungsleitfaden für Android-Geräte
<ph type="x-smartling-placeholder">Abhängigkeiten
Bei der Aufgabe "Image Generator"
com.google.mediapipe:tasks-vision-image-generator
-Bibliothek. Diese Abhängigkeit hinzufügen
in die Datei build.gradle
Ihrer Android-App ein:
dependencies {
implementation 'com.google.mediapipe:tasks-vision-image-generator:latest.release'
}
Für Geräte mit Android 12 (API 31) oder höher die native OpenCL-Bibliothek hinzufügen
Abhängigkeit von AndroidManifest.xml
. Weitere Informationen finden Sie in der Dokumentation zum
uses-native-library
Tag.
Für einige Android-Geräte sind möglicherweise zusätzliche Bibliotheken erforderlich:
<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" />
Modell
Für die Aufgabe „MediaPipe Image Generator“ ist ein trainiertes Foundation Model erforderlich, bei dieser Aufgabe. Installieren Sie nach dem Herunterladen eines Modells die erforderlichen Abhängigkeiten und das Modell in ein geeignetes Format konvertieren. Übertragen Sie die konvertierte auf das Android-Gerät übertragen.
Weitere Informationen zu verfügbaren trainierten Modellen für den Image Generator finden Sie in der Task Übersicht über Modelle.
Foundation Model herunterladen
Für den Image Generator muss das Foundation Model
Modellformat runwayml/stable-diffusion-v1-5 EMA-only
, basierend auf dem folgenden
Modell:
runwayml/stable-diffusion-v1-5.
Abhängigkeiten installieren und Modell konvertieren
$ pip install torch typing_extensions numpy Pillow requests pytorch_lightning absl-py
Führen Sie den
convert.py
Skript:
$ python3 convert.py --ckpt_path <ckpt_path> --output_path <output_path>
Konvertiertes Modell auf das Gerät übertragen
Übertragen Sie den Inhalt des Ordners <output_path>
auf das Android-Gerät.
$ 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
Plug-in-Modelle herunterladen und LoRA-Gewichtungen hinzufügen (optional)
Wenn Sie ein Plug-in-Modell verwenden möchten, prüfen Sie, ob das Modell heruntergeladen werden. Bei Plug-ins, die ein zusätzliches Modell erfordern, müssen entweder im APK gebündelt sein oder bei Bedarf heruntergeladen werden. Plug-in-Modelle sind schlank (ca. 23 MB) und können direkt im APK gebündelt werden. Wir haben jedoch wird empfohlen, Plug-in-Modelle bei Bedarf herunterzuladen.
Wenn Sie ein Modell mit LoRA bei Bedarf herunterladen. Weitere Informationen Weitere Informationen finden Sie unter Plug-in-Modell für LoRA-Gewichtungen.
Aufgabe erstellen
Im Rahmen der Aufgabe „MediaPipe Image Generator“ wird mit der Funktion createFromOptions()
für die Aufgabe. Die Funktion createFromOptions()
akzeptiert Werte für die Konfiguration
Optionen. Weitere Informationen zu Konfigurationsoptionen finden Sie unter Konfiguration
Optionen.
Konfigurationsoptionen
Diese Aufgabe bietet die folgenden Konfigurationsoptionen für Android-Apps:
Option | Beschreibung | Wertebereich |
---|---|---|
imageGeneratorModelDirectory |
Das Modellverzeichnis des Bildgenerators, in dem die Modellgewichtungen gespeichert sind. | PATH |
loraWeightsFilePath |
Legt den Pfad zur LoRA-Gewichtungsdatei fest. Optional und nur zutreffend, wenn das Modell mit LoRA angepasst wurde. | PATH |
errorListener |
Legt einen optionalen Fehler-Listener fest. | N/A |
Die Aufgabe unterstützt auch Plug-in-Modelle, mit denen Nutzer Zustandsbilder hinzufügen können in der Aufgabeneingabe, die das Foundation Model erweitern und als Referenz verwenden kann für die Generation. Dabei kann es sich um Sehenswürdigkeiten, Umrisse oder Tiefenschätzungen, die das Modell als zusätzlichen Kontext und Informationen verwendet, Bilder generieren.
Beim Hinzufügen eines Plug-in-Modells zum Foundation Model auch das Plug-in konfigurieren
Optionen. Das Plug-in für die Gesichtsmarkierung verwendet faceConditionOptions
, den Canny Edge
verwendet das Plug-in edgeConditionOptions
, das Depth-Plug-in
depthConditionOptions
Canny Edge-Optionen
Konfigurieren Sie die folgenden Optionen in edgeConditionOptions
.
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
threshold1 |
Erster Schwellenwert für die Hystereseprozedur. | Float |
100 |
threshold2 |
Zweite Schwelle für die Hystereseprozedur. | Float |
200 |
apertureSize |
Blendengröße für den Sobel-Operator. Der typische Bereich liegt zwischen 3 und 7. | Integer |
3 |
l2Gradient |
Ob zur Berechnung der Größe des Bildverlaufs die L2-Norm verwendet wird, statt der Standard-L1-Norm. | BOOLEAN |
False |
EdgePluginModelBaseOptions |
Das BaseOptions -Objekt, das den Pfad festlegt
für das Plug-in-Modell. |
BaseOptions Objekt |
N/A |
Weitere Informationen zur Funktionsweise dieser Konfigurationsoptionen finden Sie unter Canny Edge-Detektor
Optionen für Gesichts-Markierungen
Konfigurieren Sie die folgenden Optionen in faceConditionOptions
.
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
minFaceDetectionConfidence |
Der minimale Konfidenzwert für die Gesichtserkennung als erfolgreich angesehen wird. | Float [0.0,1.0] |
0.5 |
minFacePresenceConfidence |
Der minimale Konfidenzwert für die Anwesenheit von Gesichtern bei der Erkennung von Gesichtsmerkmalen. | Float [0.0,1.0] |
0.5 |
faceModelBaseOptions |
Das BaseOptions -Objekt, das den Pfad festlegt
für das Modell, das das Bedingungsbild erstellt. |
BaseOptions Objekt |
N/A |
FacePluginModelBaseOptions |
Das BaseOptions -Objekt, das den Pfad festlegt
für das Plug-in-Modell. |
BaseOptions Objekt |
N/A |
Weitere Informationen zur Funktionsweise dieser Konfigurationsoptionen finden Sie in der Face Landmarker erstellen:
Tiefenoptionen
Konfigurieren Sie die folgenden Optionen in depthConditionOptions
.
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
depthModelBaseOptions |
Das BaseOptions -Objekt, das den Pfad festlegt
für das Modell, das das Bedingungsbild erstellt. |
BaseOptions Objekt |
N/A |
depthPluginModelBaseOptions |
Das BaseOptions -Objekt, das den Pfad festlegt
für das Plug-in-Modell. |
BaseOptions Objekt |
N/A |
Nur mit dem Basismodell erstellen
val options = ImageGeneratorOptions.builder()
.setImageGeneratorModelDirectory(modelPath)
.build()
imageGenerator = ImageGenerator.createFromOptions(context, options)
Mit Plug-ins erstellen
Wenn Sie ein optionales Plug-in-Modell anwenden, legen Sie die Basisoptionen für das
Plug-in-Modell mit setPluginModelBaseOptions
. Wenn für das Plug-in-Modell ein
zusätzliches heruntergeladenes Modell zum Erstellen des Bedingungsbilds, geben Sie den Pfad in
BaseOptions
Gesichts-Markierung
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)
Tiefe
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)
Mit LoRA-Gewichtungen erstellen
Wenn Sie LoRA-Gewichtungen einbeziehen, verwenden Sie den Parameter loraWeightsFilePath
, um
auf die Pfadposition zeigen.
val options = ImageGeneratorOptions.builder()
.setLoraWeightsFilePath(weightsPath)
.setImageGeneratorModelDirectory(modelPath)
.build()
imageGenerator = ImageGenerator.createFromOptions(context, options)
Daten vorbereiten
Der Image Generator akzeptiert die folgenden Eingaben:
- prompt (erforderlich): der Text-Prompt, der das zu generierende Bild beschreibt.
- iterations (erforderlich): Die gesamten Iterationen zum Generieren des Bildes. A ist 20 ein guter Ausgangspunkt.
- seed (erforderlich): Der bei der Bildgenerierung nach dem Zufallsprinzip verwendete Seed.
- condition image (optional): Das Bild, für das das Modell als Referenz verwendet wird Generation. Gilt nur bei Verwendung eines Plug-in-Modells.
- condition type (optional): Der Typ des Plug-in-Modells, das mit der Aufgabe verwendet wird. Gilt nur bei Verwendung eines Plug-in-Modells.
Eingaben nur mit dem Basismodell
fun setInput(prompt: String, iteration: Int, seed: Int) {
imageGenerator.setInputs(prompt, iteration, seed)
}
Eingaben über Plug-ins
Wenn Sie ein optionales Plug-in-Modell anwenden, verwenden Sie auch die conditionType
zur Auswahl des Plug-in-Modells und den Parameter sourceConditionImage
für
das Bedingungsbild generieren.
Option | Beschreibung | Wert |
---|---|---|
conditionType |
Das Plug-in-Modell, das auf das Foundation Model angewendet wurde. | {"FACE", "EDGE", "DEPTH"} |
sourceConditionImage |
Das Quell-Image, das zum Erstellen des Bedingungs-Images verwendet wurde. | MPImage Objekt |
Wenn Sie ein Plug-in-Modell verwenden, erstellen Sie mit dem createConditionImage
die
Zustandsbild:
fun createConditionImage(
inputImage: MPImage,
conditionType: ConditionType
): Bitmap {
val result =
imageGenerator.createConditionImage(inputImage, conditionType)
return BitmapExtractor.extract(result)
}
Nachdem Sie das Bedingungsbild erstellt haben, fügen Sie es als Eingabe zusammen mit dem Prompt, Seed und Anzahl der Iterationen.
imageGenerator.setInputs(
prompt,
conditionalImage,
conditionType,
iteration,
seed
)
Eingaben mit LoRA-Gewichtungen
Wenn Sie LoRA-Gewichtungen verwenden, achten Sie darauf, dass sich das Token in der Text-Eingabeaufforderung befindet, wenn möchten Sie ein Bild mit dem Konzept generieren, das durch die Gewichte.
fun setInput(prompt: String, iteration: Int, seed: Int) {
imageGenerator.setInputs(prompt, iteration, seed)
}
Aufgabe ausführen
Verwenden Sie die Methode generate()
, um ein Bild anhand der Eingaben in
im vorherigen Abschnitt. Dadurch wird ein einzelnes generiertes Bild erzeugt.
Nur mit dem Basismodell generieren
fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
val result = imageGenerator.generate(prompt, iteration, seed)
val bitmap = BitmapExtractor.extract(result?.generatedImage())
return bitmap
}
Mit Plug-ins generieren
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
}
Mit LoRA-Gewichtungen generieren
Der Prozess zum Generieren von Bildern mit einem Modell, das mit LoRA-Gewichtungen angepasst wurde, ist ähnlich wie bei einem Standard-Fundament-Modell. Das Token muss im Prompt enthalten ist, und führen Sie denselben Code aus.
fun generate(prompt: String, iteration: Int, seed: Int): Bitmap {
val result = imageGenerator.generate(prompt, iteration, seed)
val bitmap = BitmapExtractor.extract(result?.generatedImage())
return bitmap
}
Iterative Generierung
Der Image Generator kann auch die generierten Zwischenbilder während der einzelnen
Iteration gemäß der Definition im Eingabeparameter iterations
. So rufen Sie diese auf
Zwischenergebnisse: Methode setInputs
und dann execute()
zum Ausführen aufrufen
Schritt zu halten. Legen Sie den showResult
-Parameter auf true
fest, um die Zwischenstufe anzuzeigen.
Ergebnisse.
fun execute(showResult: Boolean): Bitmap {
val result = imageGenerator.execute(showResult)
val bitmap =
BitmapExtractor.extract(result.generatedImage())
return bitmap
}
Ergebnisse verarbeiten und anzeigen
Der Bildgenerator gibt ein ImageGeneratorResult
zurück, das die generierten
den Zeitstempel der Fertigstellung und das bedingte Bild, falls vorhanden,
als Eingabe bereitgestellt wurde.
val bitmap = BitmapExtractor.extract(result.generatedImage())
Das folgende Bild wurde aus den folgenden Eingaben mit nur einem Foundation Model.
Eingaben:
- Prompt: „Ein bunter Cartoon-Waschbär mit einem flauschigen Hut mit breiter Krempe mit einem Stock, der durch den Wald läuft, animierte Dreiviertelansicht, Malerei“
- Seed-Wert: 312687592
- Iterationen: 20
Generiertes Bild: