首页 > 解决方案 > 使用 Keras 进行多类图像识别

问题描述

我正在尝试建立一个识别 21 个类的网络。

数据位于 Uc-merced.zip

这是代码:

# import

import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential, Model
from keras.layers import Conv2D, MaxPooling2D, Activation, Dropout, Flatten, Dense, GlobalAveragePooling2D
from keras import backend as K
from keras import applications
from keras import optimizers
from keras import utils

我正在使用 Google Colab

%cd /content/drive/My Drive/
! unzip -q -n UCMerced_LandUse.zip
! echo 'Training folder content'
! ls -l ./UCMerced_LandUse/train/
! echo 'Validation folder content'
! ls -l ./UCMerced_LandUse/validation/

train_data_dir = 'UCMerced_LandUse/train/'
val_data_dir = 'UCMerced_LandUse/validation/'


### DATA GENERATOR
# get data from the folder, perform the preprocessing and the data augmentation,
# and arranges them in batches

# dimensions of our images
img_width, img_height = 256, 256

batch_size = 5

nb_train_samples = 1493
nb_val_samples = 622

# this is the preprocessing configuration we will use for training
train_datagen = ImageDataGenerator(
    rescale=1. / 255,     # rescale
    shear_range=0.2,      # on-th-fly data augmentation
    zoom_range=0.2,       # on-th-fly data augmentation
    horizontal_flip=True) # on-th-fly data augmentation

# this is the preprocessing configuration we will use for validation:
# rescaling only
val_datagen = ImageDataGenerator(rescale=1. / 255)

print('Training set generator:')
train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),  
    batch_size=batch_size,
    class_mode='categorical'
   )


print('Validation set generator:')
val_generator = val_datagen.flow_from_directory(
    val_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical')

这是输出:

Training set generator:
Found 1493 images belonging to 21 classes.
Validation set generator:
Found 622 images belonging to 21 classes.
# Inception V3 with pre-trained weights
base_model = applications.InceptionV3(weights='imagenet', include_top=False,input_shape=(256,256,3),classes=21)
train_after_layer =50 # 


### CHANGE THE TOP MODEL BLOCK


x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(21, activation='softmax')(x)

model = Model(inputs=base_model.input, outputs=x)

# set the first K layers (up to the last conv block)
# to non-trainable (weights will not change during training)
for layer in model.layers[:train_after_layer]:
    layer.trainable = False

# compile the model with a SGD/momentum optimizer
# and a very slow learning rate.
model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
              metrics=['accuracy'])

epochs_fine = 50

history=model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs_fine,
    validation_data=val_generator,
    validation_steps=nb_val_samples // batch_size)

model.save_weights('prova.h5')


结果似乎很神,在 50epoch 结束时,结果如下:

损失:0.0866 - 准确度:0.9845 - val_loss:0.6575 - val_accuracy:0.9028


from keras.preprocessing import image
import os

model.load_weights('prova.h5')

path = '/content/drive/My Drive/UCMerced_LandUse/validation/airplane'
dirs = os.listdir( path )

print(train_generator.class_indices)

for file in dirs:
  print(file)
  string=os.path.join(path,file)
  img_pred=image.load_img(string,target_size=(256,256,3))
  img_pred=image.img_to_array(img_pred)
  img_pred=np.expand_dims(img_pred,axis=0) 
  array=model.predict(img_pred)
  y_classes = array.argmax(axis=-1)
  print(y_classes)

这是输出:

{'agricultural': 0, 'airplane': 1, 'baseballdiamond': 2, 'beach': 3, 'buildings': 4, 'chaparral': 5, 'denseresidential': 6, 'forest': 7, 'freeway': 8, 'golfcourse': 9, 'harbor': 10, 'intersection': 11, 'mediumresidential': 12, 'mobilehomepark': 13, 'overpass': 14, 'parkinglot': 15, 'river': 16, 'runway': 17, 'sparseresidential': 18, 'storagetanks': 19, 'tenniscourt': 20}

airplane71.tif
[3]
airplane72.tif
[16]
airplane73.tif
[2]
airplane74.tif
[16]
airplane75.tif
[2]
airplane76.tif
[2]
airplane77.tif
[16]
airplane78.tif
[2]
airplane79.tif
[2]
airplane80.tif

val_accuracy 是 90%,但没有人预测是正确的。这对每个班级都是一样的。

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


[0,1]您忘记在预测时将图像重新缩放到范围内。255在测试时将图像除以。您必须这样做,因为您rescale=1. / 255,ImageDataGenerator.


推荐阅读