当前位置 主页 > 网站技术 > 代码类 >

    使用pytorch完成kaggle猫狗图像识别方式

    栏目:代码类 时间:2020-01-10 21:11

    kaggle是一个为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台,在这上面有非常多的好项目、好资源可供机器学习、深度学习爱好者学习之用。

    碰巧最近入门了一门非常的深度学习框架:pytorch,所以今天我和大家一起用pytorch实现一个图像识别领域的入门项目:猫狗图像识别。

    深度学习的基础就是数据,咱们先从数据谈起。此次使用的猫狗分类图像一共25000张,猫狗分别有12500张,我们先来简单的瞅瞅都是一些什么图片。

    我们从下载文件里可以看到有两个文件夹:train和test,分别用于训练和测试。以train为例,打开文件夹可以看到非常多的小猫图片,图片名字从0.jpg一直编码到9999.jpg,一共有10000张图片用于训练。

    而test中的小猫只有2500张。仔细看小猫,可以发现它们姿态不一,有的站着,有的眯着眼睛,有的甚至和其他可识别物体比如桶、人混在一起。

    同时,小猫们的图片尺寸也不一致,有的是竖放的长方形,有的是横放的长方形,但我们最终需要是合理尺寸的正方形。小狗的图片也类似,在这里就不重复了。

    紧接着我们了解一下特别适用于图像识别领域的神经网络:卷积神经网络。学习过神经网络的同学可能或多或少地听说过卷积神经网络。这是一种典型的多层神经网络,擅长处理图像特别是大图像的相关机器学习问题。

    卷积神经网络通过一系列的方法,成功地将大数据量的图像识别问题不断降维,最终使其能够被训练。CNN最早由Yann LeCun提出并应用在手写体识别上。

    一个典型的CNN网络架构如下:

    这是一个典型的CNN架构,由卷基层、池化层、全连接层组合而成。其中卷基层与池化层配合,组成多个卷积组,逐层提取特征,最终完成分类。

    听到上述一连串的术语如果你有点蒙了,也别怕,因为这些复杂、抽象的技术都已经在pytorch中一一实现,我们要做的不过是正确的调用相关函数,

    我在粘贴代码后都会做更详细、易懂的解释。

    import os
    import shutil
    import torch
    import collections
    from torchvision import transforms,datasets
    from __future__ import print_function, division
    import os
    import torch
    import pylab
    import pandas as pd
    import torch.nn as nn
    import torch.nn.functional as F
    from torch.autograd import Variable
    from skimage import io, transform
    import numpy as np
    import matplotlib.pyplot as plt
    from torch.utils.data import Dataset, DataLoader
    from torchvision import transforms, utils
     
    # Ignore warnings
    import warnings
    warnings.filterwarnings("ignore")
     
    plt.ion() # interactive mode
    

    一个正常的CNN项目所需要的库还是蛮多的。

    import math
    from PIL import Image
     
    class Resize(object):
     """Resize the input PIL Image to the given size.
     Args:
     size (sequence or int): Desired output size. If size is a sequence like
      (h, w), output size will be matched to this. If size is an int,
      smaller edge of the image will be matched to this number.
      i.e, if height > width, then image will be rescaled to
      (size * height / width, size)
     interpolation (int, optional): Desired interpolation. Default is
      ``PIL.Image.BILINEAR``
     """
     
     def __init__(self, size, interpolation=Image.BILINEAR):
     # assert isinstance(size, int) or (isinstance(size, collections.Iterable) and len(size) == 2)
     self.size = size
     self.interpolation = interpolation
     
     def __call__(self, img):
     w,h = img.size
     
     min_edge = min(img.size)
     rate = min_edge / self.size
     
     new_w = math.ceil(w / rate)
     new_h = math.ceil(h / rate)
     
     return img.resize((new_w,new_h))