AWS Rekognitionで画像の中に含まれているオブジェクトを解析するAPIがあります。それをGolangで使ってみました。
import (
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/rekognition"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"fmt"
"io/ioutil"
)
func MyDetectLabels() {
imagePath := "hamburger.jpg"
//
// 画像をbyte配列にする
// SDKのコメントにbase64にエンコードせよとか書いてあるけどしなくてよい
// むしろしたらエラーになります・・・
//
imageBytes, err := ioutil.ReadFile(imagePath)
if err != nil {
fmt.Println(err.Error())
return
}
//
// Imageオブジェクトにbyte配列を指定
//
image := &rekognition.Image {
Bytes: imageBytes,
}
//
// IAMユーザーのアクセスキーとシークレットを指定し、セッションを作る
// IAMユーザーはAmazonRekognitionReadOnlyAccessポリシーを持つこと
//
accessKeyId := "*****"
secretAccessKey := "*****"
sess := session.Must(session.NewSession(&aws.Config{
Region: aws.String("us-west-2"),
Credentials: credentials.NewStaticCredentials(accessKeyId, secretAccessKey, ""),
}))
// 解析オブジェクトを生成
reko := rekognition.New(sess)
//
// 画像解析し、画像に含まれている情報を返す
//
input := &rekognition.DetectLabelsInput{}
input.SetImage(image)
input.SetMaxLabels(10) // 最大取得ラベル数
input.SetMinConfidence(50) // 取得する最低信頼度(%)
output, err := reko.DetectLabels(input)
if err != nil {
fmt.Println(err.Error())
return
}
for _, label := range output.Labels {
fmt.Printf("ラベル名:%s 信頼度:%f\n", *label.Name, *label.Confidence)
}
}
DetectLabelsの機能しか使わないなら、IAMのユーザーポリシーは"rekognition:DetectLabels"のみでも良いはず。
ビールと一緒にハンバーガー食べた時の画像の解析結果。
ラベル名:Burger 信頼度:98.644783
ラベル名:Food 信頼度:98.644783
ラベル名:Bottle 信頼度:96.044090
ラベル名:Alcohol 信頼度:82.943893
ラベル名:Beer 信頼度:82.943893
ラベル名:Beverage 信頼度:82.943893
ラベル名:Drink 信頼度:82.943893
ラベル名:Glass 信頼度:57.666523
ハンバーガーはもちろん、ビールも解析できている。ボトルもグラスも。しかし、SetMinConfidenceを0にしてみても、ケチャップは検出できなかった。でも何の食べ物が写っているかわかるだけでもすごいし、こんな高度な画像解析が個人開発者でも使えるようになったのもすごい。いろいろ使い道がありそうですね。