1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Teachable Machineで飼い猫を判定する

Last updated at Posted at 2024-03-03

はじめに

お手軽に機械学習が出来るサービスを知ったので遊んでみた。

Teachable Machineとは

Teacheableっていうくらいだから教師あり学習のことね。よく知らんけど
判定したい内容の数だけ画像で種類を覚えこませて、結果が利用できる。Webブラウザ上からお手軽に

やってみること

純血種(ロシアンブルー)を飼っているので、「飼い猫」か「他のロシアンブルー」かを判定させてみよう。
ロシアンブルー100匹と紛れてしまったときに役立つかもしれない。そんなわけないけど、おもしろそう

サンプルデータの用意

学習に必要なサンプル画像を用意する。当たり前だけど多い方が精度はよくなる。
飼い猫の画像は500枚用意した。500枚くらい余裕だぜ

image.png

他のロシアンブルーの画像は学習用に外国のサイトがあったので利用させてもらった。

torrent経由で200枚のロシアンブルーの画像をダウンロードして使わせてもらう。

image.png

Teachable Machineの利用

https://teachablemachine.withgoogle.com にアクセスし、画像プロジェクトを選ぶ
image.png

標準の画像モデルを選ぶ
image.png

クラスの画面が表示されるので、判定したい種類毎に名前を変えておく。ここではMy catとOther Russian Buleにする。その後アップロードをクリック
image.png

アップロード画面が表示されるので、用意したサンプル画像をドラッグ&ドロップする
image.png

クラス数分アップロードしたら、「モデルをトレーニングする」をクリック
image.png

少し待つと学習が終わるので、「モデルをエクスポートする」をクリック

image.png

pythonを使いたいので、Tensorflowタブを選択してから、モデルをダウンロードをクリック
image.png

数分待つと converted_keras.zip がダウンロードされる。

ダウンロードしたファイル

解凍するとkeras_model.h5 と labels.txt が手に入る。前者はバイナリファイル、後者はテキストファイルで中身はインデックスとクラス名

labels.txt
0 My cat
1 Other Russian Blue

pythonのプログラム

モデルダウンロード時の画面にサンプルがあるので、ちょっとだけ修正する。
引数に画像ファイルを指定するようにした

cat.py
from keras.models import load_model  # TensorFlow is required for Keras to work
from PIL import Image, ImageOps  # Install pillow instead of PIL
import numpy as np

def judge(file_path):

    # Disable scientific notation for clarity
    np.set_printoptions(suppress=True)

    # Load the model
    model = load_model("keras_Model.h5", compile=False)

    # Load the labels
    class_names = open("labels.txt", "r", encoding='utf-8').readlines()

    # Create the array of the right shape to feed into the keras model
    # The 'length' or number of images you can put into the array is
    # determined by the first position in the shape tuple, in this case 1
    data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)

    # Replace this with the path to your image
    image = Image.open(file_path).convert("RGB")

    # resizing the image to be at least 224x224 and then cropping from the center
    size = (224, 224)
    image = ImageOps.fit(image, size, Image.Resampling.LANCZOS)

    # turn the image into a numpy array
    image_array = np.asarray(image)

    # Normalize the image
    normalized_image_array = (image_array.astype(np.float32) / 127.5) - 1

    # Load the image into the array
    data[0] = normalized_image_array

    # Predicts the model
    prediction = model.predict(data)
    index = np.argmax(prediction)
    class_name = class_names[index]
    confidence_score = prediction[0][index]

    # Print prediction and confidence score
    print("Class:", class_name[2:], end="")
    print("Confidence Score:", confidence_score)

    return class_name[2:].strip('\n'), confidence_score


# メイン関数
def main():

    file_name = 'aaa.jpg'
    class_name, score = judge(file_name)
    print(file_name + 'のファイルは' + f'{score * 100:0.3f}' + '%の確率で' + class_name + 'です!')


if __name__ == "__main__":
    main()

実行してみる

プログラムと同じディレクトリに、解凍した2ファイルと判定したい画像(aaa.jpg)を置いて実行すると、ちゃんと判定できた。ちょっと確率低いけど(笑)
image.png

おわりに

My cat と Other Russian Blue が判別できるかで遊んでみた。
ただ判定が難しい内容で学習させちゃった気はする。普通に間違えることもあったし。
手の形がグー、チョキ、パー、のどれか?とか、家電の電源がONかどうか、とかそういう用途でまた今度遊んでみようかな

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?