Ruby
AI
GoogleCloudVision
google-cloud-vision

【初心者向け】【Ruby】Google画像認識で、APIの叩き方を学ぶ

More than 1 year has passed since last update.


つくるもの


  • 文字の入った画像から、文字だけをデータとして抽出するrubyプログラムをつくります。

  • GoogleCloudVisionAPI の TextDetectionという機能を使います


対象読者


  • プログラミング初心者(1週間 ~ 1ヶ月)

  • rubyを少しさわったことがあり基礎文法はわかる


注意点

GoogleCloudVisionApi の利用には クレジットカードが必要 です。

1000ユニット/月間までは無料ですが、それを超えると料金がかかるのでご注意ください。

API_KEYは絶対流出しないようにしてください!!!!

このKEYが他者にもれると、APIを使い放題され

その請求は全てあなた宛にという、課金地獄に陥ります。

絶対にAPI_KEYを直接書いたファイルを、

Githubにあげたり、Twitterにあげたりしないようにしましょう!

※ 安全に利用する方法も解説します。


学ぶこと


  • APIの扱い方


    • httpリクエスト

    • JSON

    • 環境変数の設定




完成コード


vision.rb

require 'base64'

require 'json'
require 'net/https'

IMAGE_FILE = ARGV[0]
API_KEY = ENV['GOOGLE_VISION_API_KEY']
API_URL = "https://vision.googleapis.com/v1/images:annotate?key=#{API_KEY}"

base64_image = Base64.strict_encode64(File.new(IMAGE_FILE, 'rb').read)

body = {
requests: [{
image: {
content: base64_image
},
features: [
{
type: 'TEXT_DETECTION',
maxResults: 1
}
]
}]
}.to_json

uri = URI.parse(API_URL)
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
request["Content-Type"] = "application/json"
response = https.request(request, body)

response_rb = JSON.parse(response.body)
description = response_rb["responses"][0]["textAnnotations"][0]["description"]

puts description



さっそくつくってみましょう!


ディレクトリ構成

以下のようにvisionディレクトリを作成し

その中にファイルを配置してください。

vision

- vision.rb(実行ファイル)
- samp.rb(サンプルコード学習用)
- image.jpg(分析したい画像ファイル)


APIとは

Application Programming Interfaceの略。

あるアプリの機能を、外部の別のアプリケーションが利用できるように、サービス運営者が公開してくれているもの。


Twitterのapiを利用すると、自分のアプリケーションで、特定キーワードが入ったtweetを検索することができます


APIを利用するのに必要な知識


よくあるAPI

あるHTTPリクエストを送ると、結果をJSON形式で返してくれる

例えば、GoogleCloudAPIは

https://vision.googleapis.com/v1/images:annotate?key=#{API_KEY}

というリクエストを送ると、画像認識の結果を返してくれる。


HTTPリクエスト

HTTPリクエストについて仔細な説明をすることは、ここでは省きます。(これだけで本一冊あるレベルなので)

「ユーザーが誰かに送れる要求」 くらいの理解で大丈夫です!」


試しに

ターミナルでtwitterに対してhttpリクエストを送ってみましょう。

curl https://twitter.com

と打ってみましょう。


JSONとは

JavascriptObjectNotationというデータの形式。

Rubyのハッシュに似た、キー&バリュー形式でデータを扱います。

APIのレスポンスとしてよく使われます。

{"name": "John Smith", "age": 33}


試しに

駅データ(http://www.ekidata.jp/api/api_pref.php)

の無料APIを叩いてみましょう

curl http://www.ekidata.jp/api/p/1.json


GoogleCloudVisionAPIを利用する準備


API_KEYを取得する

以下のサイトを参考に

https://qiita.com/yukotan/items/09098c5b6f18c2dd3c35

GoogleCloudVisionAPIのAPI_KEYを取得してみましょう。

GoogleCloudVisionAPI

https://cloud.google.com/vision

※クレジットカードが必要です。


では本番のコードを書いてみましょう


まずは必要なライブラリを読み込む


vision.rb

require 'base64'

require 'json'
require 'net/https'



  • base64: 画像の形式をbase64に変換するために用いる

  • json: jsonをrubyで扱うためのライブラリ

  • net/https: rubyでhttpsリクエストを簡単に送るためのライブラリ


画像ファイルを読み込む


ARGV


ARGVとは

rubyの機能。

rbファイル実行じに、ファイル名の後ろに入力した値を

配列形式でARGVという定数の中に格納してくれる。

なんのこっちゃという方は、コードを書いて動かせばわかります!

下記のサンプルコードをsamp.rbに書きましょう。


例1(サンプルコード)


samp.rb

text = ARGV[0]

puts text

$ ruby samp.rb "Hello World"

=> Hello World


例2(サンプルコード)


samp.rb

name = ARGV[0]

age = ARGV[1]
puts "Hello I'm #{name}, #{age} yrs old"

$ ruby samp2.rb "NishimoriDaisuke" 24

=> "I'm NishimoriDaisuke. 24 yrs old"


ファイルを読み込んでみよう


vision.rb

require 'base64'

require 'json'
require 'net/https'

IMAGE_FILE = ARGV[0]
puts IMAGE_FILE


$ ruby vision.rb yoshio.jpg

=> yoshio.rb


環境変数を定義しよう

APIを用いる時はAPI_KEYが他者に漏れないように気をつけなければなりません。

そのため、OSの環境変数という機能をつかってAPI_KEYを隠します。

環境変数を書き込むためのファイルあbash_profileをvimというテキストエディタを使って開きましょう。

cd ~

vi .bash_profile

# iを押してinsertモードを起動

# 以下のように記述しましょう

export GOOGLE_VISION_API_KEY="APIKEYの文字列"

# escキーでinsertモードを終了しましょう
# wqと入力して上書き保存終了しましょう

# 以下のコマンドでbash_profileの変更を反映させましょう。

source ~/.bash_profile

# 環境変数が設定されたか確認
echo GOOGLE_VISION_API_KEY


コードを書いていきましょう。


まずは環境変数を使ってAPI_KEYとapiを叩くためのAPI_URLを定数に定義します。


vision.rb

require 'base64'

require 'json'
require 'net/https'

IMAGE_FILE = ARGV[0]

# 環境変数とAPI_URLを定数として定義します。
API_KEY = ENV['GOOGLE_VISION_API_KEY']
API_URL = "https://vision.googleapis.com/v1/images:annotate?key=#{API_KEY}"



続いて以下は画像をgoogle_cloud_vision_apiが受取可能なbase64形式にするためのコードです。


vision.rb

require 'base64'

require 'json'
require 'net/https'

IMAGE_FILE = ARGV[0]

API_KEY = ENV['GOOGLE_VISION_API_KEY']
API_URL = "https://vision.googleapis.com/v1/images:annotate?key=#{API_KEY}"

# 画像をbase64形式に変換
base64_image = Base64.strict_encode64(File.new(IMAGE_FILE, 'rb').read)



HTTPリクエストの中身をつくっていきましょう。

※ 書き方はGoogleCloudVisionAPI公式ガイドに従ったものなので深く考える必要はありません。


vision.rb


require 'base64'
require 'json'
require 'net/https'

IMAGE_FILE = ARGV[0]
API_KEY = ENV['GOOGLE_VISION_API_KEY']
API_URL = "https://vision.googleapis.com/v1/images:annotate?key=#{API_KEY}"

base64_image = Base64.strict_encode64(File.new(IMAGE_FILE, 'rb').read)

# HTTPリクエストの中身(body)を定義
body = {
requests: [{
image: {
content: base64_image
},
features: [
{
type: 'TEXT_DETECTION', #画像認識の分析方法を選択
maxResults: 1 # 出力したい結果の数
}
]
}]
}.to_json



作ったリクエストを"net/https"ライブラリを使って送信するコードを書きます。


vision.rb

require 'base64'

require 'json'
require 'net/https'

IMAGE_FILE = ARGV[0]
API_KEY = ENV['GOOGLE_VISION_API_KEY']
API_URL = "https://vision.googleapis.com/v1/images:annotate?key=#{API_KEY}"

base64_image = Base64.strict_encode64(File.new(IMAGE_FILE, 'rb').read)

body = {
requests: [{
image: {
content: base64_image
},
features: [
{
type: 'TEXT_DETECTION',
maxResults: 1
}
]
}]
}.to_json

# 文字列のAPI_URLをURIオブジェクトに変換します。
uri = URI.parse(API_URL)

# httpではなく暗号化通信の施されたhttpsを用いる設定です。
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

# POSTリクエストを作成します
request = NET::HTTP::Post.new(uri.request_uri)

# httpsでリクエストを送信します。
request = https.request(request, body)

puts request


ここで一回実行してみましょう。

$ ruby vision.rb image.jpg


返り値を見やすいように修正


vision.rb


require 'base64'
require 'json'
require 'net/https'

IMAGE_FILE = ARGV[0]
API_KEY = ENV['GOOGLE_VISION_API_KEY']
API_URL = "https://vision.googleapis.com/v1/images:annotate?key=#{API_KEY}"

base64_image = Base64.strict_encode64(File.new(IMAGE_FILE, 'rb').read)

body = {
requests: [{
image: {
content: base64_image
},
features: [
{
type: 'TEXT_DETECTION',
maxResults: 1
}
]
}]
}.to_json

uri = URI.parse(API_URL)
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
request["Content-Type"] = "application/json"
response = https.request(request, body)

# 返り値がJSON形式のため、JSONをrubyで扱えるように変換。
response_rb = JSON.parse(response.body)

puts response_rb



さらに見やすいように必要なデータだけ抽出しましょう!


vision.rb


require 'base64'
require 'json'
require 'net/https'

IMAGE_FILE = ARGV[0]
API_KEY = ENV['GOOGLE_VISION_API_KEY']
API_URL = "https://vision.googleapis.com/v1/images:annotate?key=#{API_KEY}"

base64_image = Base64.strict_encode64(File.new(IMAGE_FILE, 'rb').read)

body = {
requests: [{
image: {
content: base64_image
},
features: [
{
type: 'TEXT_DETECTION',
maxResults: 1
}
]
}]
}.to_json

uri = URI.parse(API_URL)
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
request["Content-Type"] = "application/json"
response = https.request(request, body)

response_rb = JSON.parse(response.body)

# データの必要なもののみ抽出
description = response_rb["responses"][0]["textAnnotations"][0]["description"]

puts description


ruby vision.rb image.jpg

TEXT_DETECTION(文字認識)ができたはずです!


GoogleCloudVision公式のチュートリアルを参考にいろいろやってみてください!

https://cloud.google.com/vision/docs/tutorials?hl=ja

TEXT_DETECTION(文字認識)の他にも様々な機能が用意されています!ぜひ使用してみてください!

LABEL(画像の分類 ex: この画像が猫である可能性は99%, 子猫である可能性は 45%)

LANDMARKS(この写真には東京タワーが写っている)


その他参考記事

JSONについて

https://dev.classmethod.jp/etc/concrete-example-of-json/

JSONサーバーのモック(模造品)を手軽につくる

https://qiita.com/futoase/items/2859a60c8b240da70572