全部產品
Search
文件中心

Platform For AI:寫真相機方案

更新時間:Jan 27, 2026

寫真相機方案實現了自動化訓練使用者專屬的LoRA模型,並利用LoRA模型和模板圖片產生使用者個人化的寫真照片。模型線上服務(EAS)是PAI提供的模型服務平台。該方案定義了一套演算法流程,可以部署為EAS模型線上服務,並提供了相關的調用介面,用於實現AI寫真。本文為您介紹如何部署相關的EAS模型線上服務並調用介面實現AI寫真。

背景資訊

EAS相關功能說明

EAS是PAI提供的模型服務平台,在寫真相機方案中,使用的核心功能包括:

  • 通過自訂鏡像部署模型服務(包括核驗服務訓練服務預測服務),基於PAI的寫真相機演算法流程提供了映像核驗、LoRA訓練和映像產生三個API介面服務,同時支援要求的負載平衡和GPU執行個體的自動擴縮容。

  • 該功能支援非同步隊列操作,可以查詢和操作隊列消費狀態,並且可以設定隊列優先順序。詳情請參見非同步推理服務

  • 提供了Python和Java的SDK,支援透傳業務定義的自訂參數。詳情請參見服務調用SDK

寫真相機演算法流程介紹

  1. 映像核驗

    初步檢測圖片品質是否符合要求。

  2. LoRA訓練

    首先對映像進行預先處理和品質檢測,隨後利用LoRA進行自動化訓練和評估,最終產生最佳化後的模型。

  3. 映像產生

    1. 映像預先處理。

    2. 初次產生映像。

    3. 二次產生映像。

前提條件

  • 已建立專用網路,並配置公網串連。

    1. 已建立Virtual Private Cloud、交換器和安全性群組。具體操作,請參見搭建IPv4專用網路建立安全性群組

    2. 已為該VPC建立了公網NAT Gateway,並為該網關綁定了Elastic IP Address、配置了SNAT條目。具體操作,請參見使用公網NAT GatewaySNAT功能訪問互連網

  • 已開通PAI-EAS並建立預設工作空間,詳情請參見開通並建立預設工作空間

  • 如果使用RAM使用者來部署模型,需要為RAM使用者授予PAI-EAS的系統管理權限,詳情請參見雲產品依賴與授權:EAS

  • 已準備好5~20張訓練圖片和1張模板圖片,用於模型訓練和寫真製作。圖片格式支援.jpg.jpeg.png等,請確保圖片的尺寸大於512×512像素。

    • 單人寫真製作:模板圖片中包含單張人臉,多張訓練圖片中的人臉屬於同一個人。

    • 多人寫真製作:模板圖片中需包含多張人臉,且人臉數量與模型訓練的model_id數量一致。

使用限制

僅支援在華北2(北京)和新加坡地區使用該方案。

部署PAI-EAS模型服務

部署核驗服務

  1. 登入PAI控制台,在頁面上方選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS

  2. 推理服务頁簽,單擊部署服务,然後在自定义模型部署地區,單擊自定义部署

  3. 自定义部署頁面,配置以下關鍵參數。

    • 基本信息地區中,參考介面提示,自訂服務名稱。例如photog_check。

    • 环境信息地區中,配置以下參數:

      參數

      描述

      部署方式

      選擇镜像部署,並選中异步队列

      镜像配置

      選中镜像地址,並在文字框中輸入鏡像地址,取值如下:

      • 華北2(北京)的鏡像地址為:registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:check.1.0.0.pub

      • 新加坡的鏡像地址為:registry.ap-southeast-1.aliyuncs.com/mybigpai/photog_pub:check.1.0.0.pub

      存储挂载

      進行代碼配置,支援以下掛載方式:

      • OSS

        • Uri:選擇您自己的OSS Bucket路徑。例如oss://examplebucket/

        • 挂载路径:配置為/photog_oss

      • NAS

        • 选择文件系统:選擇NAS檔案系統。

        • 文件系统挂载点:選擇NAS掛載點。

        • 文件系统路径:配置為需要掛載的NAS中的源路徑,例如/

        • 挂载路径:配置為/photog_oss

      运行命令

      配置為python app.py

      端口号

      配置為7860。

    • 资源信息地區中,配置以下參數:

      參數

      描述

      资源类型

      選擇公共资源

      部署资源

      資源規格選擇GPU類型的GU30系列機型,推薦使用ml.gu7i.c32m188.1-gu30

      配置系统盘

      配置為120 GiB。

    • 在非同步退欄區域,配置以下參數:

      參數

      描述

      资源类型

      選擇公共资源组

      部署资源

      配置以下參數:

      • 最小執行個體數:1

      • CPU:8核

      • 記憶體:64 GB

      单一输入请求最大数据

      配置為20480 KB,避免隊列中每個請求的儲存空間不足。

      单一输出返回最大数据

    • 网络信息地區,選擇已建立的VPC、交換器和安全性群組。

    • 服务配置地區中,單擊编辑按鈕,並添加以下配置,您可以參考下方的完整配置樣本,來添加新增的參數。

      欄位

      新增的參數

      metadata

      增加以下參數:

      "rpc": {
                  "keepalive": 3600000,
                  "worker_threads": 1
              }
      • keepalive:單個請求的最長處理時間,單位為毫秒,配置為3600000。

      • worker_threads:EAS每個執行個體中用於並發處理請求的線程數。

        預設為5,表示最先進入隊列的前五個任務會被分配到同一個執行個體上。建議將該參數設定為1,這樣可以確保請求按順序排隊處理。

      queue

      增加參數"max_delivery": 1,防止失敗後多次重複投遞。

      完整的配置樣本如下:

      {
          "metadata": {
              "name": "photog_check",
              "instance": 1,
              "rpc": {
                  "keepalive": 3600000,
                  "worker_threads": 1
              },
              "type": "Async"
          },
          "cloud": {
              "computing": {
                  "instance_type": "ml.gu7i.c32m188.1-gu30",
                  "instances": null
              },
              "networking": {
                  "vswitch_id": "vsw-2ze4o9kww55051tf2****",
                  "security_group_id": "sg-2ze0kgiee55d0fn4****",
                  "vpc_id": "vpc-2ze5hl4ozjl4fo7q3****"
              }
          },
          "features": {
              "eas.aliyun.com/extra-ephemeral-storage": "100Gi"
          },
          "queue": {
              "cpu": 8,
              "max_delivery": 1,
              "min_replica": 1,
              "memory": 64000,
              "resource": "",
              "source": {
                  "max_payload_size_kb": 20480
              },
              "sink": {
                  "max_payload_size_kb": 20480
              }
          },
          "storage": [
              {
                  "oss": {
                      "path": "oss://examplebucket/",
                      "readOnly": false
                  },
                  "properties": {
                      "resource_type": "code"
                  },
                  "mount_path": "/photog_oss"
              }
          ],
          "containers": [
              {
                  "image": "registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:check.1.0.0.pub",
                  "script": "python app.py",
                  "port": 7860
              }
          ]
      }
  4. 單擊部署

    服务状态运行中時,服務部署成功。

部署訓練服務

  1. 登入PAI控制台,在頁面上方選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS

  2. 推理服务頁簽,單擊部署服务,然後在自定义模型部署地區,單擊自定义部署

  3. 自定义部署頁面,配置以下關鍵參數。

    • 基本信息地區中,參考介面提示,自訂服務名稱。例如:photog_train_pmml

    • 环境信息地區中,配置以下參數:

      參數

      描述

      部署方式

      選擇镜像部署,並選中异步队列

      镜像配置

      選中镜像地址,並在文字框中輸入鏡像地址,取值如下:

      • 華北2(北京)的鏡像地址為:registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:train.1.0.0.pub

      • 新加坡的鏡像地址為:registry.ap-southeast-1.aliyuncs.com/mybigpai/photog_pub:train.1.0.0.pub

      存储挂载

      進行代碼配置,支援以下掛載方式:

      • OSS

        • Uri:選擇您自己的OSS Bucket路徑,與核驗服務選擇的OSS路徑保持一致。例如oss://examplebucket/

        • 挂载路径:配置為/photog_oss

      • NAS

        • 选择文件系统:選擇NAS檔案系統。

        • 文件系统挂载点:選擇NAS掛載點。

        • 文件系统路径:配置為需要掛載的NAS中的源路徑,例如/

        • 挂载路径:配置為/photog_oss

      运行命令

      配置為python app.py

      端口号

      配置為7860。

    • 资源信息地區中,配置以下參數:

      參數

      描述

      资源类型

      選擇公共资源

      部署资源

      資源規格選擇GPU類型的GU30系列機型,推薦使用ml.gu7i.c32m188.1-gu30

      配置系统盘

      配置為120 GiB。

    • 异步队列地區中,配置以下參數:

      參數

      描述

      资源类型

      選擇公共资源

      部署资源

      配置以下參數:

      • 最小執行個體數:1

      • CPU:8核

      • 記憶體:64 GB

      单一输入请求最大数据

      配置為20480 KB,避免隊列中每個請求的儲存空間不足。

      单一输出返回最大数据

    • 网络信息地區中,選擇已建立的VPC、交換器和安全性群組。

    • 服务配置地區中,單擊编辑按鈕,並添加以下配置,您可以參考下方的完整配置樣本,來添加新增的參數。

      欄位

      新增的參數

      autoscaler

      (可選)水平自動擴縮容配置,詳情請參見水平自動擴縮容

      "behavior": {
        "scaleDown": {
          "stabilizationWindowSeconds": 60
        }
      },
      "max": 5,
      "min": 1,
      "strategies": {
                  "queue[backlog]": 1
      }

      metadata

      增加以下參數:

      "rpc": {
                  "keepalive": 3600000,
                  "worker_threads": 1
              }
      • keepalive:單個請求的最長處理時間,單位為毫秒,配置為3600000。

      • worker_threads:EAS每個執行個體中用於並發處理請求的線程數。

        預設為5,表示最先進入隊列的前五個任務會被分配到同一個執行個體上。建議將該參數設定為1,這樣可以確保請求按順序排隊處理。

      queue

      增加參數"max_delivery": 1,防止失敗後多次重複投遞。

      完整的配置樣本如下:

      {
          "autoscaler": {
              "behavior": {
                  "scaleDown": {
                      "stabilizationWindowSeconds": 60
                  }
              },
              "max": 5,
              "min": 1,
              "strategies": {
                  "queue[backlog]": 1
              }
          },
          "metadata": {
              "name": "photog_train_pmml",
              "instance": 1,
              "rpc": {
                  "keepalive": 3600000,
                  "worker_threads": 1
              },
              "type": "Async"
          },
          "cloud": {
              "computing": {
                  "instance_type": "ml.gu7i.c32m188.1-gu30",
                  "instances": null
              },
              "networking": {
                  "vswitch_id": "vsw-2ze4o9kww55051tf2****",
                  "security_group_id": "sg-2ze0kgiee55d0fn4****",
                  "vpc_id": "vpc-2ze5hl4ozjl4fo7q3****"
              }
          },
          "features": {
              "eas.aliyun.com/extra-ephemeral-storage": "120Gi"
          },
          "queue": {
              "cpu": 8,
              "max_delivery": 1,
              "min_replica": 1,
              "memory": 64000,
              "resource": "",
              "source": {
                  "max_payload_size_kb": 20480
              },
              "sink": {
                  "max_payload_size_kb": 20480
              }
          },
          "storage": [
              {
                  "oss": {
                      "path": "oss://examplebucket/",
                      "readOnly": false
                  },
                  "properties": {
                      "resource_type": "code"
                  },
                  "mount_path": "/photog_oss"
              }
          ],
          "containers": [
              {
                  "image": "registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:train.1.0.0.pub",
                  "script": "python app.py",
                  "port": 7860
              }
          ]
      }
  4. 單擊部署

    服务状态运行中時,服務部署成功。

部署預測服務

  1. 登入PAI控制台,在頁面上方選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS

  2. 推理服务頁簽,單擊部署服务,然後在自定义模型部署地區,單擊自定义部署

  3. 自定义部署頁面,配置以下關鍵參數。

    • 基本信息地區中,參考介面提示,自訂服務名稱。例如photog_pre_pmml。

    • 环境信息地區中,配置以下參數:

      參數

      描述

      部署方式

      選擇镜像部署,並選中异步队列

      镜像配置

      選中镜像地址,並在文字框中輸入鏡像地址。需要同時配置AI寫真預測服務和WebUI預測服務鏡像地址,在該地區中只需要配置AI寫真預測服務鏡像地址,WebUI預測服務鏡像地址在對應配置編輯地區進行配置。支援配置的鏡像列表如下,本方案選擇華北2(北京)地區的鏡像地址。

      • 華北2(北京)鏡像地址:

        • AI寫真預測服務:registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:infer.1.0.0.pub

        • WebUI預測服務:eas-registry-vpc.cn-beijing.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:3.2

      • 新加坡鏡像地址:

        • AI寫真預測服務:registry.ap-southeast-1.aliyuncs.com/mybigpai/photog_pub:infer.1.0.0.pub

        • WebUI預測服務:eas-registry-vpc.ap-southeast-1.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:3.2

      存储挂载

      進行代碼配置。支援以下掛載方式,本方案選擇OSS掛載。

      • OSS

        • Uri:選擇您自己的OSS Bucket路徑,與核驗服務選擇的OSS路徑保持一致。例如oss://examplebucket/

        • 挂载路径:配置為/photog_oss

      • NAS

        • 选择文件系统:選擇NAS檔案系統。

        • 文件系统挂载点:選擇NAS掛載點。

        • 文件系统路径:配置為需要掛載的NAS中的源路徑,例如/

        • 挂载路径:配置為/photog_oss

      您需要下載並解壓WebUI所需的模型檔案,並將其按照下圖布局方式存放到您的OSS Bucket路徑oss://examplebucket/photog_oss/webui或NAS路徑/photog_oss/webui中。關於如何將檔案上傳到OSS Bucket路徑,詳情請參見命令列工具ossutil 1.0。關於如何將檔案上傳到NAS路徑,詳情請參見快速入門(Linux)使用Workbench管理ECS上的檔案image.png

      环境变量

      單擊添加,配置以下兩個環境變數:

      • 變數名:URL;變數值:http://127.0.0.1:8000

      • 變數名:AUTHORIZATION;變數值:=

      运行命令

      配置為python app.py

      端口号

      配置為7860。

    • 资源信息地區中,配置以下參數:

      參數

      描述

      资源类型

      選擇公共资源

      部署资源

      資源規格選擇GPU類型的GU30系列機型,推薦使用ml.gu7i.c32m188.1-gu30

      配置系统盘

      配置為120 GiB。

    • 异步队列地區中,配置以下參數:

      參數

      描述

      资源类型

      選擇公共资源

      部署资源

      配置以下參數:

      • 最小執行個體數:1。

      • CPU:8核。

      • 記憶體:64GB。

      单一输入请求最大数据

      配置為20480 KB。避免隊列中每個請求的儲存空間不足。

      单一输出返回最大数据

    • 网络信息地區中,選擇已建立的VPC、交換器和安全性群組。

    • 服务配置地區中,添加以下配置,您可以參考下方的完整配置樣本,來添加新增的參數。

      欄位

      新增的參數

      metadata

      增加以下參數:

      "rpc": {
                  "keepalive": 3600000,
                  "worker_threads": 1
              }
      • keepalive:單個請求的最長處理時間,單位為毫秒,配置為3600000。

      • worker_threads:EAS每個執行個體中用於並發處理請求的線程數。

        預設為5,表示最先進入隊列的前五個任務會被分配到同一個執行個體上。建議將該參數設定為1,這樣可以確保請求按順序排隊處理。

      containers

      增加以下參數:

      {
                  "image": "eas-registry-vpc.cn-beijing.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:3.2",
                  "port": 8000,
                  "script": "./webui.sh --listen --port 8000 --skip-version-check --no-hashing --no-download-sd-model --skip-install --api --filebrowser --sd-dynamic-cache --data-dir /photog_oss/photog/webui/"
              }

      分別表示WebUI預測服務鏡像以及對應的運行命令和連接埠號碼。

      queue

      增加參數"max_delivery": 1,防止失敗後多次重複投遞。

      完整的配置樣本如下:

      {
          "metadata": {
              "name": "photog_pre_pmml",
              "instance": 1,
              "rpc": {
                  "keepalive": 3600000,
                  "worker_threads": 1
              },
              "type": "Async"
          },
          "cloud": {
              "computing": {
                  "instance_type": "ecs.gn6v-c8g1.2xlarge",
                  "instances": null
              },
              "networking": {
                  "vswitch_id": "vsw-2ze4o9kww55051tf2****",
                  "security_group_id": "sg-2ze0kgiee55d0fn4****",
                  "vpc_id": "vpc-2ze5hl4ozjl4fo7q3****"
              }
          },
          "features": {
              "eas.aliyun.com/extra-ephemeral-storage": "120Gi"
          },
          "queue": {
              "cpu": 8,
              "max_delivery": 1,
              "min_replica": 1,
              "memory": 64000,
              "resource": "",
              "source": {
                  "max_payload_size_kb": 20480
              },
              "sink": {
                  "max_payload_size_kb": 20480
              }
          },
          "storage": [
              {
                  "oss": {
                      "path": "oss://examplebucket/",
                      "readOnly": false
                  },
                  "properties": {
                      "resource_type": "code"
                  },
                  "mount_path": "/photog_oss"
              }
          ],
          "containers": [
              {
                  "image": "registry.cn-beijing.aliyuncs.com/mybigpai/photog_pub:infer.1.0.0.pub",
                  "env": [
                      {
                          "name": "URL",
                          "value": "http://127.0.0.1:8000"
                      },
                      {
                          "name": "AUTHORIZATION",
                          "value": "="
                      }
                  ],
                  "script": "python app.py",
                  "port": 7861
              },
              {
                  "image": "eas-registry-vpc.cn-beijing.cr.aliyuncs.com/pai-eas/stable-diffusion-webui:3.2",
                  "port": 8000,
                  "script": "./webui.sh --listen --port 8000 --skip-version-check --no-hashing --no-download-sd-model --skip-install --api --filebrowser --sd-dynamic-cache --data-dir /photog_oss/photog/webui/"
              }
          ]
      }
  4. 單擊部署

    服务状态运行中時,服務部署成功。

調用介面

步驟一:調用映像核驗介面

  1. 首先您需要在模型在线服务(EAS)頁面,單擊核驗服務名稱進入概览頁面,在基本信息地區單擊查看调用信息,在异步调用頁簽,擷取服務訪問地址和Token。image

  2. 使用如下代碼建立輸入隊列進行圖片核驗,並擷取隊列資訊。

    調用樣本如下:

    Python SDK

    import json
    from eas_prediction import QueueClient
    
    # 建立輸入隊列對象,用於寫入輸入資料。
    input_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_check')
    input_queue.set_token('<token>')
    input_queue.init()
    
    datas = json.dumps(
        {
           'request_id'    : 12345,
           'images'        : ["xx.jpg", "xx.jpg"], # urls, a list
           'configure'     : {
                'face_reconize' : True, # Judge whether all pictures are of a person
            }
        }
    )
    
    index, request_id = input_queue.put(f'{datas}')
    print(index, request_id)
    
    # 查看輸入隊列的詳情。
    attrs = input_queue.attributes()
    print(attrs)

    其中關鍵配置說明如下:

    關鍵配置

    描述

    預設值

    是否必填

    input_queue

    配置為已擷取的核驗服務的訪問地址,請參考上述程式碼範例進行配置,STRING類型。

    <token>

    替換為已擷取的核驗服務的Token,STRING類型。

    request_id

    請求ID,STRING類型。

    images

    配置為模型訓練使用圖片的URL地址,LIST類型。

    configure

    face_reconize

    判斷多張圖片中的人臉是否為同一個人,BOOL類型。

    False

    Java SDK

    import com.aliyun.openservices.eas.predict.http.HttpConfig;
    import com.aliyun.openservices.eas.predict.http.QueueClient;
    import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
    import org.apache.commons.lang3.tuple.Pair;
    
    public class AsyncTest {
        public static void main(String[] args) throws Exception {
            /** 建立佇列服務用戶端 */
            String queueEndpoint = "182848887922****.cn-shanghai.pai-eas.aliyuncs.com";
            String inputQueueName = "photog_check";
            String queueToken = "YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==";
    
            QueueClient inputQueue =
                new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
    
            /** 請求資料 */
            String data = "{\n" +
                "    'request_id': 12345,\n" +
                "    'images'    : [\"xx.jpg\", \"xx.jpg\"],\n" +
                "    'configure' : {\n" +
                "        'face_reconize' : True,\n" +
                "    }\n" +
                "}";
            Pair<Long, String> entry = inputQueue.put(data.getBytes(), null);
            System.out.println(String.format("index = %s, request id = %s", entry.getKey(), entry.getValue()));
    
            // 查看輸入隊列的詳情
            System.out.println(inputQueue.attributes());
    
            /** 關閉用戶端 */
            inputQueue.shutdown();
        }
    }

    其中:

    關鍵配置

    描述

    預設值

    是否必填

    queueEndpoint

    配置為已擷取的核驗服務的訪問地址,STRING類型。

    inputQueueName

    配置為核驗服務的名稱,STRING類型。

    queueToken

    替換為已擷取的核驗服務的Token,STRING類型。

    request_id

    請求ID,STRING類型。

    images

    配置為模型訓練使用圖片的URL地址,LIST類型。

    configure

    face_reconize

    判斷多張圖片中的人臉是否為同一個人,BOOL類型。

    False

    系統返回結果如下:

    Python SDK

    1 6bdea119-01f3-4728-b3d3-b0af366ad3eb
    {'consumers.list.[0]': 'Id: photog_check.photog-check-738569a9-798897bdf5-76****, Index: 0, Pending: 0, Status: Running, Idle: 1h10m4.997s, Window: 1, Slots: 1, AutoCommit: false', 'consumers.stats.total': '1', 'consumers.status.total': '1', 'groups.list.[0]': 'Id: photog_check, Index: 1, Pending: 1, Delivered: 2, Consumers: 1', 'meta.header.group': 'X-EAS-QueueService-Gid', 'meta.header.priority': 'X-EAS-QueueService-Priority', 'meta.header.user': 'X-EAS-QueueService-Uid', 'meta.name': 'photog-check-queue-95e006df', 'meta.state': 'Normal', 'stream.approxMaxLength': '1439', 'stream.firstEntry': '1', 'stream.lastEntry': '1', 'stream.length': '1', 'stream.maxPayloadBytes': '20971520'}

    Java SDK

    index = 2, request id = 61132b43-a527-40dc-89bb-a9a48316ddea
    {"meta.header.priority":"X-EAS-QueueService-Priority","consumers.status.total":"1","stream.firstEntry":"2","stream.maxPayloadBytes":"20971520","consumers.stats.total":"1","stream.approxMaxLength":"1439","stream.length":"1","groups.list.[0]":"Id: photog_check, Index: 2, Pending: 1, Delivered: 3, Consumers: 1","meta.header.group":"X-EAS-QueueService-Gid","stream.lastEntry":"2","consumers.list.[0]":"Id: photog_check.photog-check-738569a9-798897bdf5-76j48, Index: 2, Pending: 0, Status: Running, Idle: 19m11.174s, Window: 1, Slots: 1, AutoCommit: false","meta.name":"photog-check-queue-95e006df","meta.state":"Normal","meta.header.user":"X-EAS-QueueService-Uid"}
    
    Process finished with exit code 0

    其中:

    • index:表示該請求是EAS中的第幾個請求。

    • request_id:表示該請求的ID,後續使用該ID擷取輸出結果。

    • 其他內容表示輸入隊列詳情。

  3. 使用如下代碼建立輸出隊列並擷取返回結果,通過返回結果來確認圖片是否符合要求。

    調用樣本如下:

    Python SDK

    # 建立輸出隊列對象,用於訂閱讀取輸出結果資料。
    sink_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_check/sink')
    sink_queue.set_token('<token>')
    sink_queue.init()
    
    sink_queue.get(request_id, auto_delete=True)[0].data.decode('utf-8')

    其中:

    • sink_queue:配置為已擷取的核驗服務的訪問地址。

    • <token>:替換為已擷取的核驗服務的Token。

    • auto_delete:預設為True。如果在查詢隊列時直接使用request_id,但沒有設定auto_delete參數,那麼將會刪除該隊列的結果。由於輸出隊列通常需要刪除隊列內容,建議將auto_delete參數設定為True。

    Java SDK

    import com.aliyun.openservices.eas.predict.http.HttpConfig;
    import com.aliyun.openservices.eas.predict.http.QueueClient;
    import com.aliyun.openservices.eas.predict.queue_client.DataFrame;
    import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
    import org.apache.commons.lang3.tuple.Pair;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class AsyncPhotoTest {
        public static void main(String[] args) throws Exception {
            /** 建立佇列服務用戶端 */
            String queueEndpoint = "166233998075****.cn-beijing.pai-eas.aliyuncs.com";
            String inputQueueName = "photog_check";
            String sinkQueueName = String.format("%s/sink", inputQueueName);
            String queueToken = "YjczMzFlYmRkMDU4YmZmMGQ4NTEwODA4NDk3NmFhODE5N2ExMzEy****";
    
            QueueClient inputQueue =
                new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
            QueueClient sinkQueue =
                new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
    
            /** 請求資料 */
            String data = "{\n" +
                "  \"request_id\": 12345,\n" +
                "  \"images\": [\"xx.jpg\", \"xx.jpg\"],\n" +
                "  \"configure\": {\n" +
                "    \"face_reconize\": true\n" +
                "  }\n" +
                "}";
            Pair<Long, String> entry = inputQueue.put(data.getBytes(), null);
            Long index = entry.getKey();
            final String requestId = entry.getValue();
            System.out.println(String.format("index = %d, request id = %s", index, requestId));
    
            // 查看輸入隊列的詳情
            System.out.println(inputQueue.attributes());
    
            // 查看輸入資料
            Map<String, String> tags =
                new HashMap<String, String>() {
                    {
                        put("requestId", requestId);
                    }
                };
            DataFrame[] dfs = inputQueue.get(0, 1L, 0, false, tags);
            if (dfs.length > 0) {
                System.out.println(String.format("Successfully get input data = %s, index = %d, tags = %s", new String(dfs[0].getData()), dfs[0].getIndex(), dfs[0].getTags()));
            } else {
                System.out.println("no data");
            }
    
            // 查看輸出資料
            while (true) {
                dfs = sinkQueue.get(0, 1L, 0, true, tags);
                if (dfs.length > 0) {
                    System.out.println(String.format("Successfully get sink data = %s, tags = %s", new String(dfs[0].getData()), dfs[0].getTags()));
                    break;
                } else {
                    System.out.println("no data");
                    Thread.sleep(5000);
                }
            }
    
            /** 關閉用戶端 */
            inputQueue.shutdown();
            sinkQueue.shutdown();
        }
    }

    其中:

    • queueEndpoint:配置為已擷取的核驗服務訪問地址。

    • inputQueueName:配置為核驗服務的名稱。

    • queueToken:替換為已擷取的核驗服務的Token。

    • image:配置為模型訓練使用的圖片的URL地址。

    系統返回如下結果:

    Python SDK

    '{"request_id": "12345", "code": "OK", "message": "success", "data": {"request_id": 12345, "images": ["xx.jpg", "https://xxx.oss-cn-beijing.aliyuncs.com/photog/user_images/foto/train/0.jpg"], "configure": {"face_reconize": true}, "cost_time": 9.820043325424194, "check_results": [{"url": "https://xx-cn-beijing.aliyuncs.com/photog/user_images/foto/train/1.jpg", "message": "success", "code": 1, "frontal": true}, {"url": "https://xx-cn-beijing.aliyuncs.com/photog/user_images/foto/train/0.jpg", "message": "success", "code": 1, "frontal": false}]}}'

    Java SDK

    Successfully get sink data = {"request_id": "12345", "code": "OK", "message": "success", "data": {"request_id": 12345, "images": ["xx.jpg", "xx.jpg"], "configure": {"face_reconize": true}, "cost_time": 0.2047882080078125, "check_results": [{"url": "https://xx-cn-beijing.aliyuncs.com/photog/user_images/foto/train/1.jpg", "message": "success", "code": 1, "frontal": true}, {"url": "https://xx-cn-beijing.aliyuncs.com/photog/user_images/foto/train/0.jpg", "message": "success", "code": 1, "frontal": false}]}}

    參數說明如下:

    參數

    描述

    request_id

    請求ID,STRING類型。

    code

    請求狀態代碼,STRING類型:

    • OK:表示已完成核驗。

    • error:表示未完成核驗。

    message

    請求狀態的詳細資料。如果返回結果為success表示執行成功,對於其他返回結果,請根據具體的返回內容來確定。

    data

    返回內容詳情,內部欄位說明如下:

    • check_results:表示輸入的每張圖片的檢測結果。

      • url:圖片的URL地址。

      • message:圖片檢測詳情。success表示核驗成功。更多關於message返回結果的可能取值和對應的code,請參見message詳情

      • frontal:圖片是否為正面。

    • cost_time:本次API調用花費的服務端計算時間長度。

    • images:核驗的圖片URL列表,List類型。

    • request_id:請求流水號,STRING類型。

    message詳情

    message可能值

    code

    描述

    success

    1

    表示符合要求。

    Image decode error

    2

    無法下載或解碼映像。

    Number of face is not 1

    3

    人臉數量不為1。

    Image detect error

    4

    臉部偵測異常。

    Image encoding error

    5

    將人臉編碼為特徵向量時出錯,表示無法檢測到人臉。

    This photo is not the same person in photos

    6

    如果只出現了這個錯誤,表示多張圖片中的人臉不屬於同一個人。

步驟二:調用LoRA訓練介面

  1. 首先您需要在模型在线服务(EAS)頁面,單擊訓練服務名稱進入概览頁面,在基本信息地區單擊查看调用信息,在异步调用頁簽,擷取服務訪問地址和Token。image

  2. 使用如下代碼建立輸入隊列進行Lora訓練並擷取隊列資訊。

    調用樣本如下:

    Python SDK

    photog_train_pmmln import json
    from eas_prediction import QueueClient
    
    # 建立輸入隊列對象,用於寫入輸入資料。
    input_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_train_pmml')
    input_queue.set_token('<token>')
    input_queue.init()
    
    datas = json.dumps(
        {
            'request_id'    : 12345,
            'images'        : ["xx.jpg", "xx.jpg"], # urls
            'configure'     : {
                'user_id'   : "zhoumo", # user id
            }
        }
    )
    
    index, request_id = input_queue.put(f'{datas}')
    print(index, request_id)
    
    # 查看輸入隊列的詳情。
    attrs = input_queue.attributes()
    print(attrs)

    其中關鍵配置說明如下:

    關鍵配置

    描述

    預設值

    是否必填

    input_queue

    配置為已擷取的訓練服務的訪問地址,請參考上述程式碼範例進行配置,STRING類型。

    <token>

    替換為已擷取訓練服務的Token,STRING類型。

    request_id

    請求ID。STRING類型。

    images

    配置為訓練圖片的URL地址,LIST類型。

    configure

    user_id

    使用者的ID,STRING類型。

    sex

    訓練圖片中人物的性別。

    secret

    max_train_steps

    總訓練步數。

    400

    val_save_checkpointing_steps

    訓練的驗證步數。

    50

    Java SDK

    import com.aliyun.openservices.eas.predict.http.HttpConfig;
    import com.aliyun.openservices.eas.predict.http.QueueClient;
    import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
    import org.apache.commons.lang3.tuple.Pair;
    
    public class AsyncTest {
        public static void main(String[] args) throws Exception {
            /** 建立佇列服務用戶端 */
            String queueEndpoint = "182848887922****.cn-shanghai.pai-eas.aliyuncs.com";
            String inputQueueName = "photog_train_pmml";
            String queueToken = "YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MT****==";
    
            QueueClient inputQueue =
                new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
    
            /** 請求資料 */
            String data = "{\n" +
                "        'request_id'    : 12345,\n" +
                "        'images'        : [\"xx.jpg\", \"xx.jpg\"],\n" +
                "        'configure'     : {\n" +
                "            'user_id'   : \"zhoumo\",\n" +
                "        }\n" +
                "    }";
            Pair<Long, String> entry = inputQueue.put(data.getBytes(), null);
            System.out.println(String.format("index = %s, request id = %s", entry.getKey(), entry.getValue()));
    
            // 查看輸入隊列的詳情
            System.out.println(inputQueue.attributes());
    
            /** 關閉用戶端 */
            inputQueue.shutdown();
        }
    }

    其中關鍵配置說明如下:

    關鍵配置

    描述

    預設值

    是否必填

    queueEndpoint

    配置為已擷取的訓練服務的訪問地址,STRING類型。

    inputQueueName

    配置為訓練服務的名稱,STRING類型。

    queueToken

    替換為已擷取訓練服務的Token,STRING類型。

    request_id

    請求ID。STRING類型。

    images

    配置為訓練圖片的URL地址,LIST類型。

    configure

    user_id

    使用者的ID,STRING類型。

    sex

    訓練圖片中人物的性別。

    secret

    max_train_steps

    總訓練步數。

    400

    val_save_checkpointing_steps

    訓練的驗證步數。

    50

    系統返回如下結果:

    Python SDK

    2 bb4ce34d-47e4-425d-bee7-b806e29c6d78
    {'consumers.list.[0]': 'Id: photog_train_pmml.photog-train-pmml-78550f91-7545766654-jpdtp, Index: 2, Pending: 0, Status: Running, Idle: 18h46m24.039s, Window: 1, Slots: 1, AutoCommit: false', 'consumers.stats.total': '1', 'consumers.status.total': '1', 'groups.list.[0]': 'Id: photog_train_pmmln, Index: 2, Pending: 1, Delivered: 3, Consumers: 1', 'meta.header.group': 'X-EAS-QueueService-Gid', 'meta.header.priority': 'X-EAS-QueueService-Priority', 'meta.header.user': 'X-EAS-QueueService-Uid', 'meta.name': 'photog-train-pmmln-queue-7a5e7cc6', 'meta.state': 'Normal', 'stream.approxMaxLength': '1438', 'stream.firstEntry': '2', 'stream.lastEntry': '2', 'stream.length': '1', 'stream.maxPayloadBytes': '20971520'}

    Java SDK

    index = 3, request id = ec3b7c21-c395-4490-ae42-8f66d06e9d4d
    {"meta.header.priority":"X-EAS-QueueService-Priority","consumers.status.total":"1","stream.firstEntry":"3","stream.maxPayloadBytes":"20971520","consumers.stats.total":"1","stream.approxMaxLength":"1438","stream.length":"1","groups.list.[0]":"Id: photog_train_pmml, Index: 3, Pending: 1, Delivered: 4, Consumers: 1","meta.header.group":"X-EAS-QueueService-Gid","stream.lastEntry":"3","consumers.list.[0]":"Id: photog_train_pmmln.photog-train-pmmln-78550f91-7545766654-jpdtp, Index: 3, Pending: 0, Status: Running, Idle: 2h30m57.08s, Window: 1, Slots: 1, AutoCommit: false","meta.name":"photog-train-pmmln-queue-7a5e7cc6","meta.state":"Normal","meta.header.user":"X-EAS-QueueService-Uid"}
    
    Process finished with exit code 0

    其中:

    • index:表示該請求是EAS中的第幾個請求。

    • request_id:表示該請求的ID,後續使用該ID擷取輸出結果。

    • 其他內容表示擷取的隊列資訊。

  3. 使用以下代碼,建立輸出隊列並訂閱讀取輸出結果資料,以判斷模型訓練是否成功。

    調用樣本如下:

    Python SDK

    # 建立輸出隊列對象,用於訂閱讀取輸出結果資料。
    sink_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_train_pmml/sink')
    sink_queue.set_token('<token>')
    sink_queue.init()
    
    sink_queue.get(request_id, auto_delete=True)[0].data.decode('utf-8')

    其中:

    • sink_queue:配置為已擷取的訓練服務訪問地址。

    • <token>:替換為已擷取訓練服務的Token。

    Java SDK

    import com.aliyun.openservices.eas.predict.http.HttpConfig;
    import com.aliyun.openservices.eas.predict.http.QueueClient;
    import com.aliyun.openservices.eas.predict.queue_client.DataFrame;
    import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
    import org.apache.commons.lang3.tuple.Pair;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class AsyncPhotoTest {
        public static void main(String[] args) throws Exception {
            /** 建立佇列服務用戶端 */
            String queueEndpoint = "166233998075****.cn-beijing.pai-eas.aliyuncs.com";
            String inputQueueName = "photog_train_pmml";
            String sinkQueueName = String.format("%s/sink", inputQueueName);
            String queueToken = "N2E2YWI0Y2MyNjZmNjdlMWFmZjNhOTM5M2E5ZGNlMGY1NDQwZGYw****";
    
            QueueClient inputQueue =
                    new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
            QueueClient sinkQueue =
                    new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
    
            /** 請求資料 */
            String data = "{\n" +
                    "  \"request_id\": 12345,\n" +
                    "  \"images\": [\"xx.jpg\", \"xx.jpg\"],\n" +
                    "  \"configure\": {\n" +
                    "    \"user_id\": \"zhoumo\"\n" +
                    "  }\n" +
                    "}";
            Pair<Long, String> entry = inputQueue.put(data.getBytes(), null);
            Long index = entry.getKey();
            final String requestId = entry.getValue();
            System.out.println(String.format("index = %d, request id = %s", index, requestId));
    
            // 查看輸入隊列的詳情
            System.out.println(inputQueue.attributes());
    
            // 查看輸入資料
            Map<String, String> tags =
                    new HashMap<String, String>() {
                        {
                            put("requestId", requestId);
                        }
                    };
            DataFrame[] dfs = inputQueue.get(0, 1L, 0, false, tags);
            if (dfs.length > 0) {
                System.out.println(String.format("Successfully get data = %s, index = %d, tags = %s", new String(dfs[0].getData()), dfs[0].getIndex(), dfs[0].getTags()));
            } else {
                System.out.println("no data");
            }
    
            // 查看輸出資料
            while (true) {
                dfs = sinkQueue.get(0, 1L, 0, true, tags);
                if (dfs.length > 0) {
                    System.out.println(String.format("Successfully get data = %s, tags = %s", new String(dfs[0].getData()), dfs[0].getTags()));
                    break;
                } else {
                    System.out.println("no data");
                }
            }
    
            /** 關閉用戶端 */
            inputQueue.shutdown();
            sinkQueue.shutdown();
        }
    }

    其中:

    • queueEndpoint:配置為已擷取的訓練服務的訪問地址。

    • inputQueueName:配置為訓練服務的名稱。

    • queueToken:替換為已擷取的訓練服務的Token。

    • images:配置為模型訓練使用圖片的URL地址。

    系統返回結果如下:

    Python SDK

    '{"request_id": "12345", "code": "OK", "message": "success", "data": {"user_id": "zhoumo", "cost_time": 272.7406361103058}}'
    說明

    當返回結果中的code為502時,表示訓練進行中中。

    Java SDK

    ...
    no data
    no data
    Successfully get data = {"request_id": "12345", "code": "OK", "message": "success", "data": {"user_id": "zhoumo", "cost_time": 260.7540729045868}}
    說明

    當返回結果中顯示no data時,表示訓練進行中中。

    參數說明如下:

    參數

    描述

    request_id

    請求ID,STRING類型。

    code

    是否已完成訓練:

    • OK:表示已完成訓練。

    • error:表示未完成訓練。

    message

    返回的運行情況詳細資料。success表示模型訓練成功。

    data

    返回內容詳情,內部欄位說明如下:

    • user_id:使用者ID。

    • cost_time:本次API調用花費的服務端計算時間長度。

步驟三:調用映像產生介面

  1. 首先您需要在模型在线服务(EAS)頁面,單擊預測服務名稱進入概览頁面,在基本信息地區單擊查看调用信息,在异步调用頁簽,擷取服務訪問地址和Token。image

  2. 使用如下代碼建立輸入隊列進行圖片預測,並擷取隊列資訊。

    調用樣本如下:

    Python SDK

    import json
    from eas_prediction import QueueClient
    
    # 建立輸入隊列對象,用於寫入輸入資料。
    input_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_pre_pmml')
    input_queue.set_token('<token>')
    input_queue.init()
    
    datas = json.dumps({
        'request_id'    : 12345, 
        'template_image': "xx.jpg", 
        'configure'     : { 
            'user_id'   : "zhoumo", # threshold to get tags.
        } 
    })
    
    index, request_id = input_queue.put(f'{datas}')
    print(index, request_id)
    
    # 查看輸入隊列的詳情。
    attrs = input_queue.attributes()
    print(attrs)
    
    # 利用request_id查詢某個特定的請求
    print(input_queue.get(request_id, auto_delete=False)[0].data.decode('utf-8'))

    其中關鍵配置說明如下:

    關鍵配置

    描述

    預設值

    是否必填

    input_queue

    配置為已擷取的預測服務的訪問地址,請參考上述程式碼範例進行配置,STRING類型。

    <token>

    替換為已擷取預測服務的Token,STRING類型。

    request_id

    請求ID。STRING類型。

    template_image

    配置為模型訓練使用的圖片的URL地址。

    configure

    user_id

    使用者的ID,STRING類型。

    sex

    訓練圖片中人物的性別,STRING類型。

    secret

    first_diffusion_steps

    第一次diffusion的步數,INT類型。

    50

    first_denoising_strength

    第一次diffusion的強度,FLOAT類型。

    0.45

    second_diffusion_steps

    第二次diffusion的步數,INT類型。

    20

    second_denoising_strength

    第二次diffusion的強度,FLOAT類型。

    0.30

    more_like_me_before

    第一次人臉融合比例,值越大越像,FLOAT類型。

    0.50

    more_like_me

    第二次人臉融合比例,值越大越像,FLOAT類型。

    0.50

    mask_region

    STRING類型,取值如下:

    • edge:表示第二次diffusion只對邊緣重建。

    • face:表示代表第二次diffusion對整個臉部重建。

    edge

    crop_face_preprocess

    是否在裁剪人像地區後進行重建。BOOL類型。

    True

    apply_face_fusion_before

    是否進行第一次臉部融合,BOOL類型。

    True

    apply_face_fusion_after

    是否進行第二次臉部融合,BOOL類型。

    True

    color_shift_middle

    是否進行第一次臉部色彩平衡,BOOL類型。

    True

    color_shift_last

    是否進行第二次臉部色彩平衡,BOOL類型。

    True

    background_restore

    是否對背景進行重建,BOOL類型。

    False

    skin_retouching_bool

    是否進行皮膚平滑,BOOL類型。

    True

    photo_enhancement_bool

    是否進行人像增強,BOOL類型。

    True

    photo_enhancement_method

    人像增強方式,取值如下:

    • photo_fix

    • super_resolution

    photo_fix

    makeup_transfer

    是否進行妝容遷移,BOOL類型。

    False

    makeup_transfer_ratio

    妝容遷移比例,FLOAT類型。

    0.50

    Java SDK

    import com.aliyun.openservices.eas.predict.http.HttpConfig;
    import com.aliyun.openservices.eas.predict.http.QueueClient;
    import com.aliyun.openservices.eas.predict.queue_client.DataFrame;
    import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
    import org.apache.commons.lang3.tuple.Pair;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class AsyncTest {
        public static void main(String[] args) throws Exception {
            /** 建立佇列服務用戶端 */
            String queueEndpoint = "166233998075****.cn-beijing.pai-eas.aliyuncs.com";
            String inputQueueName = "photog_pre_pmml";
            String queueToken = "NjViMTI2NGQxZWQxYTI1NGE5MGQ1YTQ5Y2Y2MGZjY2VlZTVmNWE1****";
    
            QueueClient inputQueue =
                    new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
    
            /** 請求資料 */
            String data = "{\n" +
                    "    'request_id'    : 12345, \n" +
                    "    'template_image': \"xx.jpg\", \n" +
                    "    'configure'     : { \n" +
                    "        'user_id'   : \"zhoumo\",\n" +
                    "    } \n" +
                    "}";
            Pair<Long, String> entry = inputQueue.put(data.getBytes(), null);
            System.out.println(String.format("index = %s, request id = %s", entry.getKey(), entry.getValue()));
    
            // 查看輸入隊列的詳情
            System.out.println(inputQueue.attributes());
    
            // 利用request_id查詢某個特定的請求
            final String requestId = entry.getValue();
            Map<String, String> tags =
                    new HashMap<String, String>() {
                        {
                            put("requestId", requestId);
                        }
                    };
            DataFrame df = inputQueue.get(0, 1L, 0, false, tags)[0];
            System.out.println(String.format("Successfully get data = %s, tags = %s", new String(df.getData()), df.getTags()));
    
            /** 關閉用戶端 */
            inputQueue.shutdown();
        }
    }

    其中關鍵配置說明如下:

    關鍵配置

    描述

    預設值

    是否必填

    queueEndpoint

    配置為已擷取的預測服務的訪問地址,STRING類型。

    inputQueueName

    配置為預測服務的名稱。

    queueToken

    替換為已擷取預測服務的Token,STRING類型。

    request_id

    請求ID。STRING類型。

    template_image

    配置為模型訓練使用的圖片的URL地址。

    configure

    user_id

    使用者的ID,STRING類型。

    sex

    訓練圖片中人物的性別,STRING類型。

    secret

    first_diffusion_steps

    第一次diffusion的步數,INT類型。

    50

    first_denoising_strength

    第一次diffusion的強度,FLOAT類型。

    0.45

    second_diffusion_steps

    第二次diffusion的步數,INT類型。

    20

    second_denoising_strength

    第二次diffusion的強度,FLOAT類型。

    0.30

    more_like_me_before

    第一次人臉融合比例,值越大越像,FLOAT類型。

    0.50

    more_like_me

    第二次人臉融合比例,值越大越像,FLOAT類型。

    0.50

    mask_region

    STRING類型,取值如下:

    • edge:表示第二次diffusion只對邊緣重建。

    • face:表示代表第二次diffusion對整個臉部重建。

    edge

    crop_face_preprocess

    是否在裁剪人像地區後進行重建,並開啟大圖功能。BOOL類型。

    True

    apply_face_fusion_before

    是否進行第一次臉部融合,BOOL類型。

    True

    apply_face_fusion_after

    是否進行第二次臉部融合,BOOL類型。

    True

    color_shift_middle

    是否進行第一次臉部色彩平衡,BOOL類型。

    True

    color_shift_last

    是否進行第二次臉部色彩平衡,BOOL類型。

    True

    background_restore

    是否對背景進行重建,BOOL類型。

    False

    skin_retouching_bool

    是否進行皮膚平滑,BOOL類型。

    True

    photo_enhancement_bool

    是否進行人像增強,BOOL類型。

    True

    photo_enhancement_method

    人像增強方式,取值如下:

    • photo_fix

    • super_resolution

    photo_fix

    makeup_transfer

    是否進行妝容遷移,BOOL類型。

    False

    makeup_transfer_ratio

    妝容遷移比例,FLOAT類型。

    0.50

    系統返回如下結果:

    Python SDK

    1 069173d0-dce9-4ed6-913e-cc5fdda38764
    {'consumers.list.[0]': 'Id: photog_pre_pmml.photog-pre-pmml-835253f3-686f87d4f-d****, Index: 0, Pending: 0, Status: Running, Idle: 21h41m4.995s, Window: 1, Slots: 1, AutoCommit: false', 'consumers.stats.total': '1', 'consumers.status.total': '1', 'groups.list.[0]': 'Id: photog_pre_pmml, Index: 1, Pending: 1, Delivered: 2, Consumers: 1', 'meta.header.group': 'X-EAS-QueueService-Gid', 'meta.header.priority': 'X-EAS-QueueService-Priority', 'meta.header.user': 'X-EAS-QueueService-Uid', 'meta.name': 'photog-pre-pmml-queue-912f2cdb', 'meta.state': 'Normal', 'stream.approxMaxLength': '1439', 'stream.firstEntry': '1', 'stream.lastEntry': '1', 'stream.length': '1', 'stream.maxPayloadBytes': '20971520'}
    {"request_id": 12345, "template_image": "https://xx.oss-cn-beijing.aliyuncs.com/photog/user_images/foto/train/1.jpg", "configure": {"user_id": "zhoumo"}}

    Java SDK

    index = 4, request id = 996cb029-133e-4f18-bb03-e696fc6ae4a1
    {"meta.header.priority":"X-EAS-QueueService-Priority","consumers.status.total":"1","stream.firstEntry":"4","stream.maxPayloadBytes":"20971520","consumers.stats.total":"1","stream.approxMaxLength":"1436","stream.length":"1","groups.list.[0]":"Id: photog_pre_pmml, Index: 4, Pending: 1, Delivered: 5, Consumers: 1","meta.header.group":"X-EAS-QueueService-Gid","stream.lastEntry":"4","consumers.list.[0]":"Id: photog_pre_pmml.photog-pre-pmml-835253f3-686f87d4f-d****, Index: 4, Pending: 0, Status: Running, Idle: 2m12.017s, Window: 1, Slots: 1, AutoCommit: false","meta.name":"photog-pre-pmml-queue-912f2cdb","meta.state":"Normal","meta.header.user":"X-EAS-QueueService-Uid"}
    Successfully get data = {
        'request_id'    : 12345, 
        'template_image': "https://xx.oss-cn-beijing.aliyuncs.com/photog/user_images/foto/train/1.jpg", 
        'configure'     : { 
            'user_id'   : "zhoumo",
        } 
    }, tags = {requestId=996cb029-133e-4f18-bb03-e696fc6ae4a1, ts@source=169778191****}
    
    Process finished with exit code 0

    其中:

    • index:表示該請求是EAS中的第幾個請求。

    • request_id:表示該請求的ID,後續使用該ID擷取輸出結果。

    • 其他內容表示擷取的隊列資訊。

  3. 使用以下代碼,建立輸出隊列並擷取返回結果。在返回結果中,您可以查看擷取到的Base64編碼圖片。

    調用樣本如下:

    Python SDK

    # 建立輸出隊列對象,用於訂閱讀取輸出結果資料。
    sink_queue = QueueClient('182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'photog_pre_pmml/sink')
    sink_queue.set_token('<token>')
    sink_queue.init()
    
    sink_queue.get(request_id, auto_delete=True)[0].data.decode('utf-8')

    其中:

    • sink_queue:配置為已擷取的預測服務的訪問地址。

    • <token>:替換為已擷取的預測服務的Token。

    Java SDK

    import com.aliyun.openservices.eas.predict.http.HttpConfig;
    import com.aliyun.openservices.eas.predict.http.QueueClient;
    import com.aliyun.openservices.eas.predict.queue_client.DataFrame;
    import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
    import org.apache.commons.lang3.tuple.Pair;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class AsyncPhotoTest {
        public static void main(String[] args) throws Exception {
            /** 建立佇列服務用戶端 */
            String queueEndpoint = "166233998075****.cn-beijing.pai-eas.aliyuncs.com";
            String inputQueueName = "photog_pre_pmml";
            String sinkQueueName = String.format("%s/sink", inputQueueName);
            String queueToken = "NjViMTI2NGQxZWQxYTI1NGE5MGQ1YTQ5Y2Y2MGZjY2VlZTVmNWE1****";
    
            QueueClient inputQueue =
                    new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
            QueueClient sinkQueue =
                    new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
    
            /** 請求資料 */
            String data = "{\n" +
                    "  \"request_id\": 12345,\n" +
                    "  \"template_image\": \"xx.jpg\",\n" +
                    "  \"configure\": {\n" +
                    "    \"user_id\": \"zhoumo\"\n" +
                    "  }\n" +
                    "}";
            Pair<Long, String> entry = inputQueue.put(data.getBytes(), null);
            Long index = entry.getKey();
            final String requestId = entry.getValue();
            System.out.println(String.format("index = %d, request id = %s", index, requestId));
    
            // 查看輸入隊列的詳情
            System.out.println(inputQueue.attributes());
    
            // 查看輸入資料
            Map<String, String> tags =
                    new HashMap<String, String>() {
                        {
                            put("requestId", requestId);
                        }
                    };
            DataFrame[] dfs = inputQueue.get(0, 1L, 0, false, tags);
            if (dfs.length > 0) {
                System.out.println(String.format("Successfully get data = %s, index = %d, tags = %s", new String(dfs[0].getData()), dfs[0].getIndex(), dfs[0].getTags()));
            } else {
                System.out.println("no data");
            }
    
            // 查看輸出資料
            while (true) {
                dfs = sinkQueue.get(0, 1L, 0, true, tags);
                if (dfs.length > 0) {
                    System.out.println(String.format("Successfully get data = %s, tags = %s", new String(dfs[0].getData()), dfs[0].getTags()));
                    break;
                } else {
                    System.out.println("no data");
                }
            }
    
            /** 關閉用戶端 */
            inputQueue.shutdown();
            sinkQueue.shutdown();
        }
    }

    其中:

    • queueEndpoint:配置為已擷取的預測服務的訪問地址。

    • inputQueueName:配置為預測服務的名稱。

    • queueToken:替換為已擷取的預測服務的Token。

    • template_image:配置為圖片的URL地址。

    系統返回如下結果:

    Python SDK

    '{"request_id": "12345", "code": "OK", "message": "success", "data": {"user_id": "zhoumo", "image": "iVBORw*****CYII=", "cost_time": 329.69798278808594}}'
    說明

    當返回結果中的code為502時,表示正在產生圖片。

    Java SDK

    ...
    no data
    no data
    Successfully get data = {"request_id": "12345", "code": "OK", "message": "success", "data": {"user_id": "zhoumo", "image": "iVBORw0KGgoAAA****ABJRU5ErkJggg==", "cost_time": 21.584840059280396}}
    說明

    當返回結果中顯示no data時,表示正在產生圖片。

    參數說明如下:

    參數

    描述

    request_id

    請求ID,STRING類型。

    code

    請求狀態代碼:

    • OK:表示請求成功。

    • error:表示請求失敗。

    message

    請求狀態的詳細資料。如果返回結果為success表示執行成功,對於其他返回結果,請根據具體的返回內容來確定。

    data

    返回內容詳情。內部欄位說明如下:

    • user_id:使用者ID。

    • image:產生的Base64編碼圖片。

    • cost_time:消耗的時間,FLOAT類型。