带有Intel Neural Computer Stick 2的Raspberry Pi机器人储物箱

因此, Raspberry-tank的开发进入了一个新阶段。

在上一个系列中,事实证明,对于Raspberry而言开箱即用的语义分段太困难了。

集思广益和评论使我们能够确定以下发展领域:

  • 训练自己的E-net网络以获取所需的图像大小
  • 将神经网络的发布从Raspberry本身转移到一种特殊的硬件上,其中最常提到的是Intel Movidius(又名Neural Compute Stick,又称NCS)。

在机器人技术中,将一块新的烙铁连接到机器人是最有趣的事情,因此,训练神经网络的艰苦工作被推迟到更好的时期。

几天了-英特尔的奇迹在我手中。

它很大,您不能将其插入树莓派底部的USB连接器中。 由于右侧的USB端口被相机三脚架遮住了,而左上角被GPS模块占据了,因此没有太多选择。

结果,将GPS放在电缆上,将其调低,然后将电缆缠绕在三脚架上,然后NCS代替它。

在此硬件上的部分已完成。



英特尔NCS


英特尔最近发布了NCS的第二个版本,并且该API与以前的版本完全不兼容,这使用户在Internet上遭受了很多痛苦。

结果,有关先前版本的整个知识库当前仅是信息垃圾。

新版本提供了OpenVino框架,其中包括OpenCV等,还包括用于处理神经网络的各种工具。

以下是有关NCS2和OpenVino的一些介绍性文章:


NCS入门非常顺利。

英特尔最初为Raspbian提供了支持,因此无需与手鼓跳舞。
入门文档也非常清晰,并且OpenVino框架的安装没有引起任何问题。

事实证明,OpenVino包含OpenCV 4.1可以带来很大的好处,因为我必须自己在Raspberry上构建早期版本的OpenCV,从而节省了时间。

这是NCS2本身的外观:



进一步地,结果变得更加有趣。

NCS仅支持自己的神​​经网络格式,而英特尔作为OpenVino的一部分提供了Model Optimizer工具,用于转换最流行的框架(Tensorflow,Caffe和Torch)的图形。 接下来将有更多关于此的内容。

此外,英特尔还提供了Zoo模型 -用于许多场合的一组现成模型。

其中有两种道路分割模型:


NCS的神经网络


为了在设备上运行神经网络,您需要执行几个步骤。

初始化设备


名称MYRIAD,插件的概念及其动态加载,必须在程序中指定的路径-显然是从黑暗的过去开始的。

from openvino.inference_engine import IENetwork, IEPlugin ncs_plugin = IEPlugin(device="MYRIAD", plugin_dirs="/opt/intel/openvino/inference_engine/lib/armv7l") 

下载型号


接下来,您需要将模型上传到设备。

这是一项艰巨的任务。 我用于细分的那个小模型需要大约15秒钟的加载时间。

好消息是,您只需下载一次模型即可下载多个模型。

  model = IENetwork(model=xml_path, weights=bin_path) net = ncs_plugin.load(network=model) 

运行计算


现在可以使用该模型了。

  input_blob = next(iter(model.inputs)) out_blob = next(iter(model.outputs)) n, c, h, w = model.inputs[input_blob].shape images = np.ndarray(shape=(n, c, h, w)) images[0] = image res = net.infer(inputs={input_blob: images}) res = res[out_blob] 

单工序


突然发现您不能同时使用来自两个不同进程的NCS。
任何迟到的人都无法加载模型:

 E: [ncAPI] [ 684447] resetAll:348 Failed to connect to stalled device, rc: X_LINK_ERROR E: [ncAPI] [ 691700] ncDeviceOpen:672 Failed to find suitable device, rc: X_LINK_DEVICE_NOT_FOUND Traceback (most recent call last): net = ncs_plugin.load(network=model) File "ie_api.pyx", line 395, in openvino.inference_engine.ie_api.IEPlugin.load File "ie_api.pyx", line 406, in openvino.inference_engine.ie_api.IEPlugin.load RuntimeError: Can not init USB device: NC_ERROR 

Google和Intel支持论坛都无法理解问题所在-该设备确实是独家产品,或者我只是不知道如何烹饪。

OpenVino细分


如前所述,OpenVino开箱即用地提供了道路分割模型和示例。

测试结果有些矛盾。 有时它被歪曲地认可,但在大多数情况下是正常的。

Enet工作得更好,但是我们仍然必须在NCS下尝试Enet,所以让我们尝试一下现有的东西。



有趣的是,要从OpenVino了解更多关于模型的知识并对其进行重新培训并不是那么简单。

用户很感兴趣 ,但是英特尔的一位负责人严格地说,该模型的代码和数据是封闭的,希望的人可以在PyTorch上使用类似的神经网络 ,进行训练,转换和使用。

速度优势非常明显:
如果Enet分割花费了6秒钟,则此模型需要0.8秒钟来处理一张图片(而将模型加载到设备上则花费了14秒钟,但这是同时完成的)。

方向分类


为了确定运动方向,坦克使用了一个简单的神经网络,如相应文章所述

神经网络在Keras上进行训练,并通过Tensorflow在Raspberry上运行,Tensorflow具有用于此格式的内置适配器。

该模型非常简单,甚至在Raspberry上也显示出可接受的速度结果。
(每张图片0.35秒)。

不过,有了Intel压盖,您可以期望获得更好的结果。
在Intel的Model Optimizer接受转换的格式中,有Tensorflow,但没有Keras。

将Keras转换为TF是相当流行的事情,关于这个主题的材料足够多,我受本文的指导。

同一作者的文章更为广泛 ,仅涉及如何在OpenVino上运行Keras模型的主题。

您也可以使用英特尔指导

通常,在编译源代码时,我得到了一个将Keras模型转换为TF的脚本:

 import tensorflow as tf from tensorflow.python.framework.graph_util import convert_variables_to_constants from keras import backend as K from keras.models import load_model from keras.models import model_from_json def load_keras_model(json_file, model_file): jf = open(json_file, 'r') loaded_model_json = jf.read() jf.close() loaded_model = model_from_json(loaded_model_json) loaded_model.load_weights(model_file) return loaded_model def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True): graph = session.graph with graph.as_default(): freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or [])) output_names = output_names or [] output_names += [v.op.name for v in tf.global_variables()] # Graph -> GraphDef ProtoBuf input_graph_def = graph.as_graph_def() if clear_devices: for node in input_graph_def.node: node.device = "" frozen_graph = convert_variables_to_constants(session, input_graph_def, output_names, freeze_var_names) return frozen_graph model = load_keras_model('./model.json', './model.h5') frozen_graph = freeze_session(K.get_session(), output_names=[out.op.name for out in model.outputs]) tf.train.write_graph(frozen_graph, ".", "ktf_model.pb", as_text=False) 

相同的代码位于github上

生成的TF模型被进一步提炼为OpenVino格式:

 python mo_tf.py --input_model "model/ktf_model.pb" --log_level=DEBUG -b1 --data_type FP16 

测试表明,图片分类需要0.007秒。
这个结果非常令人愉快。

所有经过训练的模型(Keras,TF,OpenVino)也都上传到了github

物体识别


分割任务并不是机器人在其艰难生活中必须解决的唯一任务。

最初有一个猫探测器,后来发展为基于MobileSSD和OpenCV-DNN的通用探测器。

现在是时候在NCS上执行相同的任务了。

在Intel的model_zoo中 ,基于MobileSSD的较窄特异性的检测器就足够了,但没有确切的类似物。

但是,此网络在支持的TF型号列表中被列为兼容。

有趣的是,在撰写本文时,此处指示了MobileSSD 2018_01_28的版本。

但是,OpenCV拒绝读取此模型:

 cv2.error: OpenCV(4.1.0-openvino) /home/jenkins/workspace/OpenCV/OpenVINO/build/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:530: error: (-2:Unspecified error) Const input blob for weights not found in function 'getConstBlob' 

(但是我们发现他们使用詹金斯)。

同时,成功转换为OpenVino。

如果我们尝试转换与OpenCV-DNN(11_06_2017)兼容的Mobile SSD版本,则会得到以下信息:

 [E0919 main.py:317] Unexpected exception happened during extracting attributes for node FeatureExtractor/MobilenetV1/Conv2d_13_pointwise_1_Conv2d_2_1x1_256/Relu6. Original exception message: operands could not be broadcast together with remapped shapes [original->remapped]: (0,) and requested shape (1,0,10,256) 

像这样的东西,从技术上讲,OpenVino和OpenCV-DNN在同一程序包中,但是与所使用的神经网络版本不兼容。

也就是说,如果要同时使用这两种方法,则需要拖动两个版本的MobileSSD。

在速度方面,比较肯定是支持NCS的:0.1秒对1.7秒。

在质量方面……(尽管这不是NCS的问题,而是Mobile SSD的发展)。



图片分类


该坦克可以使用Imagenet上的Inception通过Tensorflow对图像进行分类。
我使用了Inception 2015-12-05,当时它是另一个。

事实证明,我的生活远远落后于别人,因为Google的家伙们一无所获,已经制作了4个版本!

但是来自英特尔的家伙们却没有落后,OpenVino支持所有4个版本。

这是一篇介绍Inception各种版本的文章
但是我们不会轻易,我们会立即下载最后一个,第四个。

我们用桌子上的猫和笔记本电脑对图片进行分类。

我们记得当前版本的结果:

  • 笔记本电脑62%
  • 笔记本,笔记本电脑11%
  • 13秒
  • 猫在哪里?

现在,我们阅读了将Inception转换为OpenVino的说明。

转换成功,我们在NCS上启动分类器:

  • 手提电脑,手提电脑85%
  • 笔记本,笔记本电脑8%
  • 0.2秒
  • 再没有猫了

结论


因此,所有需要Tensorflow的场景都是使用NCS复制的,这意味着您可以选择不使用Tensorflow。

一样,这个框架对于Raspberry来说很沉重。

NCS消化神经网络的速度使其能够扩大视野。

机器人已经完成了一些任务,例如语义分割和分类,但是还有其他一些任务,例如对象分割或实时传输带有检测到的对象的视频。 (这在裸露的Raspberry上是无法想到的)。

多重处理的问题有些令人困惑,但是即使无法解决,也总是可以选择将NCS打包为单独的服务。

参考文献


Source: https://habr.com/ru/post/zh-CN459126/


All Articles