interim commit - person now has a fix_faces route that will be used as part of the conversion to get locn -> top, right, bottom, left and using PA class for __repr() instead

This commit is contained in:
2022-12-23 12:02:22 +11:00
parent 4f80ea947a
commit a89063d366

View File

@@ -8,7 +8,7 @@ from sqlalchemy.exc import SQLAlchemyError
from status import st, Status from status import st, Status
from flask_login import login_required, current_user from flask_login import login_required, current_user
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename
from shared import GenFace, GenThumb from shared import GenFace, GenThumb, PA
from face import Face, FaceRefimgLink, FaceOverrideType, FaceNoMatchOverride, FaceForceMatchOverride from face import Face, FaceRefimgLink, FaceOverrideType, FaceNoMatchOverride, FaceForceMatchOverride
from path import Path, PathType from path import Path, PathType
from job import JobExtra, NewJob from job import JobExtra, NewJob
@@ -34,46 +34,42 @@ import os.path
# model_used: which AI model (cnn or hog) used to create face # model_used: which AI model (cnn or hog) used to create face
# person: read-only convenience field not in DB, just used in html # person: read-only convenience field not in DB, just used in html
################################################################################ ################################################################################
class Refimg(db.Model): class Refimg(PA,db.Model):
id = db.Column(db.Integer, db.Sequence('refimg_id_seq'), primary_key=True ) id = db.Column(db.Integer, db.Sequence('refimg_id_seq'), primary_key=True )
fname = db.Column(db.String(256), unique=True, nullable=False) fname = db.Column(db.String(256), unique=True, nullable=False)
face = db.Column(db.LargeBinary, unique=True, nullable=False) face = db.Column(db.LargeBinary, unique=True, nullable=False)
orig_w = db.Column(db.Integer) orig_w = db.Column(db.Integer)
orig_h = db.Column(db.Integer) orig_h = db.Column(db.Integer)
face_locn = db.Column(db.String) face_locn = db.Column(db.String)
face_top = db.Column(db.Integer)
face_right = db.Column(db.Integer)
face_bottom = db.Column(db.Integer)
face_left = db.Column(db.Integer)
thumbnail = db.Column(db.String, unique=True, nullable=False) thumbnail = db.Column(db.String, unique=True, nullable=False)
created_on = db.Column(db.Float) created_on = db.Column(db.Float)
model_used = db.Column(db.Integer, db.ForeignKey("ai_model.id") ) model_used = db.Column(db.Integer, db.ForeignKey("ai_model.id") )
person = db.relationship( 'Person', secondary="person_refimg_link", uselist=False, viewonly=True ) person = db.relationship( 'Person', secondary="person_refimg_link", uselist=False, viewonly=True )
def __repr__(self):
return "<id: {}, fname: {}>".format(self.id, self.fname )
################################################################################ ################################################################################
# Class describing Person to Refimg link in DB via sqlalchemy # Class describing Person to Refimg link in DB via sqlalchemy
################################################################################ ################################################################################
class PersonRefimgLink(db.Model): class PersonRefimgLink(PA,db.Model):
__tablename__ = "person_refimg_link" __tablename__ = "person_refimg_link"
person_id = db.Column(db.Integer, db.ForeignKey('person.id'), unique=True, nullable=False, primary_key=True) person_id = db.Column(db.Integer, db.ForeignKey('person.id'), unique=True, nullable=False, primary_key=True)
refimg_id = db.Column(db.Integer, db.ForeignKey('refimg.id'), unique=True, nullable=False, primary_key=True) refimg_id = db.Column(db.Integer, db.ForeignKey('refimg.id'), unique=True, nullable=False, primary_key=True)
def __repr__(self):
return f"<person_id: {self.person_id}, refimg_id: {self.refimg_id}>"
################################################################################ ################################################################################
# Class describing Person in DB via sqlalchemy # Class describing Person in DB via sqlalchemy
################################################################################ ################################################################################
class Person(db.Model): class Person(PA,db.Model):
id = db.Column(db.Integer, db.Sequence('person_id_seq'), primary_key=True ) id = db.Column(db.Integer, db.Sequence('person_id_seq'), primary_key=True )
tag = db.Column(db.String(48), unique=False, nullable=False) tag = db.Column(db.String(48), unique=False, nullable=False)
surname = db.Column(db.String(48), unique=False, nullable=False) surname = db.Column(db.String(48), unique=False, nullable=False)
firstname = db.Column(db.String(48), unique=False, nullable=False) firstname = db.Column(db.String(48), unique=False, nullable=False)
refimg = db.relationship('Refimg', secondary=PersonRefimgLink.__table__, order_by=Refimg.id) refimg = db.relationship('Refimg', secondary=PersonRefimgLink.__table__, order_by=Refimg.id)
def __repr__(self):
return "<tag: {}, firstname: {}, surname: {}, refimg: {}>".format(self.tag,self.firstname, self.surname, self.refimg)
################################################################################ ################################################################################
# Helper class that inherits a .dump() method to turn class Person into json / useful in jinja2 # Helper class that inherits a .dump() method to turn class Person into json / useful in jinja2
################################################################################ ################################################################################
@@ -436,7 +432,7 @@ def remove_no_match_override():
@login_required @login_required
def add_no_match_override(): def add_no_match_override():
face_id = request.form['face_id'] face_id = request.form['face_id']
f = Face.query.get(face_id); f = Face.query.get(face_id)
if not f: if not f:
raise Exception("could not find face to add override too!") raise Exception("could not find face to add override too!")
@@ -461,3 +457,29 @@ def add_no_match_override():
resp={} resp={}
resp['type']=t.name resp['type']=t.name
return resp return resp
@app.route('/fix_faces')
@login_required
def fix_faces():
for r in Refimg.query.all():
print( f"BEFORE: ref# {r.id}, face_locn = {r.face_locn}, top={r.face_top}, right={r.face_right}, bottom={r.face_bottom}, left={r.face_left}" )
tmp=json.loads(r.face_locn)
r.face_top = tmp[0]
r.face_right = tmp[1]
r.face_bottom = tmp[2]
r.face_left = tmp[3]
db.session.add(r)
print( f" FIXED: ref# {r.id}, face_locn = {r.face_locn}, top={r.face_top}, right={r.face_right}, bottom={r.face_bottom}, left={r.face_left}" )
for f in Face.query.all():
print( f"BEFORE: face# {f.id}, locn = {f.locn}, top={f.face_top}, right={f.face_right}, bottom={f.face_bottom}, left={f.face_left}" )
tmp=json.loads(f.locn)
f.face_top = tmp[0]
f.face_right = tmp[1]
f.face_bottom = tmp[2]
f.face_left = tmp[3]
db.session.add(f)
print( f" FIXED: ref# {f.id}, locn = {f.locn}, top={f.face_top}, right={f.face_right}, bottom={f.face_bottom}, left={f.face_left}" )
db.session.commit()
print("faces should be fixed")
return render_template("base.html" )