All Products
Search
Document Center

Platform For AI:AI Portrait: Gunakan SDK Java

Last Updated:Mar 06, 2026

Anda dapat menggunakan kit pengembangan perangkat lunak (SDK) Java untuk memanggil layanan AI Portrait guna melakukan pelatihan model dan pembuatan potret. SDK ini memungkinkan Anda menyesuaikan model LoRA serta membuat potret berdasarkan templat. Topik ini menjelaskan persiapan yang diperlukan dan menyediakan contoh kode.

Prasyarat

  • Lingkungan Java telah terinstal.

  • Anda memiliki 5 hingga 20 gambar pelatihan dan satu gambar templat untuk pelatihan model dan pembuatan potret. Format gambar yang didukung adalah: .jpg, .jpeg, dan .png.

    • Untuk potret tunggal, gambar templat harus berisi satu wajah. Wajah dalam gambar pelatihan harus milik orang yang sama.

    • Untuk potret multi-orang, gambar templat harus berisi beberapa wajah. Jumlah wajah tersebut harus sama dengan jumlah nilai model_id yang digunakan dalam pelatihan model.

    • Pastikan dimensi gambar pelatihan dan templat lebih besar dari 512 × 512 piksel.

Persiapan

  1. Tambahkan dependensi SDK aiservice ke bagian <dependencies> file `pom.xml` Anda:

    <dependency>
     <groupId>com.aliyun.openservices.aiservice</groupId>
     <artifactId>aiservice-sdk</artifactId>
     <version>1.0.1</version>
    </dependency>
  1. Inisialisasi client.

    import com.aliyun.openservices.aiservice.ApiClient;
    
    public class AIGCImageTest {
     public static ApiClient apiClient;
     static {
     String host = 'HOST';
     String appId = 'YOUR-APPID';
     String token = 'YOUR-TOKEN';
     apiClient = new ApiClient(host, appId, token);
     }
    }

    Ganti nilai parameter berikut sesuai kebutuhan Anda.

    Parameter

    Deskripsi

    <HOST>

    Alamat sisi server: http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com.

    <YOUR-APPID>

    Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat AppId di halaman AI Portrait.

    <YOUR-TOKEN>

    Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat token di halaman AI Portrait.

Untuk informasi selengkapnya, lihat kode sumber terbuka di GitHub.

Contoh kode

AI Portrait adalah layanan yang intensif resource dan melibatkan dua tahap utama: pelatihan model dan pembuatan potret. Pelatihan model biasanya memerlukan beberapa menit untuk selesai, sedangkan pembuatan potret selesai dalam hitungan puluhan detik.

Periksa permintaan (api.aigcImagesCheck)

  • Blok kode berikut menunjukkan contoh permintaan:

    import com.aliyun.openservices.aiservice.api;
    import com.aliyun.openservices.aiservice.ApiClient;
    import com.aliyun.openservices.aiservice.ApiException;
    import com.aliyun.openservices.aiservice.model.AIGCCreatRequest;
    import com.aliyun.openservices.aiservice.model.AIGCImageCheckResponse;
    import com.aliyun.openservices.aiservice.model.AIGCImageCreateResponse;
    import com.aliyun.openservices.aiservice.model.Response;
    
    import java.util.Arrays;
    import java.util.List;
    
    public class AIGCImageTest {
        public static ApiClient apiClient;
        private  AigcImagesApi api ;
        static {
            String host  = 'HOST';
            String appId = 'YOUR-APPID';
            String token = 'YOUR-TOKEN';
            apiClient = new ApiClient(host, appId, token);
            api = new AigcImagesApi(apiClient);
        }
    
        public void aigcImagesCheckTest() throws Exception {
            // URL gambar pelatihan.
            List<String> images =Arrays.asList(
                "https://xxx/0.jpg",
                "https://xxx/1.jpg",
                "https://xxx/2.jpg"
            );
    
            AIGCImageCheckResponse response = api.aigcImagesCheck(images);
            // ID permintaan.
            String request_id = response.getRequestId();
            // Status permintaan.
            String code = response.getCode();
            // Detail status permintaan.
            String message = response.getMessage();
            // Konten respons.
            AIGCImageCheckData data = response.getData();
    
            // Kode hasil pemeriksaan.
            List<AIGCImageCheckResult> CheckResultsList =  response.getCheckResults();
            for(int i=0; i < CheckResultsList.size(); i++ ){
                AIGCImageCheckResult result = CheckResultsList.get(i);
                Integer ResultCode = result.getCode();
                System.out.println(ResultCode);
            }
        }
    
    }

    Parameter

    Nama Parameter

    Deskripsi

    images

    Daftar URL gambar. Tipe: List<String>.

    <HOST>

    Alamat sisi server: http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com.

    <YOUR-APPID>

    Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat AppId di halaman AI Portrait.

    <YOUR-TOKEN>

    Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat token di halaman AI Portrait.

  • Blok kode berikut menunjukkan contoh respons:

    Tipe respons: AIGCImageCheckResponse

    {
    	requestId: 3c0eeb6b-1faf-4dc4-8f9a-9a02486051c6
    	code: OK
    	message: success
    	data:
    		AIGCImageCheckData{
    			requestId = '3c0eeb6b-1faf-4dc4-8f9a-9a02486051c6', 
     			images = ["https://xxx/0.jpg",
     								"https://xxx/1.jpg",
     								"https://xxx/2.jpg"], 
    		costTime=0.5460958480834961, 
     		checkResults=[
     			AIGCImageCheckResult{
     				code=1, 
     				frontal=false, 
     				url='https://xxx/0.jpg',
     				message='success'}, 
     			AIGCImageCheckResult{
            code=1, 
              frontal=true, 
              url='https://xxx/1.jpg',
              message='success'}, 
          AIGCImageCheckResult{
            code=4,
            frontal=false, 
            url='https://xxx/2.jpg',
            message='Image detect error.'}
      		]
    		}
    }

    Deskripsi nilai kembali

    Nama Parameter

    Deskripsi

    Tipe

    requestId

    ID permintaan.

    String

    code

    Kode status permintaan. Nilai yang valid:

    • OK: Permintaan berhasil.

    • error: Permintaan gagal.

    String

    message

    Detail status permintaan. Nilai success menunjukkan bahwa permintaan berhasil. Untuk nilai lainnya, lihat konten yang dikembalikan secara spesifik.

    String

    data

    Detail data yang dikembalikan.

    AIGCImageCheckData

    Deskripsi bidang data (tipe: AIGCImageCheckData)

    Nama Parameter

    Deskripsi

    Tipe

    checkResults

    Hasil deteksi untuk setiap gambar input. Setiap gambar berkorespondensi dengan sebuah dictionary yang berisi tiga kunci: url, message, dan frontal. Kunci-kunci ini masing-masing merepresentasikan URL gambar, detail deteksi gambar, dan apakah gambar merupakan tampilan depan (frontal).

    List<AIGCImageCheckResult>

    costTime

    Waktu komputasi sisi server untuk pemanggilan API ini.

    float

    images

    Daftar URL gambar yang diperiksa.

    List<String>

    requestId

    ID permintaan. Ini sama dengan request_id induk.

    String

    Rangkuman pesan dalam check_results:

    message

    Kode status

    Deskripsi

    success

    1

    Persyaratan terpenuhi.

    Image decode error.

    2

    Gambar tidak dapat diunduh atau didekode.

    Number of face is not 1.

    3

    Jumlah wajah dalam gambar bukan 1.

    Image detect error.

    4

    Terjadi kesalahan selama deteksi wajah.

    Image encoding error.

    5

    Terjadi kesalahan saat mengenkoding wajah menjadi vektor fitur. Ini menunjukkan bahwa tidak ada wajah yang terdeteksi.

    This photo is not the same person in photos.

    6

    Kesalahan ini menunjukkan bahwa wajah dalam beberapa gambar tidak berasal dari orang yang sama.

Mulai pelatihan model (api.aigcImagesTrain)

  • Blok kode berikut menunjukkan contoh permintaan:

    package com.aliyun.aisdk;
    
    import com.aliyun.openservices.aiservice.api.AigcImagesApi;
    import com.aliyun.openservices.aiservice.ApiClient;
    import com.aliyun.openservices.aiservice.ApiException;
    import com.aliyun.openservices.aiservice.model.*;
    
    import java.util.Arrays;
    import java.util.List;
    
    import java.io.IOException;
    
    public class AIGCImageTrain {
      public String host = 'HOST';
      public String appId = 'YOUR-APPID';
      public String token = 'YOUR-TOKEN';
    
      public ApiClient apiClient = new ApiClient(host, appId, token);
      public AigcImagesApi api = new AigcImagesApi(apiClient);
    
      public void aigcImagesTrainTest() throws Exception {
        List<String> images =Arrays.asList(
          "https://xxx/0.jpg",
          "https://xxx/1.jpg",
          "https://xxx/2.jpg"
        );
        AIGCImageTrainResponse response = api.aigcImagesTrain(images);
        int jobId = response.getData().getJobId();
        String modelId = response.getData().getModelId();
        String message = response.getMessage();
        InlineResponse200Data Data = response.getData();
    
        System.out.println(response);
        System.out.println(response.getMessage());
    
        System.out.println("jobId:" + jobId);
        System.out.println("modelId:" + modelId);
        System.out.println("Data:" + Data);
      }
    }

    Parameter

    Lokasi Parameter

    Deskripsi

    images

    Daftar URL gambar. Tipe: List<String>.

    <HOST>

    Alamat sisi server: http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com.

    <YOUR-APPID>

    Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat AppId di halaman AI Portrait.

    <YOUR-TOKEN>

    Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat token di halaman AI Portrait.

  • Blok kode berikut menunjukkan contoh respons:

    Tipe respons: AIGCImageTrainResponse

    {
      requestId: 2bd438df-2358-4852-b6b0-bf7d39b6dde7
      code: OK
      message: success
      data: class InlineResponse200Data {
              	jobId: xxxx
                modelId: xxxx-xxxxxxxx-xxxxxx
              }
    }

  • Tabel berikut menjelaskan bidang-bidang dalam respons.

    Deskripsi bidang data

    Nama Parameter

    Deskripsi

    Tipe

    jobId

    ID tugas.

    int

    modelId

    ID model dari tugas pelatihan ini. Merupakan string sepanjang 36 karakter.

    String

    • Gunakan job_id untuk menanyakan hasil pelatihan.

    • Anda harus menyediakan model_id untuk memanggil layanan pembuatan potret.

Menanyakan hasil pelatihan (jobApi.getAsyncJob)

  • Blok kode berikut menunjukkan contoh permintaan:

    import com.aliyun.openservices.aiservice.api.AiServiceJobApi;
    import com.aliyun.openservices.aiservice.api.AigcImagesApi;
    import com.aliyun.openservices.aiservice.ApiClient;
    import com.aliyun.openservices.aiservice.ApiException;
    import com.aliyun.openservices.aiservice.model.*;
    
    
    import java.util.Arrays;
    import java.util.List;
    
    import java.io.IOException;
    
    public class AIGCJobCheck {
    	public void aigcJobStateGet() throws Exception {
        Integer jobId = new Integer(xxxx); // ID tugas asinkron
    
        AiServiceJobApi jobApi = new AiServiceJobApi(apiClient);
    
        AsyncJobResponse jobResponse = jobApi.getAsyncJob(jobId);
        String request_id = jobResponse.getRequestId();
        String job_code = jobResponse.getCode();
        String job_message = jobResponse.getMessage();
        Map<String, AsyncJobData> job_data = jobResponse.getData();
    
        String Result_string = (String) job_data.get("job").getResult();
        JsonObject jsonObject = new JsonParser().parse(Result_string).getAsJsonObject();
        JsonArray result_states = jsonObject.get("states").getAsJsonArray();
    
        for (int result_idx=0; result_idx < result_states.size(); result_idx++){
          JsonObject result_one = result_states.get(result_idx).getAsJsonObject();
          String result_url = result_one.get("url").getAsString();
        }
      }
    }
  • Tabel berikut menjelaskan parameter-parameter.

    Parameter

    Tipe

    Deskripsi

    jobId

    Integer

    ID tugas pelatihan.

  • Blok kode berikut menunjukkan contoh respons:

    • Jika pelatihan model sedang berlangsung, respons berikut dikembalikan:

      {
          requestId: 9a76c77d-c241-4691-8c93-fc6953fb668c
          code: OK
          message: success
          data: {
                job=AsyncJobData{
                  id=12746, 
                  appId='xxxxxxxxxx', 
                  state=1, 
                  message='model requesting', 
                  result="", 
                  requestId='111a6503-c2f7-4141-b17b-f8567e6a0a5f'
                  }
          }
      }
    • Saat pelatihan model selesai, respons berikut dikembalikan:

      {
            requestId: 0fc513d1-5a9e-48e1-9b6f-2eca7c0b62e9
            code: OK
            message: success
              data: {
                job=AsyncJobData{
                  id=12744, 
                  appId='xxxxxxxxxxx', 
                  state=2, 
                  message='success', 
                  result={
                    "cost_time":232.83351230621338,
                    "model_id":"xxxxxxxxxxxx",
                    "states":[{"code":1,
                               "frontal":true,
                               "message":"success",
                               "url":"https://xxxx/train/1.jpg"}]
                  }, 
                  requestId='83146ee3-68aa-40f7-b523-06f029e1db15'
                }
              }
      }
  • Deskripsi nilai kembali

    Nama parameter

    Deskripsi

    Tipe

    requestId

    ID permintaan.

    String

    code

    Kode status permintaan. OK menunjukkan keberhasilan. error menunjukkan kegagalan.

    String

    message

    Detail status permintaan. Nilai success menunjukkan bahwa permintaan berhasil. Untuk nilai lainnya, lihat konten yang dikembalikan secara spesifik.

    String

    data

    Detail data yang dikembalikan.

    Map<String, AsyncJobData>

    Deskripsi bidang job dalam data

    Nama Parameter

    Deskripsi

    Tipe

    id

    ID tugas, yaitu job_id.

    int

    appId

    AppId pengguna.

    String

    state

    Kode status tugas:

    • 0: Menginisialisasi.

    • 1: Berjalan.

    • 2: Berhasil.

    • 3: Gagal.

    int

    message

    Informasi tentang eksekusi tugas.

    String

    Result

    Hasil yang dikembalikan oleh model.

    String

    Deskripsi hasil model (tipe: String)

    Parameter

    Deskripsi

    cost_time

    Total waktu yang dikonsumsi oleh tugas pelatihan ini.

    states

    Hasil pemeriksaan untuk setiap gambar.

    Hasil deteksi untuk setiap gambar input. Setiap gambar berkorespondensi dengan sebuah dictionary yang berisi tiga kunci: url, message, dan frontal. Kunci-kunci ini masing-masing merepresentasikan URL gambar, detail deteksi gambar, dan apakah gambar merupakan tampilan depan (frontal).

    model_id

    Nama model LoRA.

    Ini sama dengan model_id yang diperoleh dari permintaan pelatihan dan digunakan sebagai input untuk pembuatan potret.

  • Kode kesalahan terkait

    • Kode kesalahan untuk permintaan layanan adalah sebagai berikut:

      Kode status HTTP

      code

      message

      Deskripsi

      400

      PARAMETER_ERROR

      not found appid

      AppId salah.

      401

      PARAMETER_ERROR

      sign error

      Token salah.

      404

      PARAMETER_ERROR

      model not found

      Layanan model yang sesuai belum dideploy.

    • Hasil kueri dapat berisi kode kesalahan berikut:

      Kode status HTTP

      code

      message

      Deskripsi

      462

      error

      Invalid input data

      Gagal mengurai data input.

      462

      error

      Image not provided

      Tidak ada gambar pelatihan yang disediakan.

      462

      error

      Make dir in oss Error.

      Gagal membuat folder di OSS. Periksa apakah OSS telah dipasang.

      462

      error

      Image process error.

      Terjadi kesalahan selama pra-pemrosesan gambar.

      469

      error

      Training - Not get best template image

      Tugas pelatihan keluar secara tak terduga dan gagal menghasilkan gambar referensi.

      469

      error

      Training - Not get lora weight

      Tugas pelatihan keluar secara tak terduga dan gagal menghasilkan bobot LoRA.

Pembuatan potret

  • Blok kode berikut menunjukkan contoh permintaan:

    • API untuk pembuatan potret tunggal (api.aigcImagesCreate)

      • Prediksi dengan Stable Diffusion 1.5

        import com.aliyun.openservices.aiservice.api.AiServiceJobApi;
        import com.aliyun.openservices.aiservice.api.AigcImagesApi;
        import com.aliyun.openservices.aiservice.ApiClient;
        import com.aliyun.openservices.aiservice.ApiException;
        import com.aliyun.openservices.aiservice.model.*;
        
        
        import java.io.FileOutputStream;
        import java.io.OutputStream;
        import java.util.Arrays;
        import java.util.List;
        
        import java.io.IOException;
        
        import sun.misc.BASE64Decoder;
        import sun.misc.BASE64Encoder;
        
        public class AIGCImageService {
          public String host = 'HOST';
          public String appId = 'YOUR-APPID';
          public String token = 'YOUR-TOKEN';
        
          public ApiClient apiClient = new ApiClient(host, appId, token);
          public AigcImagesApi api = new AigcImagesApi(apiClient);
        
          public void aigcImageCreateGet() throws Exception {
            String modelId = "xxx-xxxx";
            String templateImage = "https://xxxx.jpg";
            String model_name = "";
            Map<String, Object> configure = new TreeMap<String, Object>();
        
            AIGCImageCreateResponse createResponse = api.aigcImagesCreate(modelId, templateImage, model_name, configure);
        
            // ID permintaan.
            String request_id = createResponse.getRequestId();
            // Status permintaan.
            String code = createResponse.getCode();
            // Detail status permintaan.
            String message = createResponse.getMessage();
            // Konten respons.
            AIGCImageCreateData data = createResponse.getData();
        
            // Gambar yang dihasilkan dalam format Base64.
            String imgStr = createResponse.getData().getImage();
        
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] imgBtyes = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < imgBtyes.length; ++i) {
              // Sesuaikan data abnormal.
              if (imgBtyes[i] < 0) {
                imgBtyes[i] += 256;
              }
            }
        
            String imgFilePath = "test_single.jpg";
            OutputStream out = new FileOutputStream(imgFilePath);
        
            out.write(imgBtyes);
            out.flush();
            out.close();
          }
        }

        Berikut ini penjelasan parameter:

        Parameter

        Tipe

        Deskripsi

        modelId

        String

        Nama model LoRA. Masukkan model-id yang diperoleh dari pelatihan.

        Atur ke "" saat menggunakan mode ipa_control_only.

        templateImage

        String

        Jalur URL templat.

        model_name

        String

        Nama model. Secara default berupa string kosong.

        configure

        Map<String, Object>

        Konfigurasi pengembalian model. Secara default bernilai None.

        <HOST>

        String

        Alamat sisi server: http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com.

        <YOUR-APPID>

        String

        Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat AppId di halaman AI Portrait.

        <YOUR-TOKEN>

        String

        Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat token di halaman AI Portrait.

        Parameter dalam configure

        Nama parameter internal konfigurasi

        Deskripsi

        Tipe

        Wajib

        Nilai default

        Rentang nilai

        lora_weights

        Bobot LoRA.

        float

        Tidak

        0.90

        0.5 hingga 1.0

        first_denoising_strength

        Intensitas rekonstruksi gambar pertama.

        float

        Tidak

        0.45

        0.0 hingga 1.0

        second_denoising_strength

        Intensitas rekonstruksi gambar kedua.

        float

        Tidak

        0.30

        0.0 hingga 1.0

        more_like_me

        Ini lebih seperti kekuatan individu itu sendiri.

        float

        Tidak

        0.50

        0.0 hingga 1.0

        crop_face_preprocess

        Menentukan apakah akan memotong gambar sebelum rekonstruksi. Kami menyarankan Anda mengaktifkan ini untuk gambar berukuran besar.

        bool

        Tidak

        True

        True, False

        apply_face_fusion_before

        Menentukan apakah akan melakukan penggabungan potret pertama.

        bool

        Tidak

        True

        True, False

        apply_face_fusion_after

        Menentukan apakah akan melakukan penggabungan potret kedua.

        bool

        Tidak

        True

        True, False

        color_shift_middle

        Menentukan apakah akan melakukan koreksi warna pertama.

        bool

        Tidak

        True

        True, False

        color_shift_last

        Menentukan apakah akan melakukan koreksi warna kedua.

        bool

        Tidak

        True

        True, False

        background_restore

        Menentukan apakah akan merekonstruksi latar belakang.

        bool

        Tidak

        False

        True, False

        skin_retouching_bool

        Menentukan apakah akan melakukan penghalusan kulit.

        Jika diaktifkan, kulit akan dihaluskan dan diterangkan, yang umumnya membuat gambar lebih menarik tetapi dapat menghasilkan kulit yang terlalu putih. Jika dinonaktifkan, tekstur kulit akan ditingkatkan.

        bool

        Tidak

        False

        True, False

        photo_enhancement_bool

        Menentukan apakah akan melakukan peningkatan potret.

        Jika diaktifkan, restorasi potret atau super resolusi dilakukan untuk meningkatkan kualitas gambar yang dihasilkan.

        bool

        Tidak

        True

        True, False

        photo_enhancement_method

        Metode peningkatan potret.

        photo_fix melakukan restorasi gambar. Ini dapat menyebabkan distorsi tertentu tetapi memperbaiki bagian yang tidak masuk akal dan dapat mengurangi tekstur kulit.

        super_resolution hanya melakukan super resolusi gambar, yang lebih baik dalam mempertahankan gambar asli.

        String

        Tidak

        photo_fix

        photo_fix, super_resolution

        makeup_transfer

        Menentukan apakah akan melakukan transfer riasan.

        Jika diaktifkan, riasan ditransfer untuk mencegah gambar terlihat terlalu polos. Namun, ini dapat menyebabkan gambar terlihat kurang mirip pengguna.

        bool

        Tidak

        False

        True, False

        makeup_transfer_ratio

        Intensitas transfer riasan.

        Nilai yang lebih tinggi menghasilkan efek transfer riasan yang lebih kuat, sehingga riasan yang dihasilkan lebih mirip templat. Namun, ini juga dapat menyebabkan gambar terlihat kurang mirip pengguna.

        float

        Tidak

        0.5

        0.0 hingga 1.0

        face_shape_match

        Menentukan apakah akan menyesuaikan bentuk wajah.

        Jika diaktifkan, intensitas kontrol dikurangi, dan bentuk wajah serta tekstur kulit akan lebih mirip pengguna.

        bool

        Tidak

        False

        True, False

        ipa_control

        Menentukan apakah akan mengaktifkan kontrol IPA.

        Jika diaktifkan, kemiripan potret ditingkatkan, tetapi hasilnya lebih rentan terhadap pengaruh gambar referensi.

        bool

        Tidak

        False

        True, False

        ipa_control_only

        Jika diaktifkan, Anda dapat melakukan prediksi tanpa pelatihan.

        Jika diaktifkan, Anda harus menentukan ipa_image_path.

        bool

        Tidak

        False

        True, False

        ipa_image_path

        URL potret referensi.

        Ini wajib jika ipa_control_only diaktifkan.

        String

        Tidak

        None

        URL yang dapat diunduh

        ipa_weight

        Intensitas kontrol IPA.

        Nilai yang lebih tinggi membuat gambar output lebih mirip pengguna, tetapi nilai yang terlalu tinggi dapat menyebabkan distorsi gambar.

        float

        Tidak

        0.5

        0.0 hingga 1.0

        style_name

        Menentukan gaya untuk output yang dihasilkan.

        Tersedia dalam gaya realistis atau kartun.

        str

        Tidak

        Realistic

        Realistic,

        Anime

        lcm_accelerate

        Menentukan apakah akan menggunakan akselerasi LCM untuk gaya generasi.

        bool

        Tidak

        False

        True, False

        sharp_ratio

        Tingkat ketajaman. Nilai yang sesuai dapat meningkatkan kejelasan.

        Nilai yang terlalu tinggi dapat menyebabkan distorsi gambar.

        float

        Tidak

        0.15

        0.0 hingga 1.0

        t2i_prompt

        Jika Anda ingin menggunakan fitur teks-ke-gambar, atur prompt di sini.

        Jika Anda mengatur t2i_prompt, Anda tidak perlu meneruskan jalur URL templat.

        String

        Tidak

        None

        N/A

      • Inferensi dengan Stable Diffusion XL

        import com.aliyun.openservices.aiservice.api.AiServiceJobApi;
        import com.aliyun.openservices.aiservice.api.AigcImagesApi;
        import com.aliyun.openservices.aiservice.ApiClient;
        import com.aliyun.openservices.aiservice.ApiException;
        import com.aliyun.openservices.aiservice.model.*;
        
        
        import java.io.FileOutputStream;
        import java.io.OutputStream;
        import java.util.Arrays;
        import java.util.List;
        
        import java.io.IOException;
        
        import sun.misc.BASE64Decoder;
        import sun.misc.BASE64Encoder;
        
        public class AIGCImageService {
          public String host = 'HOST';
          public String appId = 'YOUR-APPID';
          public String token = 'YOUR-TOKEN';
        
          public ApiClient apiClient = new ApiClient(host, appId, token);
          public AigcImagesApi api = new AigcImagesApi(apiClient);
        
          public void aigcImageCreateGet() throws Exception {
            String modelId = "xxx-xxxx";
            String templateImage = "https://xxxx.jpg";
            String model_name = "create_xl";
            Map<String, Object> configure = new TreeMap<String, Object>();
        
            AIGCImageCreateResponse createResponse = api.aigcImagesCreate(modelId, templateImage, model_name, configure);
        
            // ID permintaan.
            String request_id = createResponse.getRequestId();
            // Status permintaan.
            String code = createResponse.getCode();
            // Detail status permintaan.
            String message = createResponse.getMessage();
            // Konten respons.
            AIGCImageCreateData data = createResponse.getData();
        
            // Gambar yang dihasilkan dalam format Base64.
            String imgStr = createResponse.getData().getImage();
        
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] imgBtyes = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < imgBtyes.length; ++i) {
              // Sesuaikan data abnormal.
              if (imgBtyes[i] < 0) {
                imgBtyes[i] += 256;
              }
            }
        
            String imgFilePath = "test_single.jpg";
            OutputStream out = new FileOutputStream(imgFilePath);
        
            out.write(imgBtyes);
            out.flush();
            out.close();
          }
        }

        Tabel berikut menjelaskan parameter.

        Lokasi Parameter

        Tipe

        Deskripsi

        modelId

        string

        Nama model LoRA. Masukkan model-id yang diperoleh dari pelatihan. Atur ke "" saat menggunakan mode ipa_control_only.

        templateImage

        string

        Jalur URL templat.

        Saat menghasilkan dengan scene_lora atau prompt, atur ini ke "t2i_generate".

        model_name

        string

        Nama model. Untuk menggunakan Stable Diffusion XL, atur ini ke create_xl.

        configure

        Map<String, Object>

        Model mengembalikan konfigurasi `configure`, yang secara default bernilai `None`.

        Parameter dalam configure

        Mengonfigurasi Nama Parameter Internal

        Deskripsi

        Tipe

        Wajib

        Nilai default

        Rentang nilai

        lora_weights

        Intensitas penerapan LoRA.

        Nilai yang lebih tinggi membuat gambar output lebih mirip pengguna, tetapi nilai yang terlalu tinggi dapat menyebabkan distorsi gambar.

        float

        Tidak

        0.90

        0.5 hingga 1.0

        first_diffusion_steps

        Jumlah langkah untuk difusi pertama.

        Kami tidak menyarankan Anda mengubah parameter ini. Nilai yang terlalu rendah dapat menyebabkan distorsi gambar.

        int

        Tidak

        50

        20-50

        first_denoising_strength

        Intensitas rekonstruksi gambar pertama.

        Intensitas rekonstruksi untuk wajah. Nilai yang lebih tinggi menghasilkan lebih banyak rekonstruksi. Secara teori, nilai yang lebih tinggi membuat gambar output lebih mirip pengguna, tetapi nilai yang terlalu tinggi dapat membuat gambar terlihat tidak alami.

        float

        Tidak

        0.45

        0.0 hingga 1.0

        second_diffusion_steps

        Jumlah langkah untuk difusi kedua.

        Kami tidak menyarankan Anda mengubah parameter ini. Nilai yang terlalu rendah dapat menyebabkan distorsi gambar.

        int

        Tidak

        30

        20-50

        second_denoising_strength

        Intensitas rekonstruksi gambar kedua.

        Intensitas rekonstruksi untuk tepi wajah. Nilai yang terlalu tinggi dapat membuat gambar terlihat tidak alami.

        float

        Tidak

        0.30

        0.0 hingga 1.0

        more_like_me

        Ini lebih merupakan kekuatan saya sendiri.

        Rasio penggabungan potret. Nilai yang lebih tinggi membuat gambar lebih mirip pengguna, tetapi nilai yang terlalu tinggi mengurangi realisme gambar.

        float

        Tidak

        0.60

        0.0 hingga 1.0

        crop_face_preprocess

        Menentukan apakah akan memotong gambar sebelum rekonstruksi. Kami menyarankan Anda mengaktifkan ini untuk gambar berukuran besar.

        Kami tidak menyarankan Anda menyesuaikan parameter ini.

        bool

        Tidak

        True

        True, False

        apply_face_fusion_before

        Menentukan apakah akan melakukan penggabungan potret pertama.

        Jika diaktifkan, penggabungan potret dilakukan. Jika dinonaktifkan, kemiripan berkurang.

        bool

        Tidak

        True

        True, False

        apply_face_fusion_after

        Menentukan apakah akan melakukan penggabungan potret kedua.

        Jika diaktifkan, penggabungan potret dilakukan. Jika dinonaktifkan, kemiripan berkurang.

        bool

        Tidak

        True

        True, False

        color_shift_middle

        Menentukan apakah akan melakukan koreksi warna pertama.

        Jika diaktifkan, koreksi warna dilakukan agar warna kulit gambar output lebih mirip templat. Jika dinonaktifkan, koreksi warna tidak dilakukan, dan penyimpangan warna dapat terjadi.

        bool

        Tidak

        True

        True, False

        color_shift_last

        Menentukan apakah akan melakukan koreksi warna kedua.

        Jika diaktifkan, koreksi warna dilakukan agar warna kulit gambar output lebih mirip templat. Jika dinonaktifkan, koreksi warna tidak dilakukan, dan penyimpangan warna dapat terjadi.

        bool

        Tidak

        True

        True, False

        background_restore

        Menentukan apakah akan merekonstruksi latar belakang.

        Jika diaktifkan, latar belakang direkonstruksi. Ini dapat membuat gambar terlihat lebih alami tetapi mengubah latar belakang dan meningkatkan waktu pemrosesan.

        bool

        Tidak

        False

        True, False

        skin_retouching_bool

        Menentukan apakah akan melakukan penghalusan kulit.

        Jika diaktifkan, kulit dihaluskan dan diterangkan, yang umumnya membuat gambar lebih menarik tetapi dapat menghasilkan kulit yang terlalu putih. Jika dinonaktifkan, tekstur kulit ditingkatkan.

        bool

        Tidak

        False

        True, False

        photo_enhancement_bool

        Menentukan apakah akan melakukan peningkatan potret.

        Jika diaktifkan, restorasi potret atau super resolusi dilakukan untuk meningkatkan kualitas gambar yang dihasilkan.

        bool

        Tidak

        True

        True, False

        photo_enhancement_method

        Metode peningkatan potret:

        photo_fix melakukan restorasi gambar. Ini dapat menyebabkan distorsi tertentu tetapi memperbaiki bagian yang tidak masuk akal dan dapat mengurangi tekstur kulit.

        super_resolution hanya melakukan super resolusi gambar, yang lebih baik dalam mempertahankan gambar asli.

        String

        Tidak

        photo_fix

        photo_fix, super_resolution

        makeup_transfer

        Menentukan apakah akan melakukan transfer riasan.

        Jika diaktifkan, riasan ditransfer untuk mencegah gambar terlihat terlalu polos. Namun, ini dapat menyebabkan gambar terlihat kurang mirip pengguna.

        bool

        Tidak

        False

        True, False

        makeup_transfer_ratio

        Intensitas transfer riasan.

        Nilai yang lebih tinggi menghasilkan efek transfer riasan yang lebih kuat, sehingga riasan yang dihasilkan lebih mirip templat. Namun, ini juga dapat menyebabkan gambar terlihat kurang mirip pengguna.

        float

        Tidak

        0.5

        0.0 hingga 1.0

        ipa_control

        Menentukan apakah akan mengaktifkan kontrol IPA.

        Jika diaktifkan, kemiripan potret ditingkatkan, tetapi hasilnya lebih rentan terhadap pengaruh gambar referensi.

        bool

        Tidak

        False

        True, False

        ipa_control_only

        Jika diaktifkan, Anda dapat melakukan prediksi tanpa pelatihan.

        Jika diaktifkan, Anda harus menentukan ipa_image_path.

        bool

        Tidak

        False

        True, False

        ipa_image_path

        URL potret referensi.

        Ini wajib jika ipa_control_only diaktifkan.

        String

        Tidak

        None

        URL yang dapat diunduh

        ipa_weight

        Intensitas kontrol IPA.

        Nilai yang lebih tinggi membuat gambar output lebih mirip pengguna, tetapi nilai yang terlalu tinggi dapat menyebabkan distorsi gambar.

        float

        Tidak

        0.5

        0.0 hingga 1.0

        lcm_accelerate

        Menentukan apakah akan menggunakan akselerasi LCM untuk gaya generasi.

        bool

        Tidak

        False

        True, False

        sharp_ratio

        Tingkat ketajaman. Nilai yang sesuai dapat meningkatkan kejelasan.

        Nilai yang terlalu tinggi dapat menyebabkan distorsi gambar.

        float

        Tidak

        0.15

        0.0 hingga 1.0

        scene_id

        Jika Anda ingin menggunakan Scene LoRA, atur ID adegan di sini.

        ID adegan diperoleh dari pelatihan. ID model yang dikembalikan saat melatih Scene LoRA Stable Diffusion XL adalah ID adegan.

        String

        Tidak

        None

        N/A

        t2i_prompt

        Jika Anda ingin menggunakan fitur teks-ke-gambar, atur prompt di sini.

        Jika Anda mengatur t2i_prompt, Anda tidak perlu meneruskan jalur URL templat.

        String

        Tidak

        None

        N/A

    • API untuk pembuatan potret multi-orang (api.aigcImagesCreateByMultiModelIds)

      import com.aliyun.openservices.aiservice.api.AiServiceJobApi;
      import com.aliyun.openservices.aiservice.api.AigcImagesApi;
      import com.aliyun.openservices.aiservice.ApiClient;
      import com.aliyun.openservices.aiservice.ApiException;
      import com.aliyun.openservices.aiservice.model.*;
      
      
      import java.io.FileOutputStream;
      import java.io.OutputStream;
      import java.util.Arrays;
      import java.util.List;
      
      import java.io.IOException;
      
      import sun.misc.BASE64Decoder;
      import sun.misc.BASE64Encoder;
      
      public class AIGCImageService {
        public String host = 'HOST';
        public String appId = 'YOUR-APPID';
        public String token = 'YOUR-TOKEN';
      
        public ApiClient apiClient = new ApiClient(host, appId, token);
        public AigcImagesApi api = new AigcImagesApi(apiClient);
      
        public void aigcImageCreateMulti() throws Exception {
          String[] modelIds = new String[]{"model-id1","model-id2"};
          String templateImage = "https://xxxx.jpg";
          String model_name = "";
          Map<String, Object> configure = new TreeMap<String, Object>();
      
          AIGCImageCreateResponse createResponse = api.aigcImagesCreateByMultiModelIds(model_id, template_image, model_name, config);
      
          // ID permintaan.
          String request_id = createResponse.getRequestId();
          // Status permintaan.
          String code = createResponse.getCode();
          // Detail status permintaan.
          String message = createResponse.getMessage();
          // Konten respons.
          AIGCImageCreateData data = createResponse.getData();
      
          // Gambar yang dihasilkan dalam format Base64.
          String imgStr = createResponse.getData().getImage();
      
          BASE64Decoder decoder = new BASE64Decoder();
          byte[] imgBtyes = decoder.decodeBuffer(imgStr);
          for (int i = 0; i < imgBtyes.length; ++i) {
            // Sesuaikan data abnormal.
            if (imgBtyes[i] < 0) {
              imgBtyes[i] += 256;
            }
          }
      
          String imgFilePath = "test_multi.jpg";
          OutputStream out = new FileOutputStream(imgFilePath);
      
          out.write(imgBtyes);
          out.flush();
          out.close();
        }
      }

      Parameter

      Tipe

      Deskripsi

      modelId

      String

      ID model dari model yang telah dilatih.

      templateImage

      String

      Jalur URL templat.

      model_name

      String

      Nama model. Secara default berupa string kosong.

      configure

      Map<String, Object>

      Konfigurasi pengembalian model. Secara default bernilai None.

      <HOST>

      String

      Alamat sisi server: http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com.

      <YOUR-APPID>

      String

      Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat AppId di halaman AI Portrait.

      <YOUR-TOKEN>

      String

      Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat token di halaman AI Portrait.

  • Blok kode berikut menunjukkan contoh respons:

    {
     requestId: 5eb7741b-540b-4a5c-9c98-fdd1d714e51f
     code: OK
     message: success
     data: com.aliyun.openservices.aiservice.model.AIGCImageCreateData@358c99f5
    }

    Deskripsi bidang data (tipe: AIGCImageCreateData)

    Parameter

    Deskripsi

    Tipe

    costTime

    Waktu yang dibutuhkan untuk generasi.

    Float

    image

    Gambar dalam format Base64.

    String

  • Kode kesalahan pembuatan potret

    • Kesalahan permintaan layanan

      Kode status HTTP

      code

      message

      Deskripsi

      400

      PARAMETER_ERROR

      not found appid

      AppId salah.

      401

      PARAMETER_ERROR

      sign error

      Token salah.

      404

      PARAMETER_ERROR

      model not found

      Layanan model yang sesuai belum dideploy.

    • Error hasil kueri

      Kode status HTTP

      code

      message

      Deskripsi

      462

      error

      Invalid input data. Please check the input dict.

      Gagal mengurai data input.

      462

      error

      Image not provided. Please check the template_image.

      Gambar templat untuk pembuatan potret tidak disediakan.

      462

      error

      Prompts get error. Please check the model_id.

      Periksa format model_id yang diberikan.

      462

      error

      Face id image decord error. Pleace check the user's lora is trained or not.

      Terjadi kesalahan saat mendekode gambar yang diunggah pengguna. Periksa apakah model telah dilatih.

      462

      error

      Roop image decord error. Pleace check the user's lora is trained or not.

      Gambar Roop tidak ada. Periksa apakah model telah dilatih.

      462

      error

      Template image decode error. Please Give a new template.

      Terjadi kesalahan saat mendekode gambar templat. Berikan templat baru.

      462

      error

      There is not face in template. Please Give a new template.

      Tidak ditemukan wajah dalam gambar templat. Berikan templat baru.

      462

      error

      Template image process error. Please Give a new template.

      Terjadi kesalahan selama pra-pemrosesan gambar templat. Berikan gambar templat baru.

      469

      error

      First Face Fusion Error, Can't get face in template image.

      Terjadi kesalahan selama penggabungan potret pertama.

      469

      error

      First Stable Diffusion Process error. Check the webui status.

      Terjadi kesalahan selama proses Stable Diffusion pertama.

      469

      error

      Second Face Fusion Error, Can't get face in template image.

      Terjadi kesalahan selama penggabungan potret kedua.

      469

      error

      Second Stable Diffusion Process error. Check the webui status.

      Terjadi kesalahan selama proses Stable Diffusion kedua.

      469

      error

      Please confirm if the number of faces in the template corresponds to the user ID.

      Periksa apakah jumlah ID pengguna yang diberikan sesuai dengan jumlah wajah.

      469

      error

      Third Stable Diffusion Process error. Check the webui status.

      Terjadi kesalahan selama pemrosesan latar belakang. Ganti templat.

Contoh kode alur end-to-end

Kode berikut memberikan contoh alur end-to-end. Setelah kode berhasil dieksekusi, gambar potret AI dihasilkan di direktori saat ini.

  • Alur standar (Stable Diffusion 1.5)

    package com.aliyun.aisdk;
    
    import com.aliyun.openservices.aiservice.api.AiServiceJobApi;
    import com.aliyun.openservices.aiservice.api.AigcImagesApi;
    import com.aliyun.openservices.aiservice.ApiClient;
    import com.aliyun.openservices.aiservice.ApiException;
    import com.aliyun.openservices.aiservice.model.*;
    
    
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.Arrays;
    import java.util.List;
    
    import java.io.IOException;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    public class AIGCImageRunner {
    
      public String host = 'HOST';
      public String appId = 'YOUR-APPID';
      public String token = 'YOUR-TOKEN';
    
      public ApiClient apiClient = new ApiClient(host, appId, token);
      public AigcImagesApi api = new AigcImagesApi(apiClient);
    
      public byte[] base64ToBytes(String imgStr) throws IOException {
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] imgBtyes = decoder.decodeBuffer(imgStr);
        for (int i = 0; i < imgBtyes.length; ++i) {
          // Sesuaikan data yang tidak normal.
          if (imgBtyes[i] < 0) {
            imgBtyes[i] += 256;
          }
        }
    
        return imgBtyes;
      }
    
      public void aigcImagesCheck(List<String> images) throws Exception{
        AIGCImageCheckResponse response = api.aigcImagesCheck(images);
      }
    
      public Object[] aigcImagesTrainRun(List<String> images) throws Exception {
    
        AIGCImageTrainResponse response = api.aigcImagesTrain(images);
        int jobId = response.getData().getJobId();
    
        Object[] trainOut = new Object[2];
    
        System.out.println(response);
        System.out.println(response.getMessage());
    
        System.out.println("jobId:" + jobId);
        System.out.println("modelId:" + response.getData().getModelId());
        System.out.println(response.getData());
    
        trainOut[0]=jobId;
        trainOut[1] = response.getData().getModelId();
        return trainOut;
      }
    
      public Integer aigcJobStateGet(AiServiceJobApi jobApi, int jobId_int) throws Exception {
        Integer jobId = new Integer(jobId_int); // ID tugas asinkron.
    
        AsyncJobResponse jobResponse = jobApi.getAsyncJob(jobId);
    
        System.out.println(jobResponse.getData().get("job").getResult());
    
        return jobResponse.getData().get("job").getState();
      }
    
      public void CreateSingle(String modelId, String templateImage) throws Exception {
    
        AIGCImageCreateResponse createResponse = api.aigcImagesCreate(modelId, templateImage);
    
        // Gambar yang dihasilkan dalam format Base64.
        String imgStr = createResponse.getData().getImage();
        System.out.println(createResponse.getData());
    
        byte[] imgBtyes = base64ToBytes(imgStr);
    
        String imgFilePath = "test_single.jpg";
        OutputStream out = new FileOutputStream(imgFilePath);
    
        out.write(imgBtyes);
        out.flush();
        out.close();
      }
      
      public void CreateMulti(String[] model_ids, String template_image)throws ApiException, IOException {
            
        		String imgFilePath = "test_multi.jpg";
        		AIGCImageCreateResponse createResponse = api.aigcImagesCreateByMultiModelIds(model_ids, template_image, model_name, config);
    
            // ID permintaan.
            String request_id = createResponse.getRequestId();
            // Status permintaan.
            String code = createResponse.getCode();
            // Detail status permintaan.
            String message = createResponse.getMessage();
            // Konten tanggapan.
            AIGCImageCreateData data = createResponse.getData();
    
            if (!code.equals("OK")){
                System.out.printf("aigc_images_create gagal, model_id adalah %s, request_id adalah %s\n",model_ids,request_id);
            }else {
                String imgStr = createResponse.getData().getImage();
                byte[] image = base64ToBytes(imgStr);
    
              	
                OutputStream out = new FileOutputStream(output_image);
    
                out.write(image);
                out.flush();
                out.close();
    
            }
        }
    
    
      public void aigcEndtoEndCreate() throws Exception {
        List<String> images =Arrays.asList(
          "https://xxx/0.jpg",
          "https://xxx/1.jpg",
          "https://xxx/2.jpg"
        );
        String templateImage = "https://xxx.jpg";
        String multiTemplateImage = "https://xxx.jpg";
    
        Object[] o = aigcImagesTrainRun(images);
        int jobId = (int)o[0];
        String modelId = (String)o[1];
        
        AiServiceJobApi jobApi = new AiServiceJobApi(apiClient);
    
        while(true){
          Integer jobState = aigcJobStateGet(jobApi, jobId);
    
          if (jobState == AsyncJobState.JOB_STATE_WAIT) { // Tugas sedang berjalan.
            System.out.println("tugas sedang berjalan");
          } else if (jobState == AsyncJobState.JOB_STATE_SUCCESS) {
            System.out.println("tugas berhasil");
            break;
          } else {
            System.out.println("tugas gagal");
            throw new Exception("tugas gagal");
          }
    
          try {
            Thread.sleep(30000);
          } catch (InterruptedException e) {
            throw new RuntimeException(e);
          }
        }
        
        
    
        CreateSingle(modelId,templateImage);
    
    
        String[] modelIds = new String[]{modelId,modelId};
        CreateMulti(model_ids, template_image)
    
      }
    
    }

    Tabel berikut menjelaskan parameter.

    Parameter

    Deskripsi

    <HOST>

    Alamat sisi server: http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com.

    <YOUR-APPID>

    Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat AppId di halaman AI Portrait.

    <YOUR-TOKEN>

    Setelah Anda mengaktifkan AI Portrait, Anda dapat melihat token di halaman AI Portrait.

    images

    URL gambar yang digunakan untuk melatih model. Pisahkan beberapa URL dengan koma (,).

    templateImage

    URL gambar templat, yang berisi satu wajah. Ini digunakan untuk pembuatan potret tunggal.

    multiTemplateImage

    URL gambar templat, yang berisi beberapa wajah. Jumlah wajah harus sesuai dengan jumlah nilai model_id yang diberikan. Ini digunakan untuk pembuatan potret multi-orang.

  • Alur standar (Stable Diffusion XL)

    Untuk menggunakan model Stable Diffusion XL, Anda harus terlebih dahulu menghubungi tim PAI untuk mengaktifkan layanan. Setelah layanan diaktifkan, Anda dapat menggunakannya dengan menentukan nama model.

    package com.aliyun.aiservice.demo;
    
    import com.aliyun.openservices.aiservice.ApiClient;
    import com.aliyun.openservices.aiservice.ApiException;
    import com.aliyun.openservices.aiservice.api.AiServiceJobApi;
    import com.aliyun.openservices.aiservice.api.AigcImagesApi;
    import com.aliyun.openservices.aiservice.model.*;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import org.junit.Test;
    import sun.misc.BASE64Decoder;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.*;
    
    
    public class PhotoEndtoEndTest {
    
        public String host = 'HOST';
      	public String appId = 'YOUR-APPID';
      	public String token = 'YOUR-TOKEN';
      
        public ApiClient apiClient = new ApiClient(host, appId, token);
        public AigcImagesApi api = new AigcImagesApi(apiClient);
        public AiServiceJobApi jobApi = new AiServiceJobApi(apiClient);
    
        public byte[] base64ToBytes(String imgStr) throws IOException {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] imgBtyes = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < imgBtyes.length; ++i) {
                // Sesuaikan data abnormal.
                if (imgBtyes[i] < 0) {
                    imgBtyes[i] += 256;
                }
            }
    
            return imgBtyes;
        }
    
        public boolean Check(List<String> images) throws ApiException {
            AIGCImageCheckResponse response = this.api.aigcImagesCheck(images);
            // ID permintaan.
            String request_id = response.getRequestId();
            // Status permintaan.
            String code = response.getCode();
            // Detail status permintaan.
            String message = response.getMessage();
            // Konten respons.
            AIGCImageCheckData data = response.getData();
    
            // Cetak hasil yang dikembalikan.
            boolean is_ok = false;
            if (!code.equals("OK")){
                System.out.printf("aigc_images_check failed,request id is %\n", request_id);
            }else{
                is_ok = true;
                System.out.printf("check images done, input %d images, return %d images, %d filtered by lvwang\n",
                        images.size(),(data.getCheckResults().size()),(images.size()-data.getCheckResults().size()));
                for (int check_result_idx=0; check_result_idx < data.getCheckResults().size();check_result_idx++ ){
                    AIGCImageCheckResult checkResult = data.getCheckResults().get(check_result_idx);
                    Integer checkResultCode = checkResult.getCode();
                    if (checkResultCode.equals(1)){
                        System.out.printf("check %s success\n", checkResult.getUrl());
                    }else {
                        is_ok = false;
                        System.out.printf("check %s failed, message is %s , request_id is %s\n",
                                checkResult.getUrl(),checkResult.getMessage(),request_id);
                    }
                }
            }
            return is_ok;
        }
    
        public Object[] Train(List<String> images, String model_name, Map<String, Object> config) throws ApiException {
            Integer job_id = -1;
            String model_id = "";
    
            AIGCImageTrainResponse response = this.api.aigcImagesTrain(images,model_name,config);
            // ID permintaan.
            String request_id = response.getRequestId();
            // Status permintaan.
            String code = response.getCode();
            // Detail status permintaan.
            String message = response.getMessage();
            // Konten respons.
            InlineResponse200Data Data = response.getData();
    
            // Cetak hasil yang dikembalikan.
            if (!code.equals("OK")){
                System.out.printf("aigc_images_train failed, request id is %s\n", request_id);
    
            }else{
                job_id = response.getData().getJobId();
                model_id = response.getData().getModelId();
    
                System.out.printf("train job_id is %d, model id %s\n",job_id.intValue(),model_id);
    
            }
            Integer state = -1;
            while(true){
                AsyncJobResponse jobResponse = this.jobApi.getAsyncJob(job_id);
                String job_code = jobResponse.getCode();
                String job_message = jobResponse.getMessage();
                Map<String, AsyncJobData> job_data = jobResponse.getData();
    
                if (!job_code.equals("OK")){
                    System.out.printf("get_async_job failed, request id is %s, message is %s\n",
                            request_id, job_message);
                    job_id = new Integer(-1);
                    model_id = "";
    
                }else{
                    state = job_data.get("job").getState();
                    if (state.equals(2)){
                        System.out.printf("model %s trained successfully\n",model_id);
                        break;
                    }else if(!state.equals(3)){
                        System.out.printf("training model %s\n",model_id);
    
                        try {
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                    }else{
                        System.out.printf("model %s trained failed, message: %s\n",model_id,job_message);
                        break;
                    }
                }
    
            }
    
            if (!state.equals(2)){
                model_id = "";
            }
    
            Object[] out = new Object[2];
            out[0] = job_id;
            out[1] = model_id;
    
            return out;
    
        }
    
        public String[] QueryValidImageUrlsByJob(Integer job_id) throws ApiException {
            String[] image_urls = null;
    
            AsyncJobResponse jobResponse = this.jobApi.getAsyncJob(job_id);
            String request_id = jobResponse.getRequestId();
            String job_code = jobResponse.getCode();
            String job_message = jobResponse.getMessage();
            Map<String, AsyncJobData> job_data = jobResponse.getData();
    
            if (!job_code.equals("OK")) {
                System.out.printf("get_async_job failed, request id is %s, message is %s\n",
                        request_id, job_message);
            }else {
                Integer state = job_data.get("job").getState();
                if (state == 2){
                    System.out.printf("Job %s trained successfully\n", job_id);
                    String Result_string = (String) job_data.get("job").getResult();
                    JsonObject jsonObject = new JsonParser().parse(Result_string).getAsJsonObject();
                    JsonArray result_states = jsonObject.get("states").getAsJsonArray();
                    image_urls = new String[result_states.size()];
                    for (int result_idx=0; result_idx < result_states.size(); result_idx++){
                        JsonObject result_one = result_states.get(result_idx).getAsJsonObject();
                        String result_url = result_one.get("url").getAsString();
                        image_urls[result_idx] = result_url;
                    }
    
                }else{
                    System.out.printf("job %s not ready\n",job_id);
                }
            }
    
            return image_urls;
        }
    
        public boolean Create(String model_id, String template_image, String output_image, String model_name, Map<String, Object> config) throws IOException {
            System.out.println("Create");
            AIGCImageCreateResponse createResponse = null;
            try{
                createResponse = api.aigcImagesCreate(model_id, template_image, model_name, config);
            }catch (ApiException e){
                System.out.println();
                System.out.println(e.getResponseBody());
            }
            System.out.println(createResponse);
            // ID permintaan.
            String request_id = createResponse.getRequestId();
            // Status permintaan.
            String code = createResponse.getCode();
            // Detail status permintaan.
            String message = createResponse.getMessage();
            // Konten respons.
            AIGCImageCreateData data = createResponse.getData();
    
            if (!code.equals("OK")){
                System.out.printf("aigc_images_create failed, model_id is %s, request_id is %s\n",model_id,request_id);
            }else {
                String imgStr = createResponse.getData().getImage();
                byte[] image = base64ToBytes(imgStr);
    
                OutputStream out = new FileOutputStream(output_image);
    
                out.write(image);
                out.flush();
                out.close();
    
            }
            return true;
        }
    
        public boolean CreateMulti(String[] model_ids, String template_image, String output_image, String model_name, Map<String, Object> config) throws ApiException, IOException {
            AIGCImageCreateResponse createResponse = api.aigcImagesCreateByMultiModelIds(model_ids, template_image, model_name, config);
    
            // ID permintaan.
            String request_id = createResponse.getRequestId();
            // Status permintaan.
            String code = createResponse.getCode();
            // Detail status permintaan.
            String message = createResponse.getMessage();
            // Konten respons.
            AIGCImageCreateData data = createResponse.getData();
    
            if (!code.equals("OK")){
                System.out.printf("aigc_images_create failed, model_id is %s, request_id is %s\n",model_ids,request_id);
            }else {
                String imgStr = createResponse.getData().getImage();
                byte[] image = base64ToBytes(imgStr);
    
                OutputStream out = new FileOutputStream(output_image);
    
                out.write(image);
                out.flush();
                out.close();
    
            }
            return true;
        }
    
        @Test
        public void aigcEndtoEndCreate() throws Exception {
            List<String> images = Arrays.asList(
                    "https://xxx/0.jpg",
                    "https://xxx/1.jpg",
                    "https://xxx/2.jpg"
            );
    
            
    
            String template_image = "https://xxx.jpg";
            String multi_template_image = "https://xxx.jpg";
          
            String model_name = "train_xl";
            Map<String, Object> config = new HashMap<String, Object>();
    
            Object[] train_out = Train(images, model_name, config);
    
            Integer job_id= (Integer) train_out[0];
            String model_id =  (String) train_out[1];
    
    
    
            String[] model_ids = {model_id,model_id};
            model_name = "create_xl"; //""
            Map<String, Object> configure = new TreeMap<String, Object>();
    
            Create(model_id, template_image,"single_out.jpg", model_name,configure);
    
            CreateMulti(model_ids, multi_template_image,"multi_out.jpg", model_name,configure);
    
    
        }
    
    }

  • Buat potret AI menggunakan satu gambar referensi (tanpa pelatihan model).

    package com.aliyun.aiservice.demo;
    
    import com.aliyun.openservices.aiservice.ApiClient;
    import com.aliyun.openservices.aiservice.ApiException;
    import com.aliyun.openservices.aiservice.api.AiServiceJobApi;
    import com.aliyun.openservices.aiservice.api.AigcImagesApi;
    import com.aliyun.openservices.aiservice.model.*;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import org.junit.Test;
    import sun.misc.BASE64Decoder;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.*;
    
    public class PhotoReferCreateTest {
        public String host = 'HOST';
      	public String appId = 'YOUR-APPID';
      	public String token = 'YOUR-TOKEN';
      
        public ApiClient apiClient = new ApiClient(host, appId, token);
        public AigcImagesApi api = new AigcImagesApi(apiClient);
        public AiServiceJobApi jobApi = new AiServiceJobApi(apiClient);
    
        public byte[] base64ToBytes(String imgStr) throws IOException {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] imgBtyes = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < imgBtyes.length; ++i) {
                // Sesuaikan data abnormal.
                if (imgBtyes[i] < 0) {
                    imgBtyes[i] += 256;
                }
            }
    
            return imgBtyes;
        }
    
        public boolean Check(List<String> images) throws ApiException {
            AIGCImageCheckResponse response = this.api.aigcImagesCheck(images);
            // ID permintaan.
            String request_id = response.getRequestId();
            // Status permintaan.
            String code = response.getCode();
            // Detail status permintaan.
            String message = response.getMessage();
            // Konten respons.
            AIGCImageCheckData data = response.getData();
    
            // Cetak hasil yang dikembalikan.
            boolean is_ok = false;
            if (!code.equals("OK")){
                System.out.printf("aigc_images_check failed,request id is %\n", request_id);
            }else{
                is_ok = true;
                System.out.printf("check images done, input %d images, return %d images, %d filtered by lvwang\n",
                        images.size(),(data.getCheckResults().size()),(images.size()-data.getCheckResults().size()));
                for (int check_result_idx=0; check_result_idx < data.getCheckResults().size();check_result_idx++ ){
                    AIGCImageCheckResult checkResult = data.getCheckResults().get(check_result_idx);
                    Integer checkResultCode = checkResult.getCode();
                    if (checkResultCode.equals(1)){
                        System.out.printf("check %s success\n", checkResult.getUrl());
                    }else {
                        is_ok = false;
                        System.out.printf("check %s failed, message is %s , request_id is %s\n",
                                checkResult.getUrl(),checkResult.getMessage(),request_id);
                    }
                }
            }
            return is_ok;
        }
    
    
    
        public boolean Create(String template_image, String output_image, String ref_image) throws IOException {
            System.out.println("Create");
            AIGCImageCreateResponse createResponse = null;
    
            Map<String, Object> config = new TreeMap<String, Object>();
    
            config.put("ipa_control_only",true);
            config.put("ipa_weight",0.6);
            config.put("ipa_image_path",ref_image);
            try{
                createResponse = api.aigcImagesCreate("", template_image, "", config);
            }catch (ApiException e){
                System.out.println();
                System.out.println(e.getResponseBody());
            }
            System.out.println(createResponse);
            // ID permintaan.
            String request_id = createResponse.getRequestId();
            // Status permintaan.
            String code = createResponse.getCode();
            // Detail status permintaan.
            String message = createResponse.getMessage();
            // Konten respons.
            AIGCImageCreateData data = createResponse.getData();
    
            if (!code.equals("OK")){
                System.out.printf("aigc_images_create failed, model_id is %s, request_id is %s\n",model_id,request_id);
            }else {
                String imgStr = createResponse.getData().getImage();
                byte[] image = base64ToBytes(imgStr);
    
                OutputStream out = new FileOutputStream(output_image);
    
                out.write(image);
                out.flush();
                out.close();
    
            }
            return true;
        }
    
        @Test
        public void aigcEndtoEndCreate() throws Exception {
    
            String template_image = "https://demo.jpg";
            String ref_image = "https://reference.jpg";
          
            Create(template_image,"ref_out.jpg", ref_image);
    
    
        }
    }
    

  • Buat potret AI dengan menghasilkan gambar templat dari prompt dan satu gambar referensi (tanpa gambar templat).

    package com.aliyun.aiservice.demo;
    
    import com.aliyun.openservices.aiservice.ApiClient;
    import com.aliyun.openservices.aiservice.ApiException;
    import com.aliyun.openservices.aiservice.api.AiServiceJobApi;
    import com.aliyun.openservices.aiservice.api.AigcImagesApi;
    import com.aliyun.openservices.aiservice.model.*;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import org.junit.Ignore;
    import org.junit.Test;
    import sun.misc.BASE64Decoder;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.*;
    
    public class PhotoPtomptCreateTest {
    
        public String host = 'HOST';
      	public String appId = 'YOUR-APPID';
      	public String token = 'YOUR-TOKEN';
      
        public ApiClient apiClient = new ApiClient(host, appId, token);
        public AigcImagesApi api = new AigcImagesApi(apiClient);
        public AiServiceJobApi jobApi = new AiServiceJobApi(apiClient);
    
        public byte[] base64ToBytes(String imgStr) throws IOException {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] imgBtyes = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < imgBtyes.length; ++i) {
                // Sesuaikan data abnormal.
                if (imgBtyes[i] < 0) {
                    imgBtyes[i] += 256;
                }
            }
    
            return imgBtyes;
        }
    
        public boolean Check(List<String> images) throws ApiException {
            AIGCImageCheckResponse response = this.api.aigcImagesCheck(images);
            // ID permintaan.
            String request_id = response.getRequestId();
            // Status permintaan.
            String code = response.getCode();
            // Detail status permintaan.
            String message = response.getMessage();
            // Konten respons.
            AIGCImageCheckData data = response.getData();
    
            // Cetak hasil yang dikembalikan.
            boolean is_ok = false;
            if (!code.equals("OK")){
                System.out.printf("aigc_images_check failed,request id is %\n", request_id);
            }else{
                is_ok = true;
                System.out.printf("check images done, input %d images, return %d images, %d filtered by lvwang\n",
                        images.size(),(data.getCheckResults().size()),(images.size()-data.getCheckResults().size()));
                for (int check_result_idx=0; check_result_idx < data.getCheckResults().size();check_result_idx++ ){
                    AIGCImageCheckResult checkResult = data.getCheckResults().get(check_result_idx);
                    Integer checkResultCode = checkResult.getCode();
                    if (checkResultCode.equals(1)){
                        System.out.printf("check %s success\n", checkResult.getUrl());
                    }else {
                        is_ok = false;
                        System.out.printf("check %s failed, message is %s , request_id is %s\n",
                                checkResult.getUrl(),checkResult.getMessage(),request_id);
                    }
                }
            }
            return is_ok;
        }
    
        public Object[] Train(List<String> images, String model_name, Map<String, Object> config) throws ApiException {
            Integer job_id = -1;
            String model_id = "";
    
            AIGCImageTrainResponse response = this.api.aigcImagesTrain(images,model_name,config);
            // ID permintaan.
            String request_id = response.getRequestId();
            // Status permintaan.
            String code = response.getCode();
            // Detail status permintaan.
            String message = response.getMessage();
            // Konten respons.
            InlineResponse200Data Data = response.getData();
    
            // Cetak hasil yang dikembalikan.
            if (!code.equals("OK")){
                System.out.printf("aigc_images_train failed, request id is %s\n", request_id);
    
            }else{
                job_id = response.getData().getJobId();
                model_id = response.getData().getModelId();
    
                System.out.printf("train job_id is %d, model id %s\n",job_id.intValue(),model_id);
    
            }
            Integer state = -1;
            while(true){
                AsyncJobResponse jobResponse = this.jobApi.getAsyncJob(job_id);
                String job_code = jobResponse.getCode();
                String job_message = jobResponse.getMessage();
                Map<String, AsyncJobData> job_data = jobResponse.getData();
    
                if (!job_code.equals("OK")){
                    System.out.printf("get_async_job failed, request id is %s, message is %s\n",
                            request_id, job_message);
                    job_id = new Integer(-1);
                    model_id = "";
    
                }else{
                    state = job_data.get("job").getState();
                    if (state.equals(2)){
                        System.out.printf("model %s trained successfully\n",model_id);
                        break;
                    }else if(!state.equals(3)){
                        System.out.printf("training model %s\n",model_id);
    
                        try {
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                    }else{
                        System.out.printf("model %s trained failed, message: %s\n",model_id,job_message);
                        break;
                    }
                }
    
            }
    
            if (!state.equals(2)){
                model_id = "";
            }
    
            Object[] out = new Object[2];
            out[0] = job_id;
            out[1] = model_id;
    
            return out;
    
        }
    
        public String[] QueryValidImageUrlsByJob(Integer job_id) throws ApiException {
            String[] image_urls = null;
    
            AsyncJobResponse jobResponse = this.jobApi.getAsyncJob(job_id);
            String request_id = jobResponse.getRequestId();
            String job_code = jobResponse.getCode();
            String job_message = jobResponse.getMessage();
            Map<String, AsyncJobData> job_data = jobResponse.getData();
    
            if (!job_code.equals("OK")) {
                System.out.printf("get_async_job failed, request id is %s, message is %s\n",
                        request_id, job_message);
            }else {
                Integer state = job_data.get("job").getState();
                if (state == 2){
                    System.out.printf("Job %s trained successfully\n", job_id);
                    String Result_string = (String) job_data.get("job").getResult();
                    JsonObject jsonObject = new JsonParser().parse(Result_string).getAsJsonObject();
                    JsonArray result_states = jsonObject.get("states").getAsJsonArray();
                    image_urls = new String[result_states.size()];
                    for (int result_idx=0; result_idx < result_states.size(); result_idx++){
                        JsonObject result_one = result_states.get(result_idx).getAsJsonObject();
                        String result_url = result_one.get("url").getAsString();
                        image_urls[result_idx] = result_url;
                    }
    
                }else{
                    System.out.printf("job %s not ready\n",job_id);
                }
            }
    
            return image_urls;
        }
    
        public boolean Create(String model_id, String t2i_prompt, String template_image) throws IOException {
            System.out.println("Create");
            AIGCImageCreateResponse createResponse = null;
            HashMap<String,Object> config = new HashMap<String, Object>();
            config.put("t2i_prompt", t2i_prompt);
            try{
                createResponse = api.aigcImagesCreate(model_id, template_image, "", config);
            }catch (ApiException e){
                System.out.println();
                System.out.println(e.getResponseBody());
            }
            System.out.println(createResponse);
            // ID permintaan.
            String request_id = createResponse.getRequestId();
            // Status permintaan.
            String code = createResponse.getCode();
            // Detail status permintaan.
            String message = createResponse.getMessage();
            // Konten respons.
            AIGCImageCreateData data = createResponse.getData();
    
            if (!code.equals("OK")){
                System.out.printf("aigc_images_create failed, model_id is %s, request_id is %s\n",model_id,request_id);
            }else {
                String imgStr = createResponse.getData().getImage();
                byte[] image = base64ToBytes(imgStr);
    
                OutputStream out = new FileOutputStream("prompt_out.jpg");
    
                out.write(image);
                out.flush();
                out.close();
    
            }
            return true;
        }
    
    
    
        @Test
        public void aigcEndtoEndCreate() throws Exception {
    
    
            List<String> images =Arrays.asList(
          			"https://xxx/0.jpg",
          			"https://xxx/1.jpg",
          			"https://xxx/2.jpg"
        		);
    
            String template_image = "https://demo.jpg";
    
            String model_name = "";
            Map<String, Object> config = new HashMap<String, Object>();
    
            Object[] train_out = Train(images, model_name, config);
    
            Integer job_id= (Integer) train_out[0];
            String model_id =  (String) train_out[1];
    
            String t2i_prompt = "(portrait:1.5), 1girl, bokeh, bouquet, brown_hair, cloud, flower, hairband, hydrangea, lips, long_hair, outdoors, sunlight, white_flower, white_rose, green sweater, sweater, (cloth:1.0), (best quality), (realistic, photo-realistic:1.3), film photography, minor acne, (portrait:1.1), (indirect lighting), extremely detailed CG unity 8k wallpaper, enormous filesize, best quality, realistic, photo-realistic, ultra high res, raw photo, put on makeup";
            Create(model_id, t2i_prompt, template_image);
    
        }
    
    }
    

  • Buat potret AI dengan menghasilkan gambar templat dari prompt dan satu gambar referensi (tanpa gambar templat atau pelatihan model).

    package com.aliyun.aiservice.demo;
    
    import com.aliyun.openservices.aiservice.ApiClient;
    import com.aliyun.openservices.aiservice.ApiException;
    import com.aliyun.openservices.aiservice.api.AiServiceJobApi;
    import com.aliyun.openservices.aiservice.api.AigcImagesApi;
    import com.aliyun.openservices.aiservice.model.*;
    import com.google.gson.JsonArray;
    import com.google.gson.JsonObject;
    import com.google.gson.JsonParser;
    import org.junit.Ignore;
    import org.junit.Test;
    import sun.misc.BASE64Decoder;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.*;
    
    public class PhotoPtomptCreateTest {
    
        public String host = 'HOST';
      	public String appId = 'YOUR-APPID';
      	public String token = 'YOUR-TOKEN';
      
        public ApiClient apiClient = new ApiClient(host, appId, token);
        public AigcImagesApi api = new AigcImagesApi(apiClient);
        public AiServiceJobApi jobApi = new AiServiceJobApi(apiClient);
    
        public byte[] base64ToBytes(String imgStr) throws IOException {
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] imgBtyes = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < imgBtyes.length; ++i) {
                // Sesuaikan data abnormal.
                if (imgBtyes[i] < 0) {
                    imgBtyes[i] += 256;
                }
            }
    
            return imgBtyes;
        }
    
        public boolean Check(List<String> images) throws ApiException {
            AIGCImageCheckResponse response = this.api.aigcImagesCheck(images);
            // ID permintaan.
            String request_id = response.getRequestId();
            // Status permintaan.
            String code = response.getCode();
            // Detail status permintaan.
            String message = response.getMessage();
            // Konten respons.
            AIGCImageCheckData data = response.getData();
    
            // Cetak hasil yang dikembalikan.
            boolean is_ok = false;
            if (!code.equals("OK")){
                System.out.printf("aigc_images_check failed,request id is %\n", request_id);
            }else{
                is_ok = true;
                System.out.printf("check images done, input %d images, return %d images, %d filtered by lvwang\n",
                        images.size(),(data.getCheckResults().size()),(images.size()-data.getCheckResults().size()));
                for (int check_result_idx=0; check_result_idx < data.getCheckResults().size();check_result_idx++ ){
                    AIGCImageCheckResult checkResult = data.getCheckResults().get(check_result_idx);
                    Integer checkResultCode = checkResult.getCode();
                    if (checkResultCode.equals(1)){
                        System.out.printf("check %s success\n", checkResult.getUrl());
                    }else {
                        is_ok = false;
                        System.out.printf("check %s failed, message is %s , request_id is %s\n",
                                checkResult.getUrl(),checkResult.getMessage(),request_id);
                    }
                }
            }
            return is_ok;
        }
    
        public Object[] Train(List<String> images, String model_name, Map<String, Object> config) throws ApiException {
            Integer job_id = -1;
            String model_id = "";
    
            AIGCImageTrainResponse response = this.api.aigcImagesTrain(images,model_name,config);
            // ID permintaan.
            String request_id = response.getRequestId();
            // Status permintaan.
            String code = response.getCode();
            // Detail status permintaan.
            String message = response.getMessage();
            // Konten respons.
            InlineResponse200Data Data = response.getData();
    
            // Cetak hasil yang dikembalikan.
            if (!code.equals("OK")){
                System.out.printf("aigc_images_train failed, request id is %s\n", request_id);
    
            }else{
                job_id = response.getData().getJobId();
                model_id = response.getData().getModelId();
    
                System.out.printf("train job_id is %d, model id %s\n",job_id.intValue(),model_id);
    
            }
            Integer state = -1;
            while(true){
                AsyncJobResponse jobResponse = this.jobApi.getAsyncJob(job_id);
                String job_code = jobResponse.getCode();
                String job_message = jobResponse.getMessage();
                Map<String, AsyncJobData> job_data = jobResponse.getData();
    
                if (!job_code.equals("OK")){
                    System.out.printf("get_async_job failed, request id is %s, message is %s\n",
                            request_id, job_message);
                    job_id = new Integer(-1);
                    model_id = "";
    
                }else{
                    state = job_data.get("job").getState();
                    if (state.equals(2)){
                        System.out.printf("model %s trained successfully\n",model_id);
                        break;
                    }else if(!state.equals(3)){
                        System.out.printf("training model %s\n",model_id);
    
                        try {
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                    }else{
                        System.out.printf("model %s trained failed, message: %s\n",model_id,job_message);
                        break;
                    }
                }
    
            }
    
            if (!state.equals(2)){
                model_id = "";
            }
    
            Object[] out = new Object[2];
            out[0] = job_id;
            out[1] = model_id;
    
            return out;
    
        }
    
        public String[] QueryValidImageUrlsByJob(Integer job_id) throws ApiException {
            String[] image_urls = null;
    
            AsyncJobResponse jobResponse = this.jobApi.getAsyncJob(job_id);
            String request_id = jobResponse.getRequestId();
            String job_code = jobResponse.getCode();
            String job_message = jobResponse.getMessage();
            Map<String, AsyncJobData> job_data = jobResponse.getData();
    
            if (!job_code.equals("OK")) {
                System.out.printf("get_async_job failed, request id is %s, message is %s\n",
                        request_id, job_message);
            }else {
                Integer state = job_data.get("job").getState();
                if (state == 2){
                    System.out.printf("Job %s trained successfully\n", job_id);
                    String Result_string = (String) job_data.get("job").getResult();
                    JsonObject jsonObject = new JsonParser().parse(Result_string).getAsJsonObject();
                    JsonArray result_states = jsonObject.get("states").getAsJsonArray();
                    image_urls = new String[result_states.size()];
                    for (int result_idx=0; result_idx < result_states.size(); result_idx++){
                        JsonObject result_one = result_states.get(result_idx).getAsJsonObject();
                        String result_url = result_one.get("url").getAsString();
                        image_urls[result_idx] = result_url;
                    }
    
                }else{
                    System.out.printf("job %s not ready\n",job_id);
                }
            }
    
            return image_urls;
        }
    
        public boolean Create(String t2i_prompt, String template_image, String ref_image) throws IOException {
            System.out.println("Create");
            AIGCImageCreateResponse createResponse = null;
            HashMap<String,Object> config = new HashMap<String, Object>();
    
            config.put("t2i_prompt", t2i_prompt);
            config.put("ipa_control_only", true);
            config.put("ipa_weight", 0.6);
            config.put("ipa_image_path", ref_image);
    
            try{
                createResponse = api.aigcImagesCreate("", template_image, "", config);
            }catch (ApiException e){
                System.out.println();
                System.out.println(e.getResponseBody());
            }
            System.out.println(createResponse);
            // ID permintaan.
            String request_id = createResponse.getRequestId();
            // Status permintaan.
            String code = createResponse.getCode();
            // Detail status permintaan.
            String message = createResponse.getMessage();
            // Konten respons.
            AIGCImageCreateData data = createResponse.getData();
    
            if (!code.equals("OK")){
                System.out.printf("aigc_images_create failed, request_id is %s\n",request_id);
            }else {
                String imgStr = createResponse.getData().getImage();
                byte[] image = base64ToBytes(imgStr);
    
                OutputStream out = new FileOutputStream("ref_prompt_out.jpg");
    
                out.write(image);
                out.flush();
                out.close();
    
            }
            return true;
        }
    
    
    
        @Test
        public void aigcEndtoEndCreate() throws Exception {
    
            String template_image = "https://demo.jpg";
            String ref_image = "https://reference.jpg";
    
    
            String t2i_prompt = "(portrait:1.5), 1girl, bokeh, bouquet, brown_hair, cloud, flower, hairband, hydrangea, lips, long_hair, outdoors, sunlight, white_flower, white_rose, green sweater, sweater, (cloth:1.0), (best quality), (realistic, photo-realistic:1.3), film photography, minor acne, (portrait:1.1), (indirect lighting), extremely detailed CG unity 8k wallpaper, enormous filesize, best quality, realistic, photo-realistic, ultra high res, raw photo, put on makeup";
            Create(t2i_prompt, template_image, ref_image);
    
        }
    
    }