【Rails】Cloud Vision API를 사용하여 이미지 분석하고 과격한 이미지를 감지하는 방법

목표


refile에서 사용자의 프로필 이미지를 편집하면,
업로드 할 이미지를 Cloud Vision API로 이미지 분석하고,
과격한 화상의 경우는 DB에 보존할 수 없게 한다.

개발 환경



· Ruby : 2.5.7
·Rails: 5.2.4
·Vagrant: 2.2.7
· VirtualBox : 6.1
· OS : macOS Catalina

전제



하기 실장 완료.

로그인 기능 구현
게시 기능 구현

Cloud Vision API 사용



1. 아래 기사의 'Geocoding API 사용'과 유사한 단계에서 Cloud Vision API를 사용 설정합니다.



Geolocation API를 사용하여 위도 경도를 계산하는 방법

2. 홈 화면으로 전환하고 IAM 및 관리를 클릭합니다.





3. 서비스 계정을 클릭합니다.





4. 서비스 계정 추가를 클릭합니다.





5. 서비스 계정 이름(적절하고 좋음)을 입력하고 만들기를 클릭합니다.





6. 계속을 클릭합니다.





7. 키 만들기를 클릭합니다.





8. 키 유형을 JSON으로 설정하고 만들기를 클릭합니다.





9. 키가 생성되었는지 확인하고 닫기를 클릭





10. 마침을 클릭





11. 키를 애플리케이션 바로 아래로 이동





Cloud Vision API 평가 정보



평가 카테고리




카테고리
내용


adult
성인 이미지인지 여부

spoof
인터넷 밈인지 여부

medical
인터넷 밈인지 여부

violence
폭력적인 이미지인지 여부

racy
끔찍한 이미지인지 여부


평가값




평가값
정도


UNKNOWN
분석 불가

VERY_UNLIKELY
매우 낮음

UNLIKELY
낮은

POSSIBLE
가능성 있음

LIKELY
높은

VERY_LIKELY
매우 높음


구현



1.Gem 도입



평가 카테고리에 관계없이 평가 값이 LIKELY 또는 VERY_LIKELY포함하는 경우 DB에 저장하지 않도록 구현합니다.

Gemfile
gem 'google-cloud-vision'

터미널
$ bundle

2. Cloud Vision API 설정 파일을 만들고 편집



터미널
$ touch lib/vision.rb

lib/vision.rb
require 'base64'
require 'json'
require 'net/https'
module Vision
  class << self
    def image_analysis(profile_image)
      image_annotator = Google::Cloud::Vision::ImageAnnotator.new(
          version: :v1,
          credentials: JSON.parse(File.open('キーのファイル名') do |f| f.read end)
      )

      # リクエストパラメータ作成
      image = profile_image # 解析させたい画像(引数)
      requests_content = { image: { content: image }, features: [{ type: :SAFE_SEARCH_DETECTION }] }
      requests =   [requests_content]

      # Cloud Vision APIに画像を送信
      response = image_annotator.batch_annotate_images(requests)
      result = response.responses[0].safe_search_annotation.to_h

      # 解析結果が「LIKELY」又は「VERY_LIKELY」を含む場合はfalse、それ以外はtrueを返す
      if result.values.include?(:LIKELY) || result.values.include?(:VERY_LIKELY)
        return false
      else
        return true
      end
    end
  end
end

3. 컨트롤러 편집



users_controller.rb
def update
  # 画像が編集された場合
  if params[:user][:profile_image].present?
    # パラメーター(画像)を「tempfile」として開いて変数に代入
    profile_image = File.open(params[:user][:profile_image].tempfile)
    # Cloud Vision APIで画像分析して、分析結果を変数に代入
    result = Vision.image_analysis(profile_image)
  else
    # 画像が編集されてない場合は「true」を代入
    result = true
  end
  # 解析結果によって条件分岐
  if result == true
    @user.update(user_params)
    redirect_to user_user_path(@user)
  elsif result == false
    flash[:notice] = '画像が不適切です'
    render 'edit'
  end
end

좋은 웹페이지 즐겨찾기