nextcloud-custom-apps-face-.../git_facerecognition/lib/Db/Face.php
2024-09-03 09:12:12 +05:00

199 lines
4.8 KiB
PHP

<?php
/**
* @copyright Copyright (c) 2017-2021 Matias De lellis <mati86dl@gmail.com>
* @copyright Copyright (c) 2018, Branko Kokanovic <branko@kokanovic.org>
*
* @author Branko Kokanovic <branko@kokanovic.org>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\FaceRecognition\Db;
use JsonSerializable;
use OCP\AppFramework\Db\Entity;
/**
* Face represents one found face from one image.
*
* @method int getImage()
* @method int getPerson()
* @method int getX()
* @method int getY()
* @method int getWidth()
* @method int getHeight()
* @method float getConfidence()
* @method void setImage(int $image)
* @method void setPerson(int $person)
* @method void setX(int $x)
* @method void setY(int $y)
* @method void setWidth(int $width)
* @method void setHeight(int $height)
* @method void setConfidence(float $confidence)
*/
class Face extends Entity implements JsonSerializable {
/**
* Image from this face originated from.
*
* @var int
* */
public $image;
/**
* Person (cluster) that this face belongs to
*
* @var int|null
* */
public $person;
/**
* Left border of bounding rectangle for this face
*
* @var int
* */
public $x;
/**
* Top border of bounding rectangle for this face
*
* @var int
* */
public $y;
/**
* Width of this face from the left border
*
* @var int
* */
public $width;
/**
* Height of this face from top border
*
* @var int
* */
public $height;
/**
* Confidence of face detection obtained from the model
*
* @var float
* */
public $confidence;
/**
* If it can be grouped according to the configurations
*
* @var bool
**/
public $isGroupable;
/**
* landmarks for this face.
*
* @var array
* */
public $landmarks;
/**
* 128D face descriptor for this face.
*
* @var array
* */
public $descriptor;
/**
* Time when this face was found
*
* @var \DateTime
* */
public $creationTime;
public function __construct() {
$this->addType('id', 'integer');
$this->addType('image', 'integer');
$this->addType('person', 'integer');
$this->addType('isGroupable', 'bool');
}
/**
* Factory method to create Face from face structure that is returned as output of the model.
*
* @param int $image Image Id
* @param array $faceFromModel Face obtained from DNN model
* @return Face Created face
*/
public static function fromModel(int $imageId, array $faceFromModel): Face {
$face = new Face();
$face->image = $imageId;
$face->person = null;
$face->x = $faceFromModel['left'];
$face->y = $faceFromModel['top'];
$face->width = $faceFromModel['right'] - $faceFromModel['left'];
$face->height = $faceFromModel['bottom'] - $faceFromModel['top'];
$face->confidence = $faceFromModel['detection_confidence'];
$face->landmarks = isset($faceFromModel['landmarks']) ? $faceFromModel['landmarks'] : [];
$face->descriptor = isset($faceFromModel['descriptor']) ? $faceFromModel['descriptor'] : [];
$face->setCreationTime(new \DateTime());
return $face;
}
public function jsonSerialize() {
return [
'id' => $this->id,
'image' => $this->image,
'person' => $this->person,
'x' => $this->x,
'y' => $this->y,
'width' => $this->width,
'height' => $this->height,
'confidence' => $this->confidence,
'is_groupable' => $this->isGroupable,
'landmarks' => $this->landmarks,
'descriptor' => $this->descriptor,
'creation_time' => $this->creationTime
];
}
public function getLandmarks(): string {
return json_encode($this->landmarks);
}
public function setLandmarks($landmarks): void {
$this->landmarks = json_decode($landmarks);
$this->markFieldUpdated('landmarks');
}
public function getDescriptor(): string {
return json_encode($this->descriptor);
}
public function setDescriptor($descriptor): void {
$this->descriptor = json_decode($descriptor);
$this->markFieldUpdated('descriptor');
}
public function setCreationTime($creationTime): void {
if (is_a($creationTime, 'DateTime')) {
$this->creationTime = $creationTime;
} else {
$this->creationTime = new \DateTime($creationTime);
}
$this->markFieldUpdated('creationTime');
}
}