Hướng dẫn tạo hình ảnh cho Android

Tác vụ Trình tạo hình ảnh MediaPipe cho phép bạn tạo hình ảnh dựa trên câu lệnh dạng văn bản. Chiến dịch này nhiệm vụ sử dụng mô hình chuyển văn bản thành hình ảnh để tạo hình ảnh bằng kỹ thuật khuếch tán.

Tác vụ chấp nhận câu lệnh dạng văn bản làm thông tin đầu vào, cùng với hình ảnh điều kiện không bắt buộc mà mô hình có thể bổ sung và dùng làm tham chiếu khi tạo. Trình tạo hình ảnh cũng có thể tạo hình ảnh dựa trên các khái niệm cụ thể được cung cấp cho mô hình trong khoảng thời gian đào tạo hoặc đào tạo lại. Để biết thêm thông tin, hãy xem bài viết tuỳ chỉnh bằng LoRA.

Mã mẫu được mô tả trong các hướng dẫn này có trên GitHub. Để biết thêm thông tin về tính năng, kiểu máy và các lựa chọn cấu hình của nhiệm vụ này, xem phần Tổng quan.

Ví dụ về mã

Mã ví dụ MediaPipe Tasks là cách triển khai cơ bản của Trình tạo hình ảnh dành cho Android. Bạn có thể sử dụng ứng dụng làm điểm khởi đầu cho Android của riêng mình ứng dụng hoặc tham chiếu đến khi sửa đổi ứng dụng hiện có. Ví dụ về Trình tạo hình ảnh mã được lưu trữ trên GitHub.

Tải mã xuống

Các hướng dẫn sau đây chỉ cho bạn cách tạo bản sao trên máy của ví dụ bằng công cụ dòng lệnh git.

Cách tải mã ví dụ xuống:

  1. Sao chép kho lưu trữ git bằng lệnh sau:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Bạn có thể định cấu hình thực thể git để sử dụng quy trình thanh toán thưa thớt, vì vậy, bạn có chỉ các tệp cho ứng dụng ví dụ về Trình tạo hình ảnh:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_generator/android
    

Sau khi tạo phiên bản cục bộ của mã ví dụ, bạn có thể nhập dự án vào Android Studio rồi chạy ứng dụng. Để biết hướng dẫn, hãy xem Hướng dẫn thiết lập cho Android.

Thành phần chính

Các tệp sau đây chứa mã quan trọng cho ví dụ về cách tạo hình ảnh này ứng dụng:

  • ImageGenerationHelper.kt: Khởi chạy tác vụ và xử lý việc tạo hình ảnh.
  • DiffusionActivity.kt: Tạo hình ảnh khi trình bổ trợ hoặc trọng số LoRA không được bật.
  • PluginActivity.kt: Triển khai các mô hình trình bổ trợ, cho phép người dùng cung cấp một điều kiện làm dữ liệu đầu vào.
  • LoRAWeightActivity.kt: Truy cập và xử lý các trọng số LoRA dùng để tuỳ chỉnh nền tảng và cho phép chúng tạo hình ảnh các khái niệm cụ thể.

Thiết lập

Phần này mô tả các bước chính để thiết lập môi trường phát triển và mã dự án cụ thể để sử dụng Trình tạo hình ảnh. Để biết thông tin chung về thiết lập môi trường phát triển để sử dụng các tác vụ MediaPipe, bao gồm yêu cầu về phiên bản nền tảng, hãy xem Hướng dẫn thiết lập cho Android.

Phần phụ thuộc

Tác vụ Trình tạo hình ảnh sử dụng Thư viện com.google.mediapipe:tasks-vision-image-generator. Thêm phần phụ thuộc này vào tệp build.gradle của ứng dụng Android:

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

Đối với các thiết bị chạy Android 12 (API 31) trở lên, hãy thêm thư viện OpenCL gốc phần phụ thuộc vào AndroidManifest.xml. Để biết thêm thông tin, hãy xem tài liệu trên uses-native-library .

Một số thiết bị Android cũng có thể yêu cầu thêm thư viện:

<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" />

Mẫu

Tác vụ Trình tạo hình ảnh MediaPipe cần có một mô hình nền tảng đã qua đào tạo và tương thích với nhiệm vụ này. Sau khi tải mô hình xuống, hãy cài đặt các phần phụ thuộc bắt buộc và chuyển đổi mô hình đó sang một định dạng phù hợp. Sau đó, đẩy nút đã chuyển đổi mẫu vào thiết bị Android.

Để biết thêm thông tin về các mô hình đã huấn luyện hiện có cho Trình tạo hình ảnh, hãy xem nhiệm vụ phần Mô hình tổng quan.

Tải mô hình nền tảng xuống

Trình tạo hình ảnh yêu cầu mô hình nền tảng khớp với Định dạng mô hình runwayml/stable-diffusion-v1-5 EMA-only, dựa trên giá trị sau: mô hình: runwayml/stable-diffusion-v1-5.

Cài đặt các phần phụ thuộc và chuyển đổi mô hình

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

Chạy convert.py tập lệnh:

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

Đẩy mô hình đã chuyển đổi sang thiết bị

Đẩy nội dung của thư mục <output_path> sang thiết bị 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

Tải các mô hình Trình bổ trợ xuống và thêm trọng số LoRA (Không bắt buộc)

Nếu bạn định sử dụng mô hình trình bổ trợ, hãy kiểm tra xem mô hình đó phải được tải xuống. Đối với các trình bổ trợ yêu cầu mô hình bổ sung, trình bổ trợ các mô hình phải được nhóm lại trong APK hoặc được tải xuống theo yêu cầu. Các mẫu trình bổ trợ có dung lượng nhẹ (~23MB) và có thể được đóng gói trực tiếp trong APK. Tuy nhiên, chúng tôi bạn nên tải các mô hình trình bổ trợ xuống theo yêu cầu.

Nếu bạn đã tuỳ chỉnh mô hình bằng LoRA thân mến! tải xuống theo yêu cầu. Để biết thêm thông tin, xem trọng số LoRA mô hình trình bổ trợ.

Tạo việc cần làm

Tác vụ Trình tạo hình ảnh MediaPipe sử dụng hàm createFromOptions() để thiết lập công việc. Hàm createFromOptions() chấp nhận các giá trị cho cấu hình . Để biết thêm thông tin về các chế độ cấu hình, hãy xem phần Cấu hình .

Các lựa chọn về cấu hình

Nhiệm vụ này có các lựa chọn cấu hình sau đây cho ứng dụng Android:

Tên lựa chọn Mô tả Khoảng giá trị
imageGeneratorModelDirectory Thư mục mô hình trình tạo hình ảnh lưu trữ trọng số mô hình. PATH
loraWeightsFilePath Đặt đường dẫn đến tệp trọng số LoRA. Không bắt buộc và chỉ áp dụng nếu mô hình được tuỳ chỉnh bằng LoRA. PATH
errorListener Đặt một trình nghe lỗi (không bắt buộc). N/A

Tác vụ này cũng hỗ trợ các mô hình trình bổ trợ, cho phép người dùng thêm hình ảnh điều kiện trong dữ liệu đầu vào của công việc mà mô hình nền tảng có thể củng cố và dùng làm tham chiếu để tạo. Những hình ảnh tình trạng này có thể là điểm mốc khuôn mặt, đường viền cạnh và ước tính chuyên sâu mà mô hình này sử dụng làm ngữ cảnh và thông tin bổ sung để tạo hình ảnh.

Khi thêm mô hình trình bổ trợ vào mô hình nền tảng, bạn cũng nên định cấu hình trình bổ trợ . Trình bổ trợ Điểm mốc khuôn mặt sử dụng faceConditionOptions, cạnh Canny trình bổ trợ sử dụng edgeConditionOptions, còn trình bổ trợ Độ sâu sử dụng depthConditionOptions.

Tuỳ chọn Canny Edge

Định cấu hình các tuỳ chọn sau trong edgeConditionOptions.

Tên lựa chọn Mô tả Khoảng giá trị Giá trị mặc định
threshold1 Ngưỡng đầu tiên của thủ thuật trễ. Float 100
threshold2 Ngưỡng thứ hai của thủ thuật trễ. Float 200
apertureSize Kích thước khẩu độ cho toán tử Sobel. Phạm vi điển hình là từ 3 đến 7. Integer 3
l2Gradient Liệu định mức L2 có được dùng để tính độ dốc của hình ảnh hay không, thay vì chuẩn L1 mặc định. BOOLEAN False
EdgePluginModelBaseOptions Đối tượng BaseOptions thiết lập đường dẫn cho mô hình trình bổ trợ. BaseOptions đối tượng N/A

Để biết thêm thông tin về cách hoạt động của các lựa chọn cấu hình này, hãy xem Trình phát hiện cạnh Canny.

Lựa chọn về điểm mốc trên khuôn mặt

Định cấu hình các tuỳ chọn sau trong faceConditionOptions.

Tên lựa chọn Mô tả Khoảng giá trị Giá trị mặc định
minFaceDetectionConfidence Điểm tin cậy tối thiểu để phát hiện khuôn mặt được coi là thành công. Float [0.0,1.0] 0.5
minFacePresenceConfidence Điểm số tin cậy tối thiểu cho sự hiện diện của khuôn mặt điểm số trong tính năng phát hiện mốc khuôn mặt. Float [0.0,1.0] 0.5
faceModelBaseOptions Đối tượng BaseOptions thiết lập đường dẫn cho mô hình tạo hình ảnh điều kiện. BaseOptions đối tượng N/A
FacePluginModelBaseOptions Đối tượng BaseOptions thiết lập đường dẫn cho mô hình trình bổ trợ. BaseOptions đối tượng N/A

Để biết thêm thông tin về cách hoạt động của các tuỳ chọn cấu hình này, hãy xem Nhiệm vụ của Trình xác định khuôn mặt.

Tùy chọn độ sâu

Định cấu hình các tuỳ chọn sau trong depthConditionOptions.

Tên lựa chọn Mô tả Khoảng giá trị Giá trị mặc định
depthModelBaseOptions Đối tượng BaseOptions thiết lập đường dẫn cho mô hình tạo hình ảnh điều kiện. BaseOptions đối tượng N/A
depthPluginModelBaseOptions Đối tượng BaseOptions thiết lập đường dẫn cho mô hình trình bổ trợ. BaseOptions đối tượng N/A

Chỉ tạo bằng mô hình nền tảng

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

imageGenerator = ImageGenerator.createFromOptions(context, options)

Tạo bằng trình bổ trợ

Nếu bạn đang áp dụng một mô hình trình bổ trợ không bắt buộc, hãy đặt các tuỳ chọn cơ sở cho mô hình trình bổ trợ với setPluginModelBaseOptions. Nếu mô hình trình bổ trợ yêu cầu mô hình đã tải xuống bổ sung để tạo hình ảnh điều kiện, hãy chỉ định đường dẫn trong BaseOptions.

Điểm mốc khuôn mặt

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)
    

Cạnh Canny

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)
    

Chiều sâu

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)
    

Tạo bằng các trọng số LoRA

Nếu bạn đang thêm các trọng số LoRA, hãy sử dụng tham số loraWeightsFilePath để trỏ đến vị trí đường dẫn.

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

imageGenerator = ImageGenerator.createFromOptions(context, options)

Chuẩn bị dữ liệu

Trình tạo hình ảnh chấp nhận các dữ liệu đầu vào sau:

  • prompt (bắt buộc): Câu lệnh bằng văn bản mô tả hình ảnh cần tạo.
  • vòng lặp (bắt buộc): Tổng số lần lặp lại để tạo hình ảnh. Đáp điểm khởi đầu tốt là 20.
  • seed (bắt buộc): Hạt gốc ngẫu nhiên dùng trong quá trình tạo hình ảnh.
  • hình ảnh tình trạng (không bắt buộc): Hình ảnh mà mô hình sử dụng làm tham chiếu cho tạo. Chỉ áp dụng khi sử dụng mô hình trình bổ trợ.
  • condition type (loại điều kiện) (không bắt buộc): Loại mô hình trình bổ trợ được dùng với tác vụ. Chỉ áp dụng khi sử dụng mô hình trình bổ trợ.

Dữ liệu đầu vào chỉ có mô hình nền tảng

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

Đầu vào bằng trình bổ trợ

Nếu bạn đang áp dụng một mô hình trình bổ trợ không bắt buộc, hãy dùng cả conditionType để chọn mô hình trình bổ trợ và tham số sourceConditionImage tạo hình ảnh điều kiện.

Tên lựa chọn Mô tả Giá trị
conditionType Mô hình trình bổ trợ được áp dụng cho mô hình nền tảng. {"FACE", "EDGE", "DEPTH"}
sourceConditionImage Hình ảnh nguồn được dùng để tạo hình ảnh điều kiện. MPImage đối tượng

Nếu bạn đang sử dụng một mô hình trình bổ trợ, hãy sử dụng createConditionImage để tạo hình ảnh tình trạng:

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

Sau khi tạo hình ảnh điều kiện, hãy đưa vào dưới dạng thông tin đầu vào cùng với câu lệnh, số ngẫu nhiên và số lần lặp.

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

Dữ liệu đầu vào có trọng số LoRA

Nếu bạn đang sử dụng các trọng số LoRA, hãy đảm bảo rằng mã thông báo nằm trong lời nhắc bằng văn bản nếu bạn dự định tạo một hình ảnh có khái niệm cụ thể được thể hiện bằng trọng số.

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

Chạy tác vụ

Sử dụng phương thức generate() để tạo hình ảnh bằng các dữ liệu đầu vào được cung cấp trong phần trước. Thao tác này sẽ tạo ra một hình ảnh duy nhất.

Tạo chỉ bằng mô hình nền tảng

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

Tạo bằng trình bổ trợ

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
}

Tạo bằng các trọng số LoRA

Quá trình tạo hình ảnh bằng mô hình được tuỳ chỉnh bằng trọng số LoRA tương tự như quy trình với mô hình nền tảng chuẩn. Đảm bảo rằng mã thông báo được đưa vào lời nhắc và chạy cùng một mã.

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

Tạo lặp lại

Trình tạo hình ảnh cũng có thể xuất ra hình ảnh trung gian được tạo trong mỗi lần như xác định trong tham số đầu vào iterations. Để xem các sự kiện này kết quả trung gian, gọi phương thức setInputs, sau đó gọi execute() để chạy từng bước. Đặt tham số showResult thành true để hiển thị trung gian kết quả.

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

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

    return bitmap
}

Xử lý và hiện kết quả

Trình tạo hình ảnh trả về một ImageGeneratorResult, bao gồm dữ liệu đã tạo hình ảnh, dấu thời gian của thời điểm hoàn thành và hình ảnh có điều kiện (nếu có) đã được cung cấp dưới dạng thông tin đầu vào.

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

Hình ảnh sau đây đã được tạo từ các dữ liệu đầu vào sau đây, chỉ sử dụng mô hình nền tảng.

Đầu vào:

  • Câu lệnh: "một chú gấu trúc hoạt hình nhiều màu sắc đội một chiếc mũ rộng vành mềm mại cầm một cây gậy đi qua khu rừng, ảnh động, chụp bằng góc nhìn 3/4, tranh"
  • Số ngẫu nhiên: 312687592
  • Số lần lặp lại: 20

Hình ảnh được tạo: