因此,
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()]
相同的代码位于
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打包为单独的服务。
参考文献