日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

AI challenger 2018图片分类比赛—农作物病害检测

發(fā)布時間:2024/3/13 ChatGpt 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AI challenger 2018图片分类比赛—农作物病害检测 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 賽題簡介

對近5萬張按“物種-病害-程度”分成61類的植物葉片照片進行分類

比賽地址:AI challenger比賽—農(nóng)作物病害檢測

2 框架

我使用的是Keras,以TensorFlow為后端,手動實現(xiàn)了DenseNet用于圖片分類
由于Kaggle現(xiàn)在可以免費使用GPU,所以采用將數(shù)據(jù)上傳至Kaggle的私人Dataset上,在其上創(chuàng)建Kernel進行模型訓練
(上傳需要翻墻,有梯子最好)

3 DenseNet模型實現(xiàn)

def dense_block(x, blocks, name):for i in range(blocks):x = conv_block(x, 32, name=name + '_block' + str(i + 1))return x def transition_block(x, reduction, name):bn_axis = 3x = layers.BatchNormalization(axis=bn_axis, epsilon=1.001e-5,name=name + '_bn')(x)x = layers.Activation('relu', name=name + '_relu')(x)x = layers.Conv2D(int(backend.int_shape(x)[bn_axis] * reduction), 1,use_bias=False,name=name + '_conv')(x)x = layers.AveragePooling2D(2, strides=2, name=name + '_pool')(x)return x def conv_block(x, growth_rate, name):bn_axis = 3x1 = layers.BatchNormalization(axis=bn_axis,epsilon=1.001e-5,name=name + '_0_bn')(x)x1 = layers.Activation('relu', name=name + '_0_relu')(x1)x1 = layers.Conv2D(4 * growth_rate, 1,use_bias=False,name=name + '_1_conv')(x1)x1 = layers.BatchNormalization(axis=bn_axis, epsilon=1.001e-5,name=name + '_1_bn')(x1)x1 = layers.Activation('relu', name=name + '_1_relu')(x1)x1 = layers.Conv2D(growth_rate, 3,padding='same',use_bias=False,name=name + '_2_conv')(x1)x = layers.Concatenate(axis=bn_axis, name=name + '_concat')([x, x1])return x def DenseNet(blocks, input_shape=(150,150,3), classes=61):img_input = Input(shape=input_shape)bn_axis = 3x = layers.ZeroPadding2D(padding=((3, 3), (3, 3)))(img_input)x = layers.Conv2D(64, 7, strides=2, use_bias=False, name='conv1/conv')(x)x = layers.BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name='conv1/bn')(x)x = layers.Activation('relu', name='conv1/relu')(x)x = layers.ZeroPadding2D(padding=((1, 1), (1, 1)))(x)x = layers.MaxPooling2D(3, strides=2, name='pool1')(x)x = dense_block(x, blocks[0], name='conv2')x = transition_block(x, 0.5, name='pool2')x = dense_block(x, blocks[1], name='conv3')x = transition_block(x, 0.5, name='pool3')x = dense_block(x, blocks[2], name='conv4')x = transition_block(x, 0.5, name='pool4')x = dense_block(x, blocks[3], name='conv5')x = layers.BatchNormalization(axis=bn_axis, epsilon=1.001e-5, name='bn')(x)x = layers.GlobalAveragePooling2D(name='avg_pool')(x)x = Dense(512)(x)x = BatchNormalization()(x)x = PReLU()(x)x = Dropout(0.5)(x)x = Dense(classes, activation='softmax', name='fc61')(x)inputs = img_inputmodel = Model(inputs, x, name='densenet')return model

調(diào)用DenseNet函數(shù)即可創(chuàng)建

model = DenseNet(blocks=[6, 12, 48, 32], input_shape=(150,150,3),classes=61) model.summary()

4 數(shù)據(jù)準備

1、訓練集、驗證集生產(chǎn)器
這里對圖片進行圖像預處理,增加圖片歸一化、適度旋轉(zhuǎn)、隨機縮放、上下翻轉(zhuǎn)

train_datagen = ImageDataGenerator(rescale=1. / 255,shear_range=0.2,rotation_range=20,zoom_range=0.2,horizontal_flip=True) val_datagen = ImageDataGenerator(rescale=1. / 255)

2、讀取數(shù)據(jù)
從目錄中讀取數(shù)據(jù)

img_width, img_height = 150, 150 train_data_dir = '../input/train/train' validation_data_dir = '../input/val/val' batch_size = 64 classes = 61train_generator = train_datagen.flow_from_directory(train_data_dir,target_size=(img_width, img_height),batch_size=batch_size,class_mode='categorical') #多分類validation_generator = val_datagen.flow_from_directory(validation_data_dir,target_size=(img_width, img_height),batch_size=batch_size,class_mode='categorical') #多分類

5 模型訓練

1、先對模型進行預編譯

model.compile(loss='categorical_crossentropy',optimizer=Adam(lr=0.0001),metrics=['accuracy'])

2、訓練模型
增加自動更新學習率和保存在驗證集最后的模型參數(shù)

learning_rate_reduction = ReduceLROnPlateau(monitor='val_acc', patience=3, verbose=1,factor=0.5, min_lr=0.000001) checkpoint = ModelCheckpoint(model_name, monitor='val_acc', save_best_only=True) history = model.fit_generator(train_generator,steps_per_epoch=nb_train_samples // batch_size,epochs=30,validation_data=validation_generator,validation_steps=nb_validation_samples // batch_size,callbacks=[checkpoint, learning_rate_reduction])

訓練次數(shù)由于受Kaggle中Kernel的使用時間受限,只能訓練6小時,所以只能暫時訓練30,不過可以多次迭代訓練。

6 模型預測

由于文件夾存放順序跟window上不一樣,所以實際上文件夾在Kaggle上Dataset上的存放順序如下

rr = [0,1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23,24,25,26,27,28,29,3,30,31,32,33,34,35,36,37,38,39,4,40,41,42,43,44,45,46,47,48,49,5,50,51,52,53,54,55,56,57,58,59,6,60,7,8,9]images = os.listdir('../input/ai-challenger-pdr2018/testa/testA')result = [] for img1 in images:image_path = '../input/ai-challenger-pdr2018/testa/testA/' + img1img = image.load_img(image_path, target_size=(150, 150))x = image.img_to_array(img)/255.0x = np.expand_dims(x, axis=0)preds = model.predict(x)tmp = dict()tmp['image_id'] = img1tmp['disease_class']=rr[int(np.argmax(preds))]result.append(tmp)

最后保存為json

import json json2 = json.dumps(result) f = open('result.json','w',encoding='utf-8') f.write(json2) f.close()

7 提交結(jié)果

最終的結(jié)果是0.87395的成績

8 完整代碼參考

DenseNet模型訓練 plants_disease_detection

如果你覺得我寫的不錯,請給我一下Star(^_^),謝謝!

總結(jié)

以上是生活随笔為你收集整理的AI challenger 2018图片分类比赛—农作物病害检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。