Kaggle实战:Plant Pathology(二)

在第一篇实战里说过测试集分数还有比较大的提升空间,深度学习里有一句话:garbage in,garbage out。如果我们喂进去的图片质量差,那么训练后的模型肯定不理想。所以在第一篇的基础上,通过从以下方面考虑提升模型质量。1、进行图片预处理,提高喂进去图片的质量。2、进行数据增强,增加样本数量。3、使用多种模型进行预测,最后做个ensemble。
plus代码:https://github.com/872699467/Plant-Pathology-Plus

图片预处理

对初始图片先进行高斯模糊,取出噪点,再使用Canny算子对训练集和测试集的图片进行边缘检测,并进行裁切将多余的背景去除。将得到的边界框坐标(x1,y1,x2,y2)保存到csv文件中。关于Canny算子的工作原理,可参考https://blog.csdn.net/fengye2two/article/details/79190759

# Canny边缘检测并进行bounding box切割
def edge_and_cut(img):
    emb_img = img.copy()
    img = cv2.GaussianBlur(img, ksize=(5, 5), sigmaX=0)
    edges = cv2.Canny(img, 100, 200)

    nonzero = edges.nonzero()
    # 未检测到边缘
    if len(nonzero[0]) == 0 or len(nonzero[1]) == 0:
        col_min = 0
        row_min = 0
        col_max = img.shape[1]
        row_max = img.shape[0]
    else:
        col_min = min(nonzero[1])
        row_min = min(nonzero[0])
        col_max = max(nonzero[1])
        row_max = max(nonzero[0])

    emb_img[row_min - 10:row_min + 10, col_min:col_max] = [255, 0, 0]
    emb_img[row_max - 10:row_max + 10, col_min:col_max] = [255, 0, 0]
    emb_img[row_min:row_max, col_min - 10:col_min + 10] = [255, 0, 0]
    emb_img[row_min:row_max, col_max - 10:col_max + 10] = [255, 0, 0]

    fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(30, 20))
    ax[0].imshow(img, cmap='gray')
    ax[0].set_title('Original Image', fontsize=24)
    ax[1].imshow(edges, cmap='gray')
    ax[1].set_title('Canny Edges', fontsize=24)
    ax[2].imshow(emb_img, cmap='gray')
    ax[2].set_title('Bounding Box', fontsize=24)
    plt.show()
    return (col_min, row_min, col_max, row_max)

当我们再进行模型训练时,就只是将下图红色边界框的图片喂到模型中,剔除了无用的背景像素,提高了数据的质量。


边缘检测效果

数据增强

由于训练集的图片数量不多,所以我们可以用cv2的一系列操作进行图片的变化,增加训练集的数量。
一、水平/垂直翻转

# 垂直/水平翻转
def invert(img):
    fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(30, 20))
    ax[0].imshow(img)
    ax[0].set_title('Original Image', fontsize=24)
    ax[1].imshow(cv2.flip(img, 0))
    ax[1].set_title('Vertical Flip', fontsize=24)
    ax[2].imshow(cv2.flip(img, 1))
    ax[2].set_title('Horizontal Flip', fontsize=24)
    plt.show()

水平/垂直翻转

二、卷积
他使得图像是在强光照射下拍摄,这是由于np.ones(7,7)之和为49,而除数是36,所以增加了图片的亮度。如果除数是49,就是平滑操作了。而除数大于49,则整体亮度减少,像是阴天拍摄的。

# 卷积操作
def conv(img):
    fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(20, 20))
    kernel = np.ones((7, 7), np.float32) / 36
    conv = cv2.filter2D(img, -1, kernel)
    ax[0].imshow(img)
    ax[0].set_title('Original Image', fontsize=24)
    ax[1].imshow(conv)
    ax[1].set_title('Convolved Image', fontsize=24)
    plt.show()

除数为36,整体亮度变亮

除数为64,整体亮度变暗

三、模糊

# 模糊操作
def blur(img):
    fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(20, 20))
    ax[0].imshow(img)
    ax[0].set_title('Original Image', fontsize=24)
    ax[1].imshow(cv2.blur(img, (30, 30)))
    ax[1].set_title('Blurred Image', fontsize=24)
    plt.show()
模糊操作

Ensemble

Ensemble有点三个臭皮匠顶过一个诸葛亮的意思,如果你只用一个模型预测,预测结果的好坏只由你一个模型决定,但是如果我用多个模型预测,再将得到的结果按照一定的权重进行结合,往往只比一个模型的预测结果要好。Ensemble的特点为:1、将多个分类方法聚集在一起,以提高分类的准确率。2、由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行投票来进行分类。3、如果把单个分类器比作一个决策者的话,Ensemble的方法就相当于多个决策者共同进行一项决策。
我分别用resnet18和densenet121进行了交叉验证,每一折训练15个epoch。
一、resnet18的损失变化和训练集得分

resnet18的训练集和验证集损失变化

最终训练集的得分为:0.998847
resnet18训练集得分

二、densenet121的损失变化和训练集得分
densenet121的训练集和验证集损失变化

最终训练集的得分为:0.996672
densenet121训练集得分

最后将两个模型预测的得到进行ensemble。

    squeezenet_res = pd.read_csv('results/resnet_results.csv').iloc[:, [1, 2, 3, 4]].values
    densenet_res = pd.read_csv('results/densenet_result.csv').iloc[:, [1, 2, 3, 4]].values
    sub = pd.read_csv('data/sample_submission.csv')
    ensemble_1, ensemble_2, ensemble_3 = [sub] * 3
    ensemble_1.iloc[:, [1, 2, 3, 4]] = 0.25 * squeezenet_res + 0.75 * densenet_res
    ensemble_2.iloc[:, [1, 2, 3, 4]] = 0.5 * squeezenet_res + 0.5 * densenet_res
    ensemble_3.iloc[:, [1, 2, 3, 4]] = 0.75 * squeezenet_res + 0.25 * densenet_res

    ensemble_1.to_csv('results/submission_ensemble_1.csv', index=False)
    ensemble_2.to_csv('results/submission_ensemble_2.csv', index=False)
    ensemble_3.to_csv('results/submission_ensemble_3.csv', index=False)

将第一个emseble_1提交,最终得分为0.965,比第一篇的0.919高出不少。


得分情况
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 机器学习术语表 本术语表中列出了一般的机器学习术语和 TensorFlow 专用术语的定义。 A A/B 测试 (...
    yalesaleng阅读 2,008评论 0 11
  • KAGGLE ENSEMBLING GUIDE 声明:文章来自网络,手动翻译笔记,仅做学习参考。文末附上原地址,转...
    壹刀_文阅读 2,667评论 0 3
  • [TOC] About Trs 只是阅读过程中对其中一些进行注脚而已,更确切的内容还是英文原文来的清晰,有些翻译反...
    mrlevo520阅读 1,258评论 0 0
  • 最近数据挖掘老师给了我们这个案例,让我们做预测,不过我得到的数据集合kaggle上的数据集不太一样,如列名,上船地...
    茶酒qqq阅读 3,309评论 0 3
  • 早上,孩子起床后,让我帮她报听写,我答应了,刚开始报了几个单词,他说报得不准确,一会儿说快了,一会儿说慢了,看...
    普妈妈阅读 274评论 2 0