利用vgg-16登上kaggle Invasive Species Monitoring图像识别比赛五十强

来源:互联网 发布:数据科学入门 mobi 编辑:程序博客网 时间:2024/06/03 18:52

1、简介

比赛简介我用google翻译了一下
葛兰荼哥在格鲁吉亚压倒树木,而甘蔗蟾蜍威胁到全球十几个国家的栖息地。 这些只是许多可以对环境,经济甚至人类健康造成破坏性影响的两种入侵物种。 尽管受到广泛影响,追踪入侵物种的位置和扩散的努力非常昂贵,难以进行规模化。
目前,生态系统和植物分布监测取决于专家知识。 有经验的科学家访问指定的地区,并注意到居住在这些地区的物种。 使用这样高素质的劳动力是昂贵的,时间低效的,不足以满足人类在抽样时不能覆盖大面积的地区。
由于科学家无法对大量地区进行抽样,因此使用一些机器学习算法来预测未被采样的地区入侵物种的存在或不存在。 这种方法的准确性远非最佳,但仍然有助于解决生态问题的方法。
在这次比赛中,参赛者面临挑战,开发算法,以更准确地确定森林和树叶的图像是否含有侵入性绣球。 计算机视觉技术与其他当前技术如航空成像技术可以使入侵物种监测更便宜,更快速,更可靠。
比赛地址:https://www.kaggle.com/c/invasive-species-monitoring/leaderboard

2、操作

首先贴一下自己的排名
这里写图片描述
接下来我就具体讲讲应该怎么做,代码会全部贴上去,贡献给各位

1、下载数据
大家可以在kaggle上自行下载数据集,然后利用python os模块把数据分成一个训练集跟验证集。这部分代码就不贴了,操作完的结构如下:
这里写图片描述
以上是训练集的结构,验证集类似。
2、vgg-16
接下来就是利用vgg-16进行预测了,代码贴上来

# coding: utf-8# In[1]:import osimport pandas as pdimport numpy as npimport keras.layers.core as coreimport keras.layers.convolutional as convimport keras.models as modelsimport keras.utils.np_utils as kutilsimport sklearn.metrics as metricsimport keras.preprocessing.image as imageimport keras.callbacks as callbacksimport tensorflow as tffrom keras.applications import ResNet50from keras.layers import Input,Dense,Flattenfrom keras.models import Modelfrom keras.callbacks import EarlyStoppingfrom keras import optimizersfrom keras.models import Sequential, Model, load_modelfrom keras import applicationsfrom keras import optimizersfrom keras.layers import Dropout, Flatten, Densefrom keras.callbacks import ModelCheckpoint# In[8]:dir_data_train = '/home/etcp/szx/flower_data/my_new_train_v1'dir_data_test = '/home/etcp/szx/flower_data/validation'# dir_model = "/etcp/cartype/zoo/sample100/"img_rows,img_cols,img_dim = 224,224,3base_model = applications.VGG16(weights='imagenet', include_top=False, input_shape=(img_rows, img_cols, img_dim))x = base_model.outputx = Flatten()(x)x = Dense(256,activation='relu')(x)x = Dense(1,activation='sigmoid')(x)model = Model(input=base_model.input, output=x)model.compile(loss='binary_crossentropy', optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),              metrics=['accuracy'])model.summary()from keras.preprocessing.image import ImageDataGeneratorfrom keras.callbacks import ModelCheckpointbatch_size = 32epochs = 50train_datagen = ImageDataGenerator(        rescale=1./255,        shear_range=0.2,        zoom_range=0.2,        horizontal_flip=True)# this is the augmentation configuration we will use for testing:# only rescalingtest_datagen = ImageDataGenerator(rescale=1./255)# this is a generator that will read pictures found in# subfolers of 'data/train', and indefinitely generate# batches of augmented image datatrain_generator = train_datagen.flow_from_directory(        '/home/etcp/szx/flower_data/my_new_train_v1',  # this is the target directory        target_size=(224, 224),  # all images will be resized to 150x150        batch_size=32,        class_mode='binary')  # since we use binary_crossentropy loss, we need binary labels# this is a similar generator, for validation datavalidation_generator = test_datagen.flow_from_directory(        '/home/etcp/szx/flower_data/validation',        target_size=(224, 224),        batch_size=32,        class_mode='binary')# model.fit_generator(#         train_generator,#         samples_per_epoch=200,#         nb_epoch = 500,#         validation_data=validation_generator,#         nb_val_samples=800,#         callbacks=[ModelCheckpoint('VGG16-transferlearning.model', monitor='val_acc', save_best_only=True)])# model.load_model('VGG16-transferlearning.model')#model.load_weights('/home/etcp/szx/flower_data/vgg4.h5')model.save_weights('/home/etcp/szx/flower_data/vgg3.h5')

3、模型的预测

将每个图片路径存在all_names

newpath = '/home/etcp/szx/flower_data/test/'import osall_names = []for i in range(1531):    i = i + 1    names = newpath+str(i)+'.jpg'    all_names.append(names)

预测

times = 0for i in range(1531):    times += 1    img_path = all_names[i]    img = image.load_img(img_path, target_size=(224, 224))    x = image.img_to_array(img)    x = np.expand_dims(x, axis=0)    # print x.shape    x = np.float32(x/255.)    preds = model.predict(x,verbose=0)    print(np.max(preds))