[Python]Deep Learning AI 機械学習でならった画像識別で犬と猫を判別してみた!


はじめに

どうも!初めまして!エンジニア転職するためマイペースに勉強してるRat(@rat857)です。
ななななななんと!初投稿にしていきなりディープラーニングとAIで画像識別制作です!
初投稿ということは、、、、そう!未熟者でございます。
至らぬ点やつっこみ所が満載ですw、優しくコメント、指摘などしてください。


目標

ディープラーニングで犬と猫の画像を識別、習ったことをアウトプットする。

全体の流れ

  1. 画像収集

  2. データの整形と学習データの作成

  3. 学習フェーズ

  4. 推論フェーズ

Pythonを使い、1~4の順番にコードを書いていきます。


↑いきなりまじめかよ!?wwwww

1.画像収集

!pip install icrawler

Icrawlerはネット上から画像を集めるプログラムです。

 #犬と猫の画像を収集 
from icrawler import crawler
from icrawler.builtin import BingImageCrawler

crawler = BingImageCrawler(storage = {"root_dir": "cat"})
crawler.crawl(keyword = "猫", max_num = 100)

crawler = BingImageCrawler(storage = {"root_dir": "dog"})
crawler.crawl(keyword = "犬", max_num=100)

こちらで犬と猫の画像を集めてきます。
実行すると犬と猫の画像を100枚集めフォルダが作成されます。

2.データの整形と学習データの作成

画像のダウンロードが終わり、次に入力データの前処理とデータの分割をしていきます。

from PIL import Image
import os, glob
import numpy as np
from PIL import ImageFile

ImageFile.LOAD_TRUNCATED_IMAGES = True

classes = ["dog", "cat"]
num_calsses = len(classes)
image_size = 64
num_testdata = 25

X_train = []
X_test = []
y_train = []
y_test = []
for index, classlabel in enumerate(classes):
  photos_dir = "./" + classlabel
  files = glob.glob(photos_dir + "/*.jpg")
  for i, file in enumerate(files):
    image = Image.open(file)
    image = image.convert("RGB")
    image = image.resize((image_size, image_size))
    data = np.asarray(image)
    if i < num_testdata:
      X_test.append(data)
      y_test.append(index)
    else:
      for angle in range(-20, 20, 5):

        img_r = image.rotate(angle)
        data = np.asarray(img_r)
        X_train.append(data)
        y_train.append(index)

        img_trains = img_r.transpose(Image.FLIP_LEFT_RIGHT)
        data = np.asarray(img_trains)
        X_train.append(data)
        y_train.append(index)

X_train = np.array(X_train)
X_test = np.array(X_test)
y_train = np.array(y_train)
y_test = np.array(y_test)

xy = (X_train, X_test, y_train, y_test)
np.save("./dog_cat.npy", xy)

コードnumpysave()により、dog_cat.npyというファイルでデータセットを作成しました。
PILはPython lmaging Libraryという画像処理の為のプログラムです。

ちなみに他のコードはあらかじめのモデルのようなものですので私は残念ながら理解できていません。。。。。
理解できる日が来ることを願ってます。。。。。。。。。。w


3.学習フェーズ

こちらはAI(認識モデル)を作るメインコードになります。
このコードの実行により「学習(機械学習)」を行います。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from tensorflow.keras.optimizers import RMSprop

from keras.utils import np_utils
import tensorflow
import keras
import numpy as np

classes = ["dog", "cat"]
num_classes = len(classes)
image_size = 64

 #データを読み込む関数 

def load_data():
  X_train, X_test, y_train, y_test = np.load("./dog_cat.npy", allow_pickle = True)

  X_train = X_train.astype("float") / 255
  X_test = X_test.astype("float") / 255

  y_train = np_utils.to_categorical(y_train, num_classes)
  y_test = np_utils.to_categorical(y_test, num_classes)

  return X_train, y_train, X_test, y_test
from keras.optimizers import RMSprop
 #モデルを学習する関数 

def train(X, y, X_test, y_test):
  model = Sequential()


  model.add(Conv2D(32, (3, 3), padding = "same", input_shape = X.shape[1:]))
  model.add(Activation("relu"))
  model.add(Conv2D(32, (3, 3)))
  model.add(Activation("relu"))
  model.add(MaxPooling2D(pool_size = (2, 2)))
  model.add(Dropout(0.1))

  model.add(Conv2D(64, (3, 3), padding = "same"))
  model.add(Activation("relu"))
  model.add(Conv2D(64, (3, 3)))
  model.add(Activation("relu"))
  model.add(MaxPooling2D(pool_size = (2, 2)))
  model.add(Dropout(0.25))

  model.add(Flatten())
  model.add(Dense(512))
  model.add(Activation("relu"))
  model.add(Dropout(0.45))
  model.add(Dense(2))
  model.add(Activation("softmax"))
  opt = RMSprop(lr = 0.00005, decay = 1e-6)

  model.compile(loss = "categorical_crossentropy", optimizer = opt, metrics = ["accuracy"])
  model.fit(X, y, batch_size = 28, epochs = 40)


  return model


 #メイン開発 、データの読み込みとモデルの学習を行います。

def main():
    X_train, y_train, X_test, y_test = load_data()
    model = train(X_train, y_train, X_test, y_test)
    model.save("/content/drive/MyDrive/cnn.h5")
    

main()  

↑こちらの学習フェーズのコードを実行することにより、学習処理(機械が学習)をしてくれます。
処理が終わると model.save() コードで cnn.h5 というファイルを保存します。(cnn.h5でなくともdogcat.f1という名前にしてもいいよ、適当よ)

4.推論フェーズ

次がいよいよかわいい犬or猫の画像をダウンロード、アップロードしていき~!
学習させたプログラムに犬か猫か判別していただきます!!

import keras
import sys, os
import numpy as np
from PIL import Image
from keras.models import load_model

imsize = (64, 64)

testpic = "識別したい画像のファイル名"
keras_param = "/content/drive/MyDrive/cnn.h5"


def load_image(path):
  img = Image.open(path)
  print(img)
  # img = img.conert("RGB")
  img = img.resize(imsize)
  img = np.asarray(img)
  img = img / 255
  return img 

model = load_model(keras_param)
img = load_image(testpic)
prd = model.predict(np.array([img]))
print(prd)

prelabel = np.argmax(prd, axis = 1)
if prelabel == 0:
  print(">>> 犬")
elif prelabel == 1:
  print(">>> 猫")  


蒼いお目目のろんぱりCATスイちゃんです(=^・・^=)

こちらの画像を識別してもらいます!
最強のプログラム我々(人間)からすれば一瞬で猫とわかりますが、こちらのプログラムは判別できるのでしょうか!?












結果..…

1/1 [==============================] - 0s 81ms/step [[0.99562104 0.0543207894]] >>> 猫

はい、機械にもわかるまごうことなき  です!!!

というように正しく判別できました!
いやーすごい、一番最初にできた人すごすぎる。。。

まとめ

こちらの画像識別は他のブログなどを参考にさせていただきました。
参考といってもほぼまるパクリ。
でもこうやってアウトプットすることでより理解、学ぶことができました。
他にも識別プログラムをつくりたいのでデータ整形、学習コードなどに手を加えられるようにしたいですね、、、、むずいだろうな。
最初はまねしてそれを理解して自分でつくる。
真似はあまりよくないイメージですがプログラミング学習ではものすごく重要だとわかりました。

最後に

私個人的な話になります。
こうやって学習していますが物凄く自信がなく、学習したことを覚えてないですし、ペースも鈍足、コードをしっかり組めるか、エラーの対処などできない。
スクールの先生に質問して説明していただいても理解してないのに、わかったふりをしてしまいます。
それでもやりたいから学習しています。
できるようになりたい。
自分のペースで。少しずつでも。
私と同じように思ってる人はいるんですかね。

いつか覚醒するのかな。。。。。



この記事が気に入ったらサポートをしてみませんか?