【AWS re:Invent 2024】Amazon Nova CanvasをAWS CLIから使ってみた

記事タイトルとURLをコピーする

5Kマラソンを完走したものの筋肉痛で元気がない IoTおじさん こと アプリケーションサービス部の木次です。

前回は Amazon Nova Canvas をコンソールから使ってみましたが、今回は AWS CLI から試してみました。 前回の記事はこちらを参照してください。

blog.serverworks.co.jp

前準備

ターミナルを開いてデフォルトのリージョンをバージニア北部 (us-east-1) に設定します。

% export AWS_DEFAULT_REGION=us-east-1

まずは利用出来る基盤モデルに Nova Canvas があることを確認します。

% aws bedrock list-foundation-models --query "modelSummaries[?contains(modelId, \`canvas\`)]"
[
    {
        "modelArn": "arn:aws:bedrock:us-east-1::foundation-model/amazon.nova-canvas-v1:0",
        "modelId": "amazon.nova-canvas-v1:0",
        "modelName": "Nova Canvas",
        "providerName": "Amazon",
        "inputModalities": [
            "TEXT",
            "IMAGE"
        ],
        "outputModalities": [
            "IMAGE"
        ],
        "responseStreamingSupported": false,
        "customizationsSupported": [],
        "inferenceTypesSupported": [
            "ON_DEMAND"
        ],
        "modelLifecycle": {
            "status": "ACTIVE"
        }
    }
]

Amazon Nova Canvas の現時点のモデル ID は amazon.nova-canvas-v1:0 です。
jq コマンドを利用するため、必要であればインストールします。

入力画像は引き続き、弊社代表の画像 (input.jpg) を利用します。

https://cdn-ak.f.st-hatena.com/images/fotolife/c/cmpmasuda/20200721/20200721130658.jpg

背景を削除

タスクタイプに BACKGROUND_REMOVAL を指定して背景を削除します。

リクエスト形式

{
    "taskType": "BACKGROUND_REMOVAL",
    "backgroundRemovalParams": {
        "image": "base64-encoded string"
    }
}

応答フォーマット

{
  "images": [
    "base64-encoded string", 
    ...
  ],
  "error": "string" 
}

bedrock-runtime の invoke-model を実行します。結果は jq コマンドを利用して画像データのみ抽出し、デコードしてファイルに保存します。

% BASE64_IMAGE=$(base64 -i input.jpg)
% BASE64_JSON=$(echo '{
    "taskType": "BACKGROUND_REMOVAL",
    "backgroundRemovalParams": {
        "image": "'$BASE64_IMAGE'"
    }
}' | base64)
% aws bedrock-runtime invoke-model \
    --model-id amazon.nova-canvas-v1:0 \
    --body "${BASE64_JSON}" \
    background-removal.json
% cat background-removal.json | jq -r '.images[0]' | base64 --decode > output.png

背景のみ削除されましたね。

オブジェクトを削除

タスクタイプに INPAINTING を指定してオブジェクトを削除します。

リクエスト形式

{
    "taskType": "INPAINTING",
    "inPaintingParams": {
        "image": "base64-encoded string",                         
        "text": "string",
        "negativeText": "string",        
        "maskPrompt": "string",                      
        "maskImage": "base64-encoded string",   
        "returnMask": boolean # False by default                
    },                                                 
    "imageGenerationConfig": {
        "numberOfImages": int,
        "height": int,
        "width": int,
        "cfgScale": float
    }
}

maskPrompt 値に削除するオブジェクトを指定します。

% BASE64_IMAGE=$(base64 -i input.jpg)
% BASE64_JSON=$(echo '{
    "taskType": "INPAINTING",
    "inPaintingParams": {
        "maskPrompt": "person",
        "image": "'$BASE64_IMAGE'"
    }
}' | base64)
% aws bedrock-runtime invoke-model \
    --model-id amazon.nova-canvas-v1:0 \
    --body "${BASE64_JSON}" \
    background-removal.json
% cat background-removal.json | jq -r '.images[0]' | base64 --decode > output.png

背景だけが残りました。

オブジェクトを置換

タスクタイプに OUTPAINTING を指定して顔以外を変更します。

リクエスト形式

{
    "taskType": "OUTPAINTING",
    "outPaintingParams": {
        "text": "string",
        "negativeText": "string",        
        "image": "base64-encoded string",                         
        "maskPrompt": "string",                      
        "maskImage": "base64-encoded string",    
        "returnMask": boolean, # False by default                                         
        "outPaintingMode": "DEFAULT | PRECISE"                 
    },                                                 
    "imageGenerationConfig": {
        "numberOfImages": int,
        "height": int,
        "width": int,
        "cfgScale": float
    }
}

maskPrompt に残す部分を、text に変更箇所を指定します。

% BASE64_IMAGE=$(base64 -i input.jpg)
% BASE64_JSON=$(echo '{
    "taskType": "OUTPAINTING",
    "outPaintingParams": {
        "text": "a man in golf attire holding a golf club at a golf course",
        "maskPrompt": "face",
        "image": "'$BASE64_IMAGE'"
    }
}' | base64)
% aws bedrock-runtime invoke-model \
    --model-id amazon.nova-canvas-v1:0 \
    --body "${BASE64_JSON}" \
    background-removal.json
% cat background-removal.json | jq -r '.images[0]' | base64 --decode > output.png

「チャー・シュー・メン!」

参考

docs.aws.amazon.com