使用Python SDK調用AI寫真的演算法服務介面進行模型訓練和寫真製作。通過SDK,您可以定製LoRA模型,並根據模板製作寫真。本文為您介紹使用Python SDK調用介面之前的準備工作以及使用樣本。
前提條件
已準備好Python環境,環境依賴Python 3.4及其以上版本。
已準備好5~20張訓練圖片和1張模板圖片,用於模型訓練和寫真製作。圖片格式支援.jpg、.jpeg和.png等,請確保圖片的尺寸大於512×512像素。
單人寫真製作:模板圖片中包含單張人臉,多張訓練圖片中的人臉屬於同一個人。
多人寫真製作:模板圖片中需包含多張人臉,且人臉數量與模型訓練的model_id數量一致。
準備工作
安裝Python SDK,命令如下:
wget https://ai-service-data.oss-cn-beijing.aliyuncs.com/python-sdk/ai_service_python_sdk-1.1.3-py3-none-any.whl pip install ai_service_python_sdk-1.1.3-py3-none-any.whl初始化Client。
使用以下命令,進行環境初始化:
from ai_service_python_sdk.client.api_client import ApiClient client = ApiClient('<HOST>', '<YOUR-APPID>', '<YOUR-TOKEN>')您需要根據實際情況,替換以下參數值。
參數
描述
<HOST>
服務端地址:
http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com。<YOUR-APPID>
開通AI寫真後,您可以直接在AI寫真頁面查看AppId。
<YOUR-TOKEN>
開通AI寫真後,您可以直接在AI寫真頁面查看Token。
調用程式碼範例
AI寫真是一個資源消耗量較大的服務,主要包括模型訓練和寫真製作兩個環節。模型訓練通常需要幾分鐘的回應時間,而寫真製作則只需要數十秒即可完成。AI寫真的介面調用流程圖如下:
各個介面的請求、響應程式碼範例和端到端的請求程式碼範例如下:
核驗請求(aigc_images_check)
請求程式碼範例如下:
from ai_service_python_sdk.client.api_client import ApiClient from ai_service_python_sdk.client.api.ai_service_aigc_images_api import AIGCImagesApi host = 'http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com' appId = 'YOUR-APPID' token = 'YOUR-TOKEN' client = ApiClient(host, appId, token) api = AIGCImagesApi(client) # noqa: E501 # 輸入訓練的圖片,以URL形式存在。 images = [ 'https://xxx/0.jpg', 'https://xxx/1.jpg' ] response = api.aigc_images_check(images, <model_name>, <configure>) # 請求流水號。 request_id = response.request_id # 請求狀態。 code = response.code # 請求狀態具體資訊。 message = response.message # 請求返回內容。 data = response.data # 列印返回結果。 print(response)參數說明如下:
參數
描述
appId
配置為在AI寫真頁面查到的AppId。
token
配置為在AI寫真頁面查到的Token。
images
配置為圖片URL地址,多個URL地址使用半形逗號(,)分隔。
response
請分別為該參數配置下列輸入值:
<model_name>:模型名稱,預設輸入Null 字元串,例如
''。<configure>:模型返回配置,預設為None,例如:
None。目前沒有額外的配置。
響應結果樣本如下:
{ "request_id":"07988c97-caa4-4512-a2b2-e9173c1a03c6", "code":"OK", "message":"success", "data":{ "check_results":[ { "code":1, "frontal":true, "message":"success", "url":"https://xxx/0.jpg" },{ "code":1, "frontal":false, "message":"success", "url":"https://xxx/1.jpg" } ], "cost_time":0.47095775604248047, "images":["https://xxx/0.jpg","https://xxx/1.jpg"], "request_id":"07988c97-caa4-4512-a2b2-e9173c1a03c6"}}返回結果中的各欄位說明如下:
欄位
描述
request_id
請求流水號,STRING類型。
code
請求狀態代碼,STRING類型,取值如下:
OK:表示請求成功。
error:表示請求失敗。
message
請求狀態的詳細資料。如果返回結果為success表示執行成功,對於其他返回結果,請根據具體的返回內容來確定。
data
返回內容詳情,JSON Object類型。內部欄位說明如下:
check_results:表示輸入的每張圖片的檢測結果。每張圖片對應一個字典,該字典一共有三個Key,分別為:
url:圖片的URL地址。
message:圖片檢測詳情。可能取值請參見check_results的message欄位的可能取值。
frontal:圖片中的人臉是否為正面。
cost_time:本次API調用花費的服務端計算時間長度。
images:核驗的圖片URL列表,List類型。
request_id:請求流水號,STRING類型。
模型發起訓練(aigc_images_train)
請求程式碼範例如下:
from ai_service_python_sdk.client.api_client import ApiClient from ai_service_python_sdk.client.api.ai_service_aigc_images_api import AIGCImagesApi host = 'http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com' appId = 'YOUR-APPID' token = 'YOUR-TOKEN' client = ApiClient(host, appId, token) api = AIGCImagesApi(client) # noqa: E501 # 輸入訓練的圖片,以URL形式存在。 images = [ 'https://xxx/0.jpg', 'https://xxx/1.jpg', 'https://xxx/2.jpg', 'https://xxx/3.jpg', 'https://xxx/4.jpg', 'https://xxx/5.jpg' ] response = api.aigc_images_train(images, <model_name>, <configure>) # 請求流水號。 request_id = response.request_id # 請求狀態。 code = response.code # 請求狀態具體資訊。 message = response.message # 請求返回內容。 data = response.data # job id job_id = response.data['job_id'] # model_id model_id = response.data['model_id'] # 列印返回結果。 print(response)參數說明如下:
參數
描述
appId
配置為在AI寫真頁面查到的AppId。
token
配置為在AI寫真頁面查到的Token。
images
配置為訓練模型使用的訓練圖片的URL地址,多個URL地址之間使用半形逗號(,)分隔。
response
請分別為該參數配置下列輸入值:
<model_name>:模型名稱,預設輸入Null 字元串,例如
''。<configure>:模型返回配置,預設為None,例如:
None。目前沒有額外的配置。
響應結果樣本如下:
{'code': 'OK', 'data': {'job_id': 11***, 'model_id': 'fa4ba43a-df55-45a4-9c31-bb0dc1e5****'}, 'message': 'success', 'request_id': 'de314ef5-114d-4db1-b54a-332d5300780b'}返回結果中的各欄位說明如下:
欄位
描述
request_id
請求流水號,STRING類型。
code
請求狀態代碼,STRING類型,取值如下:
OK:表示請求成功。
error:表示請求失敗。
message
請求狀態的詳細資料。如果返回結果為success表示執行成功,對於其他返回結果,請根據具體的返回內容來確定。
data
返回內容詳情,JSON Object類型。內部欄位說明如下:
job_id:任務ID,INT類型。
model_id:本次模型訓練的模型ID,是長度為36的字串編碼,STRING類型。
您需要將上述返回結果中的job_id和model_id儲存到本地。 後續,您可以使用job_id查詢訓練結果,使用model_id發起寫真製作服務要求。
訓練結果查詢(get_async_job)
請求程式碼範例如下:
from ai_service_python_sdk.client.api_client import ApiClient from ai_service_python_sdk.client.api.ai_service_job_api import AiServiceJobApi host = 'http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com' appId = 'YOUR-APPID' token = 'YOUR-TOKEN' client = ApiClient(host, appId, token) ai_service_job_api = AiServiceJobApi(client) # 結果查詢。 result = ai_service_job_api.get_async_job(<YOUR-JOB-ID>) # 列印返回結果。 print(result)參數說明如下:
參數
描述
appId
配置為在AI寫真頁面查到的AppId。
token
配置為在AI寫真頁面查到的Token。
result
需要將<YOUR-JOB-ID>替換為模型發起訓練(aigc_images_train)介面返回的job_id。
響應結果樣本如下:
當模型訓練未執行完成時,響應結果如下:
{'code': 'OK', 'data': {'job': {'Result': '', 'app_id': '2******6', 'create_time': '2023-08-22T16:43:35.36+08:00', 'id': 11***, 'message': 'model requesting', 'state': 1, 'type': 'Image'}}, 'message': 'success', 'request_id': '8639143a-e147-4107-8e25-fcdeae24b0c5'}當模型訓練執行完成後,響應結果如下:
{'code': 'OK', 'data': {'job': {'Result': '{"cost_time":1589.0886301994324, "states": [{"code":1,"frontal":false,"message":"success","url":"xxx.jpg"}],"model_id":"fa4ba43a-df55-45a4-9c31-bb0dc1e5****"}', 'app_id': '2******6', 'create_time': '2023-08-22T15:54:41.046+08:00', 'id': 11***, 'message': 'success', 'state': 2, 'type': 'Image'}}, 'message': 'success', 'request_id': '93b77f4b-56cb-4120-b45b-f5c88941bff5'}
返回結果中的各欄位說明如下:
參數
描述
request_id
請求流水號,STRING類型。
code
請求狀態代碼,STRING類型。取值如下:
OK:表示請求成功。
error:表示請求失敗。
message
請求狀態的詳細資料。如果返回結果為success,則表示執行成功,對於其他返回結果,請根據具體的返回內容來確定。
data
返回資料詳情,JSON Object類型。內部欄位說明如下:
訓練錯誤碼說明
請求服務錯誤碼如下:
HTTP狀態代碼
code
message
說明
400
PARAMETER_ERROR
not found appid
appId填寫錯誤。
EXCEEDED_QUOTA_ERROR
exceeded quota
該賬戶的調用次數額度已用完。
401
PARAMETER_ERROR
sign error
token填寫錯誤。
404
PARAMETER_ERROR
model not found
對應的模型服務未部署。
結果查詢錯誤碼如下:
HTTP狀態代碼
code
message
說明
462
error
Invalid input data
輸⼊資料解析錯誤。
Image not provided
未提供訓練圖⽚。
Make dir in oss Error
建立OSS⽂件夾失敗,請檢查是否掛載OSS。
Image process error
映像預先處理出錯。
469
error
Training - Not get best template image
訓練異常退出導致沒有⽣成參考圖⽚。
Training - Not get lora weight
訓練異常退出導致沒有⽣成LoRA的權重。
寫真製作
請求程式碼範例如下:
單人寫真製作請求介面(aigc_images_create)
import base64 import cv2 import numpy as np from ai_service_python_sdk.client.api.ai_service_aigc_images_api import \ AIGCImagesApi # noqa: E501 from ai_service_python_sdk.client.api_client import ApiClient def decode_image_from_base64jpeg(base64_image): image_bytes = base64.b64decode(base64_image) np_arr = np.frombuffer(image_bytes, np.uint8) image = cv2.imdecode(np_arr, cv2.IMREAD_COLOR) return image host = "http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com" appId = 'YOUR-APPID' token = 'YOUR-TOKEN' client = ApiClient(host, appId, token) api = AIGCImagesApi(client) # noqa: E501 response = api.aigc_images_create( '<Your-Model-ID>', '<url>', '<model_name>', <configure> ) # 請求流水號。 request_id = response.request_id # 請求狀態。 code = response.code # 請求狀態具體資訊。 message = response.message # 請求返回內容。 data = response.data print(response) image = data['image'] image = decode_image_from_base64jpeg(image) cv2.imwrite("1.jpg", image) print(data['cost_time'])參數說明如下:
參數
描述
appId
配置為在AI寫真頁面查到的AppId。
token
配置為在AI寫真頁面查到的Token。
response
請分別為該參數配置下列輸入值:
<Your-Model-ID>:替換為模型發起訓練(aigc_images_train)介面返回的model_id。
<url>:替換為模板圖片的URL路徑,該圖片包含單張人臉。例如
https://xxx/single_template.jpg。<model_name>:模型名稱,預設輸入Null 字元串,例如
''。<configure>:模型返回配置,預設為None,例如:
None。內部欄位說明,請參見configure內部欄位說明。
多人寫真製作請求介面(aigc_images_create_by_multi_model_ids)
import base64 import cv2 import numpy as np from ai_service_python_sdk.client.api.ai_service_aigc_images_api import \ AIGCImagesApi # noqa: E501 from ai_service_python_sdk.client.api_client import ApiClient def decode_image_from_base64jpeg(base64_image): image_bytes = base64.b64decode(base64_image) np_arr = np.frombuffer(image_bytes, np.uint8) image = cv2.imdecode(np_arr, cv2.IMREAD_COLOR) return image host = "http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com" appId = 'YOUR-APPID' token = 'YOUR-TOKEN' client = ApiClient(host, appId, token) api = AIGCImagesApi(client) # noqa: E501 response = api.aigc_images_create_by_multi_model_ids( ['<Your-Model-ID1>', '<Your-Model-ID2>'], '<url>', '<model_name>', <configure> ) # 請求流水號。 request_id = response.request_id # 請求狀態。 code = response.code # 請求狀態具體資訊。 message = response.message # 請求返回內容。 data = response.data print(response) image = data['image'] image = decode_image_from_base64jpeg(image) cv2.imwrite("1.jpg", image) print(data['cost_time'])參數說明如下:
參數
描述
appId
配置為在AI寫真頁面查到的AppId。
token
配置為在AI寫真頁面查到的Token。
response
請在該參數中分別配置以下傳入的值:
<Your-Model-ID1>和<Your-Model-ID2>:分別替換為模型發起訓練(aigc_images_train)介面返回的model_id。
<url>:替換為模板圖片的URL路徑,該圖片包含多張人臉,且人臉數量和所給的Model_id一致。例如
http://xxx/multi_template.jpg。<model_name>:模型名稱,預設輸入Null 字元串,例如
''。<configure>:模型返回配置,預設為None,例如:
None。內部欄位說明,請參見configure內部欄位說明。
響應結果樣本如下:
{ 'code': 'OK', 'data': { 'cost_time': 21.705406427383423, 'image': '/9j/4AAQSkZJRgABAQAAAQABAAD/.............2wBDAAgGBgcGBQgHBwcJCQgK', 'model_id': 'fa4ba43a-df55-45a4-9c31-bb0dc1e5****' }, 'message': 'success', 'request_id': 'df5454ca-07ec-4a15-be50-7beaba42f36b' }返回結果中的各欄位說明如下:
欄位
描述
request_id
請求流水號,STRING類型。
code
請求狀態代碼:
OK:表示請求成功。
error:表示請求失敗。
message
請求狀態的詳細資料。如果返回結果為success表示執行成功,對於其他返回結果,請根據具體的返回內容來確定。
data
返回內容詳情,JSON Object類型。內部欄位說明如下:
model_id:使用者的模型ID。
image:產生AI寫真的參考模板圖片,Base64編碼。
cost_time:寫真製作消耗的時間,FLOAT類型。
相關錯誤碼說明
請求服務錯誤碼如下:
HTTP狀態代碼
code
message
說明
400
PARAMETER_ERROR
not found appid
appId填寫錯誤。
EXCEEDED_QUOTA_ERROR
exceeded quota
該賬戶的調用次數額度已用完。
401
PARAMETER_ERROR
sign error
token填寫錯誤。
404
PARAMETER_ERROR
model not found
對應的模型服務未部署。
結果查詢錯誤碼如下:
HTTP狀態代碼
code
message
說明
462
error
Invalid input data. Please check the input dict.
輸⼊資料解析錯誤。
mage not provided. Please check the template_image.
未提供寫真製作的模板圖⽚。
Prompts get error. Please check the model_id.
請檢查提供的model_id格式。
Roop image decord error. Pleace check the user's lora is trained or not.
Roop圖片不存在,請檢查是否已經完成模型訓練。
Template image decord error. Please Give a new template.
模板圖片解碼錯誤,請提供⼀張新的模板圖片。
There is not face in template. Please Give a new template.
模板映像不存在⼈臉,請提供一個新的模板圖片。
Template image process error. Please Give a new template.
模板圖⽚預先處理錯誤,請提供⼀張新的模板圖片。
469
error
First Face Fusion Error, Can't get face in template image.
第⼀次⼈臉融合出錯。
First Stable Diffusion Process error. Check the webui status.
第⼀次Stable Diffusion處理出錯。
Second Face Fusion Error, Can't get face in template image.
第⼆次⼈臉融合出錯。
Second Stable Diffusion Process error. Check the webui status.
第⼆次Stable Diffusion處理出錯。
Please confirm if the number of faces in the template corresponds to the user ID.
請檢查所給的model_id數量與人臉數量是否相符。
Third Stable Diffusion Process error. Check the webui status.
背景處理出錯,請更換模板。
500
error
Face id image decord error. Pleace check the user's lora is trained or not.
使用者上傳的圖片解碼異常,請檢查是否已經完成模型訓練。
端到端流程範例程式碼
端到端流程的程式碼範例如下。當代碼執行成功後,會在目前的目錄產生AI寫真製作圖片。
from ai_service_python_sdk.client.api_client import ApiClient
from ai_service_python_sdk.client.api.ai_service_aigc_images_api import AIGCImagesApi
from ai_service_python_sdk.client.api.ai_service_job_api import AiServiceJobApi
import logging
import sys
import time
import base64
import cv2
import numpy as np
host = "http://ai-service.ce8cc13b6421545749e7b4605f3d02607.cn-hangzhou.alicontainer.com"
appId = 'YOUR-APPID'
token = 'YOUR-TOKEN'
def decode_image_from_base64jpeg(base64_image):
image_bytes = base64.b64decode(base64_image)
np_arr = np.frombuffer(image_bytes, np.uint8)
image = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
return image
def Check(client, images):
# 核驗請求。
response = api.aigc_images_check(images, '', None)
# 請求流水號。
request_id = response.request_id
# 請求狀態。
code = response.code
# 請求狀態具體資訊。
message = response.message
# 請求返回內容。
data = response.data
# 列印返回結果。
if code != "OK":
logging.error(f"aigc_images_check failed,request id is {request_id}")
logging.error(message)
sys.exit(-1)
else:
for check_result in data['check_results']:
if check_result['code'] != 1:
logging.error(f"check {check_result['url']} failed, message is {check_result['message']}")
sys.exit(-1)
logging.info("check images done")
def Train(client, images):
# 訓練請求。
response = api.aigc_images_train(images, '', None)
request_id = response.request_id
code = response.code
message = response.message
data = response.data
# 列印返回結果。
if code != "OK":
logging.error(f"aigc_images_train failed, request id is {request_id}")
logging.error(message)
sys.exit(-1)
else:
# job id
job_id = response.data['job_id']
# model_id
model_id = response.data['model_id']
logging.info(f"train job_id is {job_id}")
logging.info(f"train moded_id is {model_id}")
if isinstance(job_id, int):
while True:
ai_service_job_api = AiServiceJobApi(client)
response = ai_service_job_api.get_async_job(job_id)
request_id = response.request_id
code = response.code
message = response.message
data = response.data
if code != "OK":
logging.error(f"get_async_job failed, request id is {request_id}")
logging.error(message)
sys.exit(-1)
else:
state = data["job"]["state"]
if state == 2:
logging.info(f"model {model_id} trained successfully")
break
elif state != 3:
logging.info(f"training model {model_id}")
time.sleep(10)
else:
logging.error(f"model {model_id} trained failed")
logging.error(f"message: {message}")
break
if state != 2:
sys.exit(-1)
return model_id
def Create(model_id, template_image):
# create image。
response = api.aigc_images_create(model_id, template_image,'', None)
# 請求流水號。
request_id = response.request_id
# 請求狀態。
code = response.code
# 請求狀態具體資訊。
message = response.message
# 請求返回內容。
data = response.data
if code != "OK":
logging.error(f"aigc_images_create failed, model_id is {model_id}")
sys.exit(-1)
else:
image = data['image']
image = decode_image_from_base64jpeg(image)
cv2.imwrite("single_out.jpg", image)
logging.info(f"single create {data['cost_time']}")
def CreateMulti(model_ids, template_image):
response = api.aigc_images_create_by_multi_model_ids(
model_ids,
template_image,
'', None
)
# 請求流水號。
request_id = response.request_id
# 請求狀態。
code = response.code
# 請求狀態具體資訊。
message = response.message
# 請求返回內容。
data = response.data
if code != "OK":
logging.error(f"aigc_images_create_by_multi_model_ids failed, model_id is {model_id}")
sys.exit(-1)
else:
image = data['image']
image = decode_image_from_base64jpeg(image)
cv2.imwrite("multi_out.jpg", image)
logging.info(f"multi create cost time {data['cost_time']}")
if __name__ == "__main__":
client = ApiClient(host, appId, token)
api = AIGCImagesApi(client) # noqa: E501
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# 輸入訓練的圖片,以URL形式存在。
images = [
'https://xxx/0.jpg',
'https://xxx/1.jpg',
'https://xxx/2.jpeg',
'https://xxx/3.jpeg',
]
#check
Check(client, images)
model_id = Train(client, images)
template_image = 'https://xxx/single_template.jpg'
Create(model_id, template_image)
#read the image single_out.jpg
model_ids = [model_id, model_id]
multi_template_image = 'https://xxx/multi_template.jpg'
CreateMulti(model_ids, multi_template_image)
#read the image multi_out.jpg參數說明如下:
參數 | 描述 |
appId | 配置為在AI寫真頁面查到的AppId。 |
token | 配置為在AI寫真頁面查到的Token。 |
images | 配置為訓練模型使用的圖片URL地址,多個URL地址之間使用半形逗號(,)分隔。 |
template_image | 模板圖片的URL地址,包含單張人臉。用於單人寫真製作。 |
multi_template_image | 模板圖片的URL地址,包含多張人臉,且人臉數量和所給的model_id一致。用於多人寫真製作。 |