Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >kaggle 图像分类竞赛实战(一):数据集下载和清洗

kaggle 图像分类竞赛实战(一):数据集下载和清洗

作者头像
我是一条小青蛇
发布于 2019-10-23 07:42:37
发布于 2019-10-23 07:42:37
3.4K00
代码可运行
举报
文章被收录于专栏:青笔原创青笔原创
运行总次数:0
代码可运行

前言

本文集以 Kaggle 网站真实竞赛《dogs-vs-cats-redux-kernels-edition》为主线,讲解如何使用深度学习技术解决图像分类问题。本文作为文集第一篇,讲解图像数据集的下载和清洗。

1. kaggle 命令行

不熟悉 kaggle 命令行接口的读者可参考专栏 《Kaggle 命令行工具查看 AI 最新竞赛和下载数据集》

通过关键词搜索竞赛:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kaggle competitions list -s "dog cat"
ref                                 deadline             category       reward  teamCount  userHasEntered  
----------------------------------  -------------------  ----------  ---------  ---------  --------------  
dogs-vs-cats                        2014-02-01 23:59:00  Playground       Swag        215           False  
dogs-vs-cats-redux-kernels-edition  2017-03-02 23:59:00  Playground  Knowledge       1314            True

下载竞赛数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kaggle competitions download -c dogs-vs-cats-redux-kernels-edition
Downloading dogs-vs-cats-redux-kernels-edition.zip to ~/dogs-vs-cats
100%|███████████████████████████████████████| 814M/814M [01:48<00:00, 7.37MB/s]
100%|███████████████████████████████████████| 814M/814M [01:48<00:00, 7.86MB/s]

查看数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ls -l | grep .zip
-rw-r--r--    1 ken  staff  853083283 10  6 10:32 dogs-vs-cats-redux-kernels-edition.zip

解压数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ unzip dogs-vs-cats-redux-kernels-edition.zip -d datasets
Archive:  dogs-vs-cats-redux-kernels-edition.zip
  inflating: datasets/train.zip      
  inflating: datasets/sample_submission.csv  
  inflating: datasets/test.zip

查看解压数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd datasets && ls
sample_submission.csv	test.zip		train.zip

2. 数据处理

2.1 查看数据集

2.1.1 解压数据集
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ unzip train.zip && unzip test.zip
2.1.2 查看训练集和测试集图片数量
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 训练集数量
$ ls train | wc -l
25000

# 测试集数量
$ ls test | wc -l
12500
2.1.3 加载训练集和测试集
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os

def load_datasets():
    def load(d):
        datasets = []
        for fn in os.listdir(d):
            fp = os.path.join(d, fn)
            if os.path.isfile(fp):
                datasets.append(fp)
        return datasets
    return load('datasets/train'), load('datasets/test')

train_datasets, test_datasets = load_datasets()
2.1.4 随机查看数据集
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import random
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline

def show_img(img, ax=None, title=None):
    if ax is not None:
        ax.imshow(img)
        ax.axis('off')
        if title is not None:
            ax.set_title(title)
    else:
        plt.title(title)
        plt.imshow(img)
        plt.axis('off')

def show_img_by_path(imgpath, **argkw):
    show_img(Image.open(imgpath), title=os.path.basename(imgpath), **argkw)

def show_imgsets(imgsets, shape=(2, 5), **argkw):
    if not isinstance(imgsets, list):
        return

    rows, cols = shape
    size = rows * cols
    imgsets = np.array(imgsets[:size]).reshape(shape)

    fig, axs = plt.subplots(rows, cols, **argkw)

    for row in range(rows):
        for col in range(cols):
            show_img_by_path(imgsets[row, col], ax=axs[row, col])

def randsample(imgsets, shape=(2, 5), **argkw):
    imgsets = random.choices(imgsets, k=shape[0]*shape[1])

    show_imgsets(imgsets, shape=shape, **argkw)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
randsample(train_datasets, shape=(10, 10), figsize=(16, 16))

2.2 训练集图片清洗

2.2.1 搭建模型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input
from keras.applications.resnet50 import ResNet50

class ImgModel:
    def __init__(self, mc):
        self.model = mc(weights='imagenet')
    def _totensor(self, img_path):
        img = image.load_img(img_path, target_size=(224, 224))
        x = image.img_to_array(img)
        tensor = np.expand_dims(x, axis=0)
        return preprocess_input(tensor)
    def predict(self, img_path):
        tensor = self._totensor(img_path)
        predict_label = self.model.predict(tensor)
        return np.argmax(predict_label)

model = ImgModel(ResNet50)
2.2.2 找出模型无法识别出是狗和猫的图片

根据 ImageNet 图像标签 ,标签 151-268 是狗,标签 281-285 是猫。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def is_dog_or_cat(img_path):
    prediction = model.predict(img_path)
    if (prediction >= 151) and (prediction <= 268):
        return True
    if (prediction >= 281) and (prediction <= 285):
        return True
    return False

def find_unknown(datasets):
    unknown = list()
    for img_path in datasets:
        if not is_dog_or_cat(img_path):
            unknown.append(img_path)
    return unknown
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_unknown = find_unknown(train_datasets)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
randsample(train_unknown, shape=(10, 10), figsize=(16, 16))

经过模型的初步筛选,在原有 25,000 张图片的训练集中,有 3,430 张图片模型未识别出是狗或者猫。但通过对这些未识别出来的图片随机抽样观察,发现存在很多明显是猫的图,以及少量是狗的图片。说明我们前面的设定的标签范围并未涵盖所有猫狗的分类。为了进一步找出这些标签,我们不妨看看这些未识别的出来的标签是否真的是我们需要的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def find_unknown_labels(unknown):
    return [model.predict(img_path) for img_path in unknown]
unknown_labels = find_unknown_labels(train_unknown)

为了能直观查看图片和标签,我们需要对前文查看图片的函数 show_img_by_path() 稍作修改,以便在查看图片的同时,在标题栏显示标签。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def show_img_by_path2(imgpath, **argkw):
    show_img(Image.open(imgpath), **argkw)

编写一个生成器,实现依次查看未识别出来的图像标签

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def unknown_iter():
    for img_path, label in zip(train_unknown, unknown_labels):
        yield img_path, label

unknown = unknown_iter()

def show_unknown(unknown, **argkw):
    img_path, label = next(unknown)
    show_img_by_path2(img_path, title=label, **argkw)

从第一张未识别图片开始,每调用一次函数 show_unknown(),依次显示下一张图片,直到看完所有图片。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show_unknown(unknown)

如果觉得一次看一张图片效率太低,可以再编写一个函数实现一次看多张图片。注意,为了从第一张开始看,我们需要重新初始化 unknown 变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def show_unknowns(unknown, shape=(10, 10), **argkw):
    rows, cols = shape
    fig, axs = plt.subplots(rows, cols, **argkw)
    for row in range(rows):
        for col in range(cols):
            show_unknown(unknown, ax=axs[row, col])

unknown = unknown_iter()

每调用一次函数 show_unknowns() 顺序显示下一百张图片。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show_unknowns(unknown, figsize=(16, 16))

如果对数字标签不满意,想看文本分类名称(只有英文)。可以参考专栏 《Keras 手动搭建 VGG 卷积神经网络识别 ImageNet 1000 种常见分类》第 3.5 小节 。这里直接使用相关代码获取数字标签到文本标签的映射字典。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_imagenet_classes():
    import pickle

    with open('imagenet1000_clsid_to_human.pkl', 'rb') as f:
        classes = pickle.load(f)

    return classes

imagenet_classes = get_imagenet_classes()

def unknown_iter2():
    labels = [str(i)+'-'+imagenet_classes[i] for i in unknown_labels]
    for img_path, label in zip(train_unknown, labels):
        yield img_path, label

unknown2 = unknown_iter2()

一次显示 20 张图片。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show_unknowns(unknown2, shape=(5, 4), figsize=(16, 16))
2.2.3 改进筛选模型

通过上一小节的观察,我们发现,简单对图片预测单一分类(概率最高的),会因为图片中存在其他物体干扰,而导致无法识别出猫和狗。因此,我们需要改进一一下模型,在概率最高的前10个分类中,查看是否有猫或者狗。

ImgModel 基本一样,仅仅在 predict() 方法返回时,不是返回概率最大的标签,而是按概率倒序排序,即概率最大的排在前面,返回标签列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ImgModel2:
    def __init__(self, mc):
        self.model = mc(weights='imagenet')
    def _totensor(self, img_path):
        img = image.load_img(img_path, target_size=(224, 224))
        x = image.img_to_array(img)
        tensor = np.expand_dims(x, axis=0)
        return preprocess_input(tensor)
    def predict(self, img_path):
        tensor = self._totensor(img_path)
        predict_labels = self.model.predict(tensor)
        sort_labels = sorted(list(zip(range(1000), predict_labels.flatten())), key=lambda x:x[1], reverse=True)
        return [label[0] for label in sort_labels]

model2 = ImgModel2(ResNet50)

改进了模型,同时也要对应调整一下函数 is_dog_or_cat2() 和函数 find_unknown2()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def is_dog_or_cat2(img_path):
    predictions = model2.predict(img_path)[:10]
    for prediction in predictions:
        if (prediction >= 151) and (prediction <= 268):
            return True
        if (prediction >= 281) and (prediction <= 285):
            return True
    return False

def find_unknown2(datasets):
    unknown = list()
    for img_path in datasets:
        if not is_dog_or_cat2(img_path):
            unknown.append(img_path)
    return unknown

在前文未识别出猫狗的 3,430 张图片中,使用改进的模型重新筛选不能识别的图片。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_unknown2 = find_unknown2(train_unknown)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
len(train_unknown2)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
281

经过第二次改进模型后的筛选,由原来不能识别 3,430 张图片降到 281 张。再来看看这剩下的 281 张图片到底是“何方神圣”,为何如此难以识别。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
randsample(train_unknown2, shape=(10, 10), figsize=(16, 16))

Fuck ! (我想你和我一样,已经忍不住破口而出了…)不难看出,这些图片确实狗糟糕的。简直无 fuck 说,我有100个理由把这些图片排除在训练集之外。

3. 将不能识别出来的图片移出训练集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import shutil
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def move_train_unknown(train_unknown):
    train_unknown_dir = 'datasets/train_unknown'
    if not os.path.isdir(train_unknown_dir):
        os.makedirs(train_unknown_dir)
    for img_path in train_unknown:
        shutil.move(img_path, train_unknown_dir)
    print('{} pictures have been moved.'.format(len(train_unknown)))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
move_train_unknown(train_unknown2)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
281 pictures have been moved.

重新加载训练集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_datasets = load_datasets()[0]

print('{} images left after cleaning.'.format(len(train_datasets)))

randsample(train_datasets, shape=(10, 10), figsize=(16, 16))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
24719 images left after cleaning.

可以看到,经过清洗后的训练集,图片“干净”了不少,这为后续模型的训练提供了良好的开始。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Kaggle竞赛】模型测试
是骡子是马拉出来溜溜就知道,一个模型好还是坏,放在全新的测试集上去测试下就知道了,根据模型测试的结果我们才能衡量模型的泛化性、稳定性等指标如何,从而方便我们根据测试的反馈去进行调参优化模型。
嵌入式视觉
2022/09/05
6350
【Kaggle竞赛】模型测试
TensorFlow 2.0 - tf.data.Dataset 数据预处理 & 猫狗分类
项目及数据地址:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/overview
Michael阿明
2021/02/19
2.5K0
TensorFlow 2.0 - tf.data.Dataset 数据预处理 & 猫狗分类
pytorch训练kaggle猫狗大战分类器
这篇文章来写一下用 pytorch 训练的一个 CNN 分类器,数据集选用的是 kaggle 上的猫狗大战数据集,只有两个 class ,不过数据集还是挺多的,足够完成我们的分类任务。这份数据集分为 train 和 test 两个文件夹,装着训练集和测试集,还有一个 sample_submission.csv 用来提交我们训练的模型在测试集上的分类情况。值得注意的是,训练集是带标签的,标签在文件名中,如 cat.7741.jpg,而测试集是不带标签的,因为我们模型在测试集中测试后分类的结果是要填到 csv 文件中提交的,所以不能拿测试集来评估模型,我们可以在训练集中划分出一个验证集来评估模型。
棒棒鸡不棒
2022/09/02
1.3K0
pytorch训练kaggle猫狗大战分类器
干货 | Tensorflow设计简单分类网络实现猫狗图像分类训练与测试
第一层:32个feature map 5x5卷积、步长为2、最大值池化 局部相应归一化处理(LRN) 第二层:64个feature map 3x3卷积、步长为1、没有池化 第三层:128个feature map 3x3卷积、步长为1、最大值池化 局部相应归一化处理(LRN) 扁平层操作12x12x128个神经元 输出层操作2个神经元输出、sigmoid激活函数 卷积层采用relu作为激活函数。
OpenCV学堂
2018/12/12
2.4K0
干货 | Tensorflow设计简单分类网络实现猫狗图像分类训练与测试
【Kaggle竞赛】AlexNet模型定义及实现
在图像识别/目标检测领域,基本上CNN的天下,从基础的AlexNet,再到后面更深的GoogleNet、VGGNet等,再到收敛速度更快、泛化性更强ResNet等残差网络,从2012年到现在CNN网络在图像识别/目标检测领域可谓是一个很好的方法。
嵌入式视觉
2022/09/05
3820
【Kaggle竞赛】AlexNet模型定义及实现
【Kaggle竞赛】迭代训练模型
CV领域中,在完成数据准备工作和设计定义好模型之后,我们就可以去迭代训练模型了,通过设置调节不同的超参数(这需要理论知识和丰富的经验)来使得损失(loss)和准确率(accuracy)这两个常用的指标达到最优。一般在训练完成之后,都需要通过损失曲线图和准确率曲线图来衡量整个训练过程。
嵌入式视觉
2022/09/05
7710
【Kaggle竞赛】迭代训练模型
开源图书《Python完全自学教程》12.6机器学习案例12.6.2猫狗二分类
深度学习是机器学习的一个分支,目前常用的深度学习框架有 TensorFlow、PyTorch和飞桨等(飞桨,即 PaddlePaddle,全中文的官方文档,让学习者不为语言而担忧)。本小节中将以 PyTorch 演示一个经典的案例,让初学 Python 的读者对深度学习有感性地认识。所以,以下代码可不求甚解,只要能认识到所涉及到的基础知识并不陌生即可——除了 PyTorch 部分。
老齐
2022/12/09
7800
开源图书《Python完全自学教程》12.6机器学习案例12.6.2猫狗二分类
迁移学习之快速搭建【卷积神经网络】
卷积神经网络 概念认识:https://cloud.tencent.com/developer/article/1822928
一颗小树x
2021/05/14
2K0
迁移学习之快速搭建【卷积神经网络】
从零开始学keras(七)之kaggle猫狗分类器
【导读】Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。本系列将教你如何从零开始学Keras,从搭建神经网络到项目实战,手把手教你精通Keras。相关内容参考《Python深度学习》这本书。
墨明棋妙27
2022/08/24
1.4K0
从零开始学keras(七)之kaggle猫狗分类器
MOOC TensorFlow入门实操课程代码回顾总结(二)
欢迎来到TensorFlow入门实操课程的学习 MOOC TensorFlow入门实操课程代码回顾总结(一) MOOC TensorFlow入门实操课程代码回顾总结(三) 注: 用于表示python代码 粘贴运行结果 目录 5 图像分类基础应用——猫狗分类案例 5.1 导入库 5.2 下载数据集 5.3 查看样本数目 5.4 创建文件夹,存放训练测试数据 5.5 切分为训练数据和测试数据 5.6 模型构建 5.7 数据预处理 5.8 模型训练 5.9 训练结果可视化 5.10 模型推理 6 迁移学
荣仔_最靓的仔
2022/01/05
5740
MOOC TensorFlow入门实操课程代码回顾总结(二)
深度学习中超大规模数据集的处理
在机器学习项目中,如果使用的是比较小的数据集,数据集的处理上可以非常简单:加载每个单独的图像,对其进行预处理,然后输送给神经网络。但是,对于大规模数据集(例如ImageNet),我们需要创建一次只访问一部分数据集的数据生成器(比如mini batch),然后将小批量数据传递给网络。其实,这种方法在我们之前的示例中也有所涉及,在使用数据增强技术提升模型泛化能力一文中,我就介绍了通过数据增强技术批量扩充数据集,虽然那里并没有使用到超大规模的数据集。Keras提供的方法允许使用磁盘上的原始文件路径作为训练输入,而不必将整个数据集存储在内存中。
云水木石
2019/07/02
1.5K0
深度学习中超大规模数据集的处理
深度学习入门数据集--2.fasion-mnist数据集
数据可以从git仓库上下载,https://github.com/zalandoresearch/fashion-mnist fasion-mnist 作为tensorflow分类教程数据,通过访问链接可以获得更多内容https://www.tensorflow.org/tutorials/keras/basic_classification
birdskyws
2019/03/06
1.8K0
【深度学习实战:kaggle自然场景的图像分类-----使用keras框架实现vgg16的迁移学习】
本次数据集来自kaggle,该数据集包括自然场景的图像。模型应该预测每个图像的正确标签。 您的目标是实现分类问题的高精度。
机器学习司猫白
2025/01/21
2060
【深度学习实战:kaggle自然场景的图像分类-----使用keras框架实现vgg16的迁移学习】
【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
这个数据集是我们在后面学习中将会用到的图形分类数据集。它的图像内容相较于手写数字识别数据集MINIST更为复杂一些,更加便于我们直观的观察算法之间的差异。
树枝990
2020/08/20
4.1K0
【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
【深度学习基础】线性神经网络 | 图像分类数据集
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/22
1490
【深度学习基础】线性神经网络 | 图像分类数据集
VGG16 训练猫狗数据集
准备数据应该是一件比较麻烦的过程,所以一般都去找那种公开的数据集。在网上找到的可以用于猫狗分类的数据集有 Kaggle 的 “Dogs vs. Cats”数据集,还有牛津大学提供的 Oxford-IIIT Pet 数据集,包含猫和狗的图片,都是非常适合做猫狗分类任务的公开数据集。
繁依Fanyi
2025/03/24
1990
PyTorch数据Pipeline标准化代码模板
PyTorch作为一款流行深度学习框架其热度大有超越TensorFlow的感觉。根据此前的统计,目前TensorFlow虽然仍然占据着工业界,但PyTorch在视觉和NLP领域的顶级会议上已呈一统之势。
机器视觉CV
2019/12/17
1.7K0
PyTorch数据Pipeline标准化代码模板
PyTorch-24h 03_图像分类
torchvision.datasets 包含许多示例数据集,可用于练习编写计算机视觉代码。FashionMNIST 就是其中之一。它有 10 个不同的图像类别(不同类型的服装),用于多分类问题。torchvision已经内置了该数据集,可以通过torchvision.datasets加载。
一只大鸽子
2023/02/24
8060
PyTorch-24h  03_图像分类
十分钟搞懂Pytorch如何读取MNIST数据集
本文用于记录使用pytorch读取minist数据集的过程,以及一些思考和疑惑吧…
全栈程序员站长
2022/07/23
5.6K0
十分钟搞懂Pytorch如何读取MNIST数据集
Python迁移学习:用Torchvision、Pytorch进行交通标志图像分类|附代码数据
本研究旨在探索如何应用迁移学习技术对交通标志图像进行分类。通过构建适用于Torchvision的图像数据集,并利用预训练模型进行微调,我们实现了对原始像素的交通标志图像的分类(点击文末“阅读原文”获取完整代码数据)。
拓端
2025/04/15
1150
Python迁移学习:用Torchvision、Pytorch进行交通标志图像分类|附代码数据
推荐阅读
相关推荐
【Kaggle竞赛】模型测试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验