前言

最近想要做一个项目是涉及到目标识别的,我想要实现一个功能就是识别到目标并且把目标的坐标信息通过串口传输给单片机进行控制,那么目前我认为最好的选择就是使用k210了,它不仅成本低,性能好,而且基于MicroPython的开发极易上手,就算是不会python的小萌新也能实现简单的使用,这是各方面完全吊打openmv呀!

首先我来介绍一下什么是k210:
210 是嘉楠(Cannaan)科技的一款集成机器视觉与机器听觉能力的系统级芯片 (RSIC-V CPU)。使用台积电 (TSMC) 超低功耗的 28 纳米先进制程,具有双核 64 位处理器,拥有较好的功耗性能,稳定性与可靠性。该方案力求零门槛开发,可在最短时效部署于用户的产品中,赋予产品人工智能(AI)。 可以说是集性能强劲与高性价比于一身。

开发环境以及材料准备

在这里插入图片描述
学习k210的话核心板和底板是必备的,还需要一条安卓线用于连接电脑。其他功能模块大家可以按照需要去某宝购买,用到视觉的话摄像头模块也是必须的哦
MaixPy 拥有自己官方的 IDE,可以在官网下载,我们使用该 IDE 可以轻松进行开发。而且拥有 Windows、 Mac OS、 Linux 等版本。官网下载地址: 软件下载地址
可以根据自己系统选择合适的版本下载安装。 Window 用户选择 exe 格式文件下载安装。安装步骤很简单的,安装完成后在下图开始处找到软件点击打开。
在这里插入图片描述
打开软件后会出现如下界面
在这里插入图片描述

软件Maixpy IDE使用说明

打开软件后的第一步就是把开发板通过安卓线连接上电脑,然后在电脑的设备管理器处找到对应的COM口。如果没有找到说明电脑没有安装ch340的驱动,这就需要自行百度去安装了。
在这里插入图片描述
然后,在软件右下角点击连接,选择对应的串口点击OK就可以连接pc与开发板了
在这里插入图片描述
这时,软件的左下角三角形箭头就会变成红色,单击的话会把文本种的代码在开发板中执行,但是断开连接的话会停止执行,因为这个按钮是在线执行代码的意思,如果没有bug的话就不会报错。
在这里插入图片描述

关于软件的菜单栏,在这里我只介绍工具烂,其他菜单栏的用不上大家完全可以不用管了,如果想要深入学习的小伙伴也可以看一下。
在这里插入图片描述
首先,根据自己的开发板在选择开发板处选择对应的开发板,如果是pyAI-K210 的开发板,因为串口驱动芯片跟 Maix 的 DOCK 接近,因此可以在选择 Dock。
然后是第二行“将打开的脚本发送到开发板的boot.py”,这个选项在开发板连接到pc后会变得可选,意思是把文本中的代码保存到开发板中,这样的话即使断开pc与开发板的连接,只要供电,就可以执行在上面保存的代码。注意,新保存的代码会覆盖旧的代码。
在这里我给出一个点亮led的代码

from Maix import GPIO
from fpioa_manager import fm

#将蓝灯引脚IO12配置到GPIO0,K210引脚支持任意配置
fm.register(12, fm.fpioa.GPIO0)

LED_B = GPIO(GPIO.GPIO0, GPIO.OUT) #构建LED对象
LED_B.value(0) #点亮LED

可以把这一段的代码复制到软件里,注意原来的代码要删掉,然后点击绿色的三角形运行,效果如下
在这里插入图片描述
如果是其他开发板的话就要按照原理图中的对应的引脚修改代码中第三行就可以了。

识别色块并且串口输出最大色块中心坐标

import sensor,lcd,time,image
from machine import UART,Timer
from fpioa_manager import fm

fm.register(15, fm.fpioa.UART1_RX, force=True)
fm.register(17, fm.fpioa.UART1_TX, force=True)

uart = UART(UART.UART1, 115200, read_buf_len=4096)
uart.write('Hello world!')

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)  #QVGA(320X240)
sensor.set_vflip(1) #后置模式,所见即所得
lcd.init()
#sensor.skip_frames(time = 2000) # 等待设置生效.

#clock=time.clock()
# 颜色识别阈值 (L Min, L Max, A Min, A Max, B Min, B Max) LAB 模型
# 下面的阈值元组是用来识别 红、绿、蓝三种颜色,当然你也可以调整让识别变得更好。
thresholds = [(30, 100, 15, 127, 15, 127), # 红色阈值
(30, 100, -64, -8, -32, 32), # 绿色阈值
(0, 30, 0, 64, -128, -20)] # 蓝色阈值



while True:
 #   clock.tick()
    img = sensor.snapshot()
    blobs = img.find_blobs([thresholds[2]]) # 0,1,2 分别表示红,绿,蓝色。
    if blobs:
        for b in blobs:
            tmp=img.draw_rectangle(b[0:4])
            tmp=img.draw_cross(b[5], b[6])
        max_blob=find_max(blobs)
        output_str="[%d,%d]" % (max_blob.cx(),max_blob.cy()) #方式1
        #output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2
        uart.write(output_str+'\r\n')
#    text=uart.read() #读取数据
#    if text: #如果读取到了数据
#        print(text.decode('utf-8')) #REPL 打印
#        uart.write('I got'+text.decode('utf-8')) #数据回传
    lcd.display(img) #LCD 显示图片
#    print(clock.fps()) #打印 FPS


def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob.pixels() > max_size:
            max_blob=blob
            max_size = blob.pixels()
    return max_blob


大家注意yellow_threshold = (65, 100, -10, 6, 24, 51) 这个赋值语句,大家要把期望识别的颜色的lab值填写到这里,就可以识别对应的颜色了。

代码的功能就是:当摄像头未识别到色块时,串口不会有输出。当识别到色块时,会把最大色块的坐标信息通过串口1,使用波特率115200传输出去(串口,波特率以及对应的引脚都可以自己修改)

fm.register(15, fm.fpioa.UART1_RX, force=True)
fm.register(17, fm.fpioa.UART1_TX, force=True)

这两句代码即是修改串口的tx与rx引脚。其他的代码可以不用去理解,直接用就好了,毕竟本文就是为了快速入门而实现某个特定功能的,想要学习的话是需要先入门学习python的哦。这时候,就可以把这两个引脚连接到单片机,设置波特率为115200就可以实现坐标的接收啦!

声源方向的坐标识别

从亚马逊的 Alexa、 google 智能音箱到国内的天猫精灵、小爱同学等智能音箱都有一个共同的功能,那就是声源定位,其原理是利用多个分布在不同方向的麦克风阵列采集声音,进而定位声源的位置。
麦克风阵列扩展模块由 7 个数字麦克风组成,其中 6 个分布在四周不同方向, 1 个在模块正中央,便于识别各个方向声源。另外 12 个 LED 指示灯,方便指示声源位置。

'''
实验目的:通过麦克风阵列编程实现声源定位,并在LCD上显示。
'''

#导入MIC_ARRAY和LCD模块
from Maix import MIC_ARRAY as mic
import lcd

#初始化模块
lcd.init()
mic.init()

while True:

    #获取原始的声源黑白位图,尺寸 16*16
    imga = mic.get_map()

    #获取声源方向并设置LED显示
    b = mic.get_dir(imga)
    a = mic.set_led(b,(0,0,255))

    #将声源地图重置成正方形,彩虹色
    imgb = imga.resize(160,160)
    imgc = imgb.to_rainbow(1)

    #显示声源图
    lcd.display(imgc)

mic.deinit()

效果如下,能够检测刮胡刀转动的声音并且在lcd上显示位置与声音大小(拍摄效果不好请见谅)
在这里插入图片描述

基于MicroPython的人脸识别

我们来简单介绍一下 K210 的 KPU。 KPU 是 K210 内部一个神经网络处理器,它可以在低功耗的情况下实现卷积神经网络计算, 实时获取被检测目标的大小、坐标和种类,对人脸或者物体进行检测和分类。
KPU 具备以下几个特点:
➢ 支持主流训练框架按照特定限制规则训练出来的定点化模型
➢ 对网络层数无直接限制,支持每层卷积神经网络参数单独配置,包括输
入输出通道数目、输入输 出行宽列高1320
➢ 支持两种卷积内核 1x1 和 3x3
➢ 支持任意形式的激活函数
➢ 实时工作时最大支持神经网络参数大小为 5.5MiB 到 5.9MiB
➢ 非实时工作时最大支持网络参数大小为(Flash 容量-软件体积)
简单来说就是 KPU 能加载和运行各种现成的 AI 算法模型,实现各种机器视
觉等功能。
MaixPy 中人脸识别本质是目标检测,主要通过在 K210 的 KPU 上跑 YOLO
(You Only Look Once)目标检测算法来实现。 我们来看一下 KPU 在 MaixPy 下的用法。

#引入kpu模块
import sensor,lcd,time
import KPU as kpu

#设置摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
#sensor.set_vflip(1)    #设置摄像头后置

lcd.init() #LCD初始化

clock = time.clock()

#task = kpu.load(0x300000) #需要将模型(face.kfpkg)烧写到flash的 0x300000 位置
task = kpu.load("/sd/facedetect.kmodel") #模型SD卡上

#模型描参数
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)

#初始化yolo2网络
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)

while(True):
    clock.tick()
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img) #运行yolo2网络

    #识别到人脸就画矩形表示
    if code:
        for i in code:
            print(i)
            b = img.draw_rectangle(i.rect())

    #LCD显示
    lcd.display(img)

    print(clock.fps())   #打印FPS

人脸识别的话并不是有了代码就可以实现了,还需要一个模型库,比如说一个刚出生的婴儿是不会认识爸爸妈妈的,而是经过后天的学习一步步在脑海里存入记忆,最后才能在众多的人中识别出爸爸妈妈。机器也是如此,你要给他一个知识库(模型),让他知道什么是人脸。
我已经打包了k210的开发软件以及模型库打包上传到csdn了免费的。
首先找到后缀名为kfpkg的文件然后再使用 K210 固件烧录工具烧录直接烧录该文件即可
在这里插入图片描述
实验效果演示
在这里插入图片描述
我对比了一下树莓派实现的人脸识别:
在这里插入图片描述
发现识别效果是差不多的。

(博客还未写完,其他功能后续更新噢)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐