-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1004 from serengil/feat-task-0402-api-bug-and-api…
…-tests Feat task 0402 api bug and api tests
- Loading branch information
Showing
15 changed files
with
199 additions
and
60 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
Empty file.
File renamed without changes.
Empty file.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
from deepface import DeepFace | ||
|
||
# pylint: disable=broad-except | ||
|
||
|
||
def represent(img_path, model_name, detector_backend, enforce_detection, align): | ||
try: | ||
result = {} | ||
embedding_objs = DeepFace.represent( | ||
img_path=img_path, | ||
model_name=model_name, | ||
detector_backend=detector_backend, | ||
enforce_detection=enforce_detection, | ||
align=align, | ||
) | ||
result["results"] = embedding_objs | ||
return result | ||
except Exception as err: | ||
return {"error": f"Exception while representing: {str(err)}"}, 400 | ||
|
||
|
||
def verify( | ||
img1_path, img2_path, model_name, detector_backend, distance_metric, enforce_detection, align | ||
): | ||
try: | ||
obj = DeepFace.verify( | ||
img1_path=img1_path, | ||
img2_path=img2_path, | ||
model_name=model_name, | ||
detector_backend=detector_backend, | ||
distance_metric=distance_metric, | ||
align=align, | ||
enforce_detection=enforce_detection, | ||
) | ||
return obj | ||
except Exception as err: | ||
return {"error": f"Exception while verifying: {str(err)}"}, 400 | ||
|
||
|
||
def analyze(img_path, actions, detector_backend, enforce_detection, align): | ||
try: | ||
result = {} | ||
demographies = DeepFace.analyze( | ||
img_path=img_path, | ||
actions=actions, | ||
detector_backend=detector_backend, | ||
enforce_detection=enforce_detection, | ||
align=align, | ||
silent=True, | ||
) | ||
result["results"] = demographies | ||
return result | ||
except Exception as err: | ||
return {"error": f"Exception while analyzing: {str(err)}"}, 400 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
#!/usr/bin/env bash | ||
cd ../api/src | ||
cd ../deepface/api/src | ||
gunicorn --workers=1 --timeout=3600 --bind=0.0.0.0:5000 "app:create_app()" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
import unittest | ||
from deepface.commons.logger import Logger | ||
from deepface.api.src.app import create_app | ||
|
||
|
||
logger = Logger("tests/test_api.py") | ||
|
||
|
||
class TestVerifyEndpoint(unittest.TestCase): | ||
def setUp(self): | ||
app = create_app() | ||
app.config["DEBUG"] = True | ||
app.config["TESTING"] = True | ||
self.app = app.test_client() | ||
|
||
def test_tp_verify(self): | ||
data = { | ||
"img1_path": "dataset/img1.jpg", | ||
"img2_path": "dataset/img2.jpg", | ||
} | ||
response = self.app.post("/verify", json=data) | ||
assert response.status_code == 200 | ||
result = response.json | ||
logger.debug(result) | ||
|
||
assert result.get("verified") is not None | ||
assert result.get("model") is not None | ||
assert result.get("similarity_metric") is not None | ||
assert result.get("detector_backend") is not None | ||
assert result.get("distance") is not None | ||
assert result.get("threshold") is not None | ||
assert result.get("facial_areas") is not None | ||
|
||
assert result.get("verified") is True | ||
|
||
logger.info("✅ true-positive verification api test is done") | ||
|
||
def test_tn_verify(self): | ||
data = { | ||
"img1_path": "dataset/img1.jpg", | ||
"img2_path": "dataset/img2.jpg", | ||
} | ||
response = self.app.post("/verify", json=data) | ||
assert response.status_code == 200 | ||
result = response.json | ||
logger.debug(result) | ||
|
||
assert result.get("verified") is not None | ||
assert result.get("model") is not None | ||
assert result.get("similarity_metric") is not None | ||
assert result.get("detector_backend") is not None | ||
assert result.get("distance") is not None | ||
assert result.get("threshold") is not None | ||
assert result.get("facial_areas") is not None | ||
|
||
assert result.get("verified") is True | ||
|
||
logger.info("✅ true-negative verification api test is done") | ||
|
||
def test_represent(self): | ||
data = { | ||
"img": "dataset/img1.jpg", | ||
} | ||
response = self.app.post("/represent", json=data) | ||
assert response.status_code == 200 | ||
result = response.json | ||
logger.debug(result) | ||
assert result.get("results") is not None | ||
assert isinstance(result["results"], list) is True | ||
assert len(result["results"]) > 0 | ||
for i in result["results"]: | ||
assert i.get("embedding") is not None | ||
assert isinstance(i.get("embedding"), list) is True | ||
assert len(i.get("embedding")) == 4096 | ||
assert i.get("face_confidence") is not None | ||
assert i.get("facial_area") is not None | ||
|
||
logger.info("✅ representation api test is done") | ||
|
||
def test_analyze(self): | ||
data = { | ||
"img": "dataset/img1.jpg", | ||
} | ||
response = self.app.post("/analyze", json=data) | ||
assert response.status_code == 200 | ||
result = response.json | ||
logger.debug(result) | ||
assert result.get("results") is not None | ||
assert isinstance(result["results"], list) is True | ||
assert len(result["results"]) > 0 | ||
for i in result["results"]: | ||
assert i.get("age") is not None | ||
assert isinstance(i.get("age"), (int, float)) | ||
assert i.get("dominant_gender") is not None | ||
assert i.get("dominant_gender") in ["Man", "Woman"] | ||
assert i.get("dominant_emotion") is not None | ||
assert i.get("dominant_race") is not None | ||
|
||
logger.info("✅ analyze api test is done") | ||
|
||
def test_invalid_verify(self): | ||
data = { | ||
"img1_path": "dataset/invalid_1.jpg", | ||
"img2_path": "dataset/invalid_2.jpg", | ||
} | ||
response = self.app.post("/verify", json=data) | ||
assert response.status_code == 400 | ||
logger.info("✅ invalid verification request api test is done") | ||
|
||
def test_invalid_represent(self): | ||
data = { | ||
"img": "dataset/invalid_1.jpg", | ||
} | ||
response = self.app.post("/represent", json=data) | ||
assert response.status_code == 400 | ||
logger.info("✅ invalid represent request api test is done") | ||
|
||
def test_invalid_analyze(self): | ||
data = { | ||
"img": "dataset/invalid.jpg", | ||
} | ||
response = self.app.post("/analyze", json=data) | ||
assert response.status_code == 400 |