云天 发表于 2022-4-22 09:55:09

LattePanda+Mind+Teachable Machine 简易AI兔

本帖最后由 云天 于 2022-4-22 09:55 编辑


【项目背景】现在最火的领域是什么?人工智能。人工智能领域最热门的话题是什么?机器学习。什么是机器学习?机器学习就是在不直接编程的情况下训练电脑进行学习,是创建类似于人脑的人工神经网络的最佳方式。是不是一看到定义就头疼?没关系,谷歌开发了一款会学习的机器,称为Teachable Machine,不但能帮助我们理解什么是机器学习,而且还允许我们亲自去教机器学习。但在国内想访问谷歌网站是有困难的,所以我找了一个国内平台,“英荔AI训练平台”https://train.aimaker.space/train。但前一段时间也用不了,这一段时间又能使用了。(本人个人猜测,国内这个平台,依然借用的是谷歌Teachable Machine)
【项目设计】
将使用Google Teachable Machine来训练我们的深度学习模型,并LattePanda上使用Mind+的Python模式来实现,当“主人”来到面前时,“小兔”的耳朵会高兴动起来,大家参考我的项目过程,肯定能制作出更多、更有趣的作品,让我们一起走近AI。

【训练模型】

1、图像分类
在这个平台你可以为姿势估计、图像分类或音频分类创建模型,因为我们的任务是图像分类,所以选择“图像项目(Image Project)”。
访问“图像分类”:https://train.aimaker.space/train/image/


以上是我们项目的初始设置,类代表不同的分类类别。我们可以使用网络摄像头直接从网络浏览器记录样本(创建数据集),另外,我们也可以从本地机器或谷歌云端硬盘上传图片。

2、如下所示,创建2个类(me,background),“me”为自己的图像,“background”为环境背景图像。



3、采集图像样本
单击“ me”类中的“摄像头”按钮,从不同的距离和角度录制图片可以确保模型能够很好地概括,并且不会过拟合。



现在,点击“按住以录制”按钮并记录你的样本。
完成此操作后,可以从样本中选择单个图像,并删除或更改其标签(如果是错误录制的)。
对“background”类重复此过程(收集背景图像)。
注意:尝试为所有类提供大致相等数量的图像,这样模型就不会偏向于任何一个特定的类。

4、训练模型
单击“训练模型”按钮开始在刚刚收集的图像上训练模型!也可以单击“高级”部分下拉列表来更改超参数。




5、预览
训练完成后,你可以在浏览器上测试你的模型,以确定模型是否在所有可能的情况下都经过了充分训练,或者是否要添加更多图像。




6、导出模型
可以点击顶部的“导出模型”按钮来导出模型,选择Tensorflow->Keras的模型类型。你还可以将模型转换为其他格式,如Tensorflow.js或Tensorflow Lite,具体取决于你的用例。单击“下载我的模型”并解压Zip文件以获取模型权重和标签。


现在,模型已经准备好了。

【硬件准备】
Lattepanda熊猫板+触摸屏+摄像头



再加上两个“舵机耳机”



【编写程序】
将下载的模型,解压到Lattepanda的Mind+Python模式下的工作目录下。


安装必要的库,tensorflow库,通过“库管理”——“PIP模式”手动安装。



OpenCV库,通过“库管理”——“推荐库”安装。



【测试程序】

测试代码:

import numpy as np
import cv2
from time import sleep
import tensorflow.keras
from keras.preprocessing import image
import tensorflow as tf

cap = cv2.VideoCapture(0)
model = tensorflow.keras.models.load_model('MyModel/keras_model.h5')
labels=['me','background']
font= cv2.FONT_HERSHEY_SIMPLEX
while True:   
    success, image = cap.read()   
    if success == False:
      break
    image = cv2.flip(image,1)


# 模型以尺寸(224)的图像作为输入

    img = cv2.resize(image,(224,224))

# 将图像转换为numpy数组
    img = np.array(img,dtype=np.float32)
    img = np.expand_dims(img,axis=0)

# 标准化输入图像
    img = img/255

# 预测类
    prediction = model.predict(img)
   
    predicted_class = labels
    print(predicted_class)
    cv2.putText(image, predicted_class, (123,456), font, 2, (0,255,0), 3)
    cv2.imshow("Frame",image)
# 如果一秒钟过去并按下“q”,关闭所有窗口
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break

# 释放所有打开的连接
cap.release()
cv2.destroyAllWindow()

测试效果:

【测试舵机】
Mind+Python模式测试舵机
import serial
import time
ser = serial.Serial('COM4', 115200, timeout=0)
def send(val):
    data = bytes(val, 'UTF8')
    ser.write(data)
time.sleep(2000)
send('a')
time.sleep(2000)
send('b')将Arduino程序提前下载到,Lattepanda集成的Leonardo板中,接收Mind+程序通过串口传来的指令,控制Arduino GPIO,驱动舵机。


#include <Servo.h>
Servo myservoL;
Servo myservoR;
int pos = 0;
char restr='c';
int bs=0;
void setup()
{
Serial.begin(115200);
   myservoL.attach(9);
   myservoR.attach(10);
}

void loop()
{if (Serial.available())
   {
   restr=Serial.read();
   if ( restr== 'a')
   {
   myservoL.write(0);
   myservoR.write(180);
   }
      if ( restr== 'b')
   {

   myservoL.write(180);
   myservoR.write(0);            
   }
   }   
}


【完整程序】


import numpy as np
import cv2
from time import sleep
import tensorflow.keras
from keras.preprocessing import image
import tensorflow as tf
import serial
ser = serial.Serial('COM4', 115200, timeout=0)
cap = cv2.VideoCapture(0)
model = tensorflow.keras.models.load_model('MyModel/keras_model.h5')
labels=['me','background']
font= cv2.FONT_HERSHEY_SIMPLEX
bs=0
def send(val):
    data = bytes(val, 'UTF8')
    ser.write(data)

while True:   
    success, image = cap.read()   
    if success == False:
      break
    image = cv2.flip(image,1)


# The model takes an image of dimensions (224,224) as input so let’s

# reshape our image to the same.
    img = cv2.resize(image,(224,224))

# Convert the image to a numpy array
    img = np.array(img,dtype=np.float32)
    img = np.expand_dims(img,axis=0)

# Normalizing input image
    img = img/255

# Predict the class
    prediction = model.predict(img)
   
    predicted_class = labels
    print(predicted_class)
    cv2.putText(image, predicted_class, (123,456), font, 2, (0,255,0), 3)
    if predicted_class=='me' and bs==0:
       send('a')
       bs=1
    if predicted_class=="background" and bs==1:
       send('b')
       bs=0
    cv2.imshow("Frame",image)
# Close all windows if one second has passed and ‘q’ is pressed
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break

# Release open connections
cap.release()
cv2.destroyAllWindow()

程序讲解:
导入所需的库:NumPy(图像处理)、cv2(用于视频捕获的OpenCV)、TensorFlow和Keras以加载模型、serial(舵机驱动)。
使用OpenCV库连接网络摄像头。
将模型加载到“model”中,并创建一个名为“labels”的列表,该列表将存储模型的类名称。
现在,将从摄像头采集的图像对其进行预处理,以便将其输入到我们的模型中。
如果预测类是“me”,这意味着用户人脸图像来到摄像头前,驱动舵机运行。
如果预测的类是“background”,则意味着是只有背景图像,驱动舵机到指定位置不动。
当按下按钮“q”时,程序将结束,这相当于停止录制。
最后,我们释放所有打开的连接。

【演示视频】
https://www.bilibili.com/video/BV1Z3411N7CW?share_source=copy_web






小企鹅 发表于 2022-4-23 17:12:08

厉害厉害

DFHkyIODM2D 发表于 2022-4-24 17:19:23

看一看。。。。

俺是胡胡 发表于 2022-7-28 22:21:33


给赞一个

派大星ym 发表于 2022-8-1 14:02:38

{:7_219:}。。。

俺是胡胡 发表于 2022-8-2 19:50:18

JVUm7ppJGaRK 发表于 2023-1-6 22:59:18

厉害厉害

花生编程 发表于 2023-7-26 22:46:48

厉害厉害

花生编程 发表于 2023-7-26 22:48:59

赞赞赞赞赞!!好有创意!

花生编程 发表于 2023-7-26 22:50:01

如果不那么卡就好了!

三春牛-创客 发表于 2023-7-27 22:07:43

厉害厉害

三春牛-创客 发表于 2023-7-27 22:08:45

赞一个!

谭周强 发表于 2023-11-2 10:29:08

学习了,非常厉害
页: [1]
查看完整版本: LattePanda+Mind+Teachable Machine 简易AI兔