Странные результаты с OpenPose (руки в позе) и opencv4nodejs - PullRequest
0 голосов
/ 22 октября 2019

Мы пытаемся запустить исходный код на Python / C ++ / opencv, переведенный на NodeJS / opencv4nodejs.

Наш интерес связан только с позами для рук. Openposes обнаруживает 22 раздачи в разных позах.

Оригинальный источник по этой ссылке:

https://github.com/opencv/opencv/blob/master/samples/dnn/openpose.cpp

и

https://github.com/opencv/opencv/blob/master/samples/dnn/openpose.py

Наш источник:

import cv from 'opencv4nodejs';
import fs from 'fs';
import path from 'path';

function handDetect1(img) {
        let POSE_PAIRS = [ 
            [0,1],[1,2],[2,3],[3,4], // thumb
            [0,5],[5,6],[6,7],[7,8], // pinkie
            [0,9],[9,10],[10,11],[11,12], /// middle
            [0,13],[13,14],[14,15],[15,16], // ring
            [0,17],[17,18],[18,19],[19,20]  // smal
        ];
        let nPoints = 22;
        const [frameHeight, frameWidth] = img.sizes;
        let threshold = 0.01;
        let inHeight = 368;
        let inWidth = 368;        
        const inputBlob = cv.blobFromImage(img, 1 / 255.0, new cv.Size(inWidth, inHeight), 
            new cv.Vec(0,0,0), false, false);        

        const ssdcocoModelPath = './data/dnn/handpose';
        if (!cv.modules.dnn) {
            throw new Error('exiting: opencv4nodejs compiled without dnn module');
        }
        const prototxt = path.resolve(ssdcocoModelPath, 'pose_deploy.prototxt');
        const modelFile = path.resolve(ssdcocoModelPath, 'pose_iter_102000.caffemodel');  

        if (!fs.existsSync(prototxt) || !fs.existsSync(modelFile)) {
            throw new Error('exiting: could not find ssd pesrson pose net model');
        }        

        let net = cv.readNetFromCaffe(prototxt, modelFile);

        net.setInput(inputBlob);

        let output = this.net.forward();
        /*
          output.sizes[0] == 1;
          output.sizes[1] == 22;
          output.sizes[2] == 46;
          output.sizes[3] == 46;
        */
        let H = output.sizes[2];
        let W = output.sizes[3];
        let SX = img.cols / W;
        let SY = img.rows / H;
        let outArray = output.getDataAsArray();      

        let points = [];
        for(let n=0;n<nPoints;n++) {
            let probMap = new cv.Mat(Buffer.from(outArray[0][n]), H,W, cv.CV_32F );
//            let probMap = new cv.Mat([outArray[0][n]], cv.CV_32F );
            probMap = probMap.resize(new cv.Size(frameWidth, frameHeight));
            let {minVal, maxVal, minLoc, maxLoc} = cv.minMaxLoc(probMap);
            maxLoc = new cv.Point2(
                (maxLoc.x*SX),
                (maxLoc.y*SY)
            );
            if (maxVal > threshold) {
                let point = maxLoc;
                points.push(point);

                img.drawCircle(point, 8, new cv.Vec(0,255,255));
                img.putText(String(n), point, cv.FONT_HERSHEY_SIMPLEX, 1, new cv.Vec(0,0,255), 2);
            }  
            else {
                points.push(null);
            }          
        }

        return img;
}

На этом рисунке показан ожидаемый результат:

Ожидаемые очки рук

Реальный результат, который мы получили, неверен- показывает некоторые точки в случайных положениях в img.

...