Amazon Rekognition 人工知能で画像分析 Part 3。Twitter画像を自動分類する

前々回前回でAmazon Rekognitionの基本的な使い方を説明しました。今回は、この画像分析の人工知能を使った簡単なアプリケーションを作成してみます。

Twitterのストリームデータから画像を大量に収集して、「人」や「動物」など指定したものだけが写っている写真を分類するシステムを作ります。特定の商品の画像を集めたり、AIの訓練データのために同じものの画像がたくさん必要になるときなんかにも使えます。指定したものかどうかの判別をAmazon Rekognitionの人工知能で行おうというのがポイントで、写真に写っているものが何かを判別してラベリングできるdetect_labelsのAPIを使用していきます。

アプリケーション実装

前回まではコンソールからの利用でしたが、今回はAWS Ruby SDKを使います。まずはGemfileを作って、

source 'https://rubygems.org'
gem 'aws-sdk'
gem 'twitter'

今回使うgemを書いておき、

$ bundle install --path vendor/bundle

bundle install しておきます。

ソースコード全体は下記のような感じ。

* Twitterストリームから指定枚数の画像URLが集まるまで収集
* 画像をURLからダウンロード
* Amazon Rekognitionで「人(People,Person,Human)」が含まれているか分析
* 含まれていればhitディレクトリに移動、そうでなければtrashディレクトリに移動

ロジックの流れができればいいのでステップごとに処理をしていきますが、それぞれ関数にして「人」の画像が1万枚集まるまで続ける、なども簡単にできます。

また、Amazon Rekognitionの指定ラベルを変えることで、犬、猫の画像だけを大量に集めるということも可能です。

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

実行結果

今回は500枚の画像を分類しましたが、ほぼ正しく「人」が写っている画像だけを分類できています。

もちろん、trashディレクトリには、「人」ではない画像が捨てられています。

Twitterのストリーミングは時間帯によっても情報が変わるので、回し続けてどういう結果が得られるのか見てみるのも面白そうです。

まとめ

Amazon Rekognitionの具体的なアプリケーションで見るユースケースの例でした。

APN Consulting Partner
スーパーソフトウエアはAWSパートナーネットワーク(APN)のコンサルティングパートナーです。