10分钟搭建你的第一个图像识别模型(附步骤、代码)

翻译:王威力python

校对:丁楠雅git

本文约3400字,建议阅读10分钟。编程

本文介绍了图像识别的深度学习模型的创建过程,经过陈述实际比赛的问题、介绍模型框架和展现解决方案代码,为初学者提供了解决图像识别问题的基础框架。服务器

 

序言网络

“几分钟就能够创建一个深度学习模型?训练就要花几个小时好吗!我甚至没有一台足够好的机器。”我听过无数次有抱负的数据科学家这样说,他们惧怕在本身的机器上构建深度学习模型。数据结构

 

其实,你没必要在谷歌或其余大型科技公司工做,就能够训练深度学习数据集。你彻底能够用几分钟的时间从头搭建起你本身的神经网络,而不须要租谷歌的服务器。Fast.ai的学生花了18分钟设计出了用于ImageNet数据集的一个模型,接下来我将在本文中展现相似的方法。架构

 

10分钟搭建你的第一个图像识别模型(附步骤、代码)

 

 

深度学习是一个普遍的领域,因此咱们会缩小咱们的关注点在图像分类问题上。并且,咱们将使用一个很是简单的深度学习架构来达到一个很好的准确率。app

 

你能够将本文中的Python代码做为构建图像分类模型的基础,一旦你对这些概念有了很好的理解,能够继续编程,参加比赛、登上排行榜。框架

 

若是你刚开始深刻学习,而且对计算机视觉领域着迷(谁不是呢?!)必定要看一看Computer Vision using Deep Learning的课程,它对这个酷炫的领域进行了全面的介绍,将为你将来进入这个巨大的就业市场奠基基础。dom

课程连接:https://trainings.analyticsvidhya.com/courses/course-v1:AnalyticsVidhya+CVDL101+CVDL101_T1/ about?utm_source=imageclassarticle&utm_ medium=blog

 

目录

 

1、什么是图像分类以及它的应用案例

2、设置图像数据结构

3、分解模型创建过程

4、设置问题定义并认识数据

5、创建图像分类模型的步骤

6、开始其余挑战

 

1、什么是图像分类以及它的应用案例

观察如下图片:

 

10分钟搭建你的第一个图像识别模型(附步骤、代码)

 

 

你应该能够立刻就认出它——是一俩豪华车。退一步来分析一下你是如何获得这个结论的——你被展现了一张图片,而后你将它划分为“车”这个类别(在这个例子中)。简单来讲,这个过程就是图像分类。

 

不少时候,图像会有许多个类别。手动检查并分类图像是一个很是繁琐的过程。尤为当问题变为对10000张甚至1000000张图片的时候,这个任务几乎不可能完成。因此若是咱们能够将这个过程自动化的实现并快速的标记图像类别,这该有多大的用处啊。

 

自动驾驶汽车是一个图像分类在现实世界应用的很好的例子。为了实现自动驾驶,咱们能够创建一个图像分类模型来识别道路上的各类物体,如车辆、人、移动物体等。咱们将在接下来的部分中看到更多的应用,甚至在咱们的身边就有许多的应用。

 

既然咱们已经掌握了主题,那么让咱们来深刻研究一下如何构建图像分类模型,它的先决条件是什么,以及如何在Python中实现它。

 

2、设置图像数据结构

咱们的数据集须要特殊的结构来解决图像分类问题。咱们将在几个部分中看到这一点,但在往下走以前,请记住这些建议。

 

你应该创建两个文件夹,一个放训练集,另外一个放测试集。训练集的文件夹里放一个csv文件和一个图像文件夹:

  • csv文件存储全部训练图片的图片名和它们对应的真实标签
  • 图像文件夹存储全部的训练图片

 

测试集文件夹中的csv文件和训练集文件夹中的csv文件不一样,测试集文件夹中的csv文件只包含测试图像的图片名,不包括它们的真实标签。由于咱们要经过训练训练集中的图片来对测试集中的图片进行预测。

 

若是你的数据集不是这样的格式,你须要进行转换,不然的话预测结果可能有错误。

 

3、分解模型搭建的过程

在咱们研究Python代码以前,让咱们先理解图像分类模型一般是如何设计的。能够将过程分为4个部分。每一个步骤须要必定时间来执行:

第一步:加载和预处理数据——30%时间

第二步:定义模型架构——10%时间

第三步:训练模型——50%时间

第四步:评价模型表现——10%时间

 

接下来我会更详细地解释一下上面的每个步骤。这一部分很是重要,由于并不是全部模型都是在第一步构建的。你须要在每次迭代以后返回,对步骤进行微调,而后再次运行它。对基础概念有一个扎实的理解,对于加速整个过程将有很大的帮助。

 

  • 第一步:加载和预处理数据

 

就深度学习模型而言,数据很是关键。若是训练集中有大量的图像,你的图像分类模型也会有更大的可能实现更好的分类效果。此外,根据所用的框架不一样,数据的维度不一样,效果也不同。

 

所以,对于关键的数据预处理这一步,我推荐你们浏览下面这篇文章,来对图像数据的预处理有一个更好的理解:

Basics of Image Processing in Pythonhttps://www.analyticsvidhya.com/blog/2014/12/image-processing-python-basics/)

 

但咱们还没彻底到数据预处理这一步,为了了解咱们的数据在新的以前没见过的数据集中的表现(在预测测试集以前),咱们须要先从训练集中划分出一部分为验证集。

 

简而言之,咱们在训练集上训练模型而后在验证集上进行验证。若是咱们对在验证集上的结果满意,就能够用来预测测试集的数据。

 

所需时间:大约2-3分钟。

 

  • 第二步:创建模型框架

 

这是深度学习模型创建过程当中的另外一个重要的步骤。在这个过程当中,须要思考这样几个问题:

  • 须要多少个卷积层?
  • 每一层的激活函数是什么?
  • 每一层有多少隐藏单元?

 

还有其余一些问题。但这些基本上是模型的超参数,它们对预测结果起着重要做用。

 

如何肯定这些超参的值?好问题!一个方法是根据现有的研究选择这些值。另外一个想法是不断尝试这些值,直到找到最好的,但这多是一个很是耗时的过程。

 

所需时间:大约1分钟定义这个框架。

 

  • 第三步:训练模型

 

对模型训练,咱们须要:

  • 训练图像和它们的真实标签。
  • 验证集图像和其真实标签。(咱们只用验证集的标签进行模型评估,不用于训练)

 

咱们还须要定义迭代次数(epoch)。开始阶段,咱们训练10次(你能够再更改)。

 

所需时间:大概5分钟,来进行模型的结构的学习。

 

  • 第四步:评估模型表现

 

最后,咱们加载测试数据(图像)并完成预处理步骤。而后咱们使用训练模型预测这些图像的类别。

所需时间:1分钟

 

4、设置问题定义并认识数据

咱们将尝试一个很是酷的挑战来理解图像分类。咱们须要创建一个模型,能够对给定的图像进行分类(衬衫、裤子、鞋子、袜子等)。这其实是许多电子商务零售商面临的一个问题,这使得它成为一个更有趣的计算机视觉问题。

 

这个挑战被称为“识别服装”,是咱们在数据黑客平台上遇到的实践问题之一。你必须注册并从上面的连接下载数据集。

“识别服装”比赛连接:https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-apparels/)数据黑客平台:https://datahack.analyticsvidhya.com/

 

 

10分钟搭建你的第一个图像识别模型(附步骤、代码)

 

 

一共有70000图像(28x28维),其中60000来自训练集,10000来自测试集。训练图像已经预先被打上了衣服类别的标签,一共10个类别。测试集没有标签。这个比赛是对测试集的图像进行识别。

 

咱们将在Google Colab搭建模型,由于它提供免费的GPU。

Google Colab:https://colab.research.google.com/

 

 

5、创建图像分类模型的步骤

接下来是时候展现你的Python技巧啦,最终咱们到了执行阶段!

主要步骤以下:

  • 设置Google Colab
  • 导入库
  • 导入数据预处理数据(3分钟)
  • 设置验证集
  • 定义模型结构(1分钟)
  • 训练模型(5分钟)
  • 预测(1分钟)

 

下面详细介绍以上步骤。

  • 第1步:设置Google Colab

 

由于咱们将从Google Drive link导入数据,咱们须要在Google Colab notebook上增长几条代码。新建Python3 notebook,写下下面的代码:

!pip install PyDrive

这一步是安装PyDrive。下面导入须要的库:

import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

下面建立drive变量访问Google Drive:

auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

须要用Google Drive上传文件的ID来下载数据集:

download = drive.CreateFile({'id': '1BZOv422XJvxFUnGh-0xVeSvgFgqVY45q'})

 

把id的部分替换为你的文件夹的ID。接下来将下载文件夹并解压。

download.GetContentFile('train_LbELtWX.zip')
!unzip train_LbELtWX.zip

每次启动notebook都须要运行以上代码。

 

  • 第2步:导入模型所需的库。

 

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import to_categorical
from keras.preprocessing import image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from tqdm import tqdm
  • 第3步:接下来是数据导入和数据预处理。

 

train = pd.read_csv('train.csv')

接下来,咱们将读入训练集,存储为list,最终转换为numpy array。

# We have grayscale images, so while loading the images we will keep grayscale=True, if you have RGB images, you should set grayscale as False
train_image = []
for i in tqdm(range(train.shape[0])):
img = image.load_img('train/'+train['id'][i].astype('str')+'.png', target_size=(28,28,1), grayscale=True)
img = image.img_to_array(img)
img = img/255
train_image.append(img)
X = np.array(train_image)

这是一个多分类问题(10个类别),须要对标签变量进行one-hot编码。

y=train['label'].values
y = to_categorical(y)
  • 第4步:从训练集中划分验证集

 

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)
  • 第5步:定义模型结构

咱们将创建一个简单的结构,有2个卷积层,一个隐藏层一个输出层。

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(28,28,1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

接下来编译模型。

model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
  • 第6步:训练模型

在这一步,咱们将训练训练集的数据,在验证集上进行验证。

model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
  • 第7步:预测!

咱们将首先遵循处理训练数据集时执行的步骤。加载测试图像并预测分类结果,用model.predict_classes()函数预测它们的类。

download = drive.CreateFile({'id': '1KuyWGFEpj7Fr2DgBsW8qsWvjqEzfoJBY'})
download.GetContentFile('test_ScVgIM0.zip')
!unzip test_ScVgIM0.zip

首先导入测试集:

test = pd.read_csv('test.csv')

接下来,读于数据并存储测试集:

test_image = []
for i in tqdm(range(test.shape[0])):
img = image.load_img('test/'+test['id'][i].astype('str')+'.png', target_size=(28,28,1), grayscale=True)
img = image.img_to_array(img)
img = img/255
test_image.append(img)
test = np.array(test_image)
# making predictions
prediction = model.predict_classes(test)

还须要新建一个提交文件夹,用来上传DataHack平台。

download = drive.CreateFile({'id': '1z4QXy7WravpSj-S4Cs9Fk8ZNaX-qh5HF'})
download.GetContentFile('sample_submission_I5njJSF.csv')
# creating submission file
sample = pd.read_csv('sample_submission_I5njJSF.csv')
sample['label'] = prediction
sample.to_csv('sample_cnn.csv', header=True, index=False)

下载sample_cnn.csv文件并上传到比赛的页面,生成你的排名。这提供了一个帮助你开始解决图像分类问题的基础方案。

 

你能够尝试调整超参数和正则化来提升模型效果。也能够经过阅读下面这篇文章来理解调参的细节。

A Comprehensive Tutorial to learn Convolutional Neural Networks from Scratchhttps://www.analyticsvidhya.com/blog/2018/12/guide-convolutional-neural-network-cnn/

 

6、开启一个新的挑战

 

 

10分钟搭建你的第一个图像识别模型(附步骤、代码)

 

 

让咱们尝试在其余的数据集进行测试。这部分,咱们将解决Identify the Digits上的这个问题。

Identify the Digits比赛连接:https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-digits/

 

在你往下看以前,请尝试本身来解决这个挑战。你已经收获了解决问题的工具,只须要使用它们。当你遇到困难的时候能够再回来检查你的过程和结果。

 

在这个挑战中,咱们须要识别给定图像中的数字。一共有70000张图片,49000张训练图像有标签,剩下的21000张为测试图片无标签。

 

准备好了吗?好!打开新的Python3 notebook,运行下面的代码:

# Setting up Colab
!pip install PyDrive
import os
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)
# Replace the id and filename in the below codes
download = drive.CreateFile({'id': '1ZCzHDAfwgLdQke_GNnHp_4OheRRtNPs-'})
download.GetContentFile('Train_UQcUa52.zip')
!unzip Train_UQcUa52.zip
# Importing libraries
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.utils import to_categorical
from keras.preprocessing import image
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from tqdm import tqdm
train = pd.read_csv('train.csv')
# Reading the training images
train_image = []
for i in tqdm(range(train.shape[0])):
img = image.load_img('Images/train/'+train['filename'][i], target_size=(28,28,1), grayscale=True)
img = image.img_to_array(img)
img = img/255
train_image.append(img)
X = np.array(train_image)
# Creating the target variable
y=train['label'].values
y = to_categorical(y)
# Creating validation set
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)
# Define the model structure
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(28,28,1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
# Compile the model
model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
# Training the model
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
download = drive.CreateFile({'id': '1zHJR6yiI06ao-UAh_LXZQRIOzBO3sNDq'})
download.GetContentFile('Test_fCbTej3.csv')
test_file = pd.read_csv('Test_fCbTej3.csv')
test_image = []
for i in tqdm(range(test_file.shape[0])):
img = image.load_img('Images/test/'+test_file['filename'][i], target_size=(28,28,1), grayscale=True)
img = image.img_to_array(img)
img = img/255
test_image.append(img)
test = np.array(test_image)
prediction = model.predict_classes(test)
download = drive.CreateFile({'id': '1nRz5bD7ReGrdinpdFcHVIEyjqtPGPyHx'})
download.GetContentFile('Sample_Submission_lxuyBuB.csv')
sample = pd.read_csv('Sample_Submission_lxuyBuB.csv')
sample['filename'] = test_file['filename']
sample['label'] = prediction
sample.to_csv('sample.csv', header=True, index=False)

在练习题页面上提交这个文件,你会获得一个至关不错的准确率。这是一个好的开端,但总有改进的余地。继续肝,看看你是否能够改进咱们的基本模型。

 

尾声

谁说深度学习模型须要数小时或数天的训练。个人目的是展现你能够在双倍快速的时间内想出一个至关不错的深度学习模式。你应该接受相似的挑战,并尝试从你的终端编码它们。什么都比不上经过实践来学习!

 

顶尖的数据科学家和分析师甚至在黑客比赛开始以前就已经准备好了这些代码。他们使用这些代码在深刻详细分析以前提早提交。先给出基准解决方案,而后使用不一样的技术改进模型。

 

你以为这篇文章有用吗?请在下面的评论部分分享你的反馈。

原文标题:

Build your First Image Classification Model in just 10 Minutes!

原文连接:

https://www.analyticsvidhya.com/blog/2019/01/build-image-classification-model-10-minutes/

编辑:黄继彦