Example #1
0
class TestTrackerMethod(unittest.TestCase):
    def setUp(self):
        self.tracker = Tracker(track_id=1)

    def mock_face_info(self):
        bounding_box = np.random.randint(100, size=(4))
        frame_id = 1
        face_image = np.ones((160, 160, 3), dtype=np.uint8)
        str_padded_bbox = '_'.join(bounding_box.astype('str').tolist())
        landmarks = np.random.randint(100, size=(10))
        return FaceInfo(bounding_box, frame_id, face_image, str_padded_bbox,
                        landmarks)

    def test_get_idle_time_should_return_nearly_exact_time(self):
        ''' asign a new time tick and check if get idle time return the right time '''
        start = time.time()
        self.tracker.tick = start
        print(self.tracker.tick, start)
        # because the time return will not exactly equal, so we need to round
        # to get a nearly equal
        time_span = time.time() - start
        idle_time = self.tracker.get_idle_time()
        self.assertAlmostEqual(time_span, idle_time, places=5)

    def test_get_track_time_return_nearly_exact_time(self):
        ''' asign a new start_time and check if get idle time return the right time '''
        start = time.time()
        self.tracker.start_time = start
        # because the time return will not exactly equal, so we need to round
        # to get a nearly equal
        time_span = time.time() - start
        idle_time = self.tracker.get_track_time()
        self.assertAlmostEqual(time_span, idle_time, places=5)

    def test_update_embeddings_should_assign_embs_into_elements(self):
        ''' assign new embs to elements and check if the exact element embs contain those input array '''
        # assing elements to tracker
        for i in range(10):
            self.tracker.elements.append(self.mock_face_info())
        nrof_elements = len(self.tracker.elements)
        start_id = np.random.randint(nrof_elements)
        interval = np.random.randint(nrof_elements - start_id)
        embeddings_array = np.random.random((interval, 128))
        self.tracker.update_embeddings(embeddings_array, start_id, interval)
        emb_array_idx = 0
        for element_idx in range(start_id, start_id + interval):
            self.assertTrue(
                np.array_equal(self.tracker.elements[element_idx].embedding,
                               embeddings_array[emb_array_idx]))
            emb_array_idx += 1

    def test_random_samples_should_not_exceed_the_number_of_element_range(
            self):
        ''' test boundaries of return random elements sample '''
        nrof_elements_list = [0, 50, 100, 200]
        for nrof_elements in nrof_elements_list:
            max_nrof_elements = min(nrof_elements, 100)
            # init the elements
            self.tracker.elements = [1] * nrof_elements
            # do the random sample
            self.tracker.random_samples()
            self.assertEqual(len(self.tracker.elements), max_nrof_elements)

    def test_random_samples_return_elements_that_belong_to_current_tracker(
            self):
        ''' test if the return elements is from the original elements '''
        # do init
        input_elements_ids = []
        for i in range(200):
            new_element = self.mock_face_info()
            self.tracker.elements.append(new_element)
            input_elements_ids.append(id(new_element))
        # do checking
        self.tracker.random_samples()
        for element in self.tracker.elements:
            element_id = id(element)
            self.assertIn(element_id, input_elements_ids)

    def test_predict_should_change_the_tick_time(self):
        ''' mock the predict method of KCFTracker to test the tick tim change '''
        old_tick = self.tracker.tick
        self.tracker.tracker.predict = unittest.mock.MagicMock(
            return_value=True)
        self.tracker.predict('mock_frame')
        self.assertNotEqual(old_tick, self.tracker.tick)

        old_tick = self.tracker.tick
        self.tracker.tracker.predict = unittest.mock.MagicMock(
            return_value=False)
        self.tracker.predict('mock_frame')
        self.assertEqual(old_tick, self.tracker.tick)

    def test_update_detection_should_save_image_to_disk(self):
        ''' mock several face_info method to test the saving image process of this method '''
        self.tracker.tracker.start_track = unittest.mock.MagicMock(
            return_value=None)
        face_info = self.mock_face_info()
        face_info.is_good = unittest.mock.MagicMock(return_value=True)
        face_info.str_info = unittest.mock.MagicMock(return_value='sample')
        saved_img_path = os.path.join(
            self.tracker.track_id_path,
            '{}_{}.jpg'.format(self.tracker.track_id, face_info.str_info()))
        print(saved_img_path)
        self.tracker.update_detection('mock_frame', face_info)
        # time.sleep(10)
        self.assertTrue(os.path.exists(saved_img_path))

    def test_generate_face_id_should_return_true_face_id_format(self):
        ''' random some input and check if the generated string is matched '''
        track_id = np.random.randint(10)
        start_time = time.time()
        area = 'VTV'
        expected_str = '{}-{}-{}'.format(area, track_id, start_time)
        self.tracker.track_id = track_id
        self.tracker.start_time = start_time

        self.assertEqual(expected_str, self.tracker.generate_face_id(area))

    def test_is_qualified_to_be_recognition_should_return_true(self):
        ''' mock some always true values to check method will return true '''
        self.tracker.get_track_time = unittest.mock.MagicMock(
            return_value=np.inf)
        self.tracker.elements = [1] * 100000
        self.assertTrue(self.tracker.is_qualified_to_be_recognized())

    def branch_test_for_is_qualified_to_be_recognition_should_return_false(
            self):
        ''' mock differents inpuy value to test all the false cases of the method '''
        track_times = [0, 0, 0, 0, np.inf, np.inf, np.inf]
        elements_lens = [np.inf, np.inf, 0, 0, np.inf, 0, 0]
        assign_new_face_id = [False, True, False, True, True, False, True]

        for track_time, elements_len, do_assign in zip(track_times,
                                                       elements_lens,
                                                       assign_new_face_id):
            self.tracker.track_time = track_time
            self.tracker.elements = [1] * elements_len
            if do_assign:
                self.tracker.face_id = 'new'
            self.assertFalse(self.tracker.is_qualified_to_be_recognized())

    def test_deep_clone_should_return_the_same_attributes_value(self):
        self.tracker.elements = [self.mock_face_info(), self.mock_face_info()]
        cloned_tracker = self.tracker.deep_clone()
        self.assertEqual(cloned_tracker.label, self.tracker.label)
        self.assertEqual(cloned_tracker.is_tracking, self.tracker.is_tracking)
        self.assertEqual(cloned_tracker.tick, self.tracker.tick)
        self.assertEqual(cloned_tracker.start_time, self.tracker.start_time)
        self.assertEqual(cloned_tracker.track_id, self.tracker.track_id)
        self.assertEqual(cloned_tracker.face_id, self.tracker.face_id)
        self.assertEqual(cloned_tracker.represent_image_id,
                         self.tracker.represent_image_id)
        self.assertEqual(cloned_tracker.send_time, self.tracker.send_time)
        self.assertEqual(cloned_tracker.is_new_face, self.tracker.is_new_face)
        self.assertEqual(cloned_tracker.track_id_path,
                         self.tracker.track_id_path)