recognize_face_by_dnn_insightface.php
Esse commit está contido em:
+1
-1
@@ -11,7 +11,7 @@
|
||||
|
||||

|
||||
|
||||
- [recognize face by LBPH algorithm](https://github.com/php-opencv/php-opencv-examples/blob/master/recognize_face_by_lbph.php) / [recognize face by DNN openface](https://github.com/php-opencv/php-opencv-examples/blob/master/recognize_face_by_dnn_openface.php)
|
||||
- [recognize face by LBPH algorithm](https://github.com/php-opencv/php-opencv-examples/blob/master/recognize_face_by_lbph.php) / [recognize face by DNN openface](https://github.com/php-opencv/php-opencv-examples/blob/master/recognize_face_by_dnn_openface.php) / [recognize face by DNN insightface](https://github.com/php-opencv/php-opencv-examples/blob/master/recognize_face_by_dnn_insightface.php)
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
use CV\Scalar, CV\Size;
|
||||
use function CV\{imread, imwrite};
|
||||
|
||||
$netDet = \CV\DNN\readNetFromCaffe('models/ssd/res10_300x300_ssd_deploy.prototxt', 'models/ssd/res10_300x300_ssd_iter_140000.caffemodel');
|
||||
$netRecogn = \CV\DNN\readNetFromONNX('models/insightface/arcface_mobilefacenet.onnx');
|
||||
|
||||
$src = imread("images/faces.jpg");
|
||||
$size = $src->size(); // 2000x500
|
||||
|
||||
$minSide = min($size->width, $size->height);
|
||||
$divider = $minSide / 300;
|
||||
\CV\resize($src, $resized, new Size($size->width / $divider, $size->height / $divider)); // 1200x300
|
||||
|
||||
//var_export($resized);
|
||||
|
||||
$blob = \CV\DNN\blobFromImage($resized, 1, new Size(), new Scalar(104, 177, 123), true, false);
|
||||
|
||||
$netDet->setInput($blob);
|
||||
|
||||
$r = $netDet->forward();
|
||||
|
||||
//var_export($r->shape);
|
||||
|
||||
$faces = [];
|
||||
$scalar = new Scalar(0, 0, 255);
|
||||
for ($i = 0; $i < $r->shape[2]; $i++) {
|
||||
$confidence = $r->atIdx([0,0,$i,2]);
|
||||
if ($confidence > 0.9) {
|
||||
var_export($confidence);echo "\n";
|
||||
$startX = $r->atIdx([0,0,$i,3]) * $src->cols;
|
||||
$startY = $r->atIdx([0,0,$i,4]) * $src->rows;
|
||||
$endX = $r->atIdx([0,0,$i,5]) * $src->cols;
|
||||
$endY = $r->atIdx([0,0,$i,6]) * $src->rows;
|
||||
|
||||
$face = $src->getImageROI(new \CV\Rect($startX, $startY, $endX - $startX, $endY - $startY));
|
||||
//imwrite("results/_face.jpg", $face);
|
||||
|
||||
$blob = \CV\DNN\blobFromImage($face, 1.0 / 255, new Size(112, 112), new Scalar(), true, false);
|
||||
$netRecogn->setInput($blob);
|
||||
$vec = $netRecogn->forward();
|
||||
\CV\normalize($r, $r);
|
||||
|
||||
//$vec->print();
|
||||
var_export($vec->data());
|
||||
}
|
||||
}
|
||||
@@ -9,3 +9,4 @@ Sources:
|
||||
* ssd_mobilenet_v1_coco - https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
|
||||
* ssdlite_mobilenet_v2_coco - https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
|
||||
* ssd_mobilenet_v2_coco - https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
|
||||
* insightface - https://github.com/axinc-ai/ailia-models/tree/master/face_identification/insightface
|
||||
|
||||
Arquivo binário não exibido.
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
+10
-1
@@ -863,7 +863,16 @@ function log() {}
|
||||
* @param int $norm_type
|
||||
* @param int $dtype
|
||||
*/
|
||||
function normalize(Mat $src, Mat $dst, int $alpha = 1, int $beta = 0, int $norm_type, $dtype = -1)
|
||||
function normalize(Mat $src, Mat $dst, int $alpha = 1, int $beta = 0, int $norm_type = NORM_L2, $dtype = -1)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Mat $src
|
||||
* @param int $norm_type
|
||||
*/
|
||||
function norm(Mat $src, int $norm_type = NORM_L2)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
use CV\Scalar, CV\Size;
|
||||
use function CV\{imread, imwrite, rectangle};
|
||||
|
||||
$netDet = \CV\DNN\readNetFromCaffe('models/ssd/res10_300x300_ssd_deploy.prototxt', 'models/ssd/res10_300x300_ssd_iter_140000.caffemodel');
|
||||
$netRecogn = \CV\DNN\readNetFromONNX('models/insightface/arcface_mobilefacenet.onnx');
|
||||
|
||||
$image2faces = function ($src) use ($netDet) {
|
||||
$size = $src->size(); // 2000x500
|
||||
|
||||
$minSide = min($size->width, $size->height);
|
||||
$divider = $minSide / 300;
|
||||
\CV\resize($src, $resized, new Size($size->width / $divider, $size->height / $divider)); // 1200x300
|
||||
//var_export($resized);
|
||||
$blob = \CV\DNN\blobFromImage($resized, 1, new Size(), new Scalar(104, 177, 123), true, false);
|
||||
|
||||
$netDet->setInput($blob);
|
||||
$r = $netDet->forward();
|
||||
|
||||
//var_export($r->shape);
|
||||
|
||||
$faces = [];
|
||||
|
||||
for ($i = 0; $i < $r->shape[2]; $i++) {
|
||||
$confidence = $r->atIdx([0,0,$i,2]);
|
||||
if ($confidence > 0.9) {
|
||||
//var_export($confidence);echo "\n";
|
||||
$startX = $r->atIdx([0,0,$i,3]) * $src->cols;
|
||||
$startY = $r->atIdx([0,0,$i,4]) * $src->rows;
|
||||
$endX = $r->atIdx([0,0,$i,5]) * $src->cols;
|
||||
$endY = $r->atIdx([0,0,$i,6]) * $src->rows;
|
||||
|
||||
$faces[] = $src->getImageROI(new \CV\Rect($startX, $startY, $endX - $startX, $endY - $startY));
|
||||
}
|
||||
}
|
||||
|
||||
return $faces;
|
||||
};
|
||||
|
||||
$face2vec = function ($face) use ($netRecogn) {
|
||||
$blob = \CV\DNN\blobFromImage($face, 1, new Size(112, 112), new Scalar(104, 117, 123), true, false);
|
||||
$netRecogn->setInput($blob);
|
||||
$r = $netRecogn->forward();
|
||||
\CV\normalize($r, $r);
|
||||
//$norm = \CV\norm($r);
|
||||
//$r = $r->divide($norm);
|
||||
return $r->data();
|
||||
};
|
||||
|
||||
function faceDistance($face1, $face2) {
|
||||
$distance = 0;
|
||||
foreach ($face1 as $i => $v) {
|
||||
$distance += ($face1[$i] - $face2[$i])**2;
|
||||
}
|
||||
return sqrt($distance);
|
||||
}
|
||||
|
||||
$src = imread("images/faces.jpg");
|
||||
|
||||
$faces = $image2faces($src);
|
||||
|
||||
$faceVectors = [];
|
||||
foreach ($faces as $i => $face) {
|
||||
$vec = $face2vec($face);
|
||||
//imwrite("results/_face.jpg", $face);
|
||||
|
||||
//$vec->print();
|
||||
//var_export($vec->data());
|
||||
$faceVectors["me$i"] = $vec;
|
||||
}
|
||||
|
||||
$src = imread("images/angelina_faces.png");
|
||||
|
||||
$faces = $image2faces($src);
|
||||
|
||||
foreach ($faces as $i => $face) {
|
||||
$vec = $face2vec($face);
|
||||
//imwrite("results/_face.jpg", $face);
|
||||
|
||||
//$vec->print();
|
||||
//var_export($vec->data());
|
||||
$faceVectors["angelina$i"] = $vec;
|
||||
}
|
||||
|
||||
//var_export($faceVectors);
|
||||
|
||||
$src = imread("images/angelina_and_me.png");
|
||||
|
||||
$faces = $image2faces($src);
|
||||
|
||||
foreach ($faces as $i => $face) {
|
||||
$vec = $face2vec($face);
|
||||
$minDistance = 0;
|
||||
$faceLabel = '';
|
||||
foreach ($faceVectors as $label => $faceVector) {
|
||||
$distance = faceDistance($vec, $faceVector);
|
||||
|
||||
if (!$minDistance || $distance < $minDistance) {
|
||||
$minDistance = $distance;
|
||||
$faceLabel = $label;
|
||||
|
||||
$similarity = intval((max(sqrt(2), $minDistance) - $minDistance) / sqrt(2) * 100);
|
||||
echo "face$i $faceLabel distance: $minDistance, similarity: $similarity%\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
Referência em uma Nova Issue
Bloquear um usuário