画像分類器製造所
自己紹介
Python東海初参加🎉
10周年おめでとうございます🎉
画像分類器製造所とは
画像収集から分類器のデプロイまでイイカンジにできたのでその話
この流れでやればいろんな画像分類器作れそう
タイトルほどたいそれてはいない
Pythonで機械学習する話のつもりが大方GCPの話になった
https://gyazo.com/2f663b9d24401602d501196f6752e183
何を作るか
🏯城画像認識🏯
データセットなさそうなので集める必要がある
学習用の画像を収集する
Pythonでゴニョゴニョするならこれ使えばいいという感じ
クローリングのために使う
有効化にするAPI
Datalab使うのにいる
Datalab上のブックの管理
DatalabはCompute Engine上で動くため
datalab create [インスタンス名(任意)]
previewから8081ポートを指定して開く
二回目以降
datalab connect [インスタンス名(任意)]
バケット作っておく
gsutil mb -l us-central1 [BUCKET_NAME]
*(MLEngineフルサポは現在 us-central1のみ)
画像をクローリングする
!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枚くらい
画像を仕分ける
画像見分けるのはしんどい...
Googleさんの目で見分ける
有効化にする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)
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
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枚くらいに絞られた
分類機を作る
有効化にするAPI
ここからは基本的にチュートリアルの流れに沿う
trainデータとevalと分ける
trainデータに対してはAccracy 0.97~1.00くらいまで
evalデータに対してはAccuracy 0.85~0.87くらい
トレーニング済みのモデルに対して予測をリクエストしての結果の精度を検証
ほんとは今日写真撮って評価するデモしたかったがネットワーク...😭
▶ 一番下で検証してみたよ
トレーニング済みのモデルに対して予測をリクエストした結果
https://gyazo.com/31fda2a38c2a4b30858377f60a0cfe07
名古屋城の画像を無事名古屋城として判定してくれた(0.7弱と確度は微妙)
会場で撮影してきた城画像を検証してみた
https://gyazo.com/00d0cd68a92483a73850582b0069cc09
https://gyazo.com/cf4e1ab2d404fb8c1f7f2224f6ee7ca8
てんで駄目だった...😭
角度のせい??学習用にこんな確度ないかも
何れにせよ画像数少なかったので増やして検証してみる
費用感
トータル600円くらい
https://gyazo.com/7f250e47dd80672f12a3c15121ff8221