8307浏览
查看: 8307|回复: 12

LattePanda+Mind+Teachable Machine 简易AI兔

[复制链接]
本帖最后由 云天 于 2022-4-22 09:55 编辑

LattePanda+Mind+Teachable Machine 简易AI兔图18

【项目背景】现在最火的领域是什么?人工智能。人工智能领域最热门的话题是什么?机器学习。什么是机器学习?机器学习就是在不直接编程的情况下训练电脑进行学习,是创建类似于人脑的人工神经网络的最佳方式。是不是一看到定义就头疼?没关系,谷歌开发了一款会学习的机器,称为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/

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

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

LattePanda+Mind+Teachable Machine 简易AI兔图2

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

LattePanda+Mind+Teachable Machine 简易AI兔图3

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

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


LattePanda+Mind+Teachable Machine 简易AI兔图4


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

LattePanda+Mind+Teachable Machine 简易AI兔图5LattePanda+Mind+Teachable Machine 简易AI兔图6


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

LattePanda+Mind+Teachable Machine 简易AI兔图7
现在,模型已经准备好了。

【硬件准备】
Lattepanda熊猫板+触摸屏+摄像头
LattePanda+Mind+Teachable Machine 简易AI兔图9

LattePanda+Mind+Teachable Machine 简易AI兔图8
再加上两个“舵机耳机”
LattePanda+Mind+Teachable Machine 简易AI兔图15LattePanda+Mind+Teachable Machine 简易AI兔图19

LattePanda+Mind+Teachable Machine 简易AI兔图20
【编写程序】
将下载的模型,解压到Lattepanda的Mind+Python模式下的工作目录下。
LattePanda+Mind+Teachable Machine 简易AI兔图10

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

LattePanda+Mind+Teachable Machine 简易AI兔图14

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

LattePanda+Mind+Teachable Machine 简易AI兔图11

【测试程序】

测试代码:
  1. import numpy as np
  2. import cv2
  3. from time import sleep
  4. import tensorflow.keras
  5. from keras.preprocessing import image
  6. import tensorflow as tf
  7. cap = cv2.VideoCapture(0)
  8. model = tensorflow.keras.models.load_model('MyModel/keras_model.h5')
  9. labels=['me','background']
  10. font= cv2.FONT_HERSHEY_SIMPLEX
  11. while True:   
  12.     success, image = cap.read()   
  13.     if success == False:
  14.         break
  15.     image = cv2.flip(image,1)
  16.   
  17. # 模型以尺寸(224)的图像作为输入
  18.     img = cv2.resize(image,(224,224))
  19. # 将图像转换为numpy数组
  20.     img = np.array(img,dtype=np.float32)
  21.     img = np.expand_dims(img,axis=0)
  22. # 标准化输入图像
  23.     img = img/255
  24. # 预测类
  25.     prediction = model.predict(img)
  26.    
  27.     predicted_class = labels[np.argmax(prediction)]
  28.     print(predicted_class)
  29.     cv2.putText(image, predicted_class, (123,456), font, 2, (0,255,0), 3)
  30.     cv2.imshow("Frame",image)
  31. # 如果一秒钟过去并按下“q”,关闭所有窗口
  32.     if cv2.waitKey(1) & 0xFF == ord('q'):
  33.       break
  34. # 释放所有打开的连接
  35. cap.release()
  36. cv2.destroyAllWindow()
复制代码
测试效果:
LattePanda+Mind+Teachable Machine 简易AI兔图12
LattePanda+Mind+Teachable Machine 简易AI兔图13【测试舵机】
Mind+Python模式测试舵机
  1. import serial
  2. import time
  3. ser = serial.Serial('COM4', 115200, timeout=0)
  4. def send(val):
  5.     data = bytes(val, 'UTF8')
  6.     ser.write(data)
  7. time.sleep(2000)
  8. send('a')
  9. time.sleep(2000)
  10. send('b')
复制代码
Arduino程序提前下载到,Lattepanda集成的Leonardo板中,接收Mind+程序通过串口传来的指令,控制Arduino GPIO,驱动舵机。
LattePanda+Mind+Teachable Machine 简易AI兔图16
  1. #include <Servo.h>
  2. Servo myservoL;
  3. Servo myservoR;
  4. int pos = 0;
  5. char restr='c';
  6. int bs=0;
  7. void setup()
  8. {
  9.   Serial.begin(115200);
  10.    myservoL.attach(9);
  11.    myservoR.attach(10);
  12. }
  13. void loop()
  14. {if (Serial.available())
  15.    {
  16.      restr=Serial.read();
  17.      if ( restr== 'a')
  18.      {
  19.      myservoL.write(0);
  20.      myservoR.write(180);
  21.      }
  22.       if ( restr== 'b')
  23.      {
  24.      myservoL.write(180);
  25.      myservoR.write(0);            
  26.      }
  27.    }   
  28. }
复制代码



【完整程序】


  1. import numpy as np
  2. import cv2
  3. from time import sleep
  4. import tensorflow.keras
  5. from keras.preprocessing import image
  6. import tensorflow as tf
  7. import serial
  8. ser = serial.Serial('COM4', 115200, timeout=0)
  9. cap = cv2.VideoCapture(0)
  10. model = tensorflow.keras.models.load_model('MyModel/keras_model.h5')
  11. labels=['me','background']
  12. font= cv2.FONT_HERSHEY_SIMPLEX
  13. bs=0
  14. def send(val):
  15.     data = bytes(val, 'UTF8')
  16.     ser.write(data)
  17. while True:   
  18.     success, image = cap.read()   
  19.     if success == False:
  20.         break
  21.     image = cv2.flip(image,1)
  22.   
  23. # The model takes an image of dimensions (224,224) as input so let’s
  24. # reshape our image to the same.
  25.     img = cv2.resize(image,(224,224))
  26. # Convert the image to a numpy array
  27.     img = np.array(img,dtype=np.float32)
  28.     img = np.expand_dims(img,axis=0)
  29. # Normalizing input image
  30.     img = img/255
  31. # Predict the class
  32.     prediction = model.predict(img)
  33.    
  34.     predicted_class = labels[np.argmax(prediction)]
  35.     print(predicted_class)
  36.     cv2.putText(image, predicted_class, (123,456), font, 2, (0,255,0), 3)
  37.     if predicted_class=='me' and bs==0:
  38.        send('a')
  39.        bs=1
  40.     if predicted_class=="background" and bs==1:
  41.        send('b')
  42.        bs=0
  43.     cv2.imshow("Frame",image)
  44. # Close all windows if one second has passed and ‘q’ is pressed
  45.     if cv2.waitKey(1) & 0xFF == ord('q'):
  46.       break
  47. # Release open connections
  48. cap.release()
  49. cv2.destroyAllWindow()
复制代码
程序讲解:
导入所需的库:NumPy(图像处理)、cv2(用于视频捕获的OpenCV)、TensorFlow和Keras以加载模型、serial(舵机驱动)。
使用OpenCV库连接网络摄像头。
将模型加载到“model”中,并创建一个名为“labels”的列表,该列表将存储模型的类名称。
现在,将从摄像头采集的图像对其进行预处理,以便将其输入到我们的模型中。
如果预测类是“me”,这意味着用户人脸图像来到摄像头前,驱动舵机运行。
如果预测的类是“background”,则意味着是只有背景图像,驱动舵机到指定位置不动。
当按下按钮“q”时,程序将结束,这相当于停止录制。
最后,我们释放所有打开的连接。

【演示视频】


下载附件converted_keras (1).zip





converted_keras.zip

2.34 MB, 下载次数: 79

小企鹅  初级技匠

发表于 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

。。。
回复

使用道具 举报

俺是胡胡  初级技师

发表于 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

学习了,非常厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail