Esse commit está contido em:
Vladimir Goncharov
2021-02-26 23:46:32 +02:00
commit 94640ebfea
5 arquivos alterados com 228 adições e 0 exclusões
+87
Ver Arquivo
@@ -0,0 +1,87 @@
<?php
use CV\Scalar, CV\Size;
$net = \CV\DNN\readNetFromONNX('models/centerface/centerface.onnx');
$src = \CV\imread("images/faces.jpg");
$img_w_new = ceil($src->cols / 32) * 32;
$img_h_new = ceil($src->rows / 32) * 32;
$scale_w = $img_w_new / $src->cols;
$scale_h = $img_h_new / $src->rows;
//var_export([$scale_w, $scale_h]);
$blob = \CV\DNN\blobFromImage($src, 1, new Size($img_w_new, $img_h_new), new Scalar(), true, false);
$net->setInput($blob);
[$heatmapMat, $scaleMat, $offsetMat, $landmarksMat] = $net->forwardMulti(['537', '538', '539', '540']);
$thresh = 0.7;
$h = $heatmapMat->shape[2];
$w = $heatmapMat->shape[3];
$l = $landmarksMat->shape[1];
function landmarks($landmarksMat, $l, $i, $j, $x1, $y1, $s0, $s1) {
$landmarks = [];
for ($k = 0; $k < $l/2; $k++) {
$landmarks[] = [$landmarksMat->atIdx([0,$k*2+1,$i,$j])*$s1+$x1, $landmarksMat->atIdx([0,$k*2+0,$i,$j])*$s0+$y1];
}
return $landmarks;
}
$faces = [];
for ($i = 0; $i < $h; $i++) {
for ($j = 0; $j < $w; $j++) {
$confidence = $heatmapMat->atIdx([0,0,$i,$j]);
if ($confidence > $thresh) {//var_export($heatmapMat->atIdx([0,0,$i,$j]));echo "\n";
//var_export($scaleMat->atIdx([0,0,$i,$j]));echo "\n";
//var_export([$i, $j]);
$s0 = exp($scaleMat->atIdx([0,0,$i,$j])) * 4;
$s1 = exp($scaleMat->atIdx([0,1,$i,$j])) * 4;
$o0 = $offsetMat->atIdx([0,0,$i,$j]);
$o1 = $offsetMat->atIdx([0,1,$i,$j]);
$x1 = max(0, ($j + $o1 + 0.5) * 4 - $s1 / 2);
$y1 = max(0, ($i + $o0 + 0.5) * 4 - $s0 / 2);
$x1 = min($x1, $src->cols);
$y1 = min($y1, $src->rows);
$x2 = $x1 + $s1;
$y2 = $y1 + $s0;
if ($faces) { // checking for intersection
foreach ($faces as $id => [$existX1, $existY1, $existX2, $existY2, $existConf]) {
if ($existX1 < $x2 && $existY1 < $y2 && $existX2 > $x1 && $existY2 > $y1) {
if ($confidence > $existConf) {//echo 1;
$faces[$id] = [$x1, $y1, $x2, $y2, $confidence, landmarks($landmarksMat, $l, $i, $j, $x1, $y1, $s0, $s1)];
}
continue 2;
}
}
}
$faces[]= [$x1, $y1, $x2, $y2, $confidence, landmarks($landmarksMat, $l, $i, $j, $x1, $y1, $s0, $s1)];
}
}
}
//var_export($faces);
$color = new Scalar(0, 0, 255);
foreach ($faces as [$x1, $y1, $x2, $y2, $conf, $landmarks]) {
foreach ($landmarks as $point) {
$point = new \CV\Point($point[0]/$scale_w, $point[1]/$scale_h);
\CV\circle($src, $point, 2, $color, 2);
\CV\rectangle($src, $x1/$scale_w, $y1/$scale_h, $x2/$scale_w, $y2/$scale_h, $color, 2);
}
}
$faces = [];
$scalar = new Scalar(0, 0, 255);
\CV\imwrite("results/_detect_facemarks_by_dnn_centerface.jpg", $src);
+2
Ver Arquivo
@@ -11,3 +11,5 @@ Sources:
* 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
* VanFace - https://github.com/lsy17096535/face-landmark
* centerface.onnx - https://github.com/Star-Clouds/CenterFace/blob/master/models/onnx/centerface.onnx
* mtcnn - https://github.com/CongWeilin/mtcnn-caffe https://github.com/imistyrain/MTCNN
Arquivo binário não exibido.
+139
Ver Arquivo
@@ -0,0 +1,139 @@
7767517
137 153
Input input.1 0 1 input.1
Convolution 363 1 1 input.1 363 0=32 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=864
ReLU 365 1 1 363 365
ConvolutionDepthWise 366 1 1 365 366 0=32 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=288 7=32
ReLU 368 1 1 366 368
Convolution 369 1 1 368 369 0=16 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=512
Convolution 371 1 1 369 371 0=96 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=1536
ReLU 373 1 1 371 373
ConvolutionDepthWise 374 1 1 373 374 0=96 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=864 7=96
ReLU 376 1 1 374 376
Convolution 377 1 1 376 377 0=24 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=2304
Split splitncnn_0 1 2 377 377_splitncnn_0 377_splitncnn_1
Convolution 379 1 1 377_splitncnn_1 379 0=144 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=3456
ReLU 381 1 1 379 381
ConvolutionDepthWise 382 1 1 381 382 0=144 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1296 7=144
ReLU 384 1 1 382 384
Convolution 385 1 1 384 385 0=24 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=3456
BinaryOp 387 2 1 377_splitncnn_0 385 387 0=0
Split splitncnn_1 1 2 387 387_splitncnn_0 387_splitncnn_1
Convolution 388 1 1 387_splitncnn_1 388 0=144 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=3456
ReLU 390 1 1 388 390
ConvolutionDepthWise 391 1 1 390 391 0=144 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=1296 7=144
ReLU 393 1 1 391 393
Convolution 394 1 1 393 394 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=4608
Split splitncnn_2 1 2 394 394_splitncnn_0 394_splitncnn_1
Convolution 396 1 1 394_splitncnn_1 396 0=192 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=6144
ReLU 398 1 1 396 398
ConvolutionDepthWise 399 1 1 398 399 0=192 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1728 7=192
ReLU 401 1 1 399 401
Convolution 402 1 1 401 402 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=6144
BinaryOp 404 2 1 394_splitncnn_0 402 404 0=0
Split splitncnn_3 1 2 404 404_splitncnn_0 404_splitncnn_1
Convolution 405 1 1 404_splitncnn_1 405 0=192 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=6144
ReLU 407 1 1 405 407
ConvolutionDepthWise 408 1 1 407 408 0=192 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=1728 7=192
ReLU 410 1 1 408 410
Convolution 411 1 1 410 411 0=32 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=6144
BinaryOp 413 2 1 404_splitncnn_0 411 413 0=0
Split splitncnn_4 1 2 413 413_splitncnn_0 413_splitncnn_1
Convolution 414 1 1 413_splitncnn_1 414 0=192 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=6144
ReLU 416 1 1 414 416
ConvolutionDepthWise 417 1 1 416 417 0=192 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=1728 7=192
ReLU 419 1 1 417 419
Convolution 420 1 1 419 420 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=12288
Split splitncnn_5 1 2 420 420_splitncnn_0 420_splitncnn_1
Convolution 422 1 1 420_splitncnn_1 422 0=384 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=24576
ReLU 424 1 1 422 424
ConvolutionDepthWise 425 1 1 424 425 0=384 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=3456 7=384
ReLU 427 1 1 425 427
Convolution 428 1 1 427 428 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=24576
BinaryOp 430 2 1 420_splitncnn_0 428 430 0=0
Split splitncnn_6 1 2 430 430_splitncnn_0 430_splitncnn_1
Convolution 431 1 1 430_splitncnn_1 431 0=384 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=24576
ReLU 433 1 1 431 433
ConvolutionDepthWise 434 1 1 433 434 0=384 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=3456 7=384
ReLU 436 1 1 434 436
Convolution 437 1 1 436 437 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=24576
BinaryOp 439 2 1 430_splitncnn_0 437 439 0=0
Split splitncnn_7 1 2 439 439_splitncnn_0 439_splitncnn_1
Convolution 440 1 1 439_splitncnn_1 440 0=384 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=24576
ReLU 442 1 1 440 442
ConvolutionDepthWise 443 1 1 442 443 0=384 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=3456 7=384
ReLU 445 1 1 443 445
Convolution 446 1 1 445 446 0=64 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=24576
BinaryOp 448 2 1 439_splitncnn_0 446 448 0=0
Convolution 449 1 1 448 449 0=384 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=24576
ReLU 451 1 1 449 451
ConvolutionDepthWise 452 1 1 451 452 0=384 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=3456 7=384
ReLU 454 1 1 452 454
Convolution 455 1 1 454 455 0=96 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=36864
Split splitncnn_8 1 2 455 455_splitncnn_0 455_splitncnn_1
Convolution 457 1 1 455_splitncnn_1 457 0=576 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=55296
ReLU 459 1 1 457 459
ConvolutionDepthWise 460 1 1 459 460 0=576 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=5184 7=576
ReLU 462 1 1 460 462
Convolution 463 1 1 462 463 0=96 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=55296
BinaryOp 465 2 1 455_splitncnn_0 463 465 0=0
Split splitncnn_9 1 2 465 465_splitncnn_0 465_splitncnn_1
Convolution 466 1 1 465_splitncnn_1 466 0=576 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=55296
ReLU 468 1 1 466 468
ConvolutionDepthWise 469 1 1 468 469 0=576 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=5184 7=576
ReLU 471 1 1 469 471
Convolution 472 1 1 471 472 0=96 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=55296
BinaryOp 474 2 1 465_splitncnn_0 472 474 0=0
Split splitncnn_10 1 2 474 474_splitncnn_0 474_splitncnn_1
Convolution 475 1 1 474_splitncnn_1 475 0=576 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=55296
ReLU 477 1 1 475 477
ConvolutionDepthWise 478 1 1 477 478 0=576 1=3 11=3 2=1 12=1 3=2 13=2 4=1 14=1 15=1 16=1 5=1 6=5184 7=576
ReLU 480 1 1 478 480
Convolution 481 1 1 480 481 0=160 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=92160
Split splitncnn_11 1 2 481 481_splitncnn_0 481_splitncnn_1
Convolution 483 1 1 481_splitncnn_1 483 0=960 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=153600
ReLU 485 1 1 483 485
ConvolutionDepthWise 486 1 1 485 486 0=960 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=8640 7=960
ReLU 488 1 1 486 488
Convolution 489 1 1 488 489 0=160 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=153600
BinaryOp 491 2 1 481_splitncnn_0 489 491 0=0
Split splitncnn_12 1 2 491 491_splitncnn_0 491_splitncnn_1
Convolution 492 1 1 491_splitncnn_1 492 0=960 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=153600
ReLU 494 1 1 492 494
ConvolutionDepthWise 495 1 1 494 495 0=960 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=8640 7=960
ReLU 497 1 1 495 497
Convolution 498 1 1 497 498 0=160 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=153600
BinaryOp 500 2 1 491_splitncnn_0 498 500 0=0
Convolution 501 1 1 500 501 0=960 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=153600
ReLU 503 1 1 501 503
ConvolutionDepthWise 504 1 1 503 504 0=960 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=8640 7=960
ReLU 506 1 1 504 506
Convolution 507 1 1 506 507 0=320 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=307200
Convolution 509 1 1 507 509 0=24 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=7680
ReLU 511 1 1 509 511
Deconvolution 512 1 1 511 512 0=24 1=2 11=2 2=1 12=1 3=2 13=2 4=0 14=0 15=0 16=0 5=0 6=2304
BatchNorm 513 1 1 512 513 0=24
ReLU 514 1 1 513 514
Convolution 515 1 1 474_splitncnn_0 515 0=24 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=2304
ReLU 517 1 1 515 517
BinaryOp 518 2 1 514 517 518 0=0
Deconvolution 519 1 1 518 519 0=24 1=2 11=2 2=1 12=1 3=2 13=2 4=0 14=0 15=0 16=0 5=0 6=2304
BatchNorm 520 1 1 519 520 0=24
ReLU 521 1 1 520 521
Convolution 522 1 1 413_splitncnn_0 522 0=24 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=768
ReLU 524 1 1 522 524
BinaryOp 525 2 1 521 524 525 0=0
Deconvolution 526 1 1 525 526 0=24 1=2 11=2 2=1 12=1 3=2 13=2 4=0 14=0 15=0 16=0 5=0 6=2304
BatchNorm 527 1 1 526 527 0=24
ReLU 528 1 1 527 528
Convolution 529 1 1 387_splitncnn_0 529 0=24 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=576
ReLU 531 1 1 529 531
BinaryOp 532 2 1 528 531 532 0=0
Convolution 533 1 1 532 533 0=24 1=3 11=3 2=1 12=1 3=1 13=1 4=1 14=1 15=1 16=1 5=1 6=5184
ReLU 535 1 1 533 535
Split splitncnn_13 1 4 535 535_splitncnn_0 535_splitncnn_1 535_splitncnn_2 535_splitncnn_3
Convolution 536 1 1 535_splitncnn_3 536 0=1 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=24
Sigmoid 537 1 1 536 537
Convolution 538 1 1 535_splitncnn_2 538 0=2 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=48
Convolution 539 1 1 535_splitncnn_1 539 0=2 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=48
Convolution 540 1 1 535_splitncnn_0 540 0=10 1=1 11=1 2=1 12=1 3=1 13=1 4=0 14=0 15=0 16=0 5=1 6=240
Arquivo binário não exibido.

Depois

Largura:  |  Altura:  |  Tamanho: 278 KiB