無料運用 LINEbotでAIの顔認識webサービスができるまで。 ~Google Colaboratoryの使い方~

2019/11/16

AI 開発試行

Heroku上にPythonアプリケーションを作る際には、デバッグ環境がないと、[git add -> commit -> push]をその都度行わないといけないため、結構面倒なことになります。ローカル環境にLinuxがないといったり、一から環境を作るのが面倒なときは、Google Colaboratoryを使うことで、defの機能確認が簡単にできます この記事では、機械学習の教育や研究用に提供しているツールであるGoogle Colaboratory の使い方を紹介します。


Google Colaboratoryの使い方


Google Colaboratoryの起動
Google Chromeブラウザにて、「Colaboratory へようこそ」にアクセスするだけです。おなじみのGoogleアカウント認証が行われ、Jupyter Notebookが起動します。
たったこれだけで、pythonの開発に必要なローカル環境(Linuxサーバー)が手に入ります。



Google Colaboratoryのソースの配置
Google DriveのMy Drive以下にColab Notebooksフォルダができ、ソースは、デフォルトで、.ipynbファイルとして保存されます。自分が作成した.pyファイルをソース上にimportしたい場合は、ここに配置することで利用できます。※その他のファイルも同様に使えるかもしれませんね。



Google Colaboratory上でGoogle Driveを利用する

# Google Drive Mount.実行すると認証用のURLが表示される。リンク先で表示されるコードをColaboratoryに入力する。
import google.colab
google.colab.drive.mount('/content/gdrive')
Google Colaboratory上で、.pyファイルをimportする

# Pythonでimportの対象ディレクトリのパスを追加。
# たまにimportが動かない。ランタイム→再起動すると解消。
import sys
sys.path.append('/content/gdrive/My Drive/Colab Notebooks')
Google Colaboratory上で、サーバにファイルをアップロード/ダウンロードする

# GoogleColab上のサーバにファイルをアップロード/ダウンロード
from google.colab import files
uploaded = files.upload()
 
files.upload("test3.jpg")
マジックコマンド
!と%を使うことで、Google Colaboratory上でbashコマンドが使えます。


# ディレクトリ作成
!mkdir test
# ディレクトリ移動
%cd test
# ファイル確認
!ls
# Colaboratoryのルートディレクトリに戻る
%cd /content/
# pipコマンド
!pip install boxsdk[jwt] 
!pip install -q http://download.....linux_x86_64.whl





ブラウザ上で画像を表示するためのDef

from PIL import Image, ImageDraw, ImageFont
from matplotlib import pyplot as plt
from   io import BytesIO
import numpy as np
%matplotlib inline 


def img_plt(merge_img):
   #JPGバイナリデータをnumpy配列に変換し、matplotlibでプロットする。
   #メモリに保持してディレクトリ偽装みたいなことをして
   im = Image.open(BytesIO(merge_img))
   print(im.size)
   plt.imshow(np.asarray(im)) 
.pyのImport

# import library
import face_detect as fd

PILによる画像サイズ変更Def

# main call_change_image
from PIL import Image, ImageDraw, ImageFont
from   io import BytesIO

def change_image(im,size) :
   # size x Height の比率にする
   if im.width > size:
       proportion = size / im.width 
       im = im.resize((int(im.width * proportion), int(im.height * proportion)),Image.NEAREST)

   # 空のインスタンスを作り、保存する。
   img = BytesIO()
   im.save(img,"JPEG")
   # バイナリデータを取得する(open().read()状態)
   return img.getvalue()
ソース例.Face++ Detect APIの呼び出し

import requests
import base64
from datetime import datetime
from PIL import Image, ImageDraw, ImageFont

# 環境設定
FACE_API_KEY = 'dxxx'
FACE_API_SECRET = 'Jxxx'

----+----+----+----+
def call_image_apis1(push_img):
   msg = ''

   # APIに通すためbase64エンコード
   push_img64 = base64.b64encode(push_img)

   # Face++ Detect API
   msg = fd.face_detect(push_img64,FACE_API_KEY,FACE_API_SECRET)
   return msg

----+----+----+----+
# Webからファイルを読み込む場合
'''
# 画像データGET
url = "http://hogehoge.com/hoge.jpg"
r = requests.get(url)
# 画像をiter_contentで、少しずつpush_imgに順次代入
push_img = b""
for chunk in r.content.iter_content(): 
   push_img += chunk
'''
# ローカルからファイルを読み込む場合
with open('test3.jpg', 'rb') as f:
   push_img = f.read()

----+----+----+----+
#メモリに保持してディレクトリ偽装みたいなことをして、PILで読み込む
im = Image.open(BytesIO(push_img))

# PILで1600 x Height の比率にして、JPGバイナリデータに戻す。
if im.width > 1600:
   push_img = change_image(im,1600)

----+----+----+----+
msg=call_image_apis1(push_img)

print(msg)

img_plt(push_img)


ブログ アーカイブ

このブログを検索

tosd Noteについて

RSS Feed資格や仕事、サラリーマンとしての備忘録です。