Vision API를 rails에 도입

google cloud platform 설정



[홈 화면]
① 프로젝트 만들기

[프로젝트 화면]
<인증 정보>
②API 키 발행
제한은 모두 「없음」으로 한다
<라이브러리>
③ 좋아하는 api를 선택하고 "활성화"를 누릅니다.

이 예에서는 Vision API를 사용합니다.



   ~Vision API의 이미지~
 [인수]          [반환값]
고양이 이미지 ▶ (Vision API) ▶ 배열 [머리, 고양이, 눈]

Rails 작업 환경 설정



①.env 파일 만들기
마우스 오른쪽 버튼 클릭 [new file] "/.env"

gemfile
gem 'dotenv-rails'

② 프로젝트와 연관하기 위한 API 키를 기입

.env
GOOGLE_API_KEY="APIキーの値"

③lib에 라이브러리의 호출 설정을 기재.

lib/vision.rb
require 'base64'
require 'json'
require 'net/https'

module Vision
  class << self
    def get_image_data(image_file)
      # APIのURL作成
      api_url = "https://vision.googleapis.com/v1/images:annotate?key=#{ENV['GOOGLE_API_KEY']}"

      # 画像をbase64にエンコード
      base64_image = Base64.encode64(open("#{Rails.root}/public/uploads/#{image_file.id}").read)

      # APIリクエスト用のJSONパラメータ
      params = {
        requests: [{
          image: {
            content: base64_image
          },
          features: [
            {
              type: 'LABEL_DETECTION'
            }
          ]
        }]
      }.to_json

      # Google Cloud Vision APIにリクエスト
      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, params)

      # APIレスポンス出力
      JSON.parse(response.body)['responses'][0]['labelAnnotations'].pluck('description').take(3)
    end
  end
end

④config에서 lib에 작성한 파일을 읽는 기술을 추가

config/application.rb
:
:
    config.load_defaults 5.2
    config.paths.add 'lib', eager_load: true # 追加
:
:

⑤ 기술 예
해석 결과의 카테고리를 관련지어 보존하는 테이블을 만든다.
해석하고 싶은 화상이 보존되고 있는 테이블이 photos라고 하면, 어소시에이션도 고려해, photo_id로 한다.

scheme.rb

  create_table "tags", force: :cascade do |t|
    t.string "name"
    t.integer "photo_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

bash
   rails db:migrate

controller

    #Visionモデルに画像を渡すと、その画像の解析し、当てはまるカテゴリーを配列として返す。
    tags = Vision.get_image_data(photo.image)
    #該当したタグの配列をeach文で小分けにしてcreateする。
    #1対多の便利な機能、「親.子供create」と記述すれば、親_idが勝手に保存される。   
    tags.each do |tag|
      photo.tags.create(name: tag)
    end


보기
<div class="tag-box">
  <% @photo.tags.each do |tag| %>
    <span class="label"><%= tag.name %></span>
  <% end %>
<?div>

이런 느낌이 된다.

좋은 웹페이지 즐겨찾기