找回密码
 立即注册
搜索

10分钟搭建你的第一个图像辨认模型 | 附残缺代码


(图片由AI科技大本营付费下载自视觉中国)

作者 | Pulkit Sharma

译者 | 王威力

来源 | 数据派THU(ID:DatapiTHU)

【导读】本文引见了图像辨认的深度学习模型的建立过程,经过陈述实践比赛的成绩、引见模型框架和展现处理方案代码,为初学者提供了处理图像辨认成绩的基础框架。

序文

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

其实,你不必在谷歌或其他大型科技公司工作,就可以训练深度学习数据集。你完全可以用几分钟的工夫从头搭建起你本人的神经网络,而不需求租谷歌的服务器。Fast.ai的先生花了18分钟设计出了用于ImageNet数据集的一个模型,接上去我将在本文中展现相似的方法。

深度学习是一个广泛的范畴,所以我们会减少我们的关注点在图像分类成绩上。而且,我们将运用一个非常简单的深度学习架构来达到一个很好的准确率。

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

假如你刚末尾深化学习,并且对计算机视觉范畴着迷(谁不是呢?!)一定要看一看Computer Vision using Deep Learning的课程,它对这个酷炫的范畴停止了片面的引见,将为你将来进入这个宏大的失业市场奠定基础。

课程链接:

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



目录

01 什么是图像分类以及它的运用案例

02 设置图像数据结构

03 分解模型建立过程

04 设置成绩定义并看法数据

05 建立图像分类模型的步骤

06 其他应战

01 什么是图像分类以及它的运用案例

观察以下图片:


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

很多时分,图像会有许多个类别。手动检查并分类图像是一个非常繁琐的过程。尤其当成绩变为对10000张甚至1000000张图片的时分,这个义务几乎不能够完成。所以假如我们可以将这个过程自动化的完成并疾速的标记图像类别,这该有多大的用途啊。

自动驾驶汽车是一个图像分类在理想世界运用的很好的例子。为了完成自动驾驶,我们可以建立一个图像分类模型来辨认道路上的各种物体,如车辆、人、移动物体等。我们将在接上去的部分中看到更多的运用,甚至在我们的身边就有许多的运用。

既然我们曾经掌握了主题,那么让我们来深化研讨一下如何构建图像分类模型,它的先决条件是什么,以及如何在Python中完成它。

02 设置图像数据结构

我们的数据集需求特殊的结构来处理图像分类成绩。我们将在几个部分中看到这一点,但在往下走之前,请记住这些建议。

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

    csv文件存储一切训练图片的图片名和它们对应的真实标签

    图像文件夹存储一切的训练图片

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

假如你的数据集不是这样的格式,你需求停止转换,否则的话预测结果能够有错误。


03 分解模型搭建的过程

在我们研讨Python代码之前,让我们先了解图像分类模型通常是如何设计的。可以将过程分为4个部分。每个步骤需求一定工夫来执行:

    第1步:加载和预处理数据——30%工夫

    第2步:定义模型架构——10%工夫

    第3步:训练模型——50%工夫

    第4步:评价模型表现——10%工夫

接上去我会更详细地解释一下下面的每一个步骤。这一部分非常重要,由于并非一切模型都是在第一步构建的。你需求在每次迭代之后前往,对步骤停止微调,然后再次运转它。对基础概念有一个扎实的了解,对于加速整个过程将有很大的协助。

1. 加载和预处理数据,所需工夫:大约2-3分钟

就深度学习模型而言,数据非常关键。假如训练集中有大量的图像,你的图像分类模型也会有更大的能够完成更好的分类效果。此外,根据所用的框架不同,数据的维度不同,效果也不一样。

因此,对于关键的数据预处理这一步,我引荐大家阅读下面这篇文章,来对图像数据的预处理有一个更好的了解:

Basics of Image Processing in Python

https://www.analyticsvidhya.com/blog/2014/12/image-processing-python-basics/



但我们还没完全到数据预处理这一步,为了了解我们的数据在新的之前没见过的数据集中的表现(在预测测试集之前),我们需求先从训练集中划分出一部分为验证集。

简而言之,我们在训练集上训练模型然后在验证集上停止验证。假如我们对在验证集上的结果称心,就可以用来预测测试集的数据。

2. 建立模型框架,所需工夫:大约1分钟定义这个框架

这是深度学习模型建立过程中的另一个重要的步骤。在这个过程中,需求思索这样几个成绩:

    需求多少个卷积层?

    每一层的激活函数是什么?

    每一层有多少隐藏单元?

还有其他一些成绩。但这些基本上是模型的超参数,它们对预测结果起着重要作用。

如何确定这些超参的值?好成绩!一个方法是根据现有的研讨选择这些值。另一个想法是不断尝试这些值,直到找到最好的,但这能够是一个非常耗时的过程。

3. 训练模型,所需工夫:大概5分钟,来停止模型的结构的学习

对模型训练,我们需求:

    训练图像和它们的真实标签。

    验证集图像和其真实标签。(我们只用验证集的标签停止模型评价,不用于训练)

我们还需求定义迭代次数(epoch)。末尾阶段,我们训练10次(你可以再更改)。

4. 评价模型表现,所需工夫:1分钟

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


04 设置成绩定义并看法数据

我们将尝试一个非常酷的应战来了解图像分类。我们需求建立一个模型,可以对给定的图像停止分类(衬衫、裤子、鞋子、袜子等)。这实践上是许多电子商务批发商面临的一个成绩,这使得它成为一个更风趣的计算机视觉成绩。

这个应战被称为“辨认服装”,是我们在数据黑客平台上遇到的实际成绩之一。你必须注册并从下面的链接下载数据集。

“辨认服装”比赛链接:

https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-apparels/

数据黑客平台:

https://datahack.analyticsvidhya.com/




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

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

Google Colab:

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




05 建立图像分类模型的步骤

接上去是时分展现你的Python技巧啦,最终我们到了执行阶段!

次要步骤如下:

    第1步:设置Google Colab

    第2步:导入库

    第3步:导入数据预处理数据(3分钟)

    第4步:设置验证集

    第5步:定义模型结构(1分钟)

    第6步:训练模型(5分钟)

    第7步:预测(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'].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'].valuesy = 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'].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 predictionsprediction = 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 Scratch

https://www.analyticsvidhya.com/blog/2018/12/guide-convolutional-neural-network-cnn/




06 开启一个新的应战


让我们尝试在其他的数据集停止测试。这部分,我们将处理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'], 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_image =

for i in tqdm(range(test_file.shape[0])):

img = image.load_img('Images/test/'+test_file['filename'], 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/

译者:王威力,求职狗,在香港科技大学学习大数据科技。感觉数据迷信很有难度,也很有意思,还在学(tu)习(tou)中。一个人肝不动的文献,follow大佬一同肝。



你觉得这篇文章有用吗?欢迎给编辑们留言,以提供给大家更优质的内容。

(*本文为 AI科技大本营转载文章,转载请联络作者)





2019 中国大数据技术大会(BDTC)历经十一载,再度火热来袭!豪华主席阵容及百位技术专家齐聚,15 场精选专题技术和行业论坛,超强干货+技术分析+行业实际平面解读,深化解析抢手技术内行业中的实际落地。【早鸟票】【特惠先生票】限时抢购,扫码了解概况!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评9

小树啊小树 2019-9-29 07:07:14 显示全部楼层
你也会Ai
回复

使用道具 举报

i埃琳娜 2019-9-29 07:13:31 显示全部楼层
分享了
回复

使用道具 举报

分享了
回复

使用道具 举报

含雪的家 2019-9-29 07:23:05 显示全部楼层
分享了
回复

使用道具 举报

@Xizi_sMgMuZjS 2019-9-29 07:31:42 显示全部楼层
分享了
回复

使用道具 举报

双子座的xy 2019-9-29 07:33:40 显示全部楼层
分享了
回复

使用道具 举报

搁置Z 2019-9-29 07:40:19 显示全部楼层
分享了
回复

使用道具 举报

忘川羽 2019-9-30 08:17:15 显示全部楼层
结束了嘛?有种还没完成的感觉,嘻嘻
回复

使用道具 举报

书写人生 2019-10-1 17:10:32 显示全部楼层
锄禾日当午,发帖真辛苦。谁知坛中餐,帖帖皆辛苦!
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies