Files
photoassistant/face.py

96 lines
4.8 KiB
Python

from main import db, app, ma
from sqlalchemy import Sequence
from sqlalchemy.exc import SQLAlchemyError
from shared import PA
# DEL ME SOON
from flask_login import login_required
from flask import render_template
import json
# pylint: disable=no-member
################################################################################
# Class describing Face in the database and DB via sqlalchemy
# - face contains the binary version of numpy array so we dont need to recalc it
# - refimg_lnk and facefile_lnk are viewOnly / just for convenience in viewer
# - refimg is a real link to the refimg used for this face (its is only used in
# viewer, and is either set when there is a matched face, or None if no match
################################################################################
class Face(PA,db.Model):
__tablename__ = "face"
id = db.Column(db.Integer, db.Sequence('face_id_seq'), primary_key=True )
face = db.Column( db.LargeBinary )
face_top = db.Column( db.Integer )
face_right = db.Column( db.Integer )
face_bottom = db.Column( db.Integer )
face_left = db.Column( db.Integer )
w = db.Column( db.Integer )
h = db.Column( db.Integer )
refimg_lnk = db.relationship("FaceRefimgLink", uselist=False, viewonly=True)
facefile_lnk = db.relationship("FaceFileLink", uselist=False, viewonly=True)
refimg =db.relationship("Refimg", secondary="face_refimg_link", uselist=False)
################################################################################
# Class describing FaceFileLink in the database and DB via sqlalchemy
# each face comes from a file and used a model to find the face
# this is not perfect, each face in the same file is always foudn with the same
# model - so really should have ModelFileLink or something, in the long run
# this might even be better as ScanDetailsFileLink and ScanDetails
################################################################################
class FaceFileLink(PA, db.Model):
__tablename__ = "face_file_link"
face_id = db.Column(db.Integer, db.ForeignKey("face.id"), primary_key=True )
file_eid = db.Column(db.Integer, db.ForeignKey("file.eid"), primary_key=True )
model_used = db.Column(db.Integer, db.ForeignKey("ai_model.id"), primary_key=True )
################################################################################
# Class describing FaceRefimgLink in the database and DB via sqlalchemy
# connects / implies a face has matched a refimg and we keep the distance too
# distance is mainly for debugging for now and shown in viewer
################################################################################
class FaceRefimgLink(PA, db.Model):
__tablename__ = "face_refimg_link"
face_id = db.Column(db.Integer, db.ForeignKey("face.id"), primary_key=True )
refimg_id = db.Column(db.Integer, db.ForeignKey("refimg.id"), primary_key=True )
face_distance = db.Column(db.Integer)
################################################################################
# Class describing FaceOverrideType in the database and DB via sqlalchemy
# when a face has an override, it will be a simple list of different types
# eg (forced match, no match, not a face, etc)
################################################################################
class FaceOverrideType(PA, db.Model):
__tablename__ = "face_override_type"
id = db.Column(db.Integer, db.Sequence('face_override_type_id_seq'), primary_key=True )
name = db.Column( db.String )
################################################################################
# Class describing FaceNoMatchOverride in the database and DB via sqlalchemy
# used when a face does not match for some reason (type and face id connected)
################################################################################
class FaceNoMatchOverride(PA, db.Model):
__tablename__ = "face_no_match_override"
id = db.Column(db.Integer, db.Sequence('face_override_id_seq'), primary_key=True )
face_id = db.Column(db.Integer, db.ForeignKey("face.id"), primary_key=True )
type_id = db.Column(db.Integer, db.ForeignKey("face_override_type.id"))
type = db.relationship("FaceOverrideType")
################################################################################
# Class describing FaceForceMatchOverride in the database and DB via sqlalchemy
# used when a face is forced to match for some reason (who and face id connected)
################################################################################
class FaceForceMatchOverride(PA, db.Model):
__tablename__ = "face_force_match_override"
id = db.Column(db.Integer, db.Sequence('face_override_id_seq'), primary_key=True )
face_id = db.Column(db.Integer, db.ForeignKey("face.id"), primary_key=True )
person_id = db.Column(db.Integer, db.ForeignKey("person.id"), primary_key=True )
person = db.relationship("Person")