查看: 4159|回复: 4

[DFR0453] 【CurieNano试用】processing+图形检测+机器学习

[复制链接]
本帖最后由 kaka 于 2017-7-28 22:04 编辑

之前看见CurieNano的试用,一直想学点机器学习方面的知识,所以一直很关注,但是看了一圈试用项目,很多都拿这块板子做了普通Arduino板子就能做的东西,没有用到居里的128个神经单元,感觉很可惜,我都斗胆向Luna大大申请了一块CurieNano,做点机器学习的研究,希望抛砖引玉,大神上点更多的创意想法。
1、下载arduino IDE 1.8.2      可以去www.arduino.cc 下载.
版本不够,编译不过,别怪我通过IDE自带的板卡管理器下载,速度太慢了,且有时候还会被墙,导致我这更新过慢,实在不好意思


2、打开IDE,下载支持文件
1.PNG
2.png 3.PNG
当然也可以通过其他方式,这里要感谢奈何大大制作的安装包
所以这里我把都传到了百度运,如果你等不急的话,直接从百度云下载吧(里面有版本编号,推荐下载版本号高的)
http://pan.baidu.com/s/1bogLHF5

3、驱动安装
驱动下载:
http://pan.baidu.com/s/1nuz3Wjn

如果你已经安装了 101/CurieNano扩展包,那么可以通过如下地址找到驱动,并安装。
C:\Users\Administrator\AppData\Local\Arduino15\packages\Intel\hardware\arc32\2.0.2\drivers
32位系统运行dpinst-x86.exe,64位系统运行dpinst-amd64.exe


安装完成后,查看设备管理器,如果有名为Genuino 101/CurieNano的串口出现,则说明安装成功,如图:
4.PNG

项目原理1.电脑上运行Processing客户端,负责收集实时视频,发送给Intel Curie Genduino 101/CurieNano,
2.电脑USB外接Intel Curie Genduino101/CurieNano,负责对视频进行训练和识别,可直接在arduino sketch中编译传送给CurieNano:
当然有人会说CurieNano处理不了视频,实际处理的是光流向量。


接下来部署Processing开发环境
首先在电脑安装Processing开发平台。在https://www.processing.org下载安装最新版本Processing软件。

然后打开Processing软件,给Processing平台添加OpenCV库。
5.png

选择菜单栏 工具-添加工具。点击鼠标。打开工具管理器。
6.PNG


选择第一页, Libraries,在下拉菜单中选择OpenV,点击Install安装。(注意,这一步需翻墙)

安装成功后,就可以使用本文后附的Processing程序代码了。程序代码启动电脑摄像头,分析拍摄的实时录像光流方向,并传递给Intel Curie nano / Genduino 101进行处理。

再回到arduino  IDE
确保sketch的开发板管理器已经安装和正确识别Curie以后,再添加CuireNeuron库。
下载CuireNeuron库
现在这个库官网收费了,我这里提供个免费版本
链接:http://pan.baidu.com/s/1eRNrRLg 密码:j7w5
无标题.png

然后添加刚才我们下载好的CuireNeuron.zip库文件。
再然后arduino代码
[AppleScript] 纯文本查看 复制代码
/**
 *processing control a 2-4 servos platform 
 */
 
 #include <CurieNeurons.h>
 CurieNeurons hNN;
 
 int catL = 0;
 int prevcat = 0;
 int dist, cat, nid, nsr, ncount;
  
 const short sampleNbr = 20;
 const short signalNbr = 2;
 byte vector[sampleNbr*signalNbr];
 byte flowX[sampleNbr];
 byte flowY[sampleNbr];
 boolean a = false;
 void setup()   
 {
   pinMode(13, OUTPUT);
   Serial.begin(115200);
   while (!Serial);
   if(hNN.begin()==0){
      Serial.print("neurons initialized");
      hNN.forget(500);
   }
   else{
      Serial.print("error.");
   }
 }
 void loop() 
 {
   while(Serial.available()==0);
   char data=Serial.read();
   for(int i = 0; i < sampleNbr; i++)
   {
       while(Serial.available()==0);
       vector[i*signalNbr]=Serial.read();
   }
   for(int i = 0; i < sampleNbr; i++)
   {
       while(Serial.available()==0);
       vector[i*signalNbr+1]=Serial.read();
   }
   a = !a;
   digitalWrite(13, a);   // turn the LED on (HIGH is the voltage level)
   switch(data)
   {    
       case '%':
           //learn 1
           catL = 1;          
           /*for(int i = 0; i <sampleNbr; i++){
              Serial.write(vector[i*signalNbr]); 
              Serial.write(vector[i*signalNbr+1]);
           }*/
           ncount = hNN.learn(vector, sampleNbr*signalNbr, catL);
           Serial.write(ncount);
           Serial.write("#");
           Serial.flush();
           break;
       case '^':
           //learn 1
           catL = 2;          
           /*for(int i = 0; i <sampleNbr; i++){
              Serial.write(vector[i*signalNbr]); 
              Serial.write(vector[i*signalNbr+1]);
           }*/
           ncount = hNN.learn(vector, sampleNbr*signalNbr, catL);
           Serial.write(ncount);
           Serial.write("#");
           Serial.flush();
           break;
       case '$':
           // Recognize
           hNN.classify(vector, sampleNbr*signalNbr,&dist, &cat, &nid);
           Serial.write(cat);
           Serial.write("#");
           Serial.flush();
           break;
                       
   }
    
 }




Processing程序


[AppleScript] 纯文本查看 复制代码
import gab.opencv.*;
import processing.video.*;
import processing.serial.*;
Serial port;
 
OpenCV opencv;
Capture video;
byte lastx, lasty;
byte currentx, currenty;
byte[] rawVecX;
byte[] rawVecY;
int index;
int count;
boolean action;
final int sampleNbr = 20;
byte state;
byte[] result;
int P_result;
 
void setup() {
  size(640, 240);
 
  result = new byte[3];
  P_result = 0;
  rawVecX = new byte[sampleNbr];
  rawVecY = new byte[sampleNbr];
  lastx = 0;
  lasty = 0;
  count = 0;
  port = new Serial(this, Serial.list()[0], 115200);
  video = new Capture(this, 320, 240);
  opencv = new OpenCV(this, 320, 240);  
  video.start();
}
 
void draw() {
  if(keyPressed){
     if (key == 'a' || key == 'A') {
       state = 1;
       println("change state to learning 1");
     } 
     else if (key == 's' || key == 'S') {
       state = 2;
       println("change state to learning 2");;
        
     }
     else{
       state = 3;
       println("change state to classifying");
     }
  }
  background(0);
  opencv.loadImage(video);
  opencv.calculateOpticalFlow();
  image(video, 0, 0);
  translate(video.width,0);
  stroke(255,0,0);
  opencv.drawOpticalFlow();
  PVector aveFlow = opencv.getAverageFlow();
  int flowScale = 50; 
  stroke(255);
  strokeWeight(2);
   
  textSize(50);
  if(result[2] == 1){    
    text("Yes", 10, 230);
  }
  else if(result[2] == 2){
    text("No", 10, 230);  
  }
  else{
    text("?", 10, 230);
  }
  textSize(40);
  if(result[1] == 1){    
    text("Yes", 10, 175);
  }
  else if(result[1] == 2){
    text("No", 10, 175);  
  }
  else{
    text("?", 10, 175);
  }
  textSize(30);
  if(result[0] == 1){    
    text("Yes", 10, 130);
  }
  else if(result[0] == 2){
    text("No", 10, 130);  
  }
  else{
    text("?", 10, 130);
  }
   
  line(video.width/2, video.height/2, video.width/2 + aveFlow.x*flowScale, video.height/2 + aveFlow.y*flowScale);
   
  currentx=byte(map(aveFlow.x, -1, 1, 0, 255));
  currenty=byte(map(aveFlow.y, -1, 1, 0, 255));
  if (action == true){
      if(index < sampleNbr){
          rawVecX[index] = currentx;
          rawVecY[index] = currenty;
          index++;  
      }
      else
      {
          action = false; 
          print("count=");
          println(count); 
          for(int i = 0; i < sampleNbr; i++){
              print(int(rawVecX[i]));
              print(",");
          }
          println();
          for(int i = 0; i < sampleNbr; i++){
              print(int(rawVecY[i]));
              print(",");
          }
          print("|");
          println(state);
          sendToCurie(state, rawVecX, rawVecY);
          println("accepted");
       }
  }
  else
  {
    if(abs(int(currentx)-int(lastx)) > 30 || abs(int(currenty)-int(lasty)) > 30){
      action = true;
      index = 0;
      count = count + 1;
      println("started");
    }
  }
  lastx = currentx;
  lasty = currenty;
 
}
 
void captureEvent(Capture c) {
  c.read();
}
 
void sendToCurie(byte LorC, byte[] vecX, byte[] vecY) //send yaw and roll angel to MegaPi to control servos 
{
   if(LorC == 1){
        port.write('%');        
   }
   else if(LorC == 2){
        port.write('^');
   }
   else{
        port.write('$');
   }
       
  port.write(vecX);
  port.write(vecY);
   
  byte inByte;
  int ct = 0;
  while (port.available() > 0){
      inByte = byte(port.read());
      print(int(inByte));
      if(ct == 0){
        result[0] = result[1];
        result[1] = result[2];
        result[2] = inByte;
      }
      print(">");
      if(inByte == '#'){
          break;
      }
      ct = ct + 1;
  }
}




这个时候你还需要下载个video库

收工



无标题.png

hnyzcj  超级版主

发表于 2017-5-22 23:08:50

qidai
回复 支持 反对

使用道具 举报

luna  管理员

发表于 2017-5-23 10:33:36

占楼~围观大项目
回复 支持 反对

使用道具 举报

gray6666  高级技匠

发表于 2017-5-26 10:39:23

期待中。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

kaka  版主
 楼主|

发表于 2017-5-26 12:23:54

luna 发表于 2017-5-23 10:33
占楼~围观大项目

稍等哦
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

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

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

mail