2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLeNet获得了第一名、VGG获得了第二名,这两类模型结构的共同特点是层次更深了。VGG继承了LeNet以及AlexNet的一些框架结构(详见 大话CNN经典模型:VGGNet),而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。
详情:大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进)
开发环境:MATLAB2019a
最好用较新的的MATLAB版本,深度学习方向的库更新太快,老版本可能出现不兼容等问题。
两个重要附加工具模块:
这两个都是需要下载安装的,MATLAB不自带,当然,很简单的,下面介绍如何安装
MATLAB运行如下代码,如果没有安装这个附加工具,自动会出现报错:
camList = webcamlist
报错:
直接点击它报错中的链接即可,如果你的MATLAB还没有登录,这时候需要先登录,或者用邮箱注册一个账号。
之后就是安装:
Deep Learning Toolbox for GoogLeNet 的安装与上一个一致,运行一下下面的代码就可以:
net = googlenet;
Deep Learning Toolbox™ 提供了一个用于通过算法、预训练模型和应用程序来设计和实现深度神经网络的框架。您可以使用卷积神经网络(ConvNet、CNN)和长短期记忆 (LSTM) 网络对图像、时序和文本数据执行分类和回归。应用程序和绘图可帮助您可视化激活值、编辑网络架构和监控训练进度。
对于小型训练集,您可以使用预训练深度网络模型(包括 SqueezeNet、Inception-v3、ResNet-101、GoogLeNet 和 VGG-19)以及从 TensorFlow®-Keras 和 Caffe 导入的模型执行迁移学习。
要加速对大型数据集的训练,您可以将计算和数据分布到桌面计算机上的多核处理器和 GPU 中(使用 Parallel Computing Toolbox™),或者扩展到群集和云,包括 Amazon EC2® P2、P3 和 G3 GPU 实例(使用 MATLAB® Distributed Computing Server™)。
此示例说明如何使用预训练的深度卷积神经网络 GoogLeNet 实时对来自网络摄像机的图像进行分类。
使用 MATLAB®、普通的网络摄像机和深度神经网络来识别周围环境中的对象。此示例使用 GoogLeNet,它是预训练的深度卷积神经网络(CNN 或 ConvNet),已基于超过一百万个图像进行训练,可以将图像分为 1000 个对象类别(例如键盘、咖啡杯、铅笔和多种动物)。您可以下载 GoogLeNet 并使用 MATLAB 实时连续处理照相机图像。
GoogLeNet 已基于大量图像学习了丰富的特征表示。它以图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。您可以用周围的物品进行试验,以了解 GoogLeNet 对图像进行分类的准确程度。要了解有关网络对象分类的详细信息,可以实时显示排名前五的类的分数,而不是只显示最终的类决策。
加载照相机和预训练网络
连接到照相机并加载预训练的 GoogLeNet 网络。您可以在此步骤使用任何预训练网络。该示例需要 MATLAB Support Package for USB Webcams,以及 Deep Learning Toolbox™ Model for GoogLeNet Network。如果没有安装所需的支持包,软件会提供下载链接。在报错的红字中有安装的路径(Add-On-Explorer),只需要点击进去登陆便可以下载此模块:
1、调取摄像头程序:
camList = webcamlist
% Connect to the webcam.
cam = webcam(1)
preview(cam);
img = snapshot(cam);
% Display the frame in a figure window.
image(img);
for idx = 1:5
img = snapshot(cam);
image(img);
end
%% Once the connection is no longer needed, clear the associated variable.
% clear cam
2、识别显示程序
clear
close all
clc
camera = webcam;
net = googlenet;
%% 加载照相机和预训练网络
inputSize = net.Layers(1).InputSize(1:2)
figure
im = snapshot(camera);
image(im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title({char(label),num2str(max(score),2)});
h = figure;
while ishandle(h)
im = snapshot(camera);
image(im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title({char(label), num2str(max(score),2)});
drawnow
end
h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);
im = snapshot(camera);
image(ax1,im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title(ax1,{char(label),num2str(max(score),2)});
[~,idx] = sort(score,'descend');
idx = idx(5:-1:1);
classes = net.Layers(end).Classes;
classNamesTop = string(classes(idx));
scoreTop = score(idx);
barh(ax2,scoreTop)
xlim(ax2,[0 1])
title(ax2,'Top 5')
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop)
ax2.YAxisLocation = 'right';
while ishandle(h)
% Display and classify the image
im = snapshot(camera);
image(ax1,im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title(ax1,{char(label),num2str(max(score),2)});
% Select the top five predictions
[~,idx] = sort(score,'descend');
idx = idx(5:-1:1);
scoreTop = score(idx);
classNamesTop = string(classes(idx));
% Plot the histogram
barh(ax2,scoreTop)
title(ax2,'Top 5')
xlabel(ax2,'Probability')
xlim(ax2,[0 1])
yticklabels(ax2,classNamesTop)
ax2.YAxisLocation = 'right';
drawnow
end