0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

エンジニアが新婦のために結婚式にITで全力で貢献しようとした話【連載第3回】写真をAI顔認識で自動タグ付けする仕組み

0
Posted at

エンジニアが新婦のために結婚式にITで全力で貢献しようとした話【連載第3回】写真をAI顔認識で自動タグ付けする仕組み

AWS Rekognition × Supabase Edge Functions 実装Tips

1. SDKなしでRekognition APIを叩く方法

Supabase Edge Functions(Deno環境)ではAWS SDKが使えません。HTTP直接呼び出し + Signature V4手動署名で対応します。

// Signature V4署名チェーンの実装例
async function callRekognition(action: string, body: object) {
  const payload = JSON.stringify(body);
  const timestamp = new Date().toISOString().replace(/[-:]/g, "").split(".")[0] + "Z";
  const dateStamp = timestamp.substring(0, 8);

  // 署名キーを段階的に導出
  const kDate = await hmacSHA256("AWS4" + SECRET_KEY, dateStamp);
  const kRegion = await hmacSHA256(kDate, REGION);
  const kService = await hmacSHA256(kRegion, "rekognition");
  const kSigning = await hmacSHA256(kService, "aws4_request");

  // 正規リクエストのハッシュ → 署名
  const canonicalRequest = [
    "POST", "/", "",
    `content-type:application/x-amz-json-1.1`,
    `host:rekognition.${REGION}.amazonaws.com`,
    `x-amz-date:${timestamp}`,
    `x-amz-target:RekognitionService.${action}`,
    "", // signed headers
    "content-type;host;x-amz-date;x-amz-target",
    await sha256Hex(payload),
  ].join("\n");

  const signature = await hmacSHA256Hex(kSigning, stringToSign);

  return fetch(`https://rekognition.${REGION}.amazonaws.com`, {
    method: "POST",
    headers: {
      "Content-Type": "application/x-amz-json-1.1",
      "X-Amz-Date": timestamp,
      "X-Amz-Target": `RekognitionService.${action}`,
      Authorization: `AWS4-HMAC-SHA256 Credential=...`,
    },
    body: payload,
  });
}

2. Face Collection の閾値設定

  • FaceMatchThreshold: 80(マッチ閾値):80%以上の類似度でマッチと判定
  • MinConfidence: 70(最低信頼度):分析結果の信頼度下限

結婚式の写真は照明やアングルが様々なので、閾値を下げすぎると誤認識が増えます。80%は実テストで「知り合いと間違えないギリギリの線」でした。

3. DetectLabels のブロックリストは運用中に調整

最初は少なめのブロックリストで始め、テスト中に「これもブロックすべき」と気づいたラベルを追加していくのが効率的です。system_config テーブルに保存してEdge Functionが毎回読み込む設計にすれば、デプロイなしで即時反映できます。

4. コスト管理

Rekognition は API 呼び出し単位の課金です。

API 単価 40人×10枚 小計
IndexFaces $0.001/回 40回 $0.04
SearchFacesByImage $0.001/回 400回 $0.40
DetectLabels $0.001/回 400回 $0.40
DetectModerationLabels $0.001/回 400回 $0.40

合計:約$1.24。Face Collection のストレージは1,000顔まで無料。結婚式のためなら余裕の範囲です。

5. HEIC変換の注意点

  • heic2any は約800KBのライブラリ。動的インポート await import("heic2any") でバンドルサイズを最小化
  • quality: 0.9 は結婚式写真の品質を保つための設定。Webアプリ一般なら0.7-0.8で十分
  • 変換結果が配列で返る場合があるため、Array.isArray(blob) ? blob[0] : blob のガード必須

この記事の関連情報・背景解説はブログでも公開しています。
エンジニアが新婦のために結婚式にITで全力で貢献しようとした話【連載第3回】写真をAI顔認識で自動タグ付けする仕組み - Secure Auto Lab

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?