口袋中的人工智能 --- 嵌入式AI编程实践系列笔记1

口袋中的人工智能 --- 嵌入式AI编程实践系列笔记

疫情高峰过后,又逢清明假期,有空把最近开始做的一些嵌入式的AI开发笔记整理一下.
清明早上外出,晨光中些许感慨,参照于右任先生"望故乡"词阙,赋诗一首,歌以咏志:

沐朝霞兮,登高坡;
遥望远兮,叹蹉跎;
凤凰涅槃兮,天佑中国;
天苍苍,野茫茫;
山之上,国有殇.
            2020 清明有感

好了,抒情完毕,切入正题,开始我的学习之旅.

0. 背景

我们这几年一直在做一些深度学习相关的东西,无论模型的设计和训练,模型推理和部署,都是在GPU服务器上实现的.近期,随着边缘计算的兴起,推理和部署渐渐倾向使用前端的AI芯片完成比较耗算力的工作,后端完成一些技术难度更高或者综合推理的工作.这种模式的兴起是随着嵌入式的AI芯片的发展而且来的.可以预见,在不久的将来更多的算法:目标检测,图像分类等基础的算法都会移植到前端的小芯片上,这样我们身边的设备像摄像头,玩具,小家电,办公设备等等不仅是智能化了,而且是具备了深度学习能力,不仅可以看见,听见还可以看明白和听明白,我确信这些会很快实现.

我前期也做了一些探索,使用过没有深度学习的Arduino和Esp32等芯片,也是用过raspberry pi这样的基于arm的主板做些项目.一般作为前端采集和预处理,把图像发送给GPU服务器,有服务器计算完成再把结果返回来. raspberry pi有一定的计算能力,可以运行 opencv和 tensorflow,只是做速度太慢,无法满足实时处理的要求.后来尝试使用raspberry pi + NCS2(intel公司的第二代神经棒)和 jetson tx2和jetson nano(英伟达的基于GPU的嵌入式主板). raspberry pi + NCS2的实测效果和我的目前使用的笔记本速度差不多(mac air 2012年款),jetson tx2基本上达到了 Nvidia的入门级显卡的速度(GTX960). 价格上NCS2不到800元,jetson tx2就比较贵差不多4000多元吧,jetson nano是简化版的这个价格更加亲民,开发板应该在800元.

10.png

1.新视野

最近偶然的机会开始接触一款K210的芯片,这跨芯片是原来做阿瓦隆矿机团队做的,这个币圈的朋友应该知道.挖矿消耗的算力其实和深度学习的算法是一样的,都是大量的张量运算.这款芯片无论是算力合适价格真的把上面的秒杀了! 芯片号称只有5美金.

12.png

俗话说的好"是骡子是马,拉出去溜溜",我入手了2款基于K210的开发板,汐速科技的Maix Go和Maix Dock. 开始了我的嵌入式AI开发之路.
Maix Go属于豪华配置,外设配的很全:主板,屏幕,电池,喇叭,摄像头,触屏一应俱全,属于写上代码马上就能部署的东西,价格在250元左右吧. Maix Dock应该跟适合做产品的内核,包括显卡,屏幕和主板,价格在150元左右吧.

16.jpg

17.png

3.启程

这2款开发板,都可以使用MaixPy编程,其实真的很容易上手. MaixPy其实就是整合了 micropython和openmv的开发语言.如果熟悉python和opencv的,可以很小的代价转移到嵌入式设备的开发. micropython是python针对迁入设备的一个子集,而openmv是对opencv做了简化后的一个嵌入式的库. 具体可以参照MAIXP的手册,应该是写的很详细了.
(https://maixpy.sipeed.com/zh/

对于初学的建议使用sd卡存储程序和模型,主要是主板flash容量太小,另外传输也不是很方便,使用sd卡就可以节约很多时间.
嵌入式系统使用了MaixPy,启动时候会把flask中一段3M的空间加载为:/flash,把sd可加载为: /sd,这样我们就可以直接使用这样的空间工作.
micropython会默认调用 boot.py和main.py这2个文件,优先调用sd目录.一般boot.py是一些参数初始化,main.py写主代码.这些可以参照文档
其实这种主板最核心的东西就是AI芯片的使用,这一点上MaixPy做的非常好,使用起来也非常简单. k210芯片的AI芯片定义为 KPU.
KPU是通用的神经网络处理器,它可以在低功耗的情况下实现卷积神经网络计算,时时获取被检测目标的大小、坐标和种类,对人脸或者物体进行检测和分类。

KPU 具备以下几个特点:

  1. 支持主流训练框架按照特定限制规则训练出来的定点化模型
  2. 对网络层数无直接限制,支持每层卷积神经网络参数单独配置,包括输入输出通道数目、输入输 出行宽列高
  3. 支持两种卷积内核 1x1 和 3x3
  4. 支持任意形式的激活函数
  5. 实时工作时最大支持神经网络参数大小为 5.5MiB 到 5.9MiB
  6. 非实时工作时最大支持网络参数大小为(Flash 容量-软件体积)

加载模型

从flash或者文件系统中加载模型

import KPU as kpu
task = kpu.load(offset or file_path)
参数
  • offtset: 模型在 flash 中的偏移大小,如 0xd00000 表示模型烧录在13M起始的地方
  • file_path: 模型在文件系统中为文件名, 如 “/sd/xxx.kmodel”
返回
  • kpu_net: kpu 网络对象

初始化yolo2网络

为yolo2网络模型传入初始化参数

import KPU as kpu
task = kpu.load(offset or file_path)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
参数
  • kpu_net: kpu 网络对象

  • threshold: 概率阈值

  • nms_value: box_iou 门限

  • anchor_num: 锚点数

  • anchor: 锚点参数与模型参数一致

例程

运行人脸识别demo
import sensor
import image
import lcd
import KPU as kpu

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
task = kpu.load('/sd/face_model.kmodel') # face_model.kmodel为人脸识别模型
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while(True):
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        for i in code:
            print(i)
            a = img.draw_rectangle(i.rect())
    a = lcd.display(img)
a = kpu.deinit(task)

运行效果

Gif-2020-46-05-12-46-24.gif

4.动手做几个小项目

已经做了几个小项目,回头整理一下笔记,后续会分享出来.

Gif-2020-59-05-12-59-45.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容