画像分類器製造所
#LT
LT for Python東海 第36回
自己紹介
phigasui
Python東海初参加🎉
10周年おめでとうございます🎉
画像分類器製造所とは
画像収集から分類器のデプロイまでイイカンジにできたのでその話
この流れでやればいろんな画像分類器作れそう
タイトルほどたいそれてはいない
Pythonで機械学習する話のつもりが大方GCPの話になった
https://gyazo.com/2f663b9d24401602d501196f6752e183
何を作るか
🏯城画像認識🏯
せっかく名古屋城で開催なので
データセットなさそうなので集める必要がある
学習用の画像を収集する
Datalabを使う
Cloud Shellからだと記録に残らない
Compute Engineだと環境構築とかめんどくさい 
Pythonでゴニョゴニョするならこれ使えばいいという感じ
クローリングのために使う
有効化にするAPI
Cloud Source Repositories API
Datalab使うのにいる
Datalab上のブックの管理
Compute Engine API
DatalabはCompute Engine上で動くため
Cloud Shellを起動
datalab create [インスタンス名(任意)]
previewから8081ポートを指定して開く
二回目以降
datalab connect [インスタンス名(任意)]
バケット作っておく
gsutil mb -l us-central1 [BUCKET_NAME]
*(MLEngineフルサポは現在 us-central1のみ)
画像をクローリングする
icrawlerを使う
Google, Bing, Flickerから画像を収集できる
Google Cloud Strageにも保存できる /icons/重要.icon
!pip install icrawler
code:crawler.py
from icrawler.builtin import GoogleImageCrawler
from icrawler.storage import GoogleStorage
castles = {
"nagoya": "名古屋城",
"inuyama": "犬山城",
"okazaki": "岡崎城",
"osaka": "大阪城",
"himeji": "姫路城",
}
for dir_name, keyword in castles.items():
gs_path = "gs://{bucket_name}/{dir_name}".format(dir_name=dir_name, bucket_name=BUCKET_NAME)
print(gs_path)
gs = GoogleStorage(gs_path)
google_crawler = GoogleImageCrawler(storage=gs)
google_crawler.crawl(keyword=keyword, max_num=IMAGE_NUM)
各400枚づづくらい集めた
計2,000枚くらい
画像を仕分ける
Cloud Vision API使う
画像見分けるのはしんどい...
Googleさんの目で見分ける
有効化にするAPI
Cloud Vision API
バケットの画像を公開する
gsutil iam ch allUsers:objectViewer gs://[BUCKET_NAME]
code:check_images.py
from google.cloud import vision
from google.cloud.vision import types
from google.cloud import storage
storage_client = storage.Client()
bucket = storage_client.get_bucket(BUCKET_NAME)
correct_labels = 'landmark', 'historic site', 'chinese architecture', 'castle', 'japanese architecture'
def detect_labels_uri(uri, threshold=0.8):
"""Detects labels in the file located in Google Cloud Storage or on the Web."""
client = vision.ImageAnnotatorClient()
image = types.Image()
image.source.image_uri = uri
response = client.label_detection(image=image)
labels = response.label_annotations
return label.description for label in labels if label.score >= threshold
correct_uris = []
for blob in bucket.list_blobs():
uri = "gs://{bucket_name}/{blob_name}".format(bucket_name=BUCKET_NAME, blob_name=blob.name)
detect_labels = detect_labels_uri(uri, 0.7)
print("checking... ", uri)
if len(set(detect_labels) & set(correct_labels)) > 0:
correct_uris.append(uri)
print('added')
# 一応保存しておく
import json
with open("images.json", 'w') as f:
json.dump(correct_uris, f)
幾つか(半分くらい)ノイズになりそうな画像を削って
1,000枚くらいに絞られた
分類機を作る
Cloud Machine Learning
Data Flowをつかう
有効化にするAPI
Cloud Machine Learning Engine
Cloud Dataflow
ここからは基本的にチュートリアルの流れに沿う
https://cloud.google.com/ml-engine/docs/tensorflow/flowers-tutorial
元のデータファイルを読み込み、Cloud Dataflow を使用してトレーニング用に TFRecords 形式に変換
trainデータとevalと分ける
Cloud Machine Learning Engine を使用してトレーニングを実行
Inception v3, 転移学習 画像枚数が少なくても精度出る
trainデータに対してはAccracy 0.97~1.00くらいまで
evalデータに対してはAccuracy 0.85~0.87くらい
トレーニング済みのモデルをCloud Machine Learning Engineでデプロイ
トレーニング済みのモデルに対して予測をリクエストしての結果の精度を検証
画像をCloud Datalabに入れる
base64の文字列に変換してjsonに詰める
Cloud Machine Learning EngineにデプロイされているモデルへPOSTして評価
ほんとは今日写真撮って評価するデモしたかったがネットワーク...😭
▶ 一番下で検証してみたよ
トレーニング済みのモデルに対して予測をリクエストした結果
https://gyazo.com/31fda2a38c2a4b30858377f60a0cfe07
名古屋城の画像を無事名古屋城として判定してくれた(0.7弱と確度は微妙)
会場で撮影してきた城画像を検証してみた
https://gyazo.com/00d0cd68a92483a73850582b0069cc09
https://gyazo.com/cf4e1ab2d404fb8c1f7f2224f6ee7ca8
てんで駄目だった...😭
角度のせい??学習用にこんな確度ないかも
そもそも大阪城と名古屋城見比べてもよう分からん
何れにせよ画像数少なかったので増やして検証してみる
費用感
トータル600円くらい
Cloud Vision APIちょっと高めであるが、自分で選別する手間を考えると安い!タイムイズマネー!
https://gyazo.com/7f250e47dd80672f12a3c15121ff8221
#LT #Python #GCP