Unit-v+M5Stack 体验深度学习与目标检测-Arduino中文社区 - Powered by Discuz! Archiver

沧海笑1122 发表于 2020-3-8 23:51

Unit-v+M5Stack 体验深度学习与目标检测

【故事】
    Unit-v检测到目标小球,将坐标传给M5Stack,屏幕上显示小球的坐标,从而 体验深度学习与目标检测。
☞☞☞点击此处观看效果视频


【硬件】
UNIT-V
M5STACK core


【软件】
Maixpy 0.24
UIFLOW 1.4.5


[接线]
UNIT-V 的grove输出,core端,16=rx   17=tx


【模型训练】
详见https://www.arduino.cn/thread-94433-1-1.html


【代码】
V侧
#======2020-03-08 unitv识别小球目标,uart传回坐标
import image
#import lcd
import sensor
import sys
import time
import KPU as kpu
from fpioa_manager import *
import math
import KPU as kpu
from Maix import GPIO
import utime

#===========uart init
fm.register(34,fm.fpioa.UART1_TX)
fm.register(35,fm.fpioa.UART1_RX)
uart_out = UART(UART.UART1, 115200, 8, None, 1, timeout=1000, read_buf_len=4096)

#载入已训练模型
task=kpu.load(0x00300000)
#只有一个目标小球,1即为小球
labels=["1"] #You can check the numbers here to real names.
anchor = (0.33340788 * 16, 0.70065861 * 16, 0.18124964 * 16,0.38986752 * 16, 0.08497349 * 16,0.1527057 * 16)
a = kpu.init_yolo2(task, 0.05, 0.05, 3, anchor)
#注:第一个是兴趣框的精确度的阈值
#第二个参数,是目标的精确度的阈值,v-train发回0.2,现在是0.05,调高了就会更可靠,但是可能识别率低
#调低了,容易识别到,但是也同时容易误识别。

print("Load Done.")
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((320, 224))
sensor.run(1)

print("Init Done.")

counter = 1 #计数器
code_stake = [] #识别集合

ball_x = 0 #ball的x坐标
ball_y = 0 #ball的y坐标

while(True):
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)

    if code:
      if counter < 3: #累计3次识别,将识别结果累加到code_stake[]当中
            code_stake = code_stake + code
            counter = counter+ 1
      else:
            counter = 0
            ball_x = 0
            ball_y = 0
            #注:i.rect()   i.rect()    i.rect()    i.rect()   分别是兴趣框的x,y,w,h
            for i in code_stake:
                ball_x=i.x()
                #ball_x=i.rect()
                ball_y=i.y()
                #ball_y=i.rect()


      if counter == 0: #3次识别完毕
            #发送数据至uart
            #==== send json str for ball_x and ball_y四舍五入 round()
            #s_json="{\"ball_x\":\""+str(round(ball_x))+"\",\"ball_y\":\""+str(round(ball_y))+"\"}"
            s_json="{\"ball_x\":"+str(round(ball_x))+",\"ball_y\":"+str(round(ball_y))+"}"
            uart_out.write(s_json+"\r\n")
            print(s_json)
            code_stake = [] #识别集清零
            utime.sleep_ms(50)#此延时不宜过低
      for i in code: #在屏幕上标记兴趣框和原点
            img.draw_rectangle(i.rect())

    else:
      #lcd.display(img)
      pass
a = kpu.deinit(task)



core侧
from m5stack import *
from m5ui import *
from uiflow import *
import json


setScreenColor(0x222222)



#rectangle0 = M5Rect(40, 5, 200, 170, 0xFFFFFF, 0xFFFFFF)
label1 = M5TextBox(39, 10, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
label2 = M5TextBox(231, 12, "Text", lcd.FONT_Default,0xFFFFFF, rotate=0)
circle0 = M5Circle(81, 144, 10, 0xfdd708, 0xFFFFFF)

uart = None
dict2 = None
data1 = None
atom_x = None
atom_y = None



uart = machine.UART(1, tx=17, rx=16)
uart.init(115200, bits=8, parity=None, stop=1)
while True:
   
if uart.any():
      dict2 = uart.readline()
      data1 = json.loads(dict2)
      atom_x=data1['ball_x']
      atom_y=data1['ball_y']
      label1.setText(str(atom_x))
      label2.setText(str(atom_y))
      circle0.setPosition((320-atom_x), (atom_y+20))



【小结】
这是深度学习的一次简单体验,没有小车驱动,也没有更炫目的特效,有一个新知识点,那就是UIFLOW的JSON解析
代码也非常简单:




【鸣谢】
    感谢arduino.cn和m5stack.com以及笑笑师兄的支持。
    明天复工,沧海合十,立此为念
【附件分享】其中的uiflow文件里面,关于uart.any()的判断,与代码不一致,以代码为准。

genvex 发表于 2020-3-9 01:26

圈粉啦,每贴都很实用

沧海笑1122 发表于 2020-3-9 11:31

genvex 发表于 2020-3-9 01:26
圈粉啦,每贴都很实用

感谢支持,一切学习

dillonning 发表于 2020-3-10 12:16

厉害了 楼主,谢谢分享

topdog 发表于 2020-4-11 19:19

沧海笑出品,必是精品!

沧海笑1122 发表于 2020-4-12 21:46

topdog 发表于 2020-4-11 19:19
沧海笑出品,必是精品!

谢谢师兄支持:handshake
页: [1]
查看完整版本: Unit-v+M5Stack 体验深度学习与目标检测