【搬运】通过AI判断金鱼坐标推断金鱼状态的实验-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2073|回复: 5

【搬运】通过AI判断金鱼坐标推断金鱼状态的实验

[复制链接]
发表于 2020-3-13 18:14 | 显示全部楼层 |阅读模式
本项目转载自home-made-garbage,作者通过AI摄像头标记金鱼的坐标尝试判断金鱼是否在睡觉,代码分为UnitV和StickC部分,UnitV串口传输坐标,最终通过StickC的WiFi对外进行UDP广播。
关于金鱼的模型可以通过V-training进行学习,UnitV识别金鱼并通过串口发送其中心坐标(x,y),画面大小224x224。

UnitV端
[mw_shl_code=python,true]from machine import UART
from board import board_info
from fpioa_manager import fm
from Maix import GPIO
import sensor,image,lcd
import KPU as kpu

lcd.init()

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((224, 224))
sensor.set_vflip(1)
sensor.set_hmirror(1)
sensor.run(1)

fm.register(35, fm.fpioa.UART1_TX, force=True)
fm.register(34, fm.fpioa.UART1_RX, force=True)

uart = UART(UART.UART1, 115200,8,0,0, timeout=1000, read_buf_len=4096)

classes = ["goldfish"]
task = kpu.load(0x600000)
#task = kpu.load("/sd/model246pic.kmodel")
anchor = (0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828)
a = kpu.init_yolo2(task, 0.3, 0.3, 5, anchor)
while(True):
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    if code:
        for i in code:
            a = img.draw_cross(i.x()+int(i.w()/2),i.y()+int(i.h()/2),color = (0, 255, 0),size=5,thickness=4)
            data_packet = bytearray([0xFF,0xD8,0xEA,0x01,i.index(),i.x()+int(i.w()/2),i.y()+int(i.h()/2),0x00,0x00,0x00])
            uart.write(data_packet)
        a = lcd.display(img)
    else:
        a = lcd.display(img)
a = kpu.deinit(task)[/mw_shl_code]

M5StickC端接收UnitV的金鱼坐标并通过UDP发送
[mw_shl_code=arduino,true]#include <WiFi.h>
#include <WiFiUDP.h>
#include <M5StickC.h>

static WiFiUDP wifiUdp;
static const char *kRemoteIpadr = "192.168.0.255";
static const int kRmoteUdpPort = 9000;

const char* ssid = "WiFi-SSID";
const char* password = "password";

static const uint8_t packet_begin[3] = { 0xFF, 0xD8, 0xEA };


void setup() {
  M5.begin();
  M5.Axp.ScreenBreath(0);
  
  Serial.begin(115200);
  Serial2.begin(115200, SERIAL_8N1, 32, 33);

  static const int kLocalPort = 7000;

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  wifiUdp.begin(kLocalPort);
  
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  if (Serial2.available()) {
    uint8_t rx_buffer[10];
    int rx_size = Serial2.readBytes(rx_buffer, 10);   
    if (rx_size == 10) {
      if ((rx_buffer[0] == packet_begin[0]) && (rx_buffer[1] == packet_begin[1]) && (rx_buffer[2] == packet_begin[2])) {
        Serial.print(rx_buffer[4]);
        Serial.print(":");
        Serial.print(rx_buffer[5]);
        Serial.print(",");
        Serial.println(rx_buffer[6]);
        
        wifiUdp.beginPacket(kRemoteIpadr, kRmoteUdpPort);
        wifiUdp.print(rx_buffer[4]);
        wifiUdp.print(":");
        wifiUdp.print(rx_buffer[5]);
        wifiUdp.write(',');
        wifiUdp.print(rx_buffer[6]);
        wifiUdp.endPacket();  
      }
    }
  }
}
[/mw_shl_code]

根据坐标绘制图表,其中Y轴为移动距离 截屏2020-03-13 18.10.36.png X轴为时间点 0211.jpg 0212.jpg
可以看出图表中1点到5点的移动量明显减少,证明金鱼此时在睡觉。

发表于 2020-3-13 18:35 | 显示全部楼层
方法不错,不过数据处理有待加强:

应该用位置差商算平均速度,用 x^2+y^2 容易被圆弧游动的金鱼欺骗
发表于 2020-4-10 12:01 | 显示全部楼层
t3486784401 发表于 2020-3-13 18:35
方法不错,不过数据处理有待加强:

应该用位置差商算平均速度,用 x^2+y^2 容易被圆弧游动的金鱼欺骗

x^2+y^2  是计算 直线移动距离吗,能出改进指导意见吗
发表于 2020-4-10 13:29 | 显示全部楼层
genvex 发表于 2020-4-10 12:01
x^2+y^2  是计算 直线移动距离吗,能出改进指导意见吗

x^2+y^2 是计算到原点的直线距离,这个参数有变化,可以推导出金鱼有移动,
但是参数不变化,却不能推导出金鱼静止(圆周运动就是特例)。

实际应该用金鱼速度来作为运动评判:(x1-x0)^2+(y1-y0)^2
相邻两次采样位置之差作为速度,即差商。

金鱼假如相对于原点做圆周运动,x^2+y^2结果是不变的,会误认为静止;
但是(x1-x0)^2+(y1-y0)^2 作为瞬时速度就不会为零,避免误判
发表于 2020-4-10 14:45 | 显示全部楼层
t3486784401 发表于 2020-4-10 13:29
x^2+y^2 是计算到原点的直线距离,这个参数有变化,可以推导出金鱼有移动,
但是参数不变化,却不能推导 ...

给力,详细,腻害,您做过类似的项目吗
发表于 2020-4-10 15:03 | 显示全部楼层
genvex 发表于 2020-4-10 14:45
给力,详细,腻害,您做过类似的项目吗

做过纯 PC 的图像识别,涉及图像变换了。

这个上摄像头的,除了驱动不同,在检测算法上目测一样
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:37 , Processed in 0.179517 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表