在第4篇中,我们介绍了如何轻松地使用预训练版Inception v3模型进行物体识别。本文将使用另外两个著名的卷积神经网络(CNN)模型(VGG19和ResNet-152),并将其与Inception v3的效果进行对比。

CNN的架构(来源:Nvidia)

VGG16

诞生于2014年的VGG16是一种16层模型(研究论文),该模型以低至7.4%的物体识别错误率赢得了2014年度ImageNet挑战赛。

ResNet-152

诞生于2015年的ResNet-152是一种152层模型(研究论文),在物体识别方面,该模型以破纪录的3.57%错误率赢得了2015年度ImageNet挑战赛。这一准确率甚至超过了普通的人工识别,人工识别的错误率通常为5%左右。

下载模型

首先再次访问Model zoo。与Inception v3类似,我们需要下载模型的定义和参数。这三个模型都针对相同的分类进行了训练,因此可以继续使用之前的synset.txt文件。

$ wget http://data.dmlc.ml/models/imagenet/vgg/vgg16-symbol.json
$ wget http://data.dmlc.ml/models/imagenet/vgg/vgg16-0000.params
$ wget http://data.dmlc.ml/models/imagenet/resnet/152-layers/resnet-152-symbol.json
$ wget http://data.dmlc.ml/models/imagenet/resnet/152-layers/resnet-152-0000.params

加载模型

这三个模型都使用ImageNet数据集进行过训练,该数据集中图片通常为224x224像素大小。由于数据形态和分类完全相同,因此也可以继续重用之前的代码。

这次只需要更改模型的名称 :) 我们可以为loadModel()和init()函数添加一个参数。

def loadModel(modelname):sym, arg_params, aux_params = mx.model.load_checkpoint(modelname, 0)mod = mx.mod.Module(symbol=sym)mod.bind(for_training=False, data_shapes=[('data', (1,3,224,224))])mod.set_params(arg_params, aux_params)return mod
def init(modelname):model = loadModel(modelname)cats = loadCategories()return model, cats

预测结果对比

我们可以通过同一批图片对三个模型的结果进行对比。

*** VGG16
[(0.58786136, 'n03272010 electric guitar'), (0.29260877, 'n04296562 stage'),
(0.013744719, 'n04487394 trombone'), (0.013494448, 'n04141076 sax, saxophone'),(0.00988709, 'n02231487 walking stick, walkingstick, stick insect')]

可能性最高的两个分类判断结果让人满意,但后续三个结果错得离谱。似乎竖立放置的麦克风支架干扰了模型的识别。

*** ResNet-152
[(0.91063803, 'n04296562 stage'), (0.039011702, 'n03272010 electric guitar'),
(0.031426914, 'n03759954 microphone, mike'), (0.011822623,
'n04286575 spotlight, spot'), (0.0020199812, 'n02676566 acoustic guitar')]

排名第一的预测非常准确,但接下来的四个预测风马牛不相及。

*** Inception v3
[(0.58039135, 'n03272010 electric guitar'), (0.27168664, 'n04296562 stage'),(0.090769522, 'n04456115 torch'), (0.023762707, 'n04286575 spotlight, spot'),
(0.0081428187, 'n03250847 drumstick')]

前两个分类的结果与VGG16极为类似,另外三个结果良莠不齐。

再换张图片试试看。

*** VGG16
[(0.96909302, 'n04536866 violin, fiddle'), (0.026661994, 'n02992211 cello, violoncello'),(0.0017284016, 'n02879718 bow'), (0.00056815811, 'n04517823 vacuum, vacuum cleaner'),
(0.00024804732, 'n04090263 rifle')]*** ResNet-152
[(0.96826887, 'n04536866 violin, fiddle'), (0.028052919, 'n02992211 cello, violoncello'),
(0.0008367821, 'n02676566 acoustic guitar'), (0.00070532493, 'n02787622 banjo'),(0.00039021231, 'n02879718 bow')]*** Inception v3
[(0.82023674, 'n04536866 violin, fiddle'), (0.15483995, 'n02992211 cello, violoncello'),
(0.0044540241, 'n02676566 acoustic guitar'), (0.0020963412, 'n02879718 bow'),
(0.0015099624, 'n03447721 gong, tam-tam')]

三个模型排名第一的预测分数都很高。不过也可以理解,毕竟小提琴的外形在神经网络看来还是很有特点的。

很明显,单凭少数例子还不能得出准确的结论。如果要挑选预训练模型,那么绝对要先准备好训练数据集,使用自己的数据进行测试并酌情决定!

技术指标对比

不同模型的详细评测结果可参阅现有研究论文,例如这一篇。对开发者来说,也许更需要考虑另外两个重要因素:

  • 模型需要多少内存
  • 模型的预测能有多快

为了回答第一个问题,可以通过参数文件的大小进行一个粗略的猜测:

  • VGG16:528MB(约1.4亿个参数)
  • ResNet-152:230MB(约6000万个参数)
  • Inception v3:43MB(约2500万个参数)

可见,目前的趋势是使用参数较少的更深度的网络。这样做有两方面收益:训练速度更快(因为网络需要学习的参数更少),并且可以降低内存使用*。

第二个问题更复杂一些,并且取决于很多因素,例如批大小。所以我们对预测调用进行计时然后再次运行看看。

t1 = time.time()
model.forward(Batch([array]))
t2 = time.time()
t = 1000*(t2-t1)
print("Predicted in %2.2f microseconds" % t)

结果就是这样(结果对多次调用取平均值获得)。

*** VGG16
0.30微秒完成预测
*** ResNet-152
0.90微秒完成预测
*** Inception v3
0.40微秒完成预测

总结来说(请自行套用标准免责声明):

  • 所有三个网络中(目前)ResNet-152准确率最高,但速度也慢了2–3倍。
  • VGG16速度最快(莫非因为层数少?)但内存用量最高并且准确率最差。
  • Inception v3几乎最快,同时在准确率和内存使用方面较为平均。这也使得该模型成为某些条件受限的环境中最佳的选择。最后一篇文章中,还将进一步讨论这个问题 :)。

代码已发布至GitHub:mxnet_example3.py, 请自行尝试。

后续内容:

  • 第6篇:通过树莓派进行实时物体检测(并让它讲话!)

mxnet入门--第5篇相关推荐

  1. Mxnet入门--第1篇

    MXNet教程 这一系列文章将概括介绍深度学习库MXNet,将介绍该库的主要功能及其Python API(可能会成为该库的首选API).随后还将提供一些有关MXNet的在线教程和笔记,希望能帮助大家更 ...

  2. linux usb3.0改2.0,TX1入门教程硬件篇-切换USB2.0与USB3.0

    TX1入门教程硬件篇-切换USB2.0与USB3.0 说明: 介绍如何切换TX1USB口的为2.0或3.0版本 步骤: 编辑extlinux.conf文件,修改usb_port_owner_info= ...

  3. 微信公众号开发入门教程第一篇

    微信公众号开发入门教程第一篇 关键字:微信公众平台开发 作者:方倍工作室 在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/ ...

  4. React入门看这篇就够了

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所 ...

  5. 一看就明白的爬虫入门讲解-基础理论篇(下篇)

    文/孔淼 上篇我分享了爬虫入门中的"我们的目的是什么"."内容从何而来"."了解网络请求"这三部分的内容,这一篇我继续分享以下内容: 1) 一些常见的限制方式 2) 尝试解决问题的思路 3) 效率问题 ...

  6. 一看就明白的爬虫入门讲解-基础理论篇(上篇)

    作者:孔淼 关于爬虫内容的分享,我会分成两篇,六个部分来分享,分别是: 1)  我们的目的是什么 2)  内容从何而来 3)  了解网络请求 4)  一些常见的限制方式 5)  尝试解决问题的思路 6 ...

  7. 怎么安装python_零基础入门必看篇:浅析python,PyCharm,Anaconda三者之间关系

    今天为大家带来的内容是:零基础入门必看篇:浅析python ,PyCharm,Anaconda三者之间关系 众所周知,Python是一种跨平台的计算机程序设计语言,简单来说,python就是类似于C, ...

  8. Java快速入门-01-基础篇

    Java快速入门-01-基础篇 如果基础不好或者想学的很细,请参看:菜鸟教程-JAVA 本笔记适合快速学习,文章后面也会包含一些常见面试问题,记住快捷键操作,一些内容我就不转载了,直接附上链接,嘻嘻 ...

  9. .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

    写在前面 上篇文章我们讲了如在在实际项目开发中使用Git来进行代码的版本控制,当然介绍的都是比较常用的功能.今天我再带着大家一起熟悉下一个ORM框架Dapper,实例代码的演示编写完成后我会通过Git ...

  10. Spring Cloud 入门 之 Config 篇(六)

    一.前言 随着业务的扩展,为了方便开发和维护项目,我们通常会将大项目拆分成多个小项目做成微服务,每个微服务都会有各自配置文件,管理和修改文件起来也会变得繁琐.而且,当我们需要修改正在运行的项目的配置时 ...

最新文章

  1. WeakHahMap,HashMap和(垃圾回收)Gc
  2. 不要对对象进行粗暴的等号赋值
  3. 上传图片显示扫描效果html5,JS+HTML5实现上传图片预览效果完整实例【测试可用】...
  4. Python语言学习之lambda:lambda函数的简介、使用方法、案例大全之详细攻略
  5. $.ajax和$.load的区别
  6. go 从入门到精通(二)基本数据类型和操作符
  7. Unity代码里的Position和界面上的Position
  8. php最难,那个PHP中号称最难的‘递归函数’
  9. 05、应用程序数据操作(下)
  10. 凨-百度地图API之地图标注(JS版),地理位置信息,根据地址获取经度纬度
  11. c语言求阶乘和的流程图_C语言编程实例
  12. (2016.12.02更新)CnCrypt文件保险柜1.18,兼容TrueCrypt加密卷,单文件绿色版
  13. word中插入公式2010和2016两个版本)
  14. excel表格如何转换成word表格_Word表格如何转为Excel表格?这2个小技巧轻松搞定!
  15. 互联网审判中区块链存证技术的应用进路
  16. U盘出现物理故障都有哪些表现
  17. oracle 无法在指定的节点上,oracle 11g rac 某节点CRS起不来的解决方法
  18. CF #768 E.Flipping Ring
  19. UE4如何使用Left Shift+W增加移动速度
  20. 【SemiDrive源码分析】【驱动BringUp】41 - LCM 驱动 backlight 背光控制原理分析

热门文章

  1. 期待人工智能在合作时的表现
  2. mvc实例详解java_MVC模式在Java Web应用程序中的实例分析
  3. Java cmd常用命令_java cmd常用命令
  4. ie登录显示登录到ftp服务器,用IE登录FTP服务器怎么消除记住的密码
  5. element-plus Table 表格自定义列模板使用及问题
  6. 泰拉瑞亚测试速度的软件,泰拉瑞亚1.4工具速度是多少 泰拉瑞亚1.4工具速度介绍-游侠网...
  7. java语言程序设计 第八版 基础篇_Java语言程序设计基础篇(第八版)编程8.7答案
  8. 交换机通过port-channel互联
  9. Bootloader - main system - Recovery的三角关系【转】
  10. 如何修复 Ubuntu 上“...script returned error exit status 1”的错误