AWS日記⑦ (Rekognition)

# はじめに
今回は Amazon Rekognition の「イメージ内の安全でないコンテンツを検出する機能」を試します。

[今回作成したAmazon Rekognition のイメージ内の安全でないコンテンツを検出する機能を試すページ](https://labo.systems/rekognition)

# 準備
[Lambda , API Gatewayの準備をします。]
(https://qiita.com/tanaka_takurou/items/3f93295de6cff060ec09)

[Amazon Rekognitionの資料]
[Amazon Rekognition 開発者ガイド 安全でないイメージの検出](https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/procedure-moderate-images.html)
[Amazon Rekognitionの概要](https://qiita.com/uenohara/items/c535d4cbb119099930c1)
[AWSでサーバレスな動画解析(Amazon Rekognition)](https://qiita.com/hayaosato/items/274c06d4466f168d662d)
[Amazon Rekognition](https://qiita.com/leomaro7/items/3c95c1a3d4da33ccccfc)
[めちゃくちゃ簡単　Amazon Rekognition](https://qiita.com/naka46/items/05624e23edb6341a5e27)

# WEBページ・API作成
GO言語のAWS Lambda関数ハンドラー aws-lambda-go を使用してHTMLやJSONを返す処理を作成します。
また、Rekognition を使用するため aws-sdk-go を利用します。

[参考資料]
[AWS SDK for Go API Reference](https://docs.aws.amazon.com/sdk-for-go/api/service/rekognition/)

##### イメージ内の安全でないコンテンツを検出するには DetectModerationLabels を使う。

```golang:main.go
func detectModeration(img string)(string, error) {
        b64data := img[strings.IndexByte(img, ',')+1:]
        data, err := base64.StdEncoding.DecodeString(b64data)
        if err != nil {
                log.Print(err)
                return "", err
        }
        svc := rekognition.New(session.New(), &aws.Config{
                Region: aws.String("ap-northeast-1"),
        })

        input := &rekognition.DetectModerationLabelsInput{
                Image: &rekognition.Image{
                        Bytes: data,
                },
        }
        res, err2 := svc.DetectModerationLabels(input)
        if err2 != nil {
                return "", err2
        }
        if len(res.ModerationLabels) < 1 {
                return "No ModerationLabel", nil
        }
        results, err3 := json.Marshal(res.ModerationLabels)
        if err3 != nil {
                return "", err3
        }
        return string(results), nil
}
```


※ 6/7 追記

##### イメージ内のテキストを検出するには DetectText を使う。

```golang:main.go
func detectText(img string)(string, error) {
        b64data := img[strings.IndexByte(img, ',')+1:]
        data, err := base64.StdEncoding.DecodeString(b64data)
        if err != nil {
                log.Print(err)
                return "", err
        }
        svc := rekognition.New(session.New(), &aws.Config{
                Region: aws.String("ap-northeast-1"),
        })

        input := &rekognition.DetectTextInput{
                Image: &rekognition.Image{
                        Bytes: data,
                },
        }
        res, err2 := svc.DetectText(input)
        if err2 != nil {
                return "", err2
        }
        if len(res.TextDetections) < 1 {
                return "No TextDetection", nil
        }
        results, err3 := json.Marshal(res.TextDetections)
        if err3 != nil {
                return "", err3
        }
        return string(results), nil
}
```


※ 6/7 追記

##### イメージ内の顔を検出するには DetectFaces を使う。

```golang:main.go
func detectFaces(img string)(string, error) {
        b64data := img[strings.IndexByte(img, ',')+1:]
        data, err := base64.StdEncoding.DecodeString(b64data)
        if err != nil {
                log.Print(err)
                return "", err
        }
        svc := rekognition.New(session.New(), &aws.Config{
                Region: aws.String("ap-northeast-1"),
        })

        input := &rekognition.DetectFacesInput{
                Image: &rekognition.Image{
                        Bytes: data,
                },
        }
        res, err2 := svc.DetectFaces(input)
        if err2 != nil {
                return "", err2
        }
        if len(res.FaceDetails) < 1 {
                return "No FaceDetails", nil
        }
        results, err3 := json.Marshal(res.FaceDetails)
        if err3 != nil {
                return "", err3
        }
        return string(results), nil
}
```

※ 6/7 追記

##### イメージ内のラベルを検出するには DetectLabels を使う。

```golang:main.go
func detectLabels(img string)(string, error) {
        b64data := img[strings.IndexByte(img, ',')+1:]
        data, err := base64.StdEncoding.DecodeString(b64data)
        if err != nil {
                log.Print(err)
                return "", err
        }
        svc := rekognition.New(session.New(), &aws.Config{
                Region: aws.String("ap-northeast-1"),
        })

        input := &rekognition.DetectLabelsInput{
                Image: &rekognition.Image{
                        Bytes: data,
                },
                MaxLabels: aws.Int64(10),
                MinConfidence: aws.Float64(60.0),
        }
        res, err2 := svc.DetectLabels(input)
        if err2 != nil {
                return "", err2
        }
        if len(res.Labels) < 1 {
                return "No Labels", nil
        }
        results, err3 := json.Marshal(res.Labels)
        if err3 != nil {
                return "", err3
        }
        return string(results), nil
}
```


# 終わりに
今回はAmazon Rekognitionの イメージ内の安全でないコンテンツを検出する機能を試しました。
他にもRekognitionの機能が利用できるため、今後試していきたいと思います。

 - [モノとシーンの検出](https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/labels.html)
 - [イメージ内のテキストの検出](https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/text-detecting-text-procedure.html)


※ 6/7 追記
イメージ内のテキスト・顔・ラベルを検出する機能を試しました。
[テキストを検出する機能を試す](https://labo.systems/rekognition/detect/text)
[顔を検出する機能を試す](https://labo.systems/rekognition/detect/faces)
[ラベルを検出する機能を試す](https://labo.systems/rekognition/detect/labels)