|
【故事】
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侧
[mw_shl_code=python,true]#======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()[0] i.rect()[1] i.rect()[2] i.rect()[3] 分别是兴趣框的x,y,w,h
for i in code_stake:
ball_x=i.x()
#ball_x=i.rect()[0]
ball_y=i.y()
#ball_y=i.rect()[1]
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)
[/mw_shl_code]
core侧
[mw_shl_code=python,true]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))[/mw_shl_code]
【小结】
这是深度学习的一次简单体验,没有小车驱动,也没有更炫目的特效,有一个新知识点,那就是UIFLOW的JSON解析
代码也非常简单:
【鸣谢】
感谢arduino.cn和m5stack.com以及笑笑师兄的支持。
明天复工,沧海合十,立此为念
【附件分享】其中的uiflow文件里面,关于uart.any()的判断,与代码不一致,以代码为准。
boot_unit_v.rar
(3.38 KB, 下载次数: 8)
|
|