# standard imports import contextlib import io import os import requests import unittest # bsie imports from bsie.extractor import base from bsie.matcher import nodes from bsie.reader.face import FaceExtract from bsie.utils import bsfs, ns # objects to test from bsie.extractor.image.face.detect import FaceDetect, bsf ## code ## class TestFaceDetect(unittest.TestCase): def setUp(self): # download test image target = os.path.join(os.path.dirname(__file__), 'testface1.jpg') if not os.path.exists(target): with open(target, 'wb') as ofile: ans = requests.get('https://www.bsfs.io/testdata/iepahGee1uch5ahr3ic1.jpg') ofile.write(ans.content) def test_extract(self): with contextlib.redirect_stderr(io.StringIO()): # NOTE: hide warnings from facenet_pytorch # setup rdr = FaceExtract() ext = FaceDetect() subject = nodes.Entity(ucid='abc123') content = rdr(os.path.join(os.path.dirname(__file__), 'testface1.jpg')) principals = set(ext.principals) face = nodes.Face( ucid='2a7203c1515e0caa66a7461452c0b4552f1433a613cb3033e59ed2361790ad45') triples = list(ext.extract(subject, content, principals)) # principals is bse:face self.assertSetEqual(principals, {ext.schema.predicate(ns.bse.face)}) # check triples self.assertIn((subject, ns.bse.face, face), triples) self.assertIn((face, bsf.x, 575.4721153898192), triples) self.assertIn((face, bsf.y, 265.3955625), triples) self.assertIn((face, bsf.width, 626.3928904791771), triples) self.assertIn((face, bsf.height,858.6870625), triples) # check embedding emb = [o for s, p, o in triples if s == face and p == bsf.embedding] self.assertEqual(len(emb), 1) self.assertAlmostEqual(emb[0].sum(), -1.9049968) # no triples on principal mismatch self.assertListEqual(list(ext.extract(subject, content, set())), []) # no triples on no content self.assertListEqual(list(ext.extract(subject, [], principals)), []) ## main ## if __name__ == '__main__': unittest.main() ## EOF ##