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
バイナリを実行
以下の画像に対して実行してみました。
実行結果が以下。
$ ./goreko -url=https://dev.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も最新のサービスをちゃんとキャッチアップしていることがわかりましたので、新サービスをいろいろ試してみたいと思います!