1

人工智能与计算机视觉

这个世界每秒钟都在产生海量的图像数据。虽然有了效果极佳的全幅照相机,但是仍然不能帮助盲人了解这个世界;虽然监控摄像头无处不在,可是却无法在危机发生的时候自动报警;虽然有了能四平八稳飞行的无人机,还是很难自动检查油管或者高压线以降低工人作业的危险。

究其原因,虽然图像是被数字化了,但是在特殊处理之前这些仍然是死数据,它们本身并不携带任何意义。好比听到与听懂是有本质区别的、拍照和视觉也完全是两回事。

为了赋予计算机视觉,科学家付出了不少努力,其中ImageNet数据集便具有里程碑式的意义。

ImageNet数据集

李飞飞带领着一组科学家,从2007年开始就筹备ImageNet数据集,作为大规模训练数据给科学家研究视觉模型。借助Amazon Mechanical Turk众包平台,协调了来自167个国家的48940名工作者清理、分类、标记,才打造了这一含有15,000,000图片、22,000分类的标注数据集。虽然这个数据集仅仅相当于一个儿童在大脑在成长初期所获得的图像数据量的一小部分,但是无论从质量还是数量上都是空前的。

ImageNet在巅峰时刻曾经是Amazon Mechanical Turk平台最大用户,不过也给李飞飞带来经费不足的困扰,据说她曾经动念头把读书时候勤工俭学的干洗店重新开张来补贴项目。

现在流行信息流,这里插播一则广告:国内用户欢迎使用百度云数据标注服务,由专业的运营团队通过众来包标注文本、图像、音频、视频、网页等数据,被百度内部许多团队采用至今,性价比非常高 J

ImageNet数据集在CVPR 2009上发表,点燃了7届火爆连连的ILSVRC比赛,不但引来了AlexNet、VGG Net、GoogLeNet、ResNet等一系列经典的模型,相对于人类5.1%的top-5错误率,ResNet的错误率为3.6%,赋予了及计算机超越人类的图片分类能力,所以2017年将是ImageNet最后一届比赛。除了学术界的成就之外,曾经在ImageNet获得优异成绩的Matthew Zeiler创建了Clarifai、Andrew Zisserman加入了DeepMind,给工业界输出了相当多的人才。

李飞飞表示,ImageNet的贡献之一就是使得人们在人工智能研究的思维方式有了很大协调了的转变,即大数据是人工智能研究的核心之一,与模型算法一样重要。吴恩达也曾经用火箭来比喻深度学习,云计算提供的超性能计算为引擎、大数据为燃料,需要配比燃料和引擎才可能让火箭顺利升空。

更多详情,请参考李飞飞的TED名为How We’re Teaching Computers to Understand Pictures的演讲:

无论从哪个角度来看,深度学习引领的人工智能的复兴,ImageNet都功不可没。

百度深度学习服务

要赋予计算机视觉,借助百度深度学习服务是最方便不过的了。当然,ImageNet数据集体量大、模型复杂,训练模型开销并不小,考虑性价比我们将使用较小的Alex Krizhevsky、Vinod Nair和Geoffrey Hinton收集的CIFAR-10物体分类数据集以及较浅的ResNeXt模型,在几个小时内就能让计算机学会分辨这10种类型的物体。

创建百度深度学习服务的方法已经在科学与艺术一文中已经介绍过了,不再赘述。目前百度深度学习服务已经支持了TensorFlow 1.2版本以及Pascal架构的GPU节点,选择它们并创建服务。

设置SSH隧道

我们将使用百度深度学习服务内置的Jupyter Notebook和TensorBoard这两个Web应用来训练图像分类模型。

百度深度学习服务中的计算节点是通过VPC进行安全隔离的,需要搭建SSH隧道才能通过本地浏览器直接访问节点中的Web应用。

PuTTY是Windows平台上著名的SSH隧道应用程序。除了设置百度深度学习服务IP地址之外,还需要在Connection、SSH、Tunnels中选择Dynamic并指定一个端口如6666并添加,然后连接便可:

隧道打通之后还需要在浏览器中做相应配置。比如Firefox,需要在连接设置中把SOCKS主机设置成localhost、端口6666:

推荐Firefox的原因是,连接设置中的SOCKS代理仅对该应用有效,而Chrome或Internet Explorer等需要通过插件才能避免影响整个操作系统。

Jupyter Notebook

回到PuTTY,可以使用以下命令运行Jupyter Notebook:

jupyter notebook --no-browser

运行之后可以得到Web应用的URL,其中的安全令牌用来确保安全:

在Firefox中访问这个URL便可以在浏览器中访问Jupyter Notebook了。

Jupyter Notebook提供了两种主要的单元:

  1. Markdown单元,用来提供富文本描述。
  2. Python单元,借助IPython执行交互式Python代码。

下面是一个典型的Markdown单元,编辑界面如下:

执行该单元便能得到图文并茂的结果:

而Python单元可以让用户在浏览器之中编辑以及交互式运行Python代码。

创建第一个Python单元以下载CIFAR-10数据集:

import tflearn
import random
import numpy
import PIL
import matplotlib.pyplot as plt

from tflearn.datasets import cifar10

# download and prepare cifar-10 dataset
(x, y), (testx, testy) = cifar10.load_data()
y = tflearn.data_utils.to_categorical(y, 10)
testy = tflearn.data_utils.to_categorical(testy, 10)

执行这个单元,便可以下载由一个用于普适物体识别的数据集CIFAR-10。CIFAR-10由60000张32×32的RGB彩色图片构成,共10个分类。其中50000张用来训练,10000张用来测试。

当然,如果环境中没有安装tflearn、matplotlib等,可以通过pip一键安装。

接着创建并执行第二个Python单元,根据ResNet文献以及变体ResNeXt文献创建合适的模型:

# define real-time data preprocessing
img_prep = tflearn.ImagePreprocessing()
img_prep.add_featurewise_zero_center(per_channel=True)

# define real-time data augmentation
img_aug = tflearn.ImageAugmentation()
img_aug.add_random_flip_leftright()
img_aug.add_random_crop([32, 32], padding=4)

n = 5

# build residual network
network = tflearn.input_data(shape=[None, 32, 32, 3], data_preprocessing=img_prep, data_augmentation=img_aug)
network = tflearn.conv_2d(network, 16, 3, regularizer='L2', weight_decay=0.0001)
network = tflearn.resnext_block(network, n, 16, 32)
network = tflearn.resnext_block(network, 1, 32, 32, downsample=True)
network = tflearn.resnext_block(network, n - 1, 32, 32)
network = tflearn.resnext_block(network, 1, 64, 32, downsample=True)
network = tflearn.resnext_block(network, n - 1, 64, 32)
network = tflearn.batch_normalization(network)
network = tflearn.activation(network, 'relu')
network = tflearn.global_avg_pool(network)
network = tflearn.fully_connected(network, 10, activation='softmax')

再创建一个Python单元,用来训练模型:

# train the model
mom = tflearn.Momentum(0.1, lr_decay=0.1, decay_step=32000, staircase=True)
network = tflearn.regression(network, optimizer=mom, loss='categorical_crossentropy')

model = tflearn.DNN(network, max_checkpoints=10, tensorboard_verbose=2, clip_gradients=0., tensorboard_dir='/mnt/bmr/resnet_logs')
model.fit(x, y, n_epoch=200, validation_set=(testx, testy), show_metric=True, batch_size=128, shuffle=True)

model.save('resnet')

执行这个单元的话可以监控训练进度。

吴晓波说要把生命浪费在美好的事物上,这时候一块好的GPU就至关重要了。好在百度深度学习服务提供了各种系列的高端显卡,包括Pascal架构的新款,动力澎湃!

这里通过调用深度学习服务节点上的GPU训练了200个epoch,几个小时之后,在CIFAR-10数据集上得到精度为94.58%的模型:

最后创建一个单元来预测一下,看看我们的模型是否真的能够识别图片。新建一个Python单元,随机从测试集中挑选一张图片进行预测,并且与期望结果对比:

print('image: ')
num = random.randint(0, testx.shape[0])
image = PIL.Image.fromarray(numpy.uint8(testx[num]*255))
plt.imshow(image)
plt.show()

predicted = numpy.argmax(model.predict(testx[num].reshape(1, 32, 32, 3)))
actual = numpy.argmax(testy[num])

print(predicted)
print(actual)

执行一下,果然我们的模型能够认出这个是一张关于小狗的照片了!

借助百度深度学习服务,赋予计算机视觉变得很容易。

TensorBoard

回到PuTTY,可以使用以下命令运行TensorBoard:

tensorboard --logdir /mnt/bmr/resnet_logs/ --host 127.0.0.1

此时通过Firefox访问http://127.0.0.1:6006/,便能够通过TensorBoard来观察训练精度的变化了。

总结

由于篇幅关系,这里仅仅展示了深度学习与计算机视觉的冰山一角。

当计算机可以睁开眼睛看世界,医护人员将会多一双不知疲倦的眼睛来诊断和护理病人、汽车将变得更聪明以更安全地帮助人们穿梭两地之间、机器人将能够取代人类去巡视灾区挽救被困者和伤员。当人类赋予计算机视觉,然后计算机将帮助人类观察地更仔细,这时观察这个世界将不仅仅是人类的双眼,有了计算机视觉的帮助人类将更自由地探索未来。



张 琪

One Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注