PythonMania

普段はロボットとAIを組み合わせて色々作ってます。Python関係以外も色々投稿していくと思います。

【Python】画像認識 - kerasで InceptionResNetV2をfine-tuningしてみる 【DeepLearning】

f:id:mizuhiki0111:20190430180019p:plain


今回は InceptionResNetV2 モデルをfine-tuningしてみたいと思います。




基本的な流れは以前紹介したVGG16やXceptionと同様ですが、

InceptionResNetV2の場合は学習させる画像のサイズを139以上に設定しないとエラーが起きます。

keras.io





また固定する層の数も変更が必要なので、ここら辺は調整してみてください。





以下コードです。


#必要なライブラリの読み込み

from sklearn.model_selection import train_test_split
import numpy as np
from PIL import Image
import os
from glob import glob
from sklearn.preprocessing import LabelEncoder
import cv2
from keras.utils import np_utils
from matplotlib import pyplot as plt
import pandas as pd



#画像のサイズ指定
ScaleTo = 150
seed = 7
n_categories = 12

#トレーニングデータの読み込み
data_dir ="../input/train"
path = "../input/train/*/*.png"
files = glob(path)

trainImg = []
trainLabel = []
j = 1
num = len(files)

#画像データをリストに格納
for img in files:
    print(str(j) + "/" + str(num) , end="\r")
    trainImg.append(cv2.resize(cv2.imread(img) ,(ScaleTo,ScaleTo)))
    #trainLabel.append(img.split("/")[-2])
    j += 1


#ラベルをリストに格納
for dir in os.listdir(data_dir):
    if dir == ".DS_Store":
        continue
    dir1 = data_dir + "/" + dir
    label = dir

    for file in os.listdir(dir1):
        if file != "Thumbs.db":

            trainLabel.append(label)


# kerasに渡すためにnumpy配列に変換。
image_list = np.asarray(trainImg)
label_list = pd.DataFrame(trainLabel)


clearTrainImg = []
examples = [];getEx = True

for img in image_list:
    #ぼかしを入れてノイズを除去
    blurImg = cv2.GaussianBlur(img ,(5,5),0)
    #RGBからHSVに変換
    hsvImg = cv2.cvtColor(blurImg , cv2.COLOR_BGR2HSV)
    #マスクを作成
    lower_green = (25,40,50)
    upper_green = (75,255,255)
    mask = cv2.inRange(hsvImg , lower_green ,upper_green)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))
    mask = cv2.morphologyEx(mask , cv2.MORPH_CLOSE,kernel)

    #ブールマスクの作成
    bMask = mask > 0

    #マスクの適用
    #空のイメージの作成
    clear = np.zeros_like(img , np.uint8)
    #オリジナル画像にブールマスクを適用
    clear[bMask] = img[bMask]

    clearTrainImg.append(clear)


for i in range(8):
    plt.subplot(2, 4, i + 1)
    plt.imshow(clearTrainImg[i])


clearTrainImg = np.asarray(clearTrainImg)
clearTrainImg.shape
# クラスの形式を変換
le = LabelEncoder()
le = le.fit(label_list)
label_list = le.transform(label_list)
label_list
label_list = np_utils.to_categorical(label_list)
label_list

X_train, X_test, y_train, y_test = train_test_split(clearTrainImg, label_list, test_size=0.33, random_state=0)



from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
        rotation_range=180,  # randomly rotate images in the range
        zoom_range = 0.1, # Randomly zoom image
        width_shift_range=0.1,  # randomly shift images horizontally
        height_shift_range=0.1,  # randomly shift images vertically
        horizontal_flip=True,  # randomly flip images horizontally
        vertical_flip=True  # randomly flip images vertically
    )
datagen.fit(X_train)











#モデル作成・学習
from keras.applications.inception_resnet_v2 import InceptionResNetV2
from keras.models import Model
import tensorflow as tf
import keras
from tensorflow import keras
from keras.layers import Conv2D, MaxPooling2D,Input
from keras.layers import Dense, Dropout, Flatten, Activation,GlobalAveragePooling2D,Input
from keras.models import Sequential
from keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint
from keras.optimizers import Adam
from keras import optimizers

nb_classes = 12

# InceptionResNetV2のロード。FC層は不要なので include_top=False
input_tensor = Input(shape=(ScaleTo, ScaleTo,3))
inception_v3 = InceptionResNetV2(include_top=False, weights='imagenet', input_tensor=input_tensor)

# FC層の作成
top_model = Sequential()
top_model.add(Flatten(input_shape=inception_v3.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(nb_classes, activation='softmax'))

#  InceptionResNetV2とFC層を結合してモデルを作成(完成図が上の図)
inception_v3_model = Model(input=inception_v3.input, output=top_model(inception_v3.output))

# InceptionResNetV2の一部の重みを固定(frozen)
for layer in inception_v3_model.layers[:775]:
    layer.trainable = False

# 多クラス分類を指定
inception_v3_model.compile(loss='categorical_crossentropy',
          optimizer=optimizers.SGD(lr=1e-3, momentum=0.9),
          metrics=['accuracy'])
inception_v3_model.summary()


#モデルの層数を確認
print("{}層".format(len(inception_v3_model.layers)))



#学習の実行
hist = inception_v3_model.fit_generator(datagen.flow(X_train, y_train, batch_size=75),
                        epochs=35, validation_data=(X_test, y_test),
                        steps_per_epoch=X_train.shape[0])


#モデルの評価
print(inception_v3_model.evaluate(X_train, y_train)) #トレーニングの精度
print(inception_v3_model.evaluate(X_test, y_test))  #テスト精度


#パラメータの保存
model.save_weights('../content/weights.h5')

【Python】画像認識 - kerasでXceptionをfine-tuningしてみる 【DeepLearning】

f:id:mizuhiki0111:20190430180019p:plain

前回はVGG16を転移学習してみましたが、今回はKerasに含まれているpretrained_modelのうちXceptionを扱ってみたいと思います。








以前の記事でも書きましたが、XceptionはInceptionというモデルの改良版であり、


パラメータ・層の深さともに軽量化されています。



草の深さに関していえば、Inceptionよりは少ないですが、前回学習したVGG16よりはかなりディープです。



f:id:mizuhiki0111:20190417133447p:plain



今回はモデルごとの精度を比較するためなので、モデルを変更した以外は前回とほぼ一緒です。


スポンサードリンク




以下コードになります。

#必要なライブラリの読み込み

from sklearn.model_selection import train_test_split
import numpy as np
from PIL import Image
import os
from glob import glob
from sklearn.preprocessing import LabelEncoder
import cv2
from keras.utils import np_utils
from matplotlib import pyplot as plt
import pandas as pd



#画像のサイズ指定
ScaleTo = 70
seed = 7
n_categories = 12

#トレーニングデータの読み込み
data_dir ="../input/train"
path = "../input/train/*/*.png"
files = glob(path)

trainImg = []
trainLabel = []
j = 1
num = len(files)

#画像データをリストに格納
for img in files:
    print(str(j) + "/" + str(num) , end="\r")
    trainImg.append(cv2.resize(cv2.imread(img) ,(ScaleTo,ScaleTo)))
    #trainLabel.append(img.split("/")[-2])
    j += 1


#ラベルをリストに格納
for dir in os.listdir(data_dir):
    if dir == ".DS_Store":
        continue
    dir1 = data_dir + "/" + dir
    label = dir

    for file in os.listdir(dir1):
        if file != "Thumbs.db":

            trainLabel.append(label)


# kerasに渡すためにnumpy配列に変換。
image_list = np.asarray(trainImg)
label_list = pd.DataFrame(trainLabel)


clearTrainImg = []
examples = [];getEx = True

for img in image_list:
    #ぼかしを入れてノイズを除去
    blurImg = cv2.GaussianBlur(img ,(5,5),0)
    #RGBからHSVに変換
    hsvImg = cv2.cvtColor(blurImg , cv2.COLOR_BGR2HSV)
    #マスクを作成
    lower_green = (25,40,50)
    upper_green = (75,255,255)
    mask = cv2.inRange(hsvImg , lower_green ,upper_green)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))
    mask = cv2.morphologyEx(mask , cv2.MORPH_CLOSE,kernel)

    #ブールマスクの作成
    bMask = mask > 0

    #マスクの適用
    #空のイメージの作成
    clear = np.zeros_like(img , np.uint8)
    #オリジナル画像にブールマスクを適用
    clear[bMask] = img[bMask]

    clearTrainImg.append(clear)


for i in range(8):
    plt.subplot(2, 4, i + 1)
    plt.imshow(clearTrainImg[i])


clearTrainImg = np.asarray(clearTrainImg)
clearTrainImg.shape
# クラスの形式を変換
le = LabelEncoder()
le = le.fit(label_list)
label_list = le.transform(label_list)
label_list
label_list = np_utils.to_categorical(label_list)
label_list

X_train, X_test, y_train, y_test = train_test_split(clearTrainImg, label_list, test_size=0.33, random_state=0)



from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
        rotation_range=180,  # randomly rotate images in the range
        zoom_range = 0.1, # Randomly zoom image
        width_shift_range=0.1,  # randomly shift images horizontally
        height_shift_range=0.1,  # randomly shift images vertically
        horizontal_flip=True,  # randomly flip images horizontally
        vertical_flip=True  # randomly flip images vertically
    )
datagen.fit(X_train)











#モデル作成・学習
from keras.applications.xception import Xception
from keras.models import Model
import tensorflow as tf
import keras
from tensorflow import keras
from keras.layers import Conv2D, MaxPooling2D,Input
from keras.layers import Dense, Dropout, Flatten, Activation,GlobalAveragePooling2D,Input
from keras.models import Sequential
from keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint
from keras.optimizers import Adam
from keras import optimizers


nb_classes = 12

# Xceptionのロード。FC層は不要なので include_top=False
input_tensor = Input(shape=(ScaleTo, ScaleTo, 3))
xception = Xception(include_top=False, weights='imagenet', input_tensor=input_tensor)

top_model = Sequential()
top_model.add(Flatten(input_shape=xception.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(nb_classes, activation='softmax'))

# Xceptionと上記モデルを結合
xception_model = Model(input=xception.input, output=top_model(xception.output))

# 50層までのパラメータを固定(frozen)
for layer in xception_model.layers[:50]:
    layer.trainable = False

# 多クラス分類を指定
xception_model.compile(loss='categorical_crossentropy',
          optimizer=optimizers.SGD(lr=1e-3, momentum=0.9),
          metrics=['accuracy'])
xception_model.summary()




#学習の実行
hist = xception_model.fit_generator(datagen.flow(X_train, y_train, batch_size=75),
                        epochs=35, validation_data=(X_test, y_test),
                        steps_per_epoch=X_train.shape[0])

                        steps_per_epoch=X_train.shape[0])


#モデルの評価
print(xception_model.evaluate(X_train, y_train)) #トレーニングの精度

【Python】画像認識 - KerasでVGG16のfine-tuningを試してみる 【DeepLearning】

f:id:mizuhiki0111:20190430180019p:plain

これまでfastaiを使った転移学習は行ってきましたが、学習した結果を使って

アプリを作成したりする場合にはKeras(Tensorflow)の方が便利そうだったので

今回はkerasを使った転移学習を行っていきます。



学習に使用するデータセットは例によってKaggleのいつものやつを使います。
(書いていませんでしたが、データセットをダウンロードするためにはKaggleへの登録が必要です)


www.kaggle.com



Kerasにも事前学習済モデルが用意されており、以下のモデルが使えるみたいです。



Xception
VGG16
VGG19
ResNet50
InceptionV3
InceptionResNetV2
MobileNet
DenseNet121
DenseNet169
DenseNet201


keras.io




今回はVGG16を使用して作成していきます。

ちなみにモデルを呼び出すときは

from keras.applications.vgg16 import VGG16

こんな感じで書けは使用することができます。


①画像・ラベルの読み込み・前加工・Keras形式のデータセット作成

#必要なライブラリのインポート
from sklearn.model_selection import train_test_split
import numpy as np
from PIL import Image
import os
from glob import glob
from sklearn.preprocessing import LabelEncoder
import cv2
from keras.utils import np_utils
from matplotlib import pyplot as plt
import pandas as pd

#画像のサイズ指定・カテゴリ数等指定
ScaleTo = 70
seed = 7
num_clases = 12



#トレーニングデータの読み込み
#画像データをフォルダ毎に分けて入れておけば、ラベルデータも生成してくれる

data_dir = "~/train"
path = "~/train/*/*.png"
files = glob(path)

trainImg = []
trainLabel = []
j = 1
num = len(files)

for img in files:
    print(str(j) + "/" + str(num) , end="\r")
    trainImg.append(cv2.resize(cv2.imread(img) ,(ScaleTo,ScaleTo)))
    j += 1


#ラベルデータの読み込み
for dir in os.listdir(data_dir):
    if dir == ".DS_Store":
        continue

    dir1 = data_dir + "/" + dir
    label = dir

    for file in os.listdir(dir1):
        if file != "Thumbs.db":
            trainLabel.append(label)

# kerasに渡すために画像をnumpy配列・ラベルをpd.Daraframeに変換。
image_list = np.asarray(trainImg)
label_list = pd.DataFrame(trainLabel)




画像の前加工
clearTrainImg = []
examples = [];getEx = True

for img in image_list:
    #ぼかしを入れてノイズを除去
    blurImg = cv2.GaussianBlur(img ,(5,5),0)
    #RGBからHSVに変換
    hsvImg = cv2.cvtColor(blurImg , cv2.COLOR_BGR2HSV)
    #マスクを作成
    lower_green = (25,40,50)
    upper_green = (75,255,255)
    mask = cv2.inRange(hsvImg , lower_green ,upper_green)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))
    mask = cv2.morphologyEx(mask , cv2.MORPH_CLOSE,kernel)

    #ブールマスクの作成
    bMask = mask > 0

    #マスクの適用
    #空のイメージの作成
    clear = np.zeros_like(img , np.uint8)
    #オリジナル画像にブールマスクを適用
    clear[bMask] = img[bMask]

    clearTrainImg.append(clear)

#8枚ほど表示してみる
for i in range(8):
    plt.subplot(2, 4, i + 1)
    plt.imshow(clearTrainImg[i])


#加工後の画像もnp配列に変換
clearTrainImg = np.asarray(clearTrainImg)
clearTrainImg.shape

#画像の正則化
clearTrainImg = clearTrainImg / 255




# ラベルをワンホットエンコーディング
le = LabelEncoder()
le = le.fit(label_list)
label_list = le.transform(label_list)
label_list
label_list = np_utils.to_categorical(label_list)
label_list

#トレーニングデータとバリデーションデータの分割
X_train, X_test, y_train, y_test = train_test_split(clearTrainImg, label_list, test_size=0.33, random_state=0)


#kerasのImageDataGeneratorを使いオーグメンテーションを指定
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
        rotation_range=180,  # randomly rotate images in the range
        zoom_range = 0.1, # Randomly zoom image
        width_shift_range=0.1,  # randomly shift images horizontally
        height_shift_range=0.1,  # randomly shift images vertically
        horizontal_flip=True,  # randomly flip images horizontally
        vertical_flip=True  # randomly flip images vertically
    )
datagen.fit(X_train)






②モデルの構築

#必要なライブラリの読み込み
from keras.applications.vgg16 import VGG16
from keras.models import Model
import tensorflow as tf
import keras
from tensorflow import keras
from keras.layers import Conv2D, MaxPooling2D,Input
from keras.layers import Dense, Dropout, Flatten, Activation,GlobalAveragePooling2D,Input
from keras.models import Sequential
from keras.callbacks import EarlyStopping, ReduceLROnPlateau, ModelCheckpoint
from keras.optimizers import Adam
from keras import optimizers



# VGG16のロード。FC層は不要なので include_top=False
input_tensor = Input(shape=(ScaleTo, ScaleTo, 3))
vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)



# 最下層の出力層等オリジナルモデル部分をSequentialモデルで作成
top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(nb_classes, activation='softmax'))


# VGG16とオリジナルモデル部分を結合してモデルを作成
vgg_model = Model(input=vgg16.input, output=top_model(vgg16.output))

#一旦モデル全体を表示してみる
vgg_model.summary()

# input層を含めた15層目までは重みを固定
#最初の方の層は、汎用的な特徴検出に使われるため
#個々の部分の学習を省略することで効率よく学習を進めることができる
for layer in vgg_model.layers[:15]:
    layer.trainable = False


#モデルをコンパイル、多クラス分類を指定
vgg_model.compile(loss='categorical_crossentropy',
          optimizer=optimizers.SGD(lr=1e-3, momentum=0.9),
          metrics=['accuracy'])
vgg_model.summary()


③学習の実行

#学習の実行
hist = vgg_model.fit_generator(datagen.flow(X_train, y_train, batch_size=75),
                        epochs=35, validation_data=(X_test, y_test),
                        steps_per_epoch=X_train.shape[0])



④パラメータの保存と精度の評価

#パラメータの保存
vgg_model.save_weights('mnist_mlp_weights.h5')


print(vgg_model.evaluate(X_train, y_train)) #トレーニングの精度
print(vgg_model.evaluate(X_test, y_test))  #テスト精度


④テストデータの成型と推論、提出用データの作成


path = "~/test/*.png"
files = glob(path)

testImg = []
testId = []
j = 1
num = len(files)


for img in files:
    print("Obtain images: " + str(j) + "/" + str(num), end='\r')
    testId.append(img.split('/')[-1])  # Images id's
    testImg.append(cv2.resize(cv2.imread(img), (ScaleTo, ScaleTo)))
    j += 1

testImg = np.asarray(testImg)  # Train images set

for i in range(8):
    plt.subplot(2, 4, i + 1)
    plt.imshow(testImg[i])






#テストデータの成型
clearTestImg = []
examples = []; getEx = True
for img in testImg:
    # Use gaussian blur
    blurImg = cv2.GaussianBlur(img, (5, 5), 0)

   
    hsvImg = cv2.cvtColor(blurImg, cv2.COLOR_BGR2HSV)

    
    lower_green = (25, 40, 50)
    upper_green = (75, 255, 255)
    mask = cv2.inRange(hsvImg, lower_green, upper_green)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11, 11))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    
    bMask = mask > 0

    
    clear = np.zeros_like(img, np.uint8)  # Create empty image
    clear[bMask] = img[bMask]  # Apply boolean mask to the origin image

    clearTestImg.append(clear)  # Append image without backgroung

    
    if getEx:
        plt.subplot(2, 3, 1); plt.imshow(img)  # Show the original image
        plt.subplot(2, 3, 2); plt.imshow(blurImg)  # Blur image
        plt.subplot(2, 3, 3); plt.imshow(hsvImg)  # HSV image
        plt.subplot(2, 3, 4); plt.imshow(mask)  # Mask
        plt.subplot(2, 3, 5); plt.imshow(bMask)  # Boolean mask
        plt.subplot(2, 3, 6); plt.imshow(clear)  # Image without background
        getEx = False

clearTestImg = np.asarray(clearTestImg)

clearTestImg = clearTestImg / 255





pred = vgg_model.predict(clearTestImg)


#提出ファイルの作成
predNum = np.argmax(pred, axis=1)
predStr = le.classes_[predNum]

res = {'file': testId, 'species': predStr}
res = pd.DataFrame(res)
res.to_csv("res.csv", index=False)

【Python】画像認識 - Kerasで学習を行えるようにデータセットを整形する 【DeepLearning】

f:id:mizuhiki0111:20190430180019p:plain



from sklearn.model_selection import train_test_split
import numpy as np
from PIL import Image
import os
from glob import glob
from sklearn.preprocessing import LabelEncoder
import cv2

#画像のサイズ指定
ScaleTo = 70
seed = 7

#トレーニングデータの読み込み
data_dir = "~/train"
path = "~/train/*/*.png"
files = glob(path)

trainImg = []
trainLabel = []
j = 1
num = len(files)

#画像データの読み込み
for img in files:
    print(str(j) + "/" + str(num) , end="\r")
    trainImg.append(cv2.resize(cv2.imread(img) ,(ScaleTo,ScaleTo)))
    #trainLabel.append(img.split("/")[-2])
    j += 1

#ラベルデータの読み込み
for dir in os.listdir(data_dir):
    if dir == ".DS_Store":
        continue

    dir1 = data_dir + "/" + dir

    label = dir

    for file in os.listdir(dir1):
        if file != "Thumbs.db":

            # 配列label_listに正解ラベルを追加
            trainLabel.append(label)
        

# kerasに渡すためにnumpy配列に変換。
image_list = np.array(trainImg)
label_list = np.array(trainLabel)

#ラベルをエンコード
le = LabelEncoder()
le = le.fit(label_list)
label_list = le.transform(label_list)
#ワンホットエンコーディング
label_list = np_utils.to_categorical(label_list)
#トレーニング・テスト用にデータを分割
X_train, X_test, y_train, y_test = train_test_split(image_list, label_list, test_size=0.33, random_state=111)

【Python】tensorflow objectdetection api 学習の仕方【DeepLearning】

今更ですがtensorflow objectdetection api のチュートリアルを試してみたのでメモ!





スポンサードリンク





①事前準備

以下URLよりコードをダウンロードできます






github.com









ダウンロードしたら、環境変数「PYTHONPATH」に

"~/models-master"
"~/models-master/research"
"~/models-master/research/slim"

までの絶対パスを追加しておきます






また今回学習させる画像データ・アノテーションファイルは以下のURLからダウンロードできます(チュートリアル用のデータです)


http://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz

http://www.robots.ox.ac.uk/~vgg/data/pets/data/annotations.tar.gz


データはzip形式でダウンロードされるので、解凍しておきます。






次に、今回使用する学習済モデルをダウンロードしておきます

github.com


今回はssd_mobilenet_v1_cocoを使用して転移学習を行っていきます.








②TF-Recordの作成



ObjectDetection apiで学習を行うためにはTF-recordという独自のデータ形式に変換する必要があります。




models-master以下の「research」ディレクトリに移動したうえで、以下のコマンドでTF-Recordを作成します。

python object_detection/dataset_tools/create_pet_tf_record.py /
--label_map_path=object_detection/data/pet_label_map.pbtxt /
--data_dir=`/` /
--output_dir=`/`
    • label_map_pathは.pbtxt(カテゴリラベルファイル)のディレクトリを指定
    • data_dirは先程ダウンロードしてきたimages・annotationsフォルダが置かれているディレクトリ

(images・annotationsフォルダはresearch直下に配置するといいと思います)

    • output_dir =TF-Recordを生成するディレクトリ






③コンフィグファイルの設定

学習を行う前に、コンフィグファイルの設定を行っていきます.




コンフィグファイルには学習を行うための様々なパラメータが設定してあります.

以下のファイルを編集していきます。
(今回はssd_mobilenet_v1_cocoモデルを使用するので以下のファイルですが、
別のモデルをダウンロードしてきた場合は適宜編集するファイルを変更してください)




research/object_detection/samples/configs/ssd_mobilenet_v1_coco.config




変更するのは以下の4か所です



①num_class
ssd { num_classes: 37 # 分類する数

.pbtxtファイルを確認して、分類する数に変更する



②fine_tune_checkpont
fine_tune_checkpoint: "~/research/ssd_mobilenet_v1_coco_2018_01_28/model.ckpt"

models.ckptまでの絶対パスを指定



③input_path

input_path:"~/research/train_record/*"


先程生成したtrain_recordまでの絶対パスを指定





④label_map_path
label_map_path: "~/research/object_detection/data/pet_label_map.pbtxt"}

.pbtxtまでの絶対パスを指定







④トレーニングの実行


以下コマンドでトレーニングを実行します

python research/object_detection/legacy/train.py --logtostderr /

    • pipeline_config_path=~\models-master\models-master\research\ssd_mobilenet_v1_coco.config /
    • train_dir=~\models-master\models-master\research\result

僕の場合は「research」ディレクトリから実行すると、
「nets」モジュールが読み込めないor「object-detection」モジュールが読み込めない
というエラーが出てしまうので、一つ上のmodels-masterディレクトリから実行しました

それぞれ環境変数に追加しているのになんでだろう...




⑤.pb形式で出力


python research/object_detection/export_inference_graph.py /

    • input_type=image_tensor /
    • pipeline_config_path=~\research\ssd_mobilenet_v1_coco.config /
    • trained_checkpoint_prefix=~\research\result\model.ckpt-242 /
    • output_directory=~\research\result2

【Python】画像認識 - kerasでCNNモのモデルを作ってみる② 【DeepLearning】

f:id:mizuhiki0111:20190430180019p:plain

スポンサードリンク

from keras.models import Sequential
from keras.layers import Conv2D,MaxPooling2D
from keras.layers import Activation,Dropout,Flatten,Dense
from keras.utils import np_utils
import numpy as np
import keras

classes = ["monkey","boar","crow"]

num_classes = len(classes)
image_size = 50

#メインの関数を定義する
def main():
    #ファイルからデータ読み込み
    X_train,X_test,y_train,y_test = np.load("./animal.npy")
    X_train = X_train.astype("float")/256
    X_test = X_test.astype("float")/256
    y_train = np_utils.to_categorical(y_train,num_classes)
    y_test = np_utils.to_categorical(y_test,num_classes)

    model = model_train(X_train,y_train)
    model_eval(model,X_test,y_test)



def model_train(X,y):
    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.25))
    model.add(Conv2D(64,(3,3),padding='same'))
    model.add(Activation("relu"))
    model.add(Conv2D(64,(3,3),padding='same'))
    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.5))
    model.add(Dense(3))
    model.add(Activation("softmax"))
    #学習率とその変更を記載
    opt = keras.optimizers.rmsprop(lr=0.0001,decay=1e-6)

    model.compile(loss = "categorical_crossentropy",
                  optimizer=opt,
                  metri =["accuracy"])

    model.fit(X,y,batch_size=32,epochs=100)


    model.save("./animal_cnn.h5")

    return model


def model_eval(model,X,y):
    scores = model.evaluate(X,y,verbose=1)
    print("Test loss:",Score[0])
    print("Test Accuracy:",scores[1])


if __name__=="__main__":
    main()


【Python】画像データをtensorflowで読み込み可能な形式(numpy配列)にする【DeepLearning】


スポンサードリンク



from PIL import Image
import os,glob
import numpy as np
from sklearn import model_selection

#クラスを配列に格納
classes = ["A","B","C"]

num_classes = len(classes)
image_size = 50

#画像の読み込み
#最終的に画像、ラベルはリストに格納される
X = []
Y = []
#まずfor文で画像のインデックスとクラスを取得(1:りんご,2,ブドウ...)
for index,classlabel in enumerate(classes):
    photos_dir = "./" + classlabel
    #globでそれぞれのクラスの画像一覧を取得
    files = glob.glob(photos_dir + "/*.jpg")
    #for文を使い、それぞれのクラスの200枚までの画像を取得
    for i,file in enumerate(files):
        if i >=200:break
        image = Image.open(file)
        image = image.convert("RGB")
        image = image.resize((image_size,image_size))
         #イメージを1枚ずつnumpy配列に変換
        data = np.asarray(image)
  #リストに格納
        X.append(data)
        Y.append(index)

#格納したリストをさらにnumpy配列に変換
X = np.array(X)
Y = np.array(Y)

X_train,X_test,Y_train,Y_test = model_selection.train_test_split(X,Y)


#画像の正規化
X_train = X_train.astype("float")/256
X_test = X_test.astype("float")/256
#ラベルをカテゴリ変数に変換
y_train = np_utils.to_categorical(y_train,num_classes)
y_test = np_utils.to_categorical(y_test,num_classes)

    

【Python】画像認識 - fastaiとDenseNetでSIGNATEの練習問題に挑戦 【DeepLearning】


前回に引き続き、SIGNATEの画像分類問題に挑戦します。


今回は10種類の画像分類問題です。







signate.jp



最初に提出した時は、ファイルの形式が間違っていて最下位からのスタートでした笑


その後データの形式を確認し、提出しなおしたところ


0.92012(暫定5位)となりました。



提出するデータの整形は以下のようにして行いました。


スポンサードリンク

#推論実行・提出用ファイル作成
preds,_ = learn.get_preds(ds_type=DatasetType.Test)
#numpy形式に変換してリストの最大値のインデックスを取得
preds_n = preds.numpy()
preds_m = preds_n.argmax(axis = 1)
#pandasDataframeに変換してtest_dfと結合
preds_p = pd.DataFrame(preds_m)
test_df = pd.DataFrame(test_df)
df = pd.concat([test_df,preds_p], axis=1)
df_new.to_csv('sample_submision.csv', index=False)


<||


スポンサードリンク
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
  (adsbygoogle = window.adsbygoogle || []).push({
    google_ad_client: "ca-pub-7997681574590118",
    enable_page_level_ads: true
  });

【Python】fastaiとDenseNetで実際にコミットしてみる 【DeepLearning】


今回は予測した結果を実際にコミットしてみて、精度を見てみたいと思います。




www.kaggle.com


サボテンの画像認識コンペです(既に終了しているコンペです)



先に結果を書いてしまうと、

Scoreは1.000

でした!

簡単に高精度の結果が出せてしまうfastai恐るべしですね




#必要なライブラリのインポート
import numpy as np
import os
from sklearn.metrics import f1_score

from fastai import *
from fastai.vision import *

import torch
import torch.nn as nn
import torchvision
import cv2

from tqdm import tqdm
from skmultilearn.model_selection import iterative_train_test_split
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MultiLabelBinarizer
import warnings
warnings.filterwarnings("ignore")

%load_ext autoreload
%autoreload


#ディレクトリの指定
data_folder = Path("../input")
train_df = pd.read_csv("../input/train.csv")
test_df = pd.read_csv("../input/sample_submission.csv")

#学習用データの読み込み
test_img = ImageList.from_df(test_df, path=data_folder/'test', folder='test')
trfm = get_transforms(do_flip=True, flip_vert=True, max_rotate=10.0, max_zoom=1.1, max_lighting=0.2, max_warp=0.2, p_affine=0.75, p_lighting=0.75)
train_img = (ImageList.from_df(train_df,path=data_folder/"train",folder="train")
            .split_by_rand_pct(0.01)
            .label_from_df()
            .add_test(test_img)
            .transform(trfm,size=128)
            .databunch(path=".",bs=64,device=torch.device('cuda:0'))
             .normalize(imagenet_stats))



learn = cnn_learner(train_img, models.densenet161, metrics=[error_rate, accuracy])
#学習の実行
lr = 3e-02
learn.fit_one_cycle(6, slice(lr))

#推論実行・提出用ファイル作成
preds,_ = learn.get_preds(ds_type=DatasetType.Test)


test_df.has_cactus = preds.numpy()[:, 0]

test_df.to_csv('sample_submit.csv', index=False)