当前位置: 首页>编程日记>正文

PoseNet收集数据

<html>

<head>

  <meta charset="UTF-8">

  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.min.js"></script>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/addons/p5.dom.min.js"></script>

  <script src="https://unpkg.com/ml5@0.4.2/dist/ml5.min.js"></script> type="text/javascript"

    <link rel="stylesheet" type="text/css" href="style.css">

</head>

<body>

  <h1>PoseNet example using p5.js</h1>

  <p id="status">Loading model...</p >

  <script src="sketch.js"></script>

</body>

</html>

let video;

let poseNet;

let pose;

let skeleton;  //骨架连接

let brain;

let state = 'waiting';

let targetLabel;

function keyPressed(){

  if (key == 's'){

    brain.saveData();

  } else {



    targetLabel = key;

    console.log(targetLabel);

    setTimeout(function() {

      console.log('collecting');

      state = 'collecting';

      setTimeout(function() {

      console.log('not collecting');

      state = 'waiting';

      }, 10000); //延迟过后停止收集

    }, 10000);  //按键收集姿势,需点击预览

  }

}

function setup() {

  createCanvas(640, 460);//页面大小

  video = createCapture(VIDEO);

  video.hide();

  poseNet = ml5.poseNet(video, modelLoaded);

  poseNet.on('pose', gotPoses);


  let options = {

    inputs: 34,

    //outputs: 4,

    outputs: ['zishi1', 'zishi2', 'zishi3', 'zihsi'],

    task: 'classification',

    debug: true

  }

  brain = ml5.neuralNetwork(options);

}

function gotPoses(poses){ 

  //console.log(poses);    //显示实时位置数据

  if (poses.length > 0){  //poses数组不为0

    pose = poses[0].pose;

    skeleton = poses[0].skeleton;


    if (state == 'collecting'){

      let inputs = [];

        for (let i = 0; i < pose.keypoints.length; i++) { //keypoints包含一个画面的17个位置点,一个一个选取

        let x = pose.keypoints[i].position.x;

        let y = pose.keypoints[i].position.y;

        inputs.push(x);

        inputs.push(y);

      }

      let target = [targetLabel];  //收集数据

      brain.addData(inputs, target);

    }

  }

}

function modelLoaded(){

  console.log('poseNet ready');

}

function draw(){

  translate(video.width, 0);

  scale(-1, 1);

  image(video, 0, 0, video.width, video.height); //镜像


  if (pose) {


    for (let i = 0; i < pose.keypoints.length; i++){ //keypoints包含一个画面的17个位置点,一个一个进行绘制

      let x = pose.keypoints[i].position.x;

      let y = pose.keypoints[i].position.y;

      fill(255,255,255);  //画出关键点

      ellipse(x, y, 7, 7);

    }

    for (let i = 0; i < skeleton.length; i++){  //骨架数组每一个值

      let a = skeleton[i][0];

      let b = skeleton[i][1];  //a的下一个骨架

      strokeWeight(2);

      stroke(255);

      line(a.position.x, a.position.y, b.position.x, b.position.y); //连线

    }

  }

}

仔细看,html中posenet已经不是latest了,而是我给出的一个具体的版本,这一步很关键,因为我如果是latest就一直没显示画面,无法确定是什么问题。

在这个代码里,我实现字母预测时是用的outputs:4,关于它的意义,我暂时无法用准确的语言来描述,我对此也是十分模糊,但是根据我后面的经验,我认为我这个4会代表输出了4个结果,这句话看起来像个废话,主要时我确实没法准确说明,如果往下看,我还做了一个outputs为1的,这两个进行对比,相信你也会对此有了一些模糊的概念。说回这个代码,我设置了按下键盘上的键就进行数据收集,在我收集了4个按键之后,按s能导出我收集的数据。在此时第一步就完成了。

第二步是数据训练。

let video;

let poseNet;

let pose;

let skeleton;  //骨架连接

let brain;

let state = 'waiting';

let targetLabel;

function keyPressed(){

  if (key == 's'){

    brain.saveData();

  } else {



    targetLabel = key;

    console.log(targetLabel);

    setTimeout(function() {

      console.log('collecting');

      state = 'collecting';

      setTimeout(function() {

      console.log('not collecting');

      state = 'waiting';

      }, 10000); //延迟过后停止收集

    }, 10000);  //按键收集姿势,需点击预览

  }

}

function setup() {

  createCanvas(640, 460);//页面大小

  video = createCapture(VIDEO);

  video.hide();

  poseNet = ml5.poseNet(video, modelLoaded);

  poseNet.on('pose', gotPoses);


  let options = {

    inputs: 34,

    //outputs: 4,

    outputs: ['zishi1', 'zishi2', 'zishi3', 'zihsi'],

    task: 'classification',

    debug: true

  }

  brain = ml5.neuralNetwork(options);

  brain.loadData('zishi.json', dataReady);

}

function dataReady() {

  brain.normalizeData();

  brain.train({epochs: 50}, finished);//数据训练

}

function finished() {

  console.log('model trained');

  brain.save();

}

function gotPoses(poses){ 

  //console.log(poses);    //显示实时位置数据

  if (poses.length > 0){  //poses数组不为0

    pose = poses[0].pose;

    skeleton = poses[0].skeleton;


    if (state == 'collecting'){

      let inputs = [];

        for (let i = 0; i < pose.keypoints.length; i++){ //keypoints包含一个画面的17个位置点,一个一个选取

        let x = pose.keypoints[i].position.x;

        let y = pose.keypoints[i].position.y;

        inputs.push(x);

        inputs.push(y);

      }

      let target = [targetLabel];  //收集数据


    brain.addData(inputs, target);

    }

  }

}

function modelLoaded(){

  console.log('poseNet ready');

}

function draw(){

  translate(video.width, 0);

  scale(-1, 1);

  image(video, 0, 0, video.width, video.height); //镜像


  if (pose) {


    for (let i = 0; i < pose.keypoints.length; i++){ //keypoints包含一个画面的17个位置点,一个一个进行绘制

      let x = pose.keypoints[i].position.x;

      let y = pose.keypoints[i].position.y;

      fill(255,255,255);  //画出关键点

      ellipse(x, y, 7, 7);

    }

    for (let i = 0; i < skeleton.length; i++){  //骨架数组每一个值

      let a = skeleton[i][0];

      let b = skeleton[i][1];  //a的下一个骨架

      strokeWeight(2);

      stroke(255);

      line(a.position.x, a.position.y, b.position.x, b.position.y); //连线

    }

  }

}


相关文章: