与MATLAB®编码器™,您可以针对使用ARM的嵌入式平台,从一个已经训练过的卷积神经网络(CNN)生成预测代码®支持NEON扩展的处理器。金宝app代码生成器利用了ARM计算库用于计算机视觉和机器学习。生成的代码实现了一个CNN,它具有在输入中指定的架构、层和参数SeriesNetwork
(深度学习工具箱)或DAGNetwork
(深度学习工具箱)网络对象。
使用以下方法生成代码:
深度学习库的MATLAB编码器接口.要安装支持包,请从MATLAB金宝app中选择它附加组件菜单。
手臂计算库对于计算机视觉和机器学习必须安装在目标硬件上。
深度学习工具箱™。
编译器和库的环境变量。
请注意
本帮助主题中的示例使用的ARM计算库版本可能不是代码生成支持的最新版本。金宝app有关库受金宝app支持的版本以及有关设置环境变量的信息,请参见深度学习与MATLAB编码器的先决条件.
codegen
使用。在ARM目标上生成深度学习代码codegen
:
编写一个入口点函数,加载预先训练的CNN和调用预测
.例如:
函数= squeezenet_predict(中)% # codegen持续的净;opencv_linkflags =pkg-config——cflags——libs opencv ";coder.updateBuildInfo (“addLinkFlags”, opencv_linkflags);如果net = code . loaddeeplearningnetwork (“squeezenet”,“squeezenet”);结束= net.predict(的);结束
如果您的目标硬件是Raspberry Pi™,您可以利用MATLAB支金宝app持包树莓派硬件.有了支持计划,金宝appcodegen
将生成的代码移动到树莓派上,并在树莓派上构建可执行程序。当您为没有硬件支持包的目标生成代码时,您必须运行命令来移动生成的文件并构建可执行程序。金宝app
ARM目标上的深度学习代码生成不支持MEX生金宝app成。
对于ARM,对于输入预测
(深度学习工具箱)附多幅图像或观测资料(N > 1
),一个MiniBatchSize
不支持大于1的值。金宝app指定一个MiniBatchSize
为1。
当你有MATLAB支金宝app持包树莓派硬件,在树莓派上生成深度学习代码:
要连接到树莓派,请使用raspi
(树莓派硬件MA金宝appTLAB支持包).例如:
r = raspi (“raspiname”,“用户名”,“密码”);
使用以下方法为库或可执行文件创建代码生成配置对象coder.config
.设置TargetLang
财产“c++”
.
cfg = coder.config (exe”);cfg。TargetLang =“c++”;
使用。创建一个深度学习配置对象编码器。DeepLearningConfig
.设置ArmComputeVersion
和ArmArchitecture
属性。设置DeepLearningConfig
属性的代码生成配置对象编码器。手臂NEONConfig
对象。例如:
dlcfg =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmArchitecture =v7的;dlcfg。ArmComputeVersion =“19.05”;cfg。DeepLearningConfig = dlcfg;
要配置树莓派的代码生成硬件设置,请创建一个编码器。硬件
对象,通过使用coder.hardware
.设置硬件
属性的代码生成配置对象编码器。硬件
对象。
hw = coder.hardware (“树莓π”);cfg。硬件= hw;
如果您正在生成一个可执行程序,请提供一个c++主程序。例如:
cfg。CustomSource =“main.cpp”;
要生成代码,请使用codegen
.属性指定代码生成配置对象配置
选择。例如:
codegen配置cfgsqueezenet_predictarg游戏{(227、227、3,“单”)}报告
请注意
您可以为代码生成指定半精度输入。但是,代码生成器类型将输入强制转换为单精度。深度学习工具箱使用单精度,浮点算法在MATLAB中的所有计算。
当你没有针对目标的硬件支持包时,为深度学习生成代码:金宝app
在Linux上生成代码®主机。
为库创建配置对象。例如:
cfg = coder.config (“自由”);
不要在可执行程序中使用配置对象。
配置代码生成以生成c++代码并只生成源代码。
cfg。GenCodeOnly = true;cfg。TargetLang =“c++”;
要使用ARM计算库指定代码生成,请创建编码器。手臂NEONConfig
对象的使用编码器。DeepLearningConfig
.设置ArmComputeVersion
和ArmArchitecture
属性。设置DeepLearningConfig
属性的代码生成配置对象编码器。手臂NEONConfig
对象。
dlcfg =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmArchitecture =v7的;dlcfg。ArmComputeVersion =“19.05”;cfg。DeepLearningConfig = dlcfg;
要配置特定于目标硬件的代码生成参数,请设置ProdHWDeviceType
财产的HardwareImplementation
对象。
对于ARMv7架构,使用“胳膊兼容- >部门皮层”
.
对于ARMv8架构,使用ARM兼容->ARM 64位(LP64)
.
例如:
cfg.HardwareImplementation.ProdHWDeviceType =ARM兼容->ARM 64位(LP64);
要生成代码,请使用codegen
.属性指定代码生成配置对象配置
选择。例如:
codegen配置cfgsqueezenet_predictarg游戏{one (227, 227, 3, 'single')}- darm_compute
例如,请参见基于ARM目标的深度学习代码生成.
系列网络是作为一个包含层类数组的c++类生成的。
class b_squeezenet_0 {public: int32_T batchSize;int32_T numLayers;real32_T * inputData;real32_T * outputData;MWCNNLayer *层[68];私人:MWTargetNetworkImpl * targetImpl;公众:b_squeezenet_0 ();空白presetup ();空白postsetup ();无效的设置(); void predict(); void cleanup(); real32_T *getLayerOutput(int32_T layerIndex, int32_T portIndex); ~b_squeezenet_0(); };
的设置()
方法为网络对象的每一层建立句柄并分配内存。的预测()
方法对网络中的每一层调用预测。假设您为一个入口点函数生成代码,squeezenet_predict
.在生成的“for you”文件中,squeezenet_predict.cpp
,入口点函数squeeznet_predict ()
构造静态对象b_squeezenet_0类类型和调用设置
和预测
在网络对象上。
静态b_squeezenet_0净;静态boolean_T net_not_empty;//函数定义// //持久化对象net用于加载DAGNetwork对象。//在第一次调用该函数时,构造并设置持久对象。当该函数随后被调用时,相同的对象被重用//以调用预测输入,避免重新构造和重新加载//网络对象。// Arguments: const real32_T in[154587] // real32_T out[1000] //返回类型:void // void squeezenet_predict(const real32_T in[154587], real32_T out[1000]) {// Copyright 2018 The MathWorks,公司if (!net_not_empty) {DeepLearningNetwork_setup(&net);net_not_empty = true;} DeepLearningNetwork_predict(&net, in, out);}
二进制文件用于具有参数的层,如网络中的全连接层和卷积层。例如,名称具有该模式的文件cnn_squeezenet_ * _w
和cnn_squeezenet_ * _b
对应于网络中卷积层的权值和偏差参数。
Cnn_squeezenet_conv10_b cnn_squeezenet_conv10_w cnn_squeezenet_conv1_b cnn_squeezenet_conv1_w cnn_squeezenet_fire2-expand1x1_b cnn_squeezenet_fire2-expand1x1_w cnn_squeezenet_fire2-expand3x3_b cnn_squeezenet_fire2-expand3x3_w cnn_squeezenet_fire2-squeeze1x1_b
完成选择源文件和定义输入类型步骤。
去生成代码的一步。(跳过检查运行时问题步骤,因为使用ARM计算库生成代码时不支持MEX生成。)金宝app
集语言来c++.
指定目标ARM硬件。
如果你的目标硬件是树莓派,你安装了MATLAB支金宝app持包树莓派硬件:
为硬件板中,选择覆盆子π
.
单击,进入“树莓派”设置界面更多的设置.然后,单击硬件.指定设备地址,用户名,密码,建立目录.
当你的ARM目标没有支持包时:金宝app
确保构建类型是静态库
或动态库
并选择只生成代码复选框。
为硬件板中,选择无-选择下面的设备
.
为设备供应商中,选择手臂兼容
.
为设备类型:
对于ARMv7架构,请选择手臂皮层
.
对于ARMv8架构,选择64位(LP64)
.
请注意
如果您在ARM目标上生成用于深度学习的代码,并且不使用硬件支持包,则只在Linux主机上生成代码。金宝app
在深度学习窗格中,设置目标库来臂计算
.指定ARM计算库版本和ARM计算架构.
生成的代码。
编码器。手臂NEONConfig
|编码器。DeepLearningConfig
|coder.loadDeepLearningNetwork