👙

【Amazon Rekognition】 aws-sdk-goで不適切な画像(卑猥画像など)を検出する

2021/09/21に公開

はじめに

業務でRekognitionを使いましたので、アウトプットの為に、記事にします。
最近はだいたいどんなアプリでも画像が出てくるので、意図していない画像を検出する為に、Rekognitionをどんどん使っていきましょう。

Amazon Rekognitionの概要

Amazon Rekognitionを使用すると、画像と動画の物体、人物、テキスト、シーン、活動を特定し、不適切なコンテンツを検出できます。
Amazon Rekognitionで検出出来る不適切画像一覧はこちら
https://docs.aws.amazon.com/rekognition/latest/dg/moderation.html

今回は不適切な画像のSuggestiveとViolenceを検出していきます。

今回検証する画像

は載せません。
本当は載せた方が分かりやすいんやけど。
著作権云々言われるの怖いし、なにより卑猥な画像を載せれない為。

こんな感じで、

  • gun.png
  • human.jpg
  • sakura.jpeg
  • 水着.png

の4枚を検証しようと思います。
gunの写真がviolenceとなり、水着の写真がSuggestiveになるはず。

環境

macOS 11.5.2
go 1.16
github.com/aws/aws-sdk-go v1.40.45

準備

.awsの設定

credentialsやconfigの設定を行なってください。
今回はこちらでは説明致しません。
設定されている事を前提として話を進めます。
まだ設定できていない人は、こちらを参考に設定してみてください。
https://zenn.dev/a_ichi1/articles/2c3c3caac8f13e

aws-sdk-goをインストールします。

//go mod を入れます。今回はexample.comにしてます。皆様はGitHubなどのリポジトリになると思います。
$ go mod init example.com
//aws-sdk-go をインストールします。
$ go get -u github.com/aws/aws-sdk-go
//go mod を更新します。
$ go mod tidy

インストールが終わりましたら、早速コードを書いていきます。
以下のソースコードが完成形です。

ソースコード

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/rekognition"
)

const imagePath = "image/"

//ここで画像を雑に定義してます。
var imageName1 = "gun.png"
var imageName2 = "human.jpg"
var imageName3 = "sakura.jpeg"
var imageName4 = "水着.png"

func main() {
	// imageNameを変更して実行することで、画像を変更します。
	// ここ雑です。すいません。
	file := imagePath + imageName1

	// 画像ファイルを取得
	imageFile, err := os.Open(file)
	if err != nil {
		log.Fatal(err)
	}
	// 最後に画像ファイルを閉じます
	defer imageFile.Close()

	// 画像ファイルのデータを読み込み
	bytes, err := ioutil.ReadAll(imageFile)
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	// セッション作成
	sess := session.Must(session.NewSession())

	// Rekognitionクライアントを作成
	svc := rekognition.New(sess, aws.NewConfig().WithRegion("us-east-1"))

	// パラメータを設定
	params := &rekognition.DetectModerationLabelsInput{
		Image: &rekognition.Image{
			Bytes: bytes,
		},
	}

	// DetectModerationLabelsを実行。resultに結果のLabelが入ります。
	result, err := svc.DetectModerationLabels(params)
	// 結果を出力
	fmt.Println(result)
}

実行

go run main.go

結果

  • gun.png
{
  ModerationLabels: [{
      Confidence: 94.91090393066406,
      Name: "Weapons",
      ParentName: "Violence"
    },{
      Confidence: 94.91090393066406,
      Name: "Violence",
      ParentName: ""
    }],
  ModerationModelVersion: "4.0"
}

想定通りviolenceになってます。

  • human.jpg
{
  ModerationLabels: [],
  ModerationModelVersion: "4.0"
}

ラベルなしです。

  • sakura.jpeg
{
  ModerationLabels: [],
  ModerationModelVersion: "4.0"
}

humanと同じ結果

  • 水着.png
{
  ModerationLabels: [{
      Confidence: 80.94490051269531,
      Name: "Suggestive",
      ParentName: ""
    },{
      Confidence: 80.94490051269531,
      Name: "Revealing Clothes",
      ParentName: "Suggestive"
    },{
      Confidence: 76.50199890136719,
      Name: "Female Swimwear Or Underwear",
      ParentName: "Suggestive"
    }],
  ModerationModelVersion: "4.0"
}

想定通り、Suggestiveになりました。

さいごに

これであなたも卑猥画像マスターですね。
いろんな画像を試してみてください。

参考

https://aws.amazon.com/jp/rekognition/?blog-cards.sort-by=item.additionalFields.createdDate&blog-cards.sort-order=desc

https://docs.aws.amazon.com/sdk-for-go/api/service/rekognition/

https://pkg.go.dev/github.com/aws/aws-sdk-go@v1.40.32/service/rekognition

https://dev.classmethod.jp/articles/amazon-rekognition-using-aws-sdk-for-go/

Discussion