この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
最近すっかりコードを書かなくなってしまっていたので、また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://devio2023-media.developers.io/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も最新のサービスをちゃんとキャッチアップしていることがわかりましたので、新サービスをいろいろ試してみたいと思います!