The evaluation metric for this contest is the normalized total [levenshtein distance](https://en.wikipedia.org/wiki/Levenshtein_distance). Let the total number of characters in all of the labels be `N` and the total levenshtein distance be `D`. The metric equals `(N - D) / N`.


## Submission Process

In this competition you will be submitting a TensorFlow Lite model file. The model must take one or more landmark frames as an input and return a float vector (the predicted probabilities of each sign class) as the output. Your model must be packaged into a `submission.zip` file and compatible with the [TensorFlow Lite Runtime v2.14.0](https://www.tensorflow.org/lite/guide/python#run_an_inference_using_tflite_runtime), which we are running using Python 3.10. You are welcome to train your model using the framework of your choice, as long as you convert the model checkpoint into the tflite format prior to submission.

Your model must also perform inference in less than 5 hours and use less than 40 MB of storage space. Expect to see approximately 35 hours of video in the test set.


Each video is loaded with the following function:

```
def load_relevant_data_subset(pq_path):
    return pd.read_parquet(pq_path, columns=selected_columns)
```

If you want to load only a subset of the landmarks, include a file named `inference_args.json` in your `submission.zip` with the field `selected_columns` containing a list of the landmark columns you want to use. If that is not included we will load all columns.

Inference is performed (roughly) as follows, ignoring details like how we manage multiple videos:
```
import tflite_runtime.interpreter as tflite
interpreter = tflite.Interpreter(model_path)

REQUIRED_SIGNATURE = "serving_default"
REQUIRED_OUTPUT = "outputs"

with open ("/kaggle/input/fingerspelling-character-map/character_to_prediction_index.json", "r") as f:
    character_map = json.load(f)
rev_character_map = {j:i for i,j in character_map.items()}

found_signatures = list(interpreter.get_signature_list().keys())

if REQUIRED_SIGNATURE not in found_signatures:
    raise KernelEvalException('Required input signature not found.')

prediction_fn = interpreter.get_signature_runner("serving_default")
output = prediction_fn(inputs=frames)
prediction_str = "".join([rev_character_map.get(s, "") for s in np.argmax(output[REQUIRED_OUTPUT], axis=1)])
```
