智能车AI电磁部署学习 (一)


智能车AI电磁部署学习 (二)
智能车AI电磁部署学习 (三)

1 简介

引入

b乎:如何评价2020届智能车比赛的AI电磁组?
通过学长介绍,在假期观看了吴恩达老师的机器学习与深度学习相关课程。

2 学习基础

以视频为主,笔记为辅
在每周课程结束后,自己编写课后作业,与CSDN版课后作业和鲸社区版本对比。

3 逐飞方案

逐飞方案
千等万等终于等出逐飞的部署方案后便与队友开始了方案尝试。
经过两天的测试发现,一旦更改神经网络,都无法正确部署在单片机得到正确结果,后与逐飞确认后,逐飞给出的是一个固定模型方案,无法自行增加、更改模型层级。

在看到此聊天记录后,决定自己开发。深度学习神经网络难点在于超参数的调整与反向传播的代码构建,而在部署端只需要实现简单的前向传播即可,模型的搭建与调整都在框架下进行,整体难度不大。
群主
的确逐飞给出的始终只是一个引导,真正的智能车还需自己努力奋斗。

4 Tensorflow模型部署

搭建

根据部署流程,在使用Keras搭建出神经网络后,导入训练集,并将模型保存在本地。

model = Sequential()
model.add(Dense(100, activation='relu', input_dim=2))
model.add(Dense(50, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(2, activation='softmax'))

model.compile(optimizer=keras.optimizers.SGD(lr=0.1), loss='mean_squared_error')

x_train = np.array([[100,100],[50,10],[80,30],[1,1],
                    [-2,1],[-70,80],[-200,25],[-1, 10]])
y_train = np.array([0,0,0,0,1,1,1,1])
y_train = to_categorical(y_train.T)  # 独热码

model.fit(x_train,y_train,epochs=500)

x_test = np.array([90,10])
print(x_test)
print(model.predict(x_test))

model.save('softmax1.h5')

读取

model = load_model('softmax1.h5')
model.summary()

x_test = np.array([0, 0])
x_test = np.reshape(x_test,(1,2))

print(model.predict(x_test))

打印出模型概要,并输入测试集。
输出

def Kernel_transform(Kernel, f):

def Bias_transform(Kernel, f):

def Weights_transform(Hide_num, Kernel, Bias,  f):

def Shape_transform(dense_kernel, dense_bias , f):

def quantitative_model_weights(in_file_name, out_file_name):

quantitative_model_weights('softmax1.h5', 'Weights.c')

接下来编写读取函数,注意处理权重数组的{ , } \n
运行得到文件Weights.c
//图片与代码不符,找不到老图拿新图凑数
旧版

新版(添加了宏定义与维度数组便于使用

C语言

在C语言端,我们只需要实现神经网络的前向传播即可。
笔记

读出了各层权重后,编写C端代码
原本计划使用DSP芯片的矩阵运算库来加速神经网络的大量乘法的运算速度(类似于STM32中DSP的使用),后发现尽管官网标注TC377有DSP,经网上搜寻、询问乾勤科技技术人员甚至翻阅芯片手册,并未找到相关描述。决定弃置代码向量化吴恩达老师对不起 ,以双重循环的方式实现前向传播。

void autoModel_Predict(double* X_in, double* Y_out, int layers)int main()
{

    double y_test[2] = {0};
    double x[] = {0,0};

    autoModel_Predict(x, y_test, 1);
    printf("%lf\n%lf", y_test[0], y_test[1]);
    
    return 0;
}

可以看到结果与py下运行一致,至此移植成功。

5 TC377

代码最终还是要落实到单片机的,因本人是mac os,所以找来了我的好哥儿们 黄大佬 帮我们测试。
在搭建了与逐飞相同数量的隐藏层后,导出参数,TC377 300M主频下 使用core_0的运算时间为1868us。

串口图片
逐飞:5、任意打开一个串口助手以ascii方式接收,此时复位一下单片机即可看到如下图所示,从显示的信息可以看到,运行一次模型所需的时间大约为502us。
逐飞在将输入、输出、权重全部量化成int8后运行速度在502us,自己构建部署的全double输入,计算用时1868us。
在这里插入图片描述
以舵机50Hz 也就是20ms控制频率来看,全double类型计算在此运算效率下是绰绰有余的。甚至摄像头组也可部署此方案

  • 32
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值