Android 圖片產生指南

MediaPipe 圖像產生器任務可讓您根據文字提示產生圖片。這項工作會使用文字轉圖像模型,透過擴散技術產生圖像。

這項工作會接受文字提示做為輸入內容,並可選提供條件圖片,讓模型進行擴充,並用做生成內容的參考依據。圖像產生器也可以根據在訓練或重新訓練期間提供給模型的特定概念,產生圖片。詳情請參閱「使用 LoRa 自訂」。

您可以在 GitHub 上找到這些操作說明中所述的程式碼範例。如要進一步瞭解這項工作的功能、模型和設定選項,請參閱總覽

程式碼範例

MediaPipe Tasks 範例程式碼是 Android 圖片產生器應用程式的基本實作方式。您可以使用這個應用程式做為自有 Android 應用程式的起點,也可以在修改現有應用程式時參考這個應用程式。圖片產生器範例程式碼託管於 GitHub 上。

下載程式碼

以下操作說明說明如何使用 git 指令列工具,建立範例程式碼的本機副本。

下載程式碼範例:

  1. 使用下列指令複製 Git 存放區:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 您可以選擇將 Git 例項設定為使用稀疏檢查,這樣您就只會取得圖片產生器範例應用程式的檔案:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generation/android
    

建立本機版本的範例程式碼後,您可以將專案匯入 Android Studio 並執行應用程式。如需操作說明,請參閱 Android 設定指南

重要元件

以下檔案包含此圖片產生範例應用程式的重要程式碼:

設定

本節將說明設定開發環境和程式碼專案的關鍵步驟,以便使用圖片產生器。如要進一步瞭解如何設定開發環境以使用 MediaPipe 工作,包括平台版本需求,請參閱 Android 設定指南

依附元件

圖片產生器工作會使用 com.google.mediapipe:tasks-vision-image-generator 程式庫。將這個依附元件新增至 Android 應用程式的 build.gradle 檔案:

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

如果是搭載 Android 12 (API 31) 以上版本的裝置,請新增原生 OpenCL 程式庫依附元件。詳情請參閱 uses-native-library 標記的說明文件。

將下列 uses-native-library 標記新增至 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" />

型號

MediaPipe 圖片產生器工作需要訓練過的基礎模型,且必須與此工作相容。下載模型後,請安裝必要的依附元件,並將模型轉換為適當的格式。然後將轉換後的模型推送至 Android 裝置。

如要進一步瞭解 Image Generator 可用的訓練模型,請參閱任務總覽的「模型」一節。

下載基礎模型

圖片產生器會要求基礎模型符合 runwayml/stable-diffusion-v1-5 EMA-only 模型格式,並以下列模型為依據:runwayml/stable-diffusion-v1-5

安裝依附元件並轉換模型

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

執行 convert.py 指令碼:

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

將轉換後的模型推送至裝置

<output_path> 資料夾的內容推送至 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

下載外掛程式模型並新增 LoRA 權重 (選用)

如果您打算使用外掛程式模型,請確認是否必須下載模型。如果外掛程式需要額外模型,則外掛程式模型必須在 APK 中隨附,或可隨選下載。外掛程式模型體積輕巧 (約 23 MB),可直接在 APK 中打包。不過,我們建議您視需要下載外掛程式模型。

如果您使用 LoRA 自訂模型,請按需下載模型。詳情請參閱 LoRA 權重外掛程式模型

建立工作

MediaPipe 圖片產生器工作會使用 createFromOptions() 函式設定工作。createFromOptions() 函式會接受設定選項的值。如要進一步瞭解設定選項,請參閱「設定選項」。

設定選項

此工作包含下列 Android 應用程式設定選項:

選項名稱 說明 值範圍
imageGeneratorModelDirectory 儲存模型權重的圖像產生器模型目錄。 PATH
loraWeightsFilePath 設定 LoRA 權重檔案的路徑。此為選用屬性,僅適用於使用 LoRA 自訂模型的情況。 PATH
errorListener 設定選用的錯誤事件監聽器。 N/A

此工作也支援外掛程式模型,可讓使用者在工作輸入內容中加入條件圖片,基礎模型可將這些圖片增強並用於產生參考資料。這些條件圖片可以是臉部地標、邊緣輪廓和深度估計值,模型會將這些圖片當作額外的背景資訊,用於產生圖片。

將外掛程式模型新增至基礎模型時,請一併設定外掛程式選項。臉部地標外掛程式使用 faceConditionOptions、Canny 邊緣外掛程式使用 edgeConditionOptions,而深度外掛程式使用 depthConditionOptions

Canny 邊緣選項

edgeConditionOptions 中設定下列選項。

選項名稱 說明 值範圍 預設值
threshold1 滯後程序的第一個閾值。 Float 100
threshold2 滯後程序的第二個門檻。 Float 200
apertureSize Sobel 運算子的光圈大小。一般範圍為 3 到 7 之間。 Integer 3
l2Gradient 是否使用 L2 範數來計算圖像漸層大小,而非預設的 L1 範數。 BOOLEAN False
EdgePluginModelBaseOptions 設定外掛程式模型路徑的 BaseOptions 物件。 BaseOptions 個物件 N/A

如要進一步瞭解這些設定選項的運作方式,請參閱「Canny 邊緣偵測器」。

臉部特徵選項

faceConditionOptions 中設定下列選項。

選項名稱 說明 值範圍 預設值
minFaceDetectionConfidence 系統判定臉部偵測成功的最低可信度分數。 Float [0.0,1.0] 0.5
minFacePresenceConfidence 臉部特徵偵測中臉部存在分數的最低可信度分數。 Float [0.0,1.0] 0.5
faceModelBaseOptions BaseOptions 物件,可設定建立條件圖片的模型路徑。 BaseOptions 個物件 N/A
FacePluginModelBaseOptions 設定外掛程式模型路徑的 BaseOptions 物件。 BaseOptions 個物件 N/A

如要進一步瞭解這些設定選項的運作方式,請參閱 人臉地標任務

深度選項

depthConditionOptions 中設定下列選項。

選項名稱 說明 值範圍 預設值
depthModelBaseOptions BaseOptions 物件,可設定建立條件圖片的模型路徑。 BaseOptions 個物件 N/A
depthPluginModelBaseOptions 設定外掛程式模型路徑的 BaseOptions 物件。 BaseOptions 個物件 N/A

僅使用基礎模型建立

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

imageGenerator = ImageGenerator.createFromOptions(context, options)

使用外掛程式建立

如果您要套用選用的外掛程式模型,請使用 setPluginModelBaseOptions 為外掛程式模型設定基本選項。如果外掛程式模型需要額外下載模型才能建立條件圖片,請在 BaseOptions 中指定路徑。

臉部特徵

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)
    

深度

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)
    

使用 LoRA 權重建立

如果您要納入 LoRA 權重,請使用 loraWeightsFilePath 參數指向路徑位置。

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

imageGenerator = ImageGenerator.createFromOptions(context, options)

準備資料

圖片產生器接受下列輸入內容:

  • prompt (必要):描述要產生圖片的文字提示。
  • iterations (必要):產生圖片的疊代次數總數。建議的起始值為 20。
  • seed (必要):圖片生成期間使用的隨機種子。
  • condition image (選用):模型用來產生圖像的參考圖片。僅適用於使用外掛程式模型時。
  • condition type (選用):與工作搭配使用的外掛程式模型類型。僅適用於使用外掛程式模型時。

僅使用基礎模型的輸入

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

含有外掛程式的輸入法

如果您要套用選用的外掛程式模型,請使用 conditionType 參數選擇外掛程式模型,並使用 sourceConditionImage 參數產生條件圖片。

選項名稱 說明
conditionType 套用至基礎模型的外掛程式模型。 {"FACE", "EDGE", "DEPTH"}
sourceConditionImage 用於建立條件圖片的來源圖片。 MPImage 個物件

如果您使用外掛程式模型,請使用 createConditionImage 建立條件圖片:

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

建立條件圖片後,請將其納入輸入內容,並加入提示、種子和疊代次數。

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

含有 LoRA 權重的輸入內容

如果您使用 LoRA 權重,如果想產生圖片,並讓圖片包含權重所代表的特定概念,請務必在文字提示中加入符號。

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

執行工作

使用 generate() 方法,根據上一節提供的輸入內容產生圖片。這會產生單一生成圖片。

僅使用基礎模型產生

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

使用外掛程式產生

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
}

使用 LoRA 權重產生

使用以 LoRA 權重自訂的模型產生圖片的程序,與使用標準基礎模型的程序類似。確認提示中包含權杖,然後執行相同的程式碼。

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

迭代產生

圖像產生器也可以在每次迭代期間輸出產生的中間圖片,如 iterations 輸入參數所定義。如要查看這些中繼結果,請呼叫 setInputs 方法,然後呼叫 execute() 來執行每個步驟。將 showResult 參數設為 true,即可顯示中間結果。

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

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

    return bitmap
}

處理及顯示結果

圖片產生器會傳回 ImageGeneratorResult,其中包含已產生的圖片、完成時間的時間戳記,以及條件式圖片 (如果有提供做為輸入內容)。

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

下圖是使用基礎模型,從以下輸入內容產生。

輸入內容:

  • 提示:「穿著寬邊帽、手持棍子穿越森林的卡通浣熊,動畫、四分之三視角、繪圖」
  • Seed:312687592
  • 疊代次數:20

生成的圖片: