はじめに
前々回と前回でAmazon Rekognitionの基本的な使い方をご説明しました。
今回は、この画像分析の人工知能を使った簡単なアプリケーションを作成してみましょう。
Twitterのストリームデータから画像を大量に収集し、「人」や「動物」など指定したものだけが写っている写真を分類するシステムを作ります。
特定の商品の画像を集めたり、AIの訓練データのために同じモノの画像がたくさん必要になるときなど様々な使い方が考えられます。
指定したものかどうかの判別をAmazon Rekognitionの人工知能で行おうというのがポイントで、写真に写っているものが何かを判別してラベリングできるdetect_labelsのAPIを使用していきます。
アプリケーション実装
前回まではコンソールからの利用でしたが、今回はAWS Ruby SDKを使います。
まずはGemfileを作って、
[ruby]
source 'https://rubygems.org'
gem 'aws-sdk'
gem 'twitter'
[/ruby]
今回使うgemを書いておき、
$ bundle install --path vendor/bundle
bundle install しておきます。
ソースコード全体は下記のような感じ。
* Twitterストリームから指定枚数の画像URLが集まるまで収集
* 画像をURLからダウンロード
* Amazon Rekognitionで「人(People,Person,Human)」が含まれているか分析
* 含まれていればhitディレクトリに移動、そうでなければtrashディレクトリに移動
ロジックの流れができればいいのでステップごとに処理をしていきますが、それぞれを関数にして「人」の画像が1万枚集まるまで実行、などの設定も簡単にできます。
また、Amazon Rekognitionの指定ラベルを変えることで、犬、猫の画像だけを大量に集めるということも可能です。
[ruby]
require 'twitter'
require 'open-uri'
require 'aws-sdk'
MAX_IMG_FETCH = 200
TEMP_DIR = "./imgs"
client = Twitter::Streaming::Client.new do |config|
config.consumer_key = "CONSUMER_KEY"
config.consumer_secret = "CONSUMER_SECRET"
config.access_token = "ACCESS_TOKE"
config.access_token_secret = "ACCESS_TOKEN_SECRET"
end
imgs = []
# 指定枚数の画像をTweetから集める
client.sample do |object|
imgs.concat object.media.flat_map { |m|
case m
when Twitter::Media::AnimatedGif
[]
when Twitter::Media::Photo
m.media_url.to_s
else
[]
end
} if object.is_a?(Twitter::Tweet)
break if imgs.size > MAX_IMG_FETCH
end
# 画像を保存
imgs.each do |url|
path = "#{TEMP_DIR}/#{File.basename(url)}"
begin
timeout(2) {
begin
File.open(path, 'w') do |f|
f.write open(url).read
end
rescue => exception
end
}
rescue TimeoutError
end
end
# Amazon Rekognition
rekognition = Aws::Rekognition::Client.new(region: 'us-west-2')
Dir.glob("#{TEMP_DIR}/*.jpg").each do |f|
begin
response_detect_labels = rekognition.detect_labels(
image: { bytes: File.read(f) },
max_labels: 10,
min_confidence: 90
)
t = false
response_detect_labels.labels.each do |label|
case label.name
when "People", "Person", "Human"
t = true
end
end
t ? File.rename(f,"#{TEMP_DIR}/hit/#{File.basename(f)}") : File.rename(f,"#{TEMP_DIR}/trash/#{File.basename(f)}")
rescue
end
end
[/ruby]
実行結果
今回は500枚の画像を分類しましたが、ほぼ正しく「人」が写っている画像だけを分類できています。
もちろん、trashディレクトリには、「人」ではない画像が捨てられています。
Twitterのストリーミングは時間帯によっても情報が変わるので、回し続けてどういう結果が得られるのか見てみるのも面白そうです。
まとめ
Amazon Rekognitionの具体的なアプリケーションで見るユースケースの例をご紹介いたしました。