美文网首页
Kaggle竞赛:Plant Seedlings Classif

Kaggle竞赛:Plant Seedlings Classif

作者: 深度学习模型优化 | 来源:发表于2019-04-20 05:34 被阅读0次

1 问题描述

怎么能从剪切秧苗中分辨出杂草?

如果能够很好的实现分辨杂草可以有效提高产量和环境管理。

         Aarhus大学信号处理研究小组,与Southern Denmark大学合作,发布了一个数据集。该数据集包含各个生长阶段大约960颗幼苗,它们属于12种植物。

图1

若要获取数据集更多信息,可以参考original data

论文参考A Public Image Database for Benchmark of Plant Seedling Classification Algorithms

2 数据描述

         该数据集包含了不同生长阶段的植物种子的训练和测试集。每个图像是一个文件且对应一个唯一的id。数据集包括12种植物。我们的目标是创建一个分类器,实现从一张图片中识别出植物的种类,下面植物种类的列表:

Black-grass
Charlock
Cleavers
Common Chickweed
Common wheat
Fat Hen
Loose Silky-bent
Maize
Scentless Mayweed
Shepherds Purse
Small-flowered Cranesbill
Sugar beet

文件描述
train.csv - 训练集,具体的图像文件在文件夹中
test.csv - 测试集, 需要识别的图片
sample_submission.csv - 上传结果文件的格式

3 数据预处理

         图片的处理主要使用opencv来做。
         标签处理采用one-hot编码。

def label_img(word_label):                       
    if word_label == 'Black-grass': return [1,0,0,0,0,0,0,0,0,0,0,0]
    elif word_label == 'Charlock': return [0,1,0,0,0,0,0,0,0,0,0,0]
    elif word_label == 'Cleavers': return [0,0,1,0,0,0,0,0,0,0,0,0]
    elif word_label == 'Common Chickweed': return [0,0,0,1,0,0,0,0,0,0,0,0]
    elif word_label == 'Common wheat': return [0,0,0,0,1,0,0,0,0,0,0,0]
    elif word_label == 'Fat Hen': return [0,0,0,0,0,1,0,0,0,0,0,0]
    elif word_label == 'Loose Silky-bent': return [0,0,0,0,0,0,1,0,0,0,0,0]
    elif word_label == 'Maize': return [0,0,0,0,0,0,0,1,0,0,0,0]
    elif word_label == 'Scentless Mayweed': return [0,0,0,0,0,0,0,0,1,0,0,0]
    elif word_label == 'Shepherds Purse': return [0,0,0,0,0,0,0,0,0,1,0,0]
    elif word_label == 'Small-flowered Cranesbill': return [0,0,0,0,0,0,0,0,0,0,1,0]
    elif word_label == 'Sugar beet': return [0,0,0,0,0,0,0,0,0,0,0,1] 

         然后建立train数据集。

def create_train_data():
    train = []
    for category_id, category in enumerate(CATEGORIES):
        for img in tqdm(os.listdir(os.path.join(train_dir, category))):
            label=label_img(category)
            path=os.path.join(train_dir,category,img)
            img=cv2.imread(path,cv2.IMREAD_GRAYSCALE)
            img = cv2.resize(img, (IMG_SIZE,IMG_SIZE))
            train.append([np.array(img),np.array(label)])
    shuffle(train)
    return train

         然后对训练数据按照训练集和验证集进行划分。

4 模型

         模型代码看这里
         使用深度学习调试技巧
         先简单的做了下模型训练:

  • 没有使用数据增强
  • 使用小批量数据优化
  • 使用SGD优化算法
  • 先直接算训练误差,然后计算得到训练误差和验证误差
图2 训练曲线

         批处理训练交叉熵为0.051953293,验证集交叉熵为0.29346284。
         本来想看下准确率,但是准确率为0,我了个去!倒吸了口凉气,WTF!是什么原因使得准确率为0?

图3 训练5000次

不平衡样本处理
         使用sklearn的stratifiedKFold函数来实现K折交叉验证。
数据增强

5 评估

epoch为5000次:训练集准确率为0.836675。

6 总结

         这里简单使用了MobileNet V1来识别种子图片。
S1: 对数据做了预处理;
S2: 建立MobileNet V1模型;
S3: 根据网络调试技巧来训练网络;
S4: 保存模型,以备后用。

相关文章

网友评论

      本文标题:Kaggle竞赛:Plant Seedlings Classif

      本文链接:https://www.haomeiwen.com/subject/zmeqgqtx.html