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

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

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

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

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

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

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

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

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

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

importosimportshutilimporttorchimportcollectionsfromtorchvisionimporttransforms,datasetsfrom__future__importprint_function,divisionimportosimporttorchimportpylabimportpandasaspdimporttorch.nnasnnimporttorch.nn.functionalasFfromtorch.autogradimportVariablefromskimageimportio,transformimportnumpyasnpimportmatplotlib.pyplotaspltfromtorch.utils.dataimportDataset,DataLoaderfromtorchvisionimporttransforms,utils#Ignorewarningsimportwarningswarnings.filterwarnings("ignore")plt.ion()#interactivemode一个正常的CNN项目所需要的库还是蛮多的。

importmathfromPILimportImageclassResize(object):"""ResizetheinputPILImagetothegivensize.Args:size(sequenceorint):Desiredoutputsize.Ifsizeisasequencelike(h,w),outputsizewillbematchedtothis.Ifsizeisanint,smalleredgeoftheimagewillbematchedtothisnumber.i.e,ifheight>width,thenimagewillberescaledto(size*height/width,size)interpolation(int,optional):Desiredinterpolation.Defaultis``PIL.Image.BILINEAR``"""def__init__(self,size,interpolation=Image.BILINEAR):#assertisinstance(size,int)or(isinstance(size,collections.Iterable)andlen(size)==2)self.size=sizeself.interpolation=interpolationdef__call__(self,img):w,h=img.sizemin_edge=min(img.size)rate=min_edge/self.sizenew_w=math.ceil(w/rate)new_h=math.ceil(h/rate)returnimg.resize((new_w,new_h))这个称为Resize的库用于给图像进行缩放操作,本来是不需要亲自定义的,因为transforms.Resize已经实现这个功能了,但是由于目前还未知的原因,我的库里没有提供这个函数,所以我需要亲自实现用来代替transforms.Resize。

如果你的torch里面已经有了这个Resize函数就不用像我这样了。

data_transform=transforms.Compose([Resize(84),transforms.CenterCrop(84),transforms.ToTensor(),transforms.Normalize(mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])])train_dataset=datasets.ImageFolder(root='train/',transform=data_transform)train_loader=torch.utils.data.DataLoader(train_dataset,batch_size=4,shuffle=True,num_workers=4)test_dataset=datasets.ImageFolder(root='test/',transform=data_transform)test_loader=torch.utils.data.DataLoader(test_dataset,batch_size=4,shuffle=True,num_workers=4)transforms是一个提供针对数据(这里指的是图像)进行转化的操作库,Resize就是上上段代码提供的那个类,主要用于把一张图片缩放到某个尺寸,在这里我们把需求暂定为要把图像缩放到84x84这个级别,这个就是可供调整的参数,大家为部署好项目以后可以试着修改这个参数,比如改成200x200,你就发现你可以去玩一盘游戏了~_~。

CenterCrop用于从中心裁剪图片,目标是一个长宽都为84的正方形,方便后续的计算。

ToTenser()就比较重要了,这个函数的目的就是读取图片像素并且转化为0-1的数字。

Normalize作为垫底的一步也很关键,主要用于把图片数据集的数值转化为标准差和均值都为0.5的数据集,这样数据值就从原来的0到1转变为-1到1。

classNet(nn.Module):def__init__(self):super(Net,self).__init__()self.conv1=nn.Conv2d(3,6,5)self.pool=nn.MaxPool2d(2,2)self.conv2=nn.Conv2d(6,16,5)self.fc1=nn.Linear(16*18*18,800)self.fc2=nn.Linear(800,120)self.fc3=nn.Linear(120,2)defforward(self,x):x=self.pool(F.relu(self.conv1(x)))x=self.pool(F.relu(self.conv2(x)))x=x.view(-1,16*18*18)x=F.relu(self.fc1(x))x=F.relu(self.fc2(x))x=self.fc3(x)returnxnet=Net()好了,最复杂的一步就是这里了。在这里,我们首先定义了一个Net类,它封装了所以训练的步骤,包括卷积、池化、激活以及全连接操作。

__init__函数首先定义了所需要的所有函数,这些函数都会在forward中调用。我们从conv1说起。conv1实际上就是定义一个卷积层,3,6,5分别是什么意思?

3代表的是输入图像的像素数组的层数,一般来说就是你输入的图像的通道数,比如这里使用的小猫图像都是彩色图像,由R、G、B三个通道组成,所以数值为3;6代表的是我们希望进行6次卷积,每一次卷积都能生成不同的特征映射数组,用于提取小猫和小狗的6种特征。

每一个特征映射结果最终都会被堆叠在一起形成一个图像输出,再作为下一步的输入;5就是过滤框架的尺寸,表示我们希望用一个5*5的矩阵去和图像中相同尺寸的矩阵进行点乘再相加,形成一个值。

定义好了卷基层,我们接着定义池化层。池化层所做的事说来简单,其实就是因为大图片生成的像素矩阵实在太大了,我们需要用一个合理的方法在降维的同时又不失去物体特征,所以深度学习学者们想出了一个称为池化的技术,说白了就是从左上角开始,每四个元素(2*2)合并成一个元素,用这一个元素去代表四个元素的值,所以图像体积一下子降为原来的四分之一。

再往下一行,我们又一次碰见了一个卷基层:conv2,和conv1一样,它的输入也是一个多层像素数组,输出也是一个多层像素数组,不同的是这一次完成的计算量更大了,我们看这里面的参数分别是6,16,5。

之所以为6是因为conv1的输出层数为6,所以这里输入的层数就是6;16代表conv2的输出层数,和conv1一样,16代表着这一次卷积操作将会学习小猫小狗的16种映射特征,特征越多理论上能学习的效果就越好,大家可以尝试一下别的值,看看效果是否真的编变好。

conv2使用的过滤框尺寸和conv1一样,所以不再重复。最后三行代码都是用于定义全连接网络的,接触过神经网络的应该就不再陌生了,主要是需要解释一下fc1。

之前在学习的时候比较不理解的也是这一行,为什么是16*18*18呢?16很好理解,因为最后一次卷积生成的图像矩阵的高度就是16层,那18*18是怎么来的呢?我们回过头去看一行代码

transforms.CenterCrop(84)在这行代码里我们把训练图像裁剪成一个84*84的正方形尺寸,所以图像最早输入就是一个3*84*84的数组。经过第一次5*5的卷积之后,我们可以得出卷积的结果是一个6*80*80的矩阵,这里的80就是因为我们使用了一个5*5的过滤框,当它从左上角第一个元素开始卷积后,过滤框的中心是从2到78,并不是从0到79,所以结果就是一个80*80的图像了。

经过一个池化层之后,图像尺寸的宽和高都分别缩小到原来的1/2,所以变成40*40。

紧接着又进行了一次卷积,和上一次一样,长宽都减掉4,变成36*36,然后应用了最后一层的池化,最终尺寸就是18*18。

所以第一层全连接层的输入数据的尺寸是16*18*18。三个全连接层所做的事很类似,就是不断训练,最后输出一个二分类数值。

net类的forward函数表示前向计算的整个过程。forward接受一个input,返回一个网络输出值,中间的过程就是一个调用init函数中定义的层的过程。

F.relu是一个激活函数,把所有的非零值转化成零值。此次图像识别的最后关键一步就是真正的循环训练操作。

importtorch.optimasoptimcirterion=nn.CrossEntropyLoss()optimizer=optim.SGD(net.parameters(),lr=0.0001,momentum=0.9)forepochinrange(3):running_loss=0.0fori,datainenumerate(train_loader,0):inputs,labels=datainputs,labels=Variable(inputs),Variable(labels)optimizer.zero_grad()outputs=net(inputs)loss=cirterion(outputs,labels)loss.backward()optimizer.step()running_loss+=loss.data[0]ifi%2000==1999:print('[%d%5d]loss:%.3f'%(epoch+1,i+1,running_loss/2000))running_loss=0.0print('finishedtraining!')[12000]loss:0.691[14000]loss:0.687[22000]loss:0.671[24000]loss:0.657[32000]loss:0.628[34000]loss:0.626finishedtraining!在这里我们进行了三次训练,每次训练都是批量获取train_loader中的训练数据、梯度清零、计算输出值、计算误差、反向传播并修正模型。我们以每2000次计算的平均误差作为观察值。可以看到每次训练,误差值都在不断变小,逐渐学习如何分类图像。代码相对性易懂,这里就不再赘述了。

correct=0total=0fordataintest_loader:images,labels=dataoutputs=net(Variable(images))_,predicted=torch.max(outputs.data,1)total+=labels.size(0)correct+=(predicted==labels).sum()print('Accuracyofthenetworkonthe5000testimages:%d%%'%(100*correct/total))终于来到模型准确度验证了,这也是开篇提到的test文件夹的用途之所在。程序到这一步时,net是一个已经训练好的神经网络了。传入一个images矩阵,它会输出相应的分类值,我们拿到这个分类值与真实值做一个比较计算,就可以获得准确率。在我的计算机上当前准确率是66%,在你的机器上可能值有所不同但不会相差太大。

最后我们做一个小总结。在pytorch中实现CNN其实并不复杂,理论性的底层都已经完成封装,我们只需要调用正确的函数即可。当前模型中的各个参数都没有达到相对完美的状态,有兴趣的小伙伴可以多调整参数跑几次,训练结果不出意外会越来越好。

THE END
1.模板匹配——图像识别概述文章浏览阅读129次,点赞9次,收藏2次。图像识别,是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。图像识别的发展经历了三个阶段:文字识别、数字图像处理与识别、物体识别。文字识别的研究是从1950年开始的,一般是识别字母、数字和符https://blog.csdn.net/weixin_42291376/article/details/143456894
2.机器视觉系统高效的图像识别与处理技术机器视觉系统作为一种高效的图像识别与处理技术,在现代计算机视觉领域占据了重要地位。它通过模仿人类的视觉功能,能够分析和理解图像中的信息,为工业自动化、医疗诊断、交通监控等多个领域提供强大的支持。那么,我们如何才能提高这套复杂系统的性能呢? 如何有效学习图像特征? https://www.bcioqpgw.cn/cai-dian/349872.html
3.机器视觉技术人工智能在图像识别和分析中的作用人工智能的范围无处不在,它正在改变我们生活的方方面面,尤其是在图像识别和分析领域。机器视觉技术是人工智能的一个重要分支,它使得计算机能够通过摄像头或其他传感器捕捉到世界,并理解其中所包含的信息。 1. 什么是机器视觉? 机器视觉是一门科学与工程,旨在为计算机系统提供“看到”能力,使它们能够处理、解释并从图像https://www.iktpfbwjvk.cn/zhi-neng/552291.html
4.java版图像识别mob64ca12d94299的技术博客java版图像识别,#Java版图像识别的科普图像识别技术是计算机视觉领域中的一项重要任务,它使得计算机能够“看懂”图像并从中提取出有用的信息。在Java中,我们可以利用一些常用的库来实现图像识别功能。本文将介绍一种简单的图像识别实现方法,并通过代码示例阐明其核心概https://blog.51cto.com/u_16213336/12722140
5.什么是图像识别与理解?图像识别与理解是指通过对图像中各种不同的物体特征进行定量化描述后,将其所期望获得的目标物进行提取,并且对所提取的目标物进行一定的定量分析。比如要从一幅照片上确定是否包含某个犯罪分子的人脸信息,就需要先将照片上的人脸检测出来,进而将检测出来的人脸区域进行分析,确定其是否是该犯罪分子。https://www.shuashuati.com/ti/76cb0bcf35ab43f68bd363ad77bd7b67.html
6.什么是图像识别,图像识别的知识介绍图像识别是指利用计算机视觉技术对图像进行分析、识别和理解的过程。这种技术可以帮助计算机“看懂”图像,从而实现自动化处理、智能化判断等功能。随着深度学习等技术的不断发展,图像识别已经逐渐成为人工智能领域中的一个重要研究方向。 1.图像识别是什么 图像识别是一种利用计算机软件对数字图像进行分析、识别和理解的https://www.eefocus.com/baike/1545801.html
7.机器学习零基础?手把手教你用TensorFlow搭建图像识别系统(一)导语:这是Wolfgang Beyer的一篇博文,详细介绍了如何使用TensorFlow搭建一个简单的图像识别系统。本篇主要介绍图像识别和本试验中会遇到的一些概念。 如果你觉得这是一篇简单介绍人工智能、机器学习和深度学习的文章,那就错啦。你可以在网上搜罗到一大堆相关话题的文章,而这篇文章也并不是讨论人工智能是否会奴役人类或抢走https://www.leiphone.com/category/ai/Y4uyEktkkwb5YhJM.html
8.科学网—如何用Python和深度神经网络识别图像?你早已听说过自动驾驶汽车的神奇吧?没有机器对图像的辨识,能做到吗? 你的好友可能(不止一次)给你演示如何用新买的iPhone X做面部识别解锁了吧?没有机器对图像的辨识,能做到吗? 医学领域里,计算机对于科学影像(如X光片)的分析能力,已经超过有多年从业经验的医生了。没有机器对图像的辨识,能做到吗? https://wap.sciencenet.cn/blog-377709-1091943.html
9.ni图像识别linuxninilinux腾讯云开发者社区图像识别之augmix augmix: https://github.com/google-research/augmix 5.3K10 图像识别——突破与应用 最近,图像识别领域发布了白皮书,简单翻译一下做个总结。--- [2]图像识别图像识别的目标是识别图像中的对象和人,并理解上下文。图像识别属于机器知觉,机器知觉是机器学习(ML)和人工智能(AI)的一部分。https://cloud.tencent.cn/developer/information/ni%E5%9B%BE%E5%83%8F%E8%AF%86%E5%88%AB
10.ocr图片识别技术是什么?OCR的作用有哪些?可以放进口袋的扫描大师 ocr图片识别技术是什么?OCR的作用有哪些? ocr图片识别技术存在于很多地方,例如的银行的人脸识别系统,二维码识别系统。福昕全能王也运用了ocr图片识别技术进行工作,大家可以使用福昕全能王进行身份证的识别。 ocr图片识别技术是什么? ocr图像识别,是指利用计算机对图像进行处理、分析和理解,以识别https://www.foxitsoftware.cn/scanner/jiaocheng/691.html
11.图像识别模型袋鼠社区图像识别模型 - 图像识别模型是专门设计用于处理图像数据的机器学习模型,其目的是从给定的图像中提取特征、识别特定对象、场景、行为、属性或进行更复杂的视觉理解任务。这类模型广泛应用于诸多领域,如安防、自动驾驶、医疗诊断、零售分析、社交媒体、遥感、艺术与文化遗https://www.dtstack.com/bbs/article/16443
12.图像识别和chatgpt图像识别和ChatGPT:当AI遇上AI 当图像识别技术和机器学习交织在一起,我们迎来了一个新的智能时代。图像识别算法的发展和应用为我们提供了更多的机会,使我们能够以前所未有的方式与计算机进行交互https://tool.a5.cn/article/show/25254.html
13.图像识别图像识别,什么是图像识别,图像识别是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术,是应用深度学习算法的一种实践应用,应用场景,包括电子商务,游戏,汽车,制造业和教育。现阶段图像识别技术一般分为人脸识别与商品识别,人脸识别主要https://baike.c114.com.cn/view.php?id=28373-30A559E6
14.计算机视觉与图像识别考试.pdfD.实现图像超分辨率的技术通常不直接依赖于这些方法 9.计算机视觉中的场景理解技术中,哪种技术可以用于分析和理解图像中的内容及其上下 文关系? A.语义分割 B.实例分割 C.人脸识别 D.目标检测和识别 10.在计算机视觉中,哪种技术可以用于将二维图像转换为三维立体信息? https://m.book118.com/html/2024/1002/8074076035006132.shtm