我如何使用 Python 在一小时内制作一个神经网络 Web 应用程序

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 255 小节,累计 39w+ 字,讲解图:1716 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1300+ 小伙伴加入,欢迎点击围观

计算机视觉 是一组令人兴奋且发展迅速的数据科学技术。它具有从工业质量控制到疾病诊断的广泛应用。我之前曾涉足过一些属于这一范畴的不同技术,并且我认为为使用 神经网络的 图像识别 Web 应用程序快速制作原型是一项值得努力的工作。

我使用了一个名为 caffe 深度学习 框架,它是由 伯克利视觉和学习中心 创建的。还有其他几个类似的深度学习框架,如 chainer theano torch7 都是候选框架,但由于我以前的经验,我选择了 caffe。 caffe 有一组 python 绑定,这是我在这个项目中使用的。如果您对深度学习和神经网络背后的更多理论感兴趣,我推荐 michael nielsen 的 这个页面

首先,我将所有 caffe 依赖项安装到运行 ubuntu 14.04 lts 的 aws t2.medium 实例上。 (可以 在此处 找到 14.04 lts 的安装说明。)我选择使用 cpu-only cuda,因为我没有为这个项目训练我自己的神经网络。我从 bvlc 模型动物园 获得了两个预训练模型,分别称为 googlenet alexnet 。这两个模型都是在 imagenet 上训练的,这是一个包含大约 1400 万张图像的标准集。

现在我已经安装了所有先决条件,我打开了 exaptive ide 并启动了一个新的 xap(我们喜欢称之为在 exaptive 中构建的 web 应用程序)。我首先创建了一个新的 python 组件,用于编写识别图像所需的 caffe 代码。在我首先要使用的神经网络模型之后,我将新组件命名为“googlenet”。

我的新 googlenet 组件在 ide 中,准备编码。

然后我用 python 编写了 caffe 代码。

首先,我们实例化一个 caffe 图像分类器。


 net = caffe.classifier(
          reference_model,
          reference_pretrained,
          mean=imagenet_mean,
          channel_swap=(2, 1, 0),
          raw_scale=255,
          image_dims=(256, 256))

reference_model 是一组网络配置选项的文件路径。 caffe为此提供了一个存量模型。 reference_pretrained 是另一个文件路径,它指向来自模型动物园的预训练 googlenet 模型。

我们获取输入图像文件路径并使用 caffe 方法加载它。


 net = caffe.classifier(
          reference_model,
          reference_pretrained,
          mean=imagenet_mean,
          channel_swap=(2, 1, 0),
          raw_scale=255,
          image_dims=(256, 256))


然后我们简单地以输入图像作为参数调用我们的图像分类器的预测。


 net = caffe.classifier(
          reference_model,
          reference_pretrained,
          mean=imagenet_mean,
          channel_swap=(2, 1, 0),
          raw_scale=255,
          image_dims=(256, 256))

然后我们得到图像的前三个预测。


 net = caffe.classifier(
          reference_model,
          reference_pretrained,
          mean=imagenet_mean,
          channel_swap=(2, 1, 0),
          raw_scale=255,
          image_dims=(256, 256))

然后制作一些漂亮的 html 以返回文本组件。


 net = caffe.classifier(
          reference_model,
          reference_pretrained,
          mean=imagenet_mean,
          channel_swap=(2, 1, 0),
          raw_scale=255,
          image_dims=(256, 256))

请注意,我们正在获取 id 并使用 name_map,它对应于图像类的 imagenet id。然后 pretty_text 将返回给用户。

现在 python 已经写好了,我需要连接一个用户界面。为了将图像放入 xap,我选择了一个文件放置目标,这是 exaptive 处理文件输入的常用 javascript 组件之一。

放置目标将用于将图像传递给神经网络组件。

文件放置目标,准备接受我们的图像。

此时剩下的就是为将在神经网络组件内生成的 html 创建文本显示。为此,我选择了一个名为“text”的 javascript 组件,它将呈现 html。

三个组件之后,我们准备识别一些图像。

至此,代码就完成了。我添加了一些 html 和内联样式,然后我保存了这个 xap 并在另一个选项卡中打开它。这是我们加载时的页面。

然后我们拖入一张图片。我用了一张兔子和一只小猫的照片。该应用程序处理了几秒钟,然后我看到:

有用!您可以看到神经网络的预测(及其 imagenet id 编号)以及神经网络给我们的确定性百分比。因此,从这里开始,我们为许多其他应用程序奠定了基础。现在我们可以使用任何预训练的神经网络模型。例如,如果生命科学应用程序存在模型,我们需要做的就是上传该模型,我们刚刚编写的组件可以指向它而不是 googlenet 模型,并为我们提供来自该网络应用程序的结果。

为了说明这一点,我添加了第二个使用 alexnet 模型的组件,这样我将从在同一组图像上训练的两个独立神经网络模型获得同一图像的结果。

alexnet 组件与 googlenet 的唯一区别在于我们在代码中使用的模型文件路径。

通过两个神经网络运行相同的图像,我们现在得到:

总而言之,这个编写代码和连接组件的过程只花了我不到一个小时。正如我之前所写,我们可以替换任何 caffe 神经网络模型并通过这个基本的 xap 使用它。从这里开始,我认为将神经网络训练界面创建为 xap 会很有趣。如果有一个很好的前端来训练神经网络,从指定隐藏层的数量,到这些隐藏层的组成和配置,再到可视化新模型的测试分数,都会很有帮助。完成后,也许后续的博客文章会井井有条。