def test_fail_prediction_by_invalid_model_type(self): with self.assertRaises(InvalidMessage): messagebus.handle( commands.MakePrediction( image_path=os.path.join(ROOT_DIR, 'tests', 'data', 'sample.jpg'), model_type='invalid', ))
def test_raise_error_if_topk_is_negative(self): with self.assertRaises(ValueError): messagebus.handle( commands.MakePrediction( image_path=os.path.join(ROOT_DIR, 'tests', 'data', 'sample.jpg'), model_type='fake', topk=-3, ))
def test_raise_error_due_to_wrong_image_format_when_predicting(self): fp = tempfile.NamedTemporaryFile() fp.write(b'non-image data') with self.assertRaises(InvalidImageDataFormat): messagebus.handle( commands.MakePrediction( image_path=fp.name, model_type='fake', ), )
def upload_image_file_object(img_file): """Read image file data and save to Database if valid. Return error if the given file is invalid. """ if img_file: try: encode = messagebus.handle( commands.UploadImage(file_object=img_file)) except Exception as e: kwargs = {'status': 'error', 'message': 'failed to save image'} if config.DEBUG: # pragma: no cover logger.error(traceback.format_exc()) else: # pragma: no cover logger.error(e) status_code = 400 else: kwargs = {'status': 'success', 'imgId': encode} status_code = 201 else: # pragma: no cover if config.DEBUG: logger.error('Counld not find image') kwargs = {'status': 'error', 'message': 'failed to upload image'} status_code = 400 return kwargs, status_code
def test_run_prediction(self): pred = messagebus.handle( commands.MakePrediction( image_path=os.path.join(ROOT_DIR, 'tests', 'data', 'sample.jpg'), model_type='fake', )) self.assertTrue(isinstance(pred, np.ndarray))
def test_get_labels_with_prediction(self): result = messagebus.handle( commands.MakePrediction( image_path=os.path.join(ROOT_DIR, 'tests', 'data', 'sample.jpg'), model_type='fake', topk=3, )) self.assertEqual(len(result), 3)
def test_add_label_to_prediction_result(self): data = np.random.randint(1, 100, len(FakeLabelData.labels)).astype(np.float32) data /= data.sum() result = messagebus.handle( commands.LabelPrediction(prediction=data, model_type='fake', topk=2)) self.assertEqual(len(result), 2)
def fetch_label_list(model_type): try: label_list = messagebus.handle( commands.FetchLabels(model_type=model_type)) except InvalidMessage: return {'status': 'error', 'message': 'Invalid model type'}, 400 kwargs = {'status': 'success', 'labelList': label_list} response = jsonify(**kwargs) response.status_code = 200 return response
def predict_image(model_type): """Predict image from a provided file. The output format is: { status: str imgId: str result: List } """ img_file = request.files['file'] kwargs, status_code = upload_image_file_object(img_file) if status_code == 201: try: model = Image.get_by_encoded_id(kwargs.get('imgId')) filepath = os.path.join(config.STATIC_DIR, config.UPLOAD_DIR, model.filename) result = messagebus.handle( commands.MakePrediction( image_path=filepath, model_type=model_type, topk=3, )) # convert float to percentages to display to be readable result = list(map(serialize_predict_result, result)) kwargs['result'] = result except Exception as e: if config.DEBUG: # pragma: no cover logger.error(traceback.format_exc()) else: # pragma: no cover logger.error(e) kwargs = { 'status': 'error', 'message': 'a problem occured during prediction' } status_code = 500 response = jsonify(kwargs) response.status_code = status_code return response
def test_fetch_labels_by_invalid_model_type(self): with self.assertRaises(InvalidMessage): messagebus.handle(commands.FetchLabels(model_type='invalid'))
def test_fetch_all_label_items(self): labels = messagebus.handle(commands.FetchLabels(model_type='fake')) self.assertEqual(labels, FakeLabelData.labels)
def test_fetch_target_label(self): label = messagebus.handle( commands.FetchLabels(model_type='fake', label_id=2))[0] self.assertEqual(label, FakeLabelData.labels[2])