深度学习

理解和使用深度学习网络

行动深入学习 - 第1部分

大家好!请允许我快速介绍自己。我的名字是约翰娜史蒂夫允许我时不时地接管这个博客来谈论深度学习。
今天我想开拨打一个叫做:

“在行动中深入学习:

在MathWorks创建的很酷的项目
这旨在让您深入了解我们在MathWorks上所做的工作:我将展示一些演示,并让您访问代码,甚至可能发布一两个视频。 今天的演示被称为“看图说词”这是一系列文章的第一篇,包括:
  • 基于cnn的三维点云分割
  • GPU编码器
  • 年龄检测
  • 也许还有几个!

演示:看图说词
Pictionary是指一个人/团队吸引对象的游戏,另一个人/团队试图猜测对象是什么。
图片猜词演示的开发者其实是……我!这个演示是MathWorks的一个开发人员在内部留言板上发布的: 我们已经有了例子使用MNIST数据集进行笔迹检测,但这是对这一概念的独特诠释。因此,创建一个看图猜词示例的想法就诞生了。
阅读数据集中的图像
第一个挑战(老实说,也是这个例子中最难的部分)是阅读图片。每个图像包含一个对象类别的许多绘图,例如,有一个“蚂蚁”类别,它在一个JSON文件中存储了数千只手绘的蚂蚁。文件的每一行看起来像这样:
{“Word”:“Ant”,“CountryCode”:“我们”,“时间戳”:“2017-03-27 00:14:57.31033 UTC”,“识别”:TRUE,“key_id”:“5421013154136064”,“绘图“:[[27,17,16,21,34,50,49,34,23,17],[47,58,73,81,84,67,54,46,47,51]],[[22,0],[51,18]],[[41,46,43],[45,11,0]],[[53,211,0],[[535,64,69,91,119,135,148,159,1119,149,126,87,68,62]那[68,68,58,51,36,34,38,48,64,78,85,90,90,83,73]],[[161,175],[70,69]],[[180,177,176,187,206,226,244,250,250,245,233,207,188,180,180],[68,67,61,50,42,40,48,58,72,80,87,89,83,76,71]],[[73,61],[85,113]],[[95,94],[88,126]],[[140,157],[90,118]],[[199,201,208],[90,116,122]],[[234,242,255],[89,105,112]]]}
你能看到图像吗?我也不。图像包含x,y连接点。如果我们从文件中取出x和y点,我们可以看到绘图开始成形。
中风 x值 y值
1 27,17,16,21,34,50,49,34,23,17 47、58、73、81、84、67年,54岁,46岁,47岁的51
2 22日0 51,18
3. 41,46,43. 45,11,0.
4. 53, 65, 64, 69, 91119135148159158149126, 87, 68, 62 58 68年,68年,51岁,36岁,34岁,38岁,48岁,64,78,85,90,90,83,73
这个文件的想法是为了捕捉个人的“笔画”,也就是不用举起笔就画出来的东西。让我们以第一种笔法为例:
图像上的X和Y值是这样的:
完整的图片: 放大:

x,从输入文件中的y值绘制在粉红色

相同的图像,只是放大了

然后我们玩快速游戏“连接点”,我们得到了类似绘图的第一个中风。连接点在Matlab中相当容易,其中函数称为iptui.intline
iptui.intline [X, Y] = intline(X1, X2, Y1, Y2)计算整数坐标连接(X1, Y1)和(X2, Y2)的线段的近似值。

绘制X,Y值(粉色)和连接它们的“线条”(黄色)

我们为剩下的笔画做到这一点,我们得到:

黄色只是为了强调视觉效果。实际的图像将有一个黑色的背景和白色的绘图。

终于!有点像蚂蚁的图画。 现在我们可以从这些x、y点创建图像,我们可以创建一个函数,并快速地为文件中的所有蚂蚁以及多个类别重复此操作。
现在,这个数据集假设人们是用铅笔或其他细的东西画的,因为线条的粗细只有1像素。我们可以用图像处理工具,如图像放大,快速改变图纸的厚度。我想象人们会在白板上用记号笔玩这个游戏,所以在粗线上训练将有助于这个假设。
larger_im = imdilate (im2 strel(“磁盘”,3));
虽然我们正在清理邮件,但才能使图像中心为:
对于此示例,我拉了5000个训练图像和500个测试图像。有许多(很多!)更多的示例图像可用在文件中,因此如果您如此倾向,请随时增加这些数字。
建立和训练网络
现在我们的数据集准备好了,让我们开始培训。 这是网络的结构:
layers = [imageInputLayer([256 256 1])]“填充”1)BatchnormalizationLayer Ruilulayer MaxPooling2Dlayer(2,'走吧'32岁的,2)convolution2dLayer (3“填充”1)BatchnormalizationLayer Ruilulayer MaxPooling2Dlayer(2,'走吧')卷积2dlayer(3,64,“填充”,1) batchNormalizationLayer reluLayer fulllyconnectedlayer (5) softmaxLayer classificationLayer];
我是如何选择这个特定结构的?很高兴你发问。我从那些已经建立了网络的人那里偷来的。这个特定的网络结构在MNIST数据集上的精确度是99%,所以我认为这是这些手写图纸的一个很好的起点。
以下是使用此代码创建的方便绘图:
lgraph = layerGraph(层);情节(层)

我承认,这是一个相当无聊的层图因为它都是一条直线,但如果你在工作DAG网络,你可以很容易地看到一个复杂网络的连接。

我用了大约20分钟的NVIDIA P100 GPU进行了训练。测试图像留出给大约90%的准确性。对于自动驾驶的情况,我需要回去改进算法。对于看图猜词游戏来说,我认为这是一个完全可以接受的数字。
predLabelsTest = net.classify (uint8 (imgDataTest));testAccuracy = sum(predLabelsTest == labelsTest') / numel(labelsTest)
testaccuracy = 0.8996.
调试网络
让我们深入研究准确性,以更深入地了解训练有素的网络。
查看特定类别的预测的一种方法是创建混淆矩阵。一个非常简单的选择是创建热图。这与混淆矩阵类似 - 假设您在每个类别中具有相同数量的图像 - 我们这样做:每类测试图像。
%可视化预测的标签与实际不匹配的地方tt = table(predLabelsTest, categorical(labelsTest'),'VariableNames',{'Predicted','Actual'});图(“名字”,“混淆矩阵”);热图(tt,“实际”,“预测”);
显而易见的是,蚂蚁和手表往往会混淆分类器。这似乎是合理的困惑。如果我们把酒杯和蚂蚁搞混了,那我们就有麻烦了。
我们的看图词分类器出现错误的原因有两个:
  1. 的人猜测无法辨认物体,还是
  2. 的人画画不能很好地描述物体。
如果我们要求分类器100%准确,我们就会假设绘图者对任何对象类别都不会做得很差。不大可能。
再深入一点,让我们看看67只被错误分类的蚂蚁。
找出预测标签与实际不符的时间idx = find(predlabelstest〜= labelstest');Loser_ants = IDX(IDX <500);蒙太奇(IMGDATATEST(::,1,loser_ants));
我将在肢体上出去,并说至少18个蚂蚁根本不应该被称为蚂蚁。在辩护我的分类器时,让我们说你正在玩Pictionary,有人画了这个:
从图片中选择一个图片II = 169 IMG =挤压(UINT8(IMGDATATEST(:,:,1,ii)));actuallabel = labelstest(ii);predigedlabel = net.classify(img);imshow(img,[]);标题(['预料到的: 'char (predictedLabel)', 实际的: 'char (actualLabel)))
你叫它蚂蚁的可能性有多大?如果电脑把它归类为雨伞,那真的是个错误吗?
在新的图像上尝试分类器
现在这个例子的全部意义就是看看在现实生活中的新图像会是什么样子。我画了一只蚂蚁……

我自己的蚂蚁画

...经过训练的模型现在可以告诉我它认为它是什么。让我们再加上一个信心评级。
s =快照(摄像头);myDrawing = segmentImage (s (:,: 2));myDrawing = imresize (myDrawing [256256]);%确保这是处理的正确尺寸[predval,参看]= net.classify (uint8 (myDrawing));imshow (myDrawing);标题(string (predval) + sprintf ('%.1f %%'马克斯(参看)* 100));
我使用了使用图像处理创建的分段函数,找到我画的对象并将黑色翻转到白色和白色到黑色。
看来我的看图猜词技巧已经够好了!
这个代码打开了FileExchange,你可以看到这个例子网络研讨会我用我的同事加布里埃尔哈记录。 如果你有任何问题,请在下方留言。下次当我与MathWorks工程师谈论使用cnn进行点云分割时,请加入我!
|
  • 打印
  • 发电子邮件

评论

要发表评论,请点击在这里要登录您的MathWorks帐户或创建新的。