诞生于 2015 年 12 月的 Inception v3 是 GoogleNet 模型(曾赢得 2014 年度 ImageNet 挑战赛)的改进版。本文不准备深入介绍该模型的研究论文,不过打算强调一下论文的结论:相比当时最棒的模型,Inception v3 的准确度高出了 15%–25%,同时计算的经济性方面低六倍,并且至少将参数的数量减少了五倍(例如使用该模型对内存的要求更低)。
简直就是神器!那么我们该如何使用?
Model zoo 提供了一系列可直接使用的预训练模型,并且通常还会提供模型定义、模型参数(例如神经元权重),(也许还会提供)使用说明。
首先来下载定义和参数(你也许需要更改文件名)。第一个文件可以直接打开:其中包含了每一层的定义。第二个文件是一个二进制文件,请不要打开 ;)
- $ wget http: //data.dmlc.ml/models/imagenet/inception-bn/Inception-BN-symbol.json
- $ wget http: //data.dmlc.ml/models/imagenet/inception-bn/Inception-BN-0126.params
- $ mv Inception - BN - 0126.params Inception - BN - 0000.params
该模型已通过 ImageNet 数据集进行了训练,因此我们还需要下载对应的图片分类清单(共有 1000 个分类)。
- $ wget http: //data.dmlc.ml/models/imagenet/synset.txt
- $ wc - l synset.txt 1000 synset.txt $ head - 5 synset.txt n01440764 tench,
- Tinca tinca n01443537 goldfish,
- Carassius auratus n01484850 great white shark,
- white shark,
- man - eater,
- man - eating shark,
- Carcharodon carcharias n01491361 tiger shark,
- Galeocerdo cuvieri n01494475 hammerhead,
- hammerhead shark
搞定,开始实战。
我们需要:
- import mxnet as mx
- sym,
- arg_params,
- aux_params = mx.model.load_checkpoint('Inception-BN', 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)
这样就可以了。只需要四行代码!随后可以放入一些数据看看会发生什么。嗯…… 先别急。
数据准备:从七十年代以来,这一直是个痛苦的过程…… 从关系型数据库到机器学习,再到深度学习,这方面没有任何改进。虽然乏味但很必要。开始吧。
还记得吗,这个模型需要通过四维 NDArray 来保存一张 224x224 分辨率图片的红、绿、蓝通道数据。我们将使用流行的 OpenCV 库从输入图片中构建这样的 NDArray。如果还没安装 OpenCV,考虑到本例的要求,直接运行 pip install opencv-python 就够了 :)。
随后的步骤如下:
- img = cv2.imread(filename)
- img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
- img = cv2.resize(img, (224, 224, ))
- img = np.swapaxes(img, 0, 2) img = np.swapaxes(img, 1, 2)
- img = img[np.newaxis, :] array = mx.nd.array(img) >>> print array.shape(1L, 3L, 224L, 224L)
晕了?一起用个例子看看吧。输入下列这张图片:
来源: http://www.infoq.com/cn/articles/an-introduction-to-the-mxnet-api-part04