Amazon RekognitionをAWS SDK for Goから使ってみる

はじめに

最近すっかりコードを書かなくなってしまっていたので、またGolangを勉強しようと思い、AWS SDK for GoからAmazon Rekognitionを使ってみました。

やってみた

Golang環境の導入

僕の場合はOS X YosemiteにHomebrewでGolangをインストールしました。

$ brew install go
$ go version
go version go1.8 darwin/amd64

AWS SDK for Goの導入

AWS SDK for Goはgo getで一発でインストールできます。

$ go get -u github.com/aws/aws-sdk-go/

すると、~/go/src/github.com/aws/aws-sdk-go/にAWS SDK for Goが展開されます。

$ ls ~/go/src/github.com/aws/aws-sdk-go/
CHANGELOG.md         README.md            models
CHANGELOG_PENDING.md aws                  private
CONTRIBUTING.md      awsmigrate           sdk.go
LICENSE.txt          awstesting           service
Makefile             doc-src              vendor
NOTICE.txt           example

なお、以前は$GOPATHの設定が必要だったのですが、Go 1.8からデフォルトで$HOME/goがセットされるようになったそうです。

スクリプトを作成

画像ファイルのURLを引数に渡すと、DetectFacesを実行するスクリプトを書きました。

package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"net/http"

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

func main() {
	// 引数-urlから画像ファイルのURLを取得
	f := flag.String("url", "http://example.com/", "URL")
	flag.Parse()

	// 画像ファイルを取得
	image, err := http.Get(*f)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer image.Body.Close()

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

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

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

	// DetectFacesに渡すパラメータを設定
	params := &rekognition.DetectFacesInput{
		Image: &rekognition.Image{
			Bytes: bytes,
		},
		Attributes: []*string{
			aws.String("ALL"),
		},
	}

	// DetectFacesを実行
	resp, err := svc.DetectFaces(params)
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	// 結果を出力
	fmt.Println(resp)
}

作成したスクリプトはgo fmtで整形します。

$ go fmt goreko.go

そしてbuildします。

$ go build

バイナリが出来上がります。

$ ls
goreko    goreko.go

バイナリを実行

以下の画像に対して実行してみました。

7620781788_c44fc22553_z

実行結果が以下。

$ ./goreko -url=https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2017/03/7620781788_c44fc22553_z.jpg
{
  FaceDetails: [{
      AgeRange: {
        High: 45,
        Low: 29
      },
      Beard: {
        Confidence: 99.59941101074219,
        Value: false
      },
      BoundingBox: {
        Height: 0.25600960850715637,
        Left: 0.3044496476650238,
        Top: 0.26923078298568726,
        Width: 0.38551613688468933
      },
      Confidence: 99.99990844726562,
      Emotions: [{
          Confidence: 99.88208770751953,
          Type: "HAPPY"
        },{
          Confidence: 0.714111328125,
          Type: "CALM"
        },{
          Confidence: 0.3273427486419678,
          Type: "ANGRY"
        }],
      Eyeglasses: {
        Confidence: 99.98210144042969,
        Value: true
      },
      EyesOpen: {
        Confidence: 89.83787536621094,
        Value: true
      },
      Gender: {
        Confidence: 99.9288101196289,
        Value: "Male"
      },
      Landmarks: [
        {
          Type: "eyeLeft",
          X: 0.43741557002067566,
          Y: 0.36614683270454407
        },
        {
          Type: "eyeRight",
          X: 0.5669198036193848,
          Y: 0.36526039242744446
        },
        {
          Type: "nose",
          X: 0.5264847874641418,
          Y: 0.4052385687828064
        },
        {
          Type: "mouthLeft",
          X: 0.44214296340942383,
          Y: 0.45339053869247437
        },
        {
          Type: "mouthRight",
          X: 0.5672095417976379,
          Y: 0.44904106855392456
        },
        {
          Type: "leftPupil",
          X: 0.43228963017463684,
          Y: 0.370173841714859
        },
        {
          Type: "rightPupil",
          X: 0.5775913596153259,
          Y: 0.3629841208457947
        },
        {
          Type: "leftEyeBrowLeft",
          X: 0.38468411564826965,
          Y: 0.34235435724258423
        },
        {
          Type: "leftEyeBrowRight",
          X: 0.420712947845459,
          Y: 0.3310817778110504
        },
        {
          Type: "leftEyeBrowUp",
          X: 0.46518683433532715,
          Y: 0.3350377082824707
        },
        {
          Type: "rightEyeBrowLeft",
          X: 0.5457873940467834,
          Y: 0.334259033203125
        },
        {
          Type: "rightEyeBrowRight",
          X: 0.5727271437644958,
          Y: 0.329836368560791
        },
        {
          Type: "rightEyeBrowUp",
          X: 0.599844217300415,
          Y: 0.33317142724990845
        },
        {
          Type: "leftEyeLeft",
          X: 0.41301229596138,
          Y: 0.36653006076812744
        },
        {
          Type: "leftEyeRight",
          X: 0.4616145193576813,
          Y: 0.3670576512813568
        },
        {
          Type: "leftEyeUp",
          X: 0.4379234313964844,
          Y: 0.3638383150100708
        },
        {
          Type: "leftEyeDown",
          X: 0.43700990080833435,
          Y: 0.3678082525730133
        },
        {
          Type: "rightEyeLeft",
          X: 0.5425776839256287,
          Y: 0.3665045201778412
        },
        {
          Type: "rightEyeRight",
          X: 0.5903759002685547,
          Y: 0.36477184295654297
        },
        {
          Type: "rightEyeUp",
          X: 0.5672491788864136,
          Y: 0.3631669580936432
        },
        {
          Type: "rightEyeDown",
          X: 0.5670334100723267,
          Y: 0.3669760823249817
        },
        {
          Type: "noseLeft",
          X: 0.483066588640213,
          Y: 0.42092758417129517
        },
        {
          Type: "noseRight",
          X: 0.5464873313903809,
          Y: 0.4188898205757141
        },
        {
          Type: "mouthUp",
          X: 0.5146479606628418,
          Y: 0.4374517500400543
        },
        {
          Type: "mouthDown",
          X: 0.5168762803077698,
          Y: 0.4898394048213959
        }
      ],
      MouthOpen: {
        Confidence: 91.74642181396484,
        Value: true
      },
      Mustache: {
        Confidence: 94.57676696777344,
        Value: false
      },
      Pose: {
        Pitch: 11.231383323669434,
        Roll: -1.9937095642089844,
        Yaw: 16.109811782836914
      },
      Quality: {
        Brightness: 43.78074645996094,
        Sharpness: 99.99090576171875
      },
      Smile: {
        Confidence: 99.9142837524414,
        Value: true
      },
      Sunglasses: {
        Confidence: 97.87500762939453,
        Value: false
      }
    }],
  OrientationCorrection: "ROTATE_0"
}

ということでちゃんと実行されました!

さいごに

久しぶりにGoのコード書いたらすっかり忘れてました。改めて勉強したいと思います。また、AWS SDK for Goも最新のサービスをちゃんとキャッチアップしていることがわかりましたので、新サービスをいろいろ試してみたいと思います!