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
-
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>
-
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.
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.
InlineResponse200Data
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.
-
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`.
-
-
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); } }