|
| 1 | +<?php |
| 2 | + |
| 3 | +use CV\Scalar, CV\Size; |
| 4 | +use function CV\{imread, imwrite, cvtColor, circle}; |
| 5 | + |
| 6 | +$netDet = \CV\DNN\readNetFromCaffe('models/ssd/res10_300x300_ssd_deploy.prototxt', 'models/ssd/res10_300x300_ssd_iter_140000.caffemodel'); |
| 7 | +$netRecogn = \CV\DNN\readNetFromCaffe('models/VanFace/VanFace.prototxt', 'models/VanFace/VanFace.caffemodel'); |
| 8 | + |
| 9 | +$src = imread("images/faces.jpg"); |
| 10 | +$size = $src->size(); // 2000x500 |
| 11 | + |
| 12 | +$minSide = min($size->width, $size->height); |
| 13 | +$divider = $minSide / 300; |
| 14 | +\CV\resize($src, $resized, new Size($size->width / $divider, $size->height / $divider)); // 1200x300 |
| 15 | + |
| 16 | +//var_export($resized); |
| 17 | + |
| 18 | +$blob = \CV\DNN\blobFromImage($resized, 1, new Size(), new Scalar(104, 177, 123), true, false); |
| 19 | + |
| 20 | +$netDet->setInput($blob); |
| 21 | + |
| 22 | +$r = $netDet->forward(); |
| 23 | + |
| 24 | +//var_export($r->shape); |
| 25 | + |
| 26 | +$faces = []; |
| 27 | +$scalar = new Scalar(0, 0, 255); |
| 28 | +for ($i = 0; $i < $r->shape[2]; $i++) { |
| 29 | + $confidence = $r->atIdx([0,0,$i,2]); |
| 30 | + if ($confidence > 0.9) { |
| 31 | + var_export($confidence);echo "\n"; |
| 32 | + $startX = $r->atIdx([0,0,$i,3]) * $src->cols; |
| 33 | + $startY = $r->atIdx([0,0,$i,4]) * $src->rows; |
| 34 | + $endX = $r->atIdx([0,0,$i,5]) * $src->cols; |
| 35 | + $endY = $r->atIdx([0,0,$i,6]) * $src->rows; |
| 36 | + |
| 37 | + $face = $src->getImageROI(new \CV\Rect($startX, $startY, $endX - $startX, $endY - $startY)); |
| 38 | + \CV\resize($face, $resized, new Size(60,60)); |
| 39 | + $resized = cvtColor($resized, \CV\COLOR_BGR2GRAY, 2); |
| 40 | + \CV\meanStdDev($resized, $mean, $sdv); |
| 41 | + |
| 42 | + $m = $mean->data()[0]; |
| 43 | + $s = $sdv->data()[0]; |
| 44 | + |
| 45 | + $blob = \CV\DNN\blobFromImage($resized, 1 / (0.000001 + $s), new Size(60,60), new Scalar($m, $m, $m)); |
| 46 | + $netRecogn->setInput($blob); |
| 47 | + //var_export($blob);die(); |
| 48 | + $out = $netRecogn->forward(); |
| 49 | + $data = $out->data(); |
| 50 | + |
| 51 | + for ($j=0;$j<68;$j++) { |
| 52 | + $point = new \CV\Point($startX + $data[$j*2] * $face->cols, $startY + $data[$j*2+1] * $face->rows); |
| 53 | + circle($src, $point, 2, new Scalar(0, 0, 255), 2); |
| 54 | + //var_export($point); |
| 55 | + } |
| 56 | + } |
| 57 | +} |
| 58 | + |
| 59 | +imwrite("results/_detect_facemarks_by_dnn_vanface.jpg", $src); |
0 commit comments