Dlib for javascript 我对C++和DLIB都比较陌生。我需要为浏览器开发一个面部地标检测器,我想知道是否有人尝试过使用例如ASM.js编译DLIB来开发浏览器。我还没有在网上看到过很多DLib面部标志的现场演示

Dlib for javascript 我对C++和DLIB都比较陌生。我需要为浏览器开发一个面部地标检测器,我想知道是否有人尝试过使用例如ASM.js编译DLIB来开发浏览器。我还没有在网上看到过很多DLib面部标志的现场演示,javascript,c++,dlib,Javascript,C++,Dlib,这是一个值得追求的想法吗?若有的话,有人能告诉我什么资源吗?我在我的一个项目中也面临同样的问题。但我通过浏览器成功地从dlib获得了面部标志性细节 实际上,我从用户那个里获取图像并发送到服务器,然后将其保存到一个特定的文件夹中。然后通过PHP触发dlibpythoncode,并以json格式获取地标点详细信息。一旦我们得到一点细节,我们可以做任何事情 想法是 输入图像文件-->发送到服务器-->保存到文件夹-->触发dlib python脚本-->将点另存为json文件-->返回到成功-->获取

这是一个值得追求的想法吗?若有的话,有人能告诉我什么资源吗?

我在我的一个项目中也面临同样的问题。但我通过浏览器成功地从dlib获得了面部标志性细节

实际上,我从用户那个里获取图像并发送到服务器,然后将其保存到一个特定的文件夹中。然后通过
PHP
触发dlib
python
code,并以
json
格式获取地标点详细信息。一旦我们得到一点细节,我们可以做任何事情

想法是

输入图像文件-->发送到服务器-->保存到文件夹-->触发dlib python脚本-->将点另存为json文件-->返回到成功-->获取json

通过这种方式:

第1步: 首先在服务器上成功安装Dlip(首先测试本地服务器),无任何错误。并检查它是否正常运行

第二步: 然后我们需要dlip的face landmark。dlip有一个示例脚本
face\u landmark\u detection.py
我们可以使用它

我的自定义
face\u landmark\u detection.py
脚本这是将点详细信息保存为特定路径中的json文件:

# python face_landmark_detection.py "predictor.dat" "folder/image.jpg" "folder/test.json" 

import dlib
import glob
import json
import os
from skimage import io
import sys



predictor_path = sys.argv[1]
#faces_folder_path = sys.argv[2]
image      = sys.argv[2]
json_path  = sys.argv[3]

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(predictor_path)






img = io.imread(image)
dets = detector(img, 1)
print(dets);
print("Number of faces detected: {}".format(len(dets)))
for k, d in enumerate(dets):

    print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
          k, d.left(), d.top(), d.right(), d.bottom()))

    # Get the landmarks/parts for the face in box d.
    shape = predictor(img, d)

    print("Part 0: {}, Part 1: {}, Part 3: {}  ...".format(shape.part(0),
          shape.part(1), shape.part(2), ))
    part1 = shape
    data = {}
    num = 0
    for n, p in enumerate(shape.parts()):
        n = format(n)
        p = format(p)
        p = p.split(",")
        x = p[0].split("(")
        x = x[1]
        y = p[1].split(" ")
        y = y[1].split(")")
        y = y[0]
        print(n, x, y)
        data[n] = {'x':x, 'y':y}
    out_file = open(json_path, "a")
    json.dump(data, out_file, sort_keys=True, indent=4)
    json_data = json.dumps(data, sort_keys=True);     
    print(json_data)        
我的服务器
php
脚本。此脚本从浏览器获取图像并将其保存在某个文件夹中,然后使用预测器路径、图像路径、json路径参数触发my
face\u landmark\u detection.py

server.php
这样的文件

<?php

$target_dir = "/designing/face/uploads/";
$type = explode("/", $_FILES["file"]["type"]);
$type = $type[1];
$target_file = $target_dir . basename($_FILES["file"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file, PATHINFO_EXTENSION);
// Check if image file is a actual image or fake image
if (isset($_POST)) {
    $check = getimagesize($_FILES["file"]["tmp_name"]);
    if ($check !== false) {

        $uploadOk = 1;
    } else {

        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    unlink($target_file);
    $uploadOk = 1;
}
// Check file size
/* if ($_FILES["file"]["size"] > 500000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
  } */
// Allow certain file formats
if ($imageFileType != "jpg" && $imageFileType != "jpeg" && $imageFileType != "png") {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}

// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "error";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
        //chmod($target_file, 0777);
        //echo "The file ". basename( $_FILES["file"]["name"]). " has been uploaded.";

        if ($imageFileType == "png") {
            $image = imagecreatefrompng($target_file);
            $bg = imagecreatetruecolor(imagesx($image), imagesy($image));
            imagefill($bg, 0, 0, imagecolorallocate($bg, 255, 255, 255));
            imagealphablending($bg, TRUE);
            imagecopy($bg, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
            imagedestroy($image);
            $quality = 100; // 0 = worst / smaller file, 100 = better / bigger file 
            imagejpeg($bg, $target_file . ".jpg", $quality);
            imagedestroy($bg);
            unlink($target_file);
            $target_file = $target_file . ".jpg";
            //echo $target_file;
        }

        $json_file = fopen("/test/json/" . $_FILES["file"]["name"] . "_json.txt", "w");
        if ($json_file) {
            $command = 'python /face/face_landmark_detection.py "/face/predictor.dat" "' . $target_file . '" "/test/json/' . $_FILES["file"]["name"] . '_json.txt"';
            $output = shell_exec($command);
            if ($output) {
                //unlink($target_file);
                echo "ok";
            }
        }




        //echo $command;
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>  
$('#file').change(function() {
    var formData = new FormData();
    formData.append('file', $('input[type=file]')[0].files[0]);
    img = $('input[type=file]')[0].files[0];
    file_name = img.name;
    console.log(file_name);
    var reader = new FileReader();
    reader.onload = function(readerEvt) {
        data_url = readerEvt.target.result;
    };
    reader.readAsDataURL(img);
    $.ajax({
        url: base_url + "server.php",
        type: 'POST',
        data: formData,
        success: function(data) {
            console.log(data);
            if (data === "ok") {
                getJson(data_url, file_name);
            } else {
                alert("something worng");
            }
        },
        cache: false,
        contentType: false,
        processData: false
    });
});
var pts;

function getJson(data_url, file_name) {
    console.log(file_name);
    var json_name = {
        'name': file_name
    };
    $.ajax({
        method: "POST",
        url: base_url + "get_json.php",
        crossDomain: true,
        data: json_name,
        dataType: 'JSON',
        success: function(data) {
            pts = data;
            console.log(pts);
            // alert(data_url);
        }
    });
}
一旦一切正常运行,我们就会得到一个带有点的json文件。我们可以用这些点在画布上玩我们想要的。首先,你必须了解整个过程

我直接粘贴我的演示代码在这里。查看代码并更改所需内容(如路径、参数等),然后运行


我成功地获得了我的虚拟脸改造项目的这些方式点的细节。我无法为您的演示提供“我的项目”url,因为项目目前正在进行中。

您是否正在尝试构建一个系统,该系统应通过JS直接在浏览器内部工作,或与一些基于服务器的后端一起工作?或者你想构建某种浏览器扩展吗?ASM.js看起来有点死气沉沉-可能不值得投入太多精力来发现存在一些不完整的bitsI我正在尝试构建一个可以使用Dlib的客户端js解决方案。与clmtrackr.js或tracker.js类似,您的Dlib代码是否需要在每次调用
face\u landmark\u detection.py
程序时加载。因此,如果有10个请求发送到您的服务器,则会分别加载到每个程序实例中。这不会增加服务器上的内存消耗。显然,这会导致内存问题。。目前我们的项目正在进行中。。所以现在没有太多问题。但我们必须为未来的进程考虑这一点。。你对此有什么想法吗?我对Python不太了解。但是,在C++文件中,可以存储在静态缓冲区中,并且可以在许多对象之间共享。如果可能的话,您可以在Python中执行类似的操作。@AkshayHazari。。。是的,它可以通过python在web cam上运行…许多开源库都可以在web上使用。。。。我个人试过了……它的工作太棒了