AI challenger 2018图片分类比赛—农作物病害检测
生活随笔
收集整理的這篇文章主要介紹了
AI challenger 2018图片分类比赛—农作物病害检测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 賽題簡介
對近5萬張按“物種-病害-程度”分成61類的植物葉片照片進行分類
比賽地址:AI challenger比賽—農作物病害檢測
2 框架
我使用的是Keras,以TensorFlow為后端,手動實現了DenseNet用于圖片分類
由于Kaggle現在可以免費使用GPU,所以采用將數據上傳至Kaggle的私人Dataset上,在其上創建Kernel進行模型訓練
(上傳需要翻墻,有梯子最好)
3 DenseNet模型實現
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調用DenseNet函數即可創建
model = DenseNet(blocks=[6, 12, 48, 32], input_shape=(150,150,3),classes=61) model.summary()4 數據準備
1、訓練集、驗證集生產器
這里對圖片進行圖像預處理,增加圖片歸一化、適度旋轉、隨機縮放、上下翻轉
2、讀取數據
從目錄中讀取數據
5 模型訓練
1、先對模型進行預編譯
model.compile(loss='categorical_crossentropy',optimizer=Adam(lr=0.0001),metrics=['accuracy'])2、訓練模型
增加自動更新學習率和保存在驗證集最后的模型參數
訓練次數由于受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 提交結果
最終的結果是0.87395的成績
8 完整代碼參考
DenseNet模型訓練 plants_disease_detection
如果你覺得我寫的不錯,請給我一下Star(^_^),謝謝!
總結
以上是生活随笔為你收集整理的AI challenger 2018图片分类比赛—农作物病害检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络协议-TCP和UDP最完整的区别介绍
- 下一篇: 文本输入框input实现字母大小写转换