get paraVISION working again

This commit is contained in:
carl 2024-10-22 22:25:43 -03:00
parent 241372ef00
commit 4266448f68
3 changed files with 69 additions and 32 deletions

View File

@ -252,7 +252,9 @@ class FaceClass(object):
# @doc crop an image, allowing a gutter. # @doc crop an image, allowing a gutter.
def shrink(self, name, skale=0.5): def shrink(self, name, skale=0.5):
print ("shrinking ",name) print ("shrinking ",name,skale)
if skale == 0:
return
self.imgs[name] = cv2.resize(self.imgs[name],None,fx=skale,fy=skale) self.imgs[name] = cv2.resize(self.imgs[name],None,fx=skale,fy=skale)

View File

@ -3,21 +3,32 @@
# #
import json import json
import sys import sys
import os
import cv2
import torchvision.transforms
### export PYTHONPATH=/wherever/yoloserv/modules ... as long as "paravision/.../" is in there ### export PYTHONPATH=/wherever/yoloserv/modules ... as long as "paravision/.../" is in there
from paravision.recognition.exceptions import ParavisionException from paravision.recognition.exceptions import ParavisionException
from paravision.recognition.engine import Engine
from paravision.recognition.sdk import SDK from paravision.recognition.sdk import SDK
from paravision.recognition.engine import Engine
import paravision.recognition.utils as pru import paravision.recognition.utils as pru
#from openvino.inference_engine import Engineq #from openvino.inference_engine import Engineq
#from deepface.basemodels import VGGFace, OpenFace, Facenet, FbDeepFace, DeepID #from deepface.basemodels import VGGFace, OpenFace, Facenet, FbDeepFace, DeepID
from faceclass import FaceClass from faceclass import FaceClass
# Paravision is quite unlike all the other open source img recognition packages
# which cause problems when image formats move between the two.
# So this class has quite a few differences.
class Paravision(FaceClass): class Paravision(FaceClass):
models = {}
scores = {}
quality = {}
sdk = None
match_score = 0
def init(self,backend=None,model=None): def init(self,backend=None,model=None):
print("@@@ initialising paravision") print("@@@ initialising paravision")
try: try:
@ -26,6 +37,18 @@ class Paravision(FaceClass):
pass pass
# @doc Load a pic using the device label
def load1(self, name,fname):
print(" Loading image '%s' from file %s" % (name, fname))
if not os.path.isfile(fname):
print(" * file not found: %s" % (fname))
return '{ "status":442565, "remark":"file name not found", "guilty_param":"fname", "guilty_value":"%s" }' % (fname)
self.files[name] = fname
self.imgs[name] = pru.load_image(fname)
print(" Loaded %s from file %s" % (name, fname))
return '{ "status":0, "remark":"OK", "name":"%s", "fname":"%s" }' % (name,fname)
# @doc find all the faces in the named image # @doc find all the faces in the named image
def detect(self, name): def detect(self, name):
boxes = [] boxes = []
@ -33,46 +56,58 @@ class Paravision(FaceClass):
print("** face_recognition::detect ... %s" % name) print("** face_recognition::detect ... %s" % name)
try: try:
# Get all faces from images with qualities, landmarks, and embeddings # Get all faces from images with qualities, landmarks, and embeddings
res = self.sdk.get_faces([self.imgs[name]]) faces = self.sdk.get_faces([self.imgs[name]], qualities=True, landmarks=True, embeddings=True)
boxes = res.faces inferences = faces.image_inferences
for b in boxes: ix = inferences[0].most_prominent_face_index()
b = b.bounding_box self.models[name] = inferences[0].faces[ix].embedding
#print(b) self.quality[name] = round(1000*inferences[0].faces[ix].quality)
self.boxes.append((int(b.origin.x),int(b.origin.y),int(b.origin.x+b.width),int(b.origin.y+b.height))) self.boxes = [ (0,0,0,0) ]
print("found %d boxes for %s" % (len(self.boxes), name) )
except Exception as ex: except Exception as ex:
self.errstr = "image processing exception at get_faces: "+str(ex) self.errstr = "image processing exception at get_faces: "+str(ex)
return '{ "status":222310, "remark":"image processing exception", "guilty_param":"error", "guilty_value":"%s" }' % str(ex) return '{ "status":222310, "remark":"image processing exception", "guilty_param":"error", "guilty_value":"%s" }' % str(ex)
return '{ "status":0, "remark":"OK", "faces":%d, "boxes":%s }' % (len(self.boxes), json.dumps(self.boxes)) return '{ "status":0, "remark":"OK", "faces":%d, "boxes":%s }' % (len(self.boxes), json.dumps(self.boxes))
# @doc This does everything for you.
# If you are smartserv, "crowd" means cam and "govid" means regula pic
def crowd_vs_govid(self, name1,file1,scale1, name2,file2,scale2):
print("##1##")
if self.json2obj(self.load1(name1, file1))["status"] != 0:
return self.jsonx
if self.json2obj(self.detect(name1))["status"] != 0:
return self.jsonx
self.save(name1,"/tmp")
print("##2##")
if self.json2obj(self.load1(name2, file2))["status"] != 0:
return self.jsonx
self.save(name2,"/tmp")
if self.json2obj(self.detect(name2))["status"]!=0:
return self.jsonx
self.save(name2,"/tmp")
print("##R##")
jsonstr = self.compare(name1,name2)
print(jsonstr)
return jsonstr
# @doc compare two named images, previously loaded # @doc compare two named images, previously loaded
def compare(self, name1, name2): def compare(self, name1, name2):
print("** face_recognition::compare ... %s vs %s" % (name1,name2)) print("** face_recognition::compare ... %s vs %s" % (name1,name2))
self.encs[name1] = self.sdk.get_embedding_from_prepared_image(self.imgs[name1])
self.encs[name2] = self.sdk.get_embedding_from_prepared_image(self.imgs[name2])
#if self.encs[name1]==[]:
# return '{ "status":14330, "remark":"could not encode image", "guilty_param":"img1", "guilty_value":"%s" }' % name1
#if self.encs[name2]==[]:
# return '{ "status":14331, "remark":"could not encode image", "guilty_param":"img2", "guilty_value":"%s" }' % name2
print(self.encs.keys())
print(self.encs[name1])
print(self.encs[name2])
try: try:
res = self.sdk.get_match_score(self.model, other.model) res = self.sdk.get_match_score(self.models[name1], self.models[name2])
print("Match is ",res) print("Match is ",res)
#self.match_score = 1000 * (1 - face_recognition.face_distance([self.encs[name1][0]], self.encs[name2][0])) self.match_score = res
#print("Score is ",self.match_score)
# Create .json
self.tree["score"] = self.match_score[0]
except Exception as ex: except Exception as ex:
print("** paravision::compare exception ... " + str(ex) ) print("** paravision::compare exception ... " + str(ex) )
self.errstr = "image comparison exception at compute_scores: "+str(ex) self.errstr = "image comparison exception at compute_scores: "+str(ex)
return '{ "status":332410, "remark":"%s" }' % self.errstr return '{ "status":332410, "remark":"%s" }' % self.errstr
return '{ "status":0, "remark":"OK", "score":%d }' % self.match_score[0] return '{ "status":0, "remark":"OK", "score":%d }' % self.match_score
def scores(self):
return '{ "status":0, "remark":"OK", "score":%d }' % self.match_score

View File

@ -240,12 +240,12 @@ class yoloserv(object):
# Match faces together # Match faces together
@cherrypy.expose @cherrypy.expose
def svc_match_faces(self,dev1,fil1,scl1,dev2,fil2,scl2): def svc_match_faces(self,dev1,fil1,scl1s,dev2,fil2,scl2s):
jsonstr = self.facematcher.crowd_vs_govid(dev1,self.conf["yolo_indir"]+fil1,scl1, dev2,self.conf["yolo_outdir"]+fil2,scl2) scl1 = float(scl1s)
scl2 = float(scl2s)
jsonstr = self.facematcher.crowd_vs_govid(dev1,self.conf["yolo_indir"]+fil1,scl1, dev2,self.conf["yolo_indir"]+fil2,scl2)
obj = self.json2obj(jsonstr) obj = self.json2obj(jsonstr)
return jsonstr return jsonstr
if obj.status > 0:
return jsonstr
def json2obj(self,jsonx): def json2obj(self,jsonx):
return json.loads(jsonx) return json.loads(jsonx)