get paraVISION working again
This commit is contained in:
parent
241372ef00
commit
4266448f68
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -3,11 +3,14 @@
|
|||||||
#
|
#
|
||||||
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
|
||||||
|
|
||||||
@ -15,9 +18,17 @@ import paravision.recognition.utils as pru
|
|||||||
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,47 +56,59 @@ 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user