この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
乗るしかない、このビッグウェーブに。
はじめに
本日Amazon RekognitionにCelebrity Recognition(有名人認識)が追加されました。
そして先日、僕はこんなブログを書きました。
つまりそういうことです。
やってみた
Image Moderationによって不適切と判断されたものがCelebrityであれば保存します。
スクリプト本体はAWS SDK for Goを使用しました。新機能を使う前に最新版を取得しておきます。
$ go get -u github.com/aws/aws-sdk-go/
また、TwitterのPublic timelineの収集にはChimeraCoder/anacondaライブラリを使用しました。
$ go get -u github.com/ChimeraCoder/anaconda/
スクリプト
スクリプトの内容は以下の通りです。詳細はコメントとして書きました。
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/rekognition"
"github.com/ChimeraCoder/anaconda"
)
func main() {
// Twitter認証情報をセット
consumerKey := os.Getenv("TWITTER_CONSUMER_KEY")
consumerSecret := os.Getenv("TWITTER_CONSUMER_SECRET")
AccessToken := os.Getenv("TWITTER_ACCESS_TOKEN")
AccessTokenSecret := os.Getenv("TWITTER_ACCESS_TOKEN_SECRET")
// Twitter認証
anaconda.SetConsumerKey(consumerKey)
anaconda.SetConsumerSecret(consumerSecret)
api := anaconda.NewTwitterApi(AccessToken, AccessTokenSecret)
// TwitterのPublicStream(statuses/sample)を取得
twitterStream := api.PublicStreamSample(nil)
for {
// データを取得
data := <-twitterStream.C
switch tweet := data.(type) {
// Tweetの場合
case anaconda.Tweet:
// 画像URLを格納する配列を定義
var url []string
// 画像URLを配列に格納
m := tweet.ExtendedEntities.Media
for i := 0; i < len(m); i++ {
url = append(url, m[i].Media_url)
}
for i := 0; i < len(url); i++ {
// 画像を取得
getImage(url[i])
}
default:
}
}
}
func getImage(url string) {
fmt.Println(url)
// 画像URLを格納する配列を定義
var result1 bool
var result2 bool
// 画像ファイルのURLに:largeを追加
var buffer bytes.Buffer
buffer.WriteString(url)
buffer.WriteString(":large")
// largeな画像ファイルを取得
image, err := http.Get(buffer.String())
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"))
// svc.DetectModerationLabelsに渡すパラメータを設定
dparams := &rekognition.DetectModerationLabelsInput{
Image: &rekognition.Image{
Bytes: bytes,
},
// Confidenceが70%以上
MinConfidence: aws.Float64(0.7),
}
// svc.DetectModerationLabelsを実行
dresp, err := svc.DetectModerationLabels(dparams)
if err != nil {
fmt.Println(err.Error())
return
}
// 対象であればtrue
if len(dresp.ModerationLabels) != 0 {
result1 = true
}
// svc.RecognizeCelebritiesに渡すパラメータを設定
cparams := &rekognition.RecognizeCelebritiesInput{
Image: &rekognition.Image{
Bytes: bytes,
},
}
// svc.RecognizeCelebritiesを実行
cresp, err := svc.RecognizeCelebrities(cparams)
if err != nil {
fmt.Println(err.Error())
return
}
// 対象であればtrueをリターン
if len(cresp.CelebrityFaces) != 0 {
result2 = true
}
if result1 == true && result2 == true {
// URLからファイル名を取得
filename := filepath.Base(url)
if err != nil {
fmt.Println(err.Error())
return
}
// ファイルを作成
file, err := os.Create(filename)
if err != nil {
fmt.Println(err.Error())
return
}
defer file.Close()
// ファイルを書き込んで保存
file.Write(bytes)
// 保存した情報を出力
fmt.Println(dresp.ModerationLabels)
fmt.Println(cresp.CelebrityFaces)
fmt.Println("Save " + filename + ".")
}
}
作成したスクリプトはgo fmtで整形します。
$ go fmt getcelebpic.go
そしてbuildします。
$ go build
バイナリが出来上がります。
$ ls
getcelebpic getcelebpic.go
実行結果
例の如く実行して保存された画像は公序良俗の観点からお見せできませんが、実際に取得出来た画像のCelebrityFacesの内容はこんな感じです。
Id: "1YK3In0Q",
MatchConfidence: 88,
Name: "Fujita Nicole",
Urls: ["www.imdb.com/name/nm7578700"]
まさかの藤田ニコルさん...!(水着でした)
さいごに
やらずにはいられませんでした。ごめんなさい。
補足すると著名人の方が自分の写真が肖像権を違反して流出しているのを検知するような使い方も出来そうです。