centerface
Esse commit está contido em:
@@ -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);
|
||||
@@ -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.
@@ -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 |
Referência em uma Nova Issue
Bloquear um usuário