ニューラルネットワークによるネコイヌ識別実践(初期訓練or VGG予備訓練モデル使用)

4684 ワード

ニューラルネットワークを学習する過程で,猫犬識別実践を行い,このブログは実践過程を記録し,後期記憶に便利である.

1.ニューラルネットワークによるネコ犬の識別実践(初期訓練ニューラルネットワーク)

# from diy import *
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Activation, Dropout, Flatten, Dense
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
from keras.models import load_model
import numpy as np

#  
# img = cv2.imread('imag.jpg')
# img = imagread('imag.jpg')
# imagshow(img)

#  
model = Sequential()
model.add(Conv2D(input_shape=(150, 150, 3), filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(Conv2D(filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=2, strides=2))

model.add(Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'))
model.add(Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=2, strides=2))

model.add(Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))
model.add(Conv2D(filters=128, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPool2D(pool_size=2, strides=2))

model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0, 5))
model.add(Dense(2, activation='softmax'))

#  
adam = Adam(lr=1e-4)

#  , , 
model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy'])

train_datagen = ImageDataGenerator(
    rotation_range=40,  #  
    width_shift_range=0.2,
    height_shift_range=0.2,
    rescale=1 / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest',
)

test_datagen = ImageDataGenerator(
    rescale=1 / 255,
)

batch_size = 32

#  
train_generator = train_datagen.flow_from_directory(
    'image/train',
    target_size=(150, 150),
    batch_size=batch_size,
)

#  
test_generator = train_datagen.flow_from_directory(
    'image/test',
    target_size=(150, 150),
    batch_size=batch_size,
)

model.fit_generator(train_generator, steps_per_epoch=2, epochs=30, validation_data=test_generator, validation_steps=2)

model.save('model_cnn.h5')

#  
label = np.array(['cat', 'dog'])
#  
model = load_model('model_cnn.h5')

#  
image = load_img('image/test/88.jpg')
image
image = image.resize((150, 150))
image = img_to_array(image)
image = image / 255
image = np.expand_dims(image, 0)

#  
print(label[model.predict_classes(image)])


2.ニューラルネットワークによるネコイヌ識別実践(VGG予備訓練モデルを使用)

from keras.applications.vgg16 import VGG16
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Activation, Dropout, Flatten, Dense
from keras.optimizers import SGD
from keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
from keras.models import load_model
import numpy as np

vgg16_model = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))

#  
top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16_model.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0, 5))
top_model.add(Dense(2, activation='softmax'))

model = Sequential()
model.add(vgg16_model)
model.add(top_model)

#  , , 
model.compile(optimizer=SGD(lr=1e-4, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])

train_datagen = ImageDataGenerator(
    rotation_range=40,  #  
    width_shift_range=0.2,
    height_shift_range=0.2,
    rescale=1 / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest',
)

test_datagen = ImageDataGenerator(
    rescale=1 / 255,
)

batch_size = 32

#  
train_generator = train_datagen.flow_from_directory(
    'image/train',
    target_size=(150, 150),
    batch_size=batch_size,
)

#  
test_generator = train_datagen.flow_from_directory(
    'image/test',
    target_size=(150, 150),
    batch_size=batch_size,
)

model.fit_generator(train_generator, steps_per_epoch=2, epochs=30, validation_data=test_generator, validation_steps=2)

model.save('model_vgg16.h5')

#  
label = np.array(['cat', 'dog'])
#  
model = load_model('model_vgg16.h5')

#  
image = load_img('image/test/88.jpg')
# image
image = image.resize((150, 150))
image = img_to_array(image)
image = image / 255
image = np.expand_dims(image, 0)

#  
print(label[model.predict_classes(image)])