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)