Android 圖片產生指南

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

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

您可以前往 GitHub 取得這些操作說明中提及的程式碼範例。如要進一步瞭解這項工作的功能、模型和設定選項,請參閱總覽

程式碼範例

MediaPipe Tasks 範例程式碼是 Android 圖片產生器應用程式的基本實作。您可以將該應用程式做為開發 Android 應用程式的起點,也可以在修改現有應用程式時參照該應用程式。Image Generator 範例程式碼由 GitHub 代管。

下載程式碼

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

如要下載範例程式碼,請按照下列步驟操作:

  1. 使用下列指令複製 Git 存放區:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 您可以選擇將 Git 執行個體設為使用稀疏檢查,因此只有 Image Generator 範例應用程式的檔案:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generator/android
    

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

重要元件

下列檔案包含此映像檔產生範例應用程式的重要程式碼:

設定

本節說明如何設定開發環境,以及專門用來使用 Image Generator 的程式碼專案。如需瞭解如何使用 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 程式庫依附元件新增至 AndroidManifest.xml。詳情請參閱 uses-native-library 標記的說明文件。

部分 Android 裝置可能還需要額外的程式庫:

<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 圖片產生器工作需要經過訓練且與這項工作相容的基礎模型。下載模型後,請安裝必要的依附元件,並將 Ther 模型轉換為合適的格式。然後,將轉換後的模型推送至 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 Edge 外掛程式使用 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 Edge 偵測工具」一文。

臉部位置標記選項

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)
    

峽谷邊緣

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 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
}

處理並顯示結果

Image Generator 會傳回 ImageGeneratorResult,其中包括產生的圖片、完成時間的時間戳記,以及一個做為輸入提供的條件式圖片。

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

下方圖片是使用僅使用基礎模型的輸入所產生。

輸入內容:

  • 提示:「一隻色彩繽紛的卡通風格獨具,戴著一頂毛茸茸的帽子,拿著樹枝走過森林,動畫,四分之三的視野、繪畫」
  • 種子:312687592
  • 疊代:20

產生的圖片: