From 9bd026f8c1bb8b1e2ac890ddf6acf34b6b3150c6 Mon Sep 17 00:00:00 2001 From: carl Date: Wed, 10 Jul 2024 13:16:05 -0300 Subject: [PATCH 1/3] sync --- doc/yoloserv.odt | Bin 126181 -> 126629 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/yoloserv.odt b/doc/yoloserv.odt index b6b53fdd58467a06a3cad1de9c9b8d2e8c615a21..9676f84fc5c3def136d9d8e244bc480d69f597eb 100644 GIT binary patch delta 20522 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 delta 20051 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 From 444f229e860ea1cde3f9bbde0af0128fbe70f7f9 Mon Sep 17 00:00:00 2001 From: carl Date: Wed, 24 Jul 2024 08:20:43 -0300 Subject: [PATCH 2/3] improve yolo quality for subox testing --- sbin/ctl.sh | 54 ++++++++++--------------------------------- src/facematch_open.py | 3 +-- 2 files changed, 13 insertions(+), 44 deletions(-) diff --git a/sbin/ctl.sh b/sbin/ctl.sh index 97f000b60..784720c22 100755 --- a/sbin/ctl.sh +++ b/sbin/ctl.sh @@ -116,37 +116,9 @@ function f_apt(){ pip3 install yolov8 pip3 install deepface - case $1 in - "updates") apt update - apt upgrade apt install libopencv-dev python3-opencv - python3 -m pip install --upgrade pip - ;; - "regula") f_apt_regula - ;; - "yolov5") f_apt_yolov5 - ;; - "yolov8") f_apt_yolov8 - ;; - "para_facematch") f_apt_openvino - f_apt_paravision - ;; - "openvino") f_apt_openvino - ;; - "deepface") pip3 install deepface - ;; - "facerec") f_apt_facerec - ;; - "intox") f_apt_yolov5 - f_apt_intox - ;; - *) echo "Error. Second parameter must be updates|regula|yolov5|paravision|freeface|paraface|palm|intox" - ;; - esac -} - - -function f_apt_regula(){ + pip3 install deepface + #REGULA.. apt install pcscd libccid wget -O downloads/regula.deb https://downloads.regulaforensics.com/repo/ubuntu/pool/stable/r/regula-reader/regula-reader_6.7.198393.16246_amd64.deb wget -O downloads/drivers.deb https://downloads.regulaforensics.com/repo/ubuntu/pool/stable/r/regula-drivers/regula-drivers_2.1.1.12_amd64.deb @@ -154,17 +126,16 @@ function f_apt_regula(){ sudo pip3 install openvino - . /usr/local/lib/python3.10/dist-packages/ - ROOTURL="http://824f668f-5c6e-4ffe-8b5b-edb4d0301982:985c5412-5e0d-4d66-8d28-ed32dbb900a3@paravision.mycloudrepo.io" - pip3 install cmake --upgrade - pip3 install --no-cache-dir\ - --extra-index-url $ROOTURL/repositories/python-sdk\ - --extra-index-url $ROOTURL/repositories/python-recognition\ - "paravision-recognition" "paravision-models-gen5-balanced-openvino-2022-3" "openvino==2022.3"\ - --trusted-host paravision.mycloudrepo.io + # bypass paravision + # . /usr/local/lib/python3.10/dist-packages/ + # ROOTURL="http://824f668f-5c6e-4ffe-8b5b-edb4d0301982:985c5412-5e0d-4d66-8d28-ed32dbb900a3@paravision.mycloudrepo.io" + # pip3 install cmake --upgrade + # pip3 install --no-cache-dir\ + # --extra-index-url $ROOTURL/repositories/python-sdk\ + # --extra-index-url $ROOTURL/repositories/python-recognition\ + # "paravision-recognition" "paravision-models-gen5-balanced-openvino-2022-3" "openvino==2022.3"\ + # --trusted-host paravision.mycloudrepo.io - # Open source Face_Recognition - pip3 install deepface wget -O downloads/facerec.zip https://github.com/ageitgey/face_recognition/archive/refs/heads/master.zip cd downloads @@ -207,11 +178,10 @@ function f_stop(){ } - echo "Running $0 with option $1 at $DIR" case $1 in - "apt") f_apt $2 + "apt") f_apt ;; "start") f_start ;; diff --git a/src/facematch_open.py b/src/facematch_open.py index 4a6ec48d1..b80fb8b7b 100644 --- a/src/facematch_open.py +++ b/src/facematch_open.py @@ -40,9 +40,8 @@ import urllib.request import time -from ukdi import UKDI -class Facematch(UKDI): +class Facematch(object): name = "face_recognition_face_match" IN_ENGLISH = "A class for checking the similarity between two faces." From 2882528690a5d4f24c9af4038b09c3d9ec0d2efb Mon Sep 17 00:00:00 2001 From: carl Date: Wed, 24 Jul 2024 21:44:29 -0300 Subject: [PATCH 3/3] big cleanup --- doc/yoloserv.odt | Bin 126629 -> 127722 bytes sbin/ctl.sh | 13 ++++- src/camera.py | 25 ++++----- src/face_recognitionx.py | 35 ++++++------- src/faceclass.py | 73 ++++++++++++++++++++------ src/yoloserv.py | 107 +++++++++++++++++++++++++++------------ 6 files changed, 173 insertions(+), 80 deletions(-) diff --git a/doc/yoloserv.odt b/doc/yoloserv.odt index 9676f84fc5c3def136d9d8e244bc480d69f597eb..22222fa140c952a8dee690ebea8669b80bf9feb3 100644 GIT binary patch delta 20268 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

0Fdofuz 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 delta 19132 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 x|I`g5lEP0wa-YfgCm_WUd^Nq#(?IxOmjen?-d 100: - break + if pixel_avg > 150: + return '{ "status":4774, "remark":"Frame is too bright " }' + if pixel_avg < 50: + return '{ "status":4775, "remark":"Frame is too dark " }' cap.release() + return '{ "status":0, "remark":"OK", "pixel_avg":%d }' % pixel_avg - # show the raw acquired image for a test + # show the raw acquired image for a test - only works if opencv was compiled a certain way def show(self): cv2.imshow("test_window",self.frame) cv2.waitKey(0) @@ -66,19 +69,12 @@ class Camera(object): # save the image to a named file def save(self, filename, format="png"): - ret = 0 - buffer = None - if format=="png": - ret, buffer = cv2.imencode('.png', self.frame) - else: - ret, buffer = cv2.imencode('.jpg', self.frame) - if not ret: - print("Bad ret code ", ret) - cv2.imwrite(filename + "." + format, buffer) + cv2.imwrite(filename + "." + format, self.frame) + return 0 def dump(self): - print (self.frame) + #print (self.frame) return self.frame @@ -98,5 +94,6 @@ class Camera(object): if __name__ == '__main__': m = Camera() - m.acquire(0,"/tmp/newpic.jpg",True) + print(m.acquire("0")) + m.save("/tmp/test","png") diff --git a/src/face_recognitionx.py b/src/face_recognitionx.py index 48f42c927..0cfc567e0 100644 --- a/src/face_recognitionx.py +++ b/src/face_recognitionx.py @@ -42,7 +42,9 @@ import urllib.request from faceclass import FaceClass import time - +# +# This, together with its superclass, is the reference implementation - CTO +# class FaceRecognition(FaceClass): @@ -53,32 +55,30 @@ class FaceRecognition(FaceClass): face_match_json = None conf = [] - + # @doc find all the faces in the named image def get_faces(self, name): print("** get_faces ... %s" % name) try: # Get all faces from images with qualities, landmarks, and embeddings - boxes = face_recognition.face_locations(self.imgs[name], number_of_times_to_upsample=2, model='hog') - print("found %d boxes for %s" % (len(boxes), name) ) + self.boxes = face_recognition.face_locations(self.imgs[name], number_of_times_to_upsample=2, model='hog') + print("found %d boxes for %s" % (len(self.boxes), name) ) # Get numerical representation of faces (required for face match) self.encs[name] = face_recognition.face_encodings(self.imgs[name])[0] #print("encoding for %s : " % name, self.encs[name]) except Exception as ex: self.errstr = "image processing exception at get_faces: "+str(ex) - return -1 - return len(boxes) - - -# return " id=%d photo=%d result=%d " % (self.id_face, self.photo_face, len(self.image_inference_result)) + 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)) + # @doc find the landmarks of the given face def get_landmarks(self, name): - self.landmarks = face_recognition.face_landmarks(self.imgs[name]) - print(self.landmarks) - return self.landmarks + landmarks = face_recognition.face_landmarks(self.imgs[name]) + return '{ "status":0, "remark":"OK", "landmarks":%s }' % json.dumps(landmarks) - def compute_scores(self, name1, name2): + # @doc compare two named images, previously loaded + def compare(self, name1, name2): print("** computing ... %s vs %s" % (name1,name2)) try: res = face_recognition.compare_faces([self.encs[name1]], self.encs[name2]) @@ -90,8 +90,9 @@ class FaceRecognition(FaceClass): self.tree["score"] = self.match_score[0] except Exception as ex: self.errstr = "image comparison exception at compute_scores: "+str(ex) - return -1 - return self.match_score + return '{ "status":332410, "remark":"%s" }' % self.errstr + return '{ "status":0, "remark":"OK", "score":%d }' % self.match_score[0] + def get_scores(self): return json.dumps(self.tree) @@ -99,7 +100,7 @@ class FaceRecognition(FaceClass): def detect_all(self): n=0 - self.load("localcam","regula", "/tmp/localcam.png", "/tmp/regula/Portrait_0.jpg") + self.load("localcam", "/tmp/localcam.png", "regula", "/tmp/regula/Portrait_0.jpg") self.get_faces("localcam") self.get_faces("regula") print("computed ... ", d.compute_scores("regula","localcam")) @@ -115,7 +116,7 @@ if __name__ == '__main__': if sys.argv[1]=="kiosk": # lfw n=0 - d.load("localcam","regula", "/tmp/localcam.png", "/tmp/regula/Portrait_0.jpg") + d.load("localcam", "/tmp/localcam.png", "regula", "/tmp/regula/Portrait_0.jpg") d.get_faces("localcam") d.get_faces("regula") print("computed ... ", d.compute_scores("regula","localcam")) diff --git a/src/faceclass.py b/src/faceclass.py index ef2dd1c9a..23f01fc42 100644 --- a/src/faceclass.py +++ b/src/faceclass.py @@ -2,6 +2,8 @@ import sys import os import cv2 import json +import base64 + from matplotlib import pyplot as plt class FaceClass(object): @@ -24,20 +26,20 @@ class FaceClass(object): # Load a pics using the device label def load1(self, name,fname): if not os.path.isfile(fname): - return False + return '{ "status":442565, "remark":"file name not found", "guilty_param":"fname", "guilty_value":"%s" }' % (fname) self.imgs[name] = cv2.imread(fname) - #print(" Loaded %s from file %s" % (name, fname)) - return True + print(" Loaded %s from file %s" % (name, fname)) + return '{ "status":0, "remark":"OK", "name":"%s", "fname":"%s" }' % (name,fname) - def load(self, name1,name2,fname1,fname2): + def load2(self, name1,fname1,name2,fname2): print("FaceClass loading files ....................... ") if not os.path.isfile(fname1): print("Cant access file ",fname1) - return -1 + return '{ "status":442566, "remark":"file not found", "guilty_param":"fname", "guilty_value":"%s" }' % (fname1) if not os.path.isfile(fname2): print("Cant access file ",fname2) - return -1 + return '{ "status":442567, "remark":"file not found", "guilty_param":"fname", "guilty_value":"%s" }' % (fname2) self.imfiles.append(fname1) self.imfiles.append(fname2) self.imnames[name1] = fname1 @@ -49,38 +51,79 @@ class FaceClass(object): p2.imshow(name2, self.imgs[name2]) p1.show() print("FaceClass: Loaded %s from file %s" % (name1, fname1)) - return 1 + print("FaceClass: Loaded %s from file %s" % (name2, fname2)) + return '{ "status":0, "remark":"OK", "name1":"%s", "fname1":"%s", "name2":"%s", "fname2":"%s" }' % (name1,fname1,name2,fname2) - def box(self, name, x, y, w, h): - cv2.rectangle(self.imgs[name],(x,y),(x+w,y+h), (0,255,0), 4) + # @doc draw a box and save with a new name + def rect(self, name, x1, y1, x2, y2, newname): + self.imgs[newname] = cv2.rectangle(self.imgs[name],(x1,y1),(x2,y2), (0,255,0), 4) + # @doc crop an image and save with a new name + def crop(self, name, x1, y1, x2, y2, newname): + print(x1,y1,x2,y2) + self.imgs[newname] = self.imgs[name][x1:x2, y1:y2] # Load the config def init(self): with open("/etc/ukdi.json","r") as f: self.conf = json.loads(f.read()) - # Find all faces def get_faces(self,name): - return -1 + return '{ "status":88241, "remark":"override this!" }' # Find best face def get_best_face(self): - return None + return '{ "status":88242, "remark":"override this!" }' + + # @doc find the biggest face in the named image + def get_ideal(self, name): + self.boxes = [] + self.get_faces(name) + found = -1 + ix = 0 + biggest = -1 + for b in self.boxes: + print(json.dumps(b)) + area = b[3] * b[2] + print(b,area) + if area > biggest: + found = ix + biggest = area + # box returns (left,top,right,bottom) - ffs + #self.crop(name,b[1],b[0],b[3],b[2],"_crop") + #self.rect(name,b[0],b[1],b[2],b[3],"_rect") + # rect expects x1,y1,x2,y2 + self.rect(name,b[0],b[1],b[1]+b[3],b[0]+b[2],"_rect") + ix+=1 + if found < 0: + return '{ "status":8572421, "remark":"no ideal face", "guilty_param":"name", "guilty_value":"%s" }' % name + return '{ "status":0, "remark":"OK", "faces":%d, "ideal_ix":%s, "ideal_area":%d, "boxes":%s }' % (len(self.boxes), found, biggest, json.dumps(self.boxes)) + + + # return a base64 version of the pic in memory + def dump64(self,which,format="png"): + if format=="jpg": + _ , im_arr = cv2.imencode('.jpg', self.imgs[which]) + img_as_txt = base64.b64encode(im_arr) + return b'data:image/jpeg;base64,'+img_as_txt + _ , im_arr = cv2.imencode('.png', self.imgs[which]) + img_as_txt = base64.b64encode(im_arr) + return b'data:image/png;base64, '+img_as_txt + # Find landmarks def get_landmarks(self): - return '{ "status": 9999 }' + return '{ "status":88243, "remark":"override this!" }' # Find metadata (age etc) def get_metadata(self,name): - return None + return '{ "status":88244, "remark":"override this!" }' # Match two faces def process(self,name1,name2): - return None + return '{ "status":88245, "remark":"override this!" }' diff --git a/src/yoloserv.py b/src/yoloserv.py index f024f851a..87ad8f586 100644 --- a/src/yoloserv.py +++ b/src/yoloserv.py @@ -23,7 +23,7 @@ class yoloserv(object): yolo = None device = None - imgdir = None + indir = None outdir = None facedetector = None lifedetector = None @@ -50,7 +50,7 @@ class yoloserv(object): print("Init yoloserv: %s @ %s %s " % (self.conf["yolo_devices"], self.conf["yolo_indir"], self.conf["yolo_outdir"]) ) self.devices = self.conf["yolo_devices"].split(",") - self.imgdir = self.conf["yolo_indir"] + self.indir = self.conf["yolo_indir"] self.outdir = self.conf["yolo_outdir"] # Object (face) matching @@ -65,7 +65,7 @@ class yoloserv(object): self.facematcher = Deepfacex() self.facematcher.init("dlib","SFace") if "face_recognition" in self.devices: - print("Loading deepface facematch...") + print("Loading face_recognition facematch...") from face_recognitionx import FaceRecognition self.facematcher = FaceRecognition() self.facematcher.init() @@ -123,55 +123,79 @@ class yoloserv(object): self.intox_detector.init() + # Acquire image - the device used depends on the device list and what actual file was loaded as self.camera + # @doc acquires an image from the camera (test OK CG 2024-0724) @cherrypy.expose def svc_acquire(self,camidx=0): self.camera.acquire(camidx) - return "0 OK" + return '{ "status":0, "remark":"OK" }' - # Test + # Test- (opencv) @cherrypy.expose def svc_show(self): self.camera.show() - return "0 OK" + return '{ "status":0, "remark":"OK" }' + # @doc saves the camera image to a file (test OK CG 2024-0724) @cherrypy.expose def svc_save(self,filename,extn="png"): - self.camera.save(filename,extn) - return "0 OK" + self.camera.save(self.outdir + filename,extn) + return '{ "status":0, "remark":"OK", "outfile": "%s/%s.%s" }' % (self.outdir,filename,extn) + # @doc dumps the camera image as an array (test OK CG 2024-0724) @cherrypy.expose def svc_dump(self): buf = self.camera.dump() return buf + # @doc dumps the camera image as a base64 encoded array (test OK CG 2024-0724) @cherrypy.expose def svc_dump64(self): - buf = self.camera.dump64() + buf = self.camera.dump64().decode() return buf + # @doc dumps the camera image as an tag for straight to HTML output (test OK CG 2024-0724) + @cherrypy.expose + def svc_dumphtml(self): + buf = self.camera.dump64().decode() + return "" % buf + + # Find faces - the algorithm used depends on the device list and what actual file was loaded as self.camera - # Simply load an image + # @doc load an image from a file using the specified yoloserv plugin (test OK CG 2024-0724) @cherrypy.expose - def svc_load_face(self,infile): - self.facematcher.load(infile) + def svc_load_face(self,name,infile): + return self.facematcher.load1(name, self.indir + infile) + # @doc load images from two files using the specified yoloserv plugin (test OK CG 2024-0724) @cherrypy.expose - def svc_detect_faces(self,infile): - nfaces = self.facematcher.detect_all(self.imgdir + infile) - return '{ "status":0, "remark":"found faces", "count":%d }' % (nfaces) + def svc_load_faces(self,name1,infile1,name2,infile2): + return self.facematcher.load2(name1, self.indir + infile1, name2, self.indir + infile2) - # Find the most prominent object + # @doc find all the faces in the named image that was loaded using the above calls (test OK CG 2024-0724) @cherrypy.expose - def svc_ideal_face(self,infile): - self.facematcher.detect_one(infile) + def svc_get_faces(self,which): + return self.facematcher.get_faces(which) + + # @doc find the most prominent face in the named image that was loaded using the above calls (test OK CG 2024-0724) + # you can access the new ideal face (if present) with the image name "_ideal" + @cherrypy.expose + def svc_get_ideal(self,which): + return self.facematcher.get_ideal(which) + + # @doc dumps the named image as an tag for straight to HTML output (test OK CG 2024-0724) + @cherrypy.expose + def svc_imgtag(self,which): + buf = self.facematcher.dump64(which).decode() + return "" % buf # Match faces together @cherrypy.expose - def svc_match_faces(self,infile1,infile2): - return self.facematcher.detect(infile1,infile2) + def svc_compare(self,name1,name2): + return self.facematcher.compare(name1,name2) @cherrypy.expose @@ -180,8 +204,24 @@ class yoloserv(object): os._exit(0) + + + + # @doc find the landmarks in the named image (test OK CG 2024-0724) @cherrypy.expose - def facematch(self,dev1,dev2): + def svc_get_landmarks(self,which): + return self.facematcher.get_landmarks(which) + + # Match faces together + @cherrypy.expose + def svc_match_faces(self,infile1,infile2): + return self.facematcher.detect(infile1,infile2) + def json2obj(self,jsonx): + return json.laods(jsonx) + + # @doc put all the steps for a retail facematch into one convenient functions + @cherrypy.expose + def retail_facematch(self,dev1,dev2): if self.facematcher is None: return '{ "status":777244, "remark":"suitable yolo_device" }' @@ -199,15 +239,18 @@ class yoloserv(object): if self.conf["emulate_facematch"]: return '{ "status":0, "remark":"OK", "data":{} }' - status = self.facematcher.load(dev1, dev2, img1, img2) - if not status: - return '{ "status":777242, "remark":"face loading failed", "guilty_param":"facematch", "guilty_value":"%s" }' % (status) - if self.facematcher.get_faces(dev1) < 1: - return '{ "status":777243, "remark":"face loading failed", "guilty_param":"image", "guilty_value":"%s" }' % (dev1) - if self.facematcher.get_faces(dev2) < 1: - return '{ "status":777244, "remark":"face loading failed", "guilty_param":"image", "guilty_value":"%s" }' % (dev2) - if self.facematcher.compute_scores(dev1,dev2) < 1: - return '{ "status":777245, "remark":"face matching failed", "guilty_param":"image", "guilty_value":"%s" }' % (self.facematcher.errstr) + obj = self.json2obj(self.facematcher.load_faces(dev1, img1, dev2, img2)) + if obj["status"] > 0: + return jsonx + obj = self.json2obj(self.facematcher.get_faces(dev1)) + if obj["status"] > 0: + return jsonx + obj = self.json2obj(self.facematcher.get_faces(dev2)) + if obj["status"] > 0: + return jsonx + obj = self.json2obj(self.facematcher.compute_scores(dev1,dev2)) + if obj["status"] > 0: + return jsonx jsonstr = self.facematcher.get_scores() return '{ "status":0, "remark":"OK", "data": %s }' % (jsonstr) @@ -360,13 +403,13 @@ class yoloserv(object): if __name__ == '__main__': # Deal with the incoming call parameters servport = int(sys.argv[1]) - imgdir = sys.argv[2] + indir = sys.argv[2] outdir = sys.argv[3] # Initialise the webserver s = yoloserv() s.initialise() - #s.initialise(imgdir,outdir,weightsfile) + #s.initialise(indir,outdir,weightsfile) cherrypy.config.update({'server.socket_host': '0.0.0.0', 'server.socket_port': servport}) cherrypy.quickstart(s, '/')