{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport os\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport pandas as pd\nimport pathlib\nimport zipfile\n\n# Read folder paths from the CSV file\nfolder_paths = pd.read_csv(\"../input/asl-fingerspelling-alphabet-dataset/datasets/folder_paths.csv\")\ntrain_folder = folder_paths.loc[0, \"train_folder\"]\ntest_folder = folder_paths.loc[0, \"test_folder\"]\nnew_image_path = folder_paths.loc[0, \"new_image_path\"]\n\n# Data generators\ntrain_datagen = ImageDataGenerator(\n    rescale=1.0 / 255.0,\n    rotation_range=10,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    shear_range=0.1,\n    zoom_range=0.1,\n    horizontal_flip=True\n)\n\ntest_datagen = ImageDataGenerator(rescale=1.0 / 255.0)\n\ntrain_generator = train_datagen.flow_from_directory(\n    train_folder,\n    target_size=(64, 64),\n    batch_size=32,\n    class_mode='categorical'\n)\n\ntest_generator = test_datagen.flow_from_directory(\n    test_folder,\n    target_size=(64, 64),\n    batch_size=32,\n    class_mode='categorical',\n    shuffle=False\n)\n\n# Create the CNN model\nmodel = Sequential()\nmodel.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Conv2D(128, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(128, activation='relu'))\nmodel.add(Dense(26, activation='softmax'))\n\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\nmodel.fit(train_generator, epochs=100)\n\n# Save the Keras model\nmodel.save('submission.h5')\n\n# Convert the Keras model to TFLite format\nconverter = tf.lite.TFLiteConverter.from_keras_model(model)\ntflite_model = converter.convert()\n\n# Save the TFLite model to a file\nwith open('submission.tflite', 'wb') as f:\n    f.write(tflite_model)\n\n# Generate the submission.zip file containing the TFLite model\ndef generate_submission_zip(tflite_model):\n    with zipfile.ZipFile('submission.zip', 'w') as zipf:\n        zipf.write(tflite_model)   \n        zipf.write('../input/asl-fingerspelling/character_to_prediction_index.json', 'character_to_prediction_index.json')\n\n# Call the function to generate the submission.zip\ngenerate_submission_zip('submission.tflite')\n\n# Load the new image and predict the alphabet\nnew_image = tf.keras.preprocessing.image.load_img(new_image_path, target_size=(64, 64))\nnew_image = tf.keras.preprocessing.image.img_to_array(new_image)\nnew_image = np.expand_dims(new_image, axis=0)\nnew_image = new_image / 255.0\n\npredictions = model.predict(new_image)\npredicted_label_index = np.argmax(predictions)\npredicted_alphabet = chr(predicted_label_index + 65)\n\nprint(\"Predicted alphabet:\", predicted_alphabet)\n\n","metadata":{"execution":{"iopub.status.busy":"2023-07-14T18:32:01.709786Z","iopub.execute_input":"2023-07-14T18:32:01.710163Z","iopub.status.idle":"2023-07-14T18:32:24.125978Z","shell.execute_reply.started":"2023-07-14T18:32:01.710133Z","shell.execute_reply":"2023-07-14T18:32:24.124886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport os\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import KFold\nimport pandas as pd\nimport pathlib\nimport zipfile\n# Read folder paths from the CSV file\nfolder_paths = pd.read_csv(\"../input/asl-fingerspelling-alphabet-dataset/datasets/folder_paths.csv\")\ntrain_folder = folder_paths.loc[0, \"train_folder\"]\ntest_folder = folder_paths.loc[0, \"test_folder\"]\nnew_image_path = folder_paths.loc[0, \"new_image_path\"]\n# Data generators\ntrain_datagen = ImageDataGenerator(\n    rescale=1.0 / 255.0,\n    rotation_range=10,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    shear_range=0.1,\n    zoom_range=0.1,\n    horizontal_flip=True\n)\ntest_datagen = ImageDataGenerator(rescale=1.0 / 255.0)\n# Load all the images for cross-validation\nall_data_generator = train_datagen.flow_from_directory(\n    train_folder,\n    target_size=(64, 64),\n    batch_size=32,\n    class_mode='categorical',\n    shuffle=False\n)\n# Perform K-Fold cross-validation\nk = 5  # Number of folds\nkf = KFold(n_splits=k)\nfor fold_idx, (train_index, val_index) in enumerate(kf.split(all_data_generator)):\n    print(\"Fold:\", fold_idx + 1)\n    # Create the CNN model\n    model = Sequential()\n    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))\n    model.add(MaxPooling2D((2, 2)))\n    model.add(Conv2D(64, (3, 3), activation='relu'))\n    model.add(MaxPooling2D((2, 2)))\n    model.add(Conv2D(128, (3, 3), activation='relu'))\n    model.add(MaxPooling2D((2, 2)))\n    model.add(Flatten())\n    model.add(Dense(128, activation='relu'))\n    model.add(Dense(26, activation='softmax'))\n    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n    # Get the training and validation data for this fold\n    train_data_generator = train_datagen.flow_from_directory(\n        train_folder,\n        target_size=(64, 64),\n        batch_size=32,\n        class_mode='categorical',\n        shuffle=False,\n        subset='training',\n        indices=train_index\n    )\n    val_data_generator = train_datagen.flow_from_directory(\n        train_folder,\n        target_size=(64, 64),\n        batch_size=32,\n        class_mode='categorical',\n        shuffle=False,\n        subset='training',\n        indices=val_index\n    )\n    # Train the model for this fold\n    model.fit(train_data_generator, epochs=100, validation_data=val_data_generator)\n    # Save the Keras model for this fold\n    model.save(f'my_asl_model_fold_{fold_idx}.h5')\n# Convert the Keras model to TFLite format for the last fold\nconverter = tf.lite.TFLiteConverter.from_keras_model(model)\ntflite_model = converter.convert()\n# Save the TFLite model to a file\nwith open('converted_asl_fingerspelling_model.tflite', 'wb') as f:\n    f.write(tflite_model)\n# Generate the submission.zip file containing the TFLite model\ndef generate_submission_zip(tflite_path):\n    with zipfile.ZipFile('submission.zip', 'w') as zipf:\n        zipf.write(tflite_path)\n# Call the function to generate the submission.zip\ngenerate_submission_zip('converted_asl_fingerspelling_model.tflite')\n# Load the new image and predict the alphabet using the last fold's model\nnew_image = tf.keras.preprocessing.image.load_img(new_image_path, target_size=(64, 64))\nnew_image = tf.keras.preprocessing.image.img_to_array(new_image)\nnew_image = np.expand_dims(new_image, axis=0)\nnew_image = new_image / 255.0\n# Load the model from the last fold\nmodel = tf.keras.models.load_model('my_asl_model_fold_4.h5')\npredictions = model.predict(new_image)\npredicted_label_index = np.argmax(predictions)\npredicted_alphabet = chr(predicted_label_index + 65)\nprint(\"Predicted alphabet:\", predicted_alphabet)\n","metadata":{"execution":{"iopub.status.busy":"2023-07-25T18:59:40.786539Z","iopub.execute_input":"2023-07-25T18:59:40.787104Z","iopub.status.idle":"2023-07-25T18:59:41.795306Z","shell.execute_reply.started":"2023-07-25T18:59:40.787067Z","shell.execute_reply":"2023-07-25T18:59:41.793949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport os\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom sklearn.model_selection import KFold\nimport pandas as pd\nimport pathlib\nimport zipfile\n# Read folder paths from the CSV file\nfolder_paths = pd.read_csv(\"../input/asl-fingerspelling-alphabet-dataset/datasets/folder_paths.csv\")\ntrain_folder = folder_paths.loc[0, \"train_folder\"]\ntest_folder = folder_paths.loc[0, \"test_folder\"]\nnew_image_path = folder_paths.loc[0, \"new_image_path\"]\n# Data generators\ntrain_datagen = ImageDataGenerator(\n    rescale=1.0 / 255.0,\n    rotation_range=10,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    shear_range=0.1,\n    zoom_range=0.1,\n    horizontal_flip=True\n)\ntest_datagen = ImageDataGenerator(rescale=1.0 / 255.0)\n# Load all the images to count the number of samples\nall_data_generator = train_datagen.flow_from_directory(\n    train_folder,\n    target_size=(64, 64),\n    batch_size=32,\n    class_mode='categorical',\n    shuffle=False\n)\nnum_samples = all_data_generator.samples\nif num_samples >= 5:  # At least 5 samples for K-Fold cross-validation\n    # Perform K-Fold cross-validation\n    k = 2  # Number of folds\n    kf = KFold(n_splits=k)\n    for fold_idx, (train_index, val_index) in enumerate(kf.split(all_data_generator)):\n        print(\"Fold:\", fold_idx + 1)\n        # Create the CNN model\n        model = Sequential()\n        model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))\n        model.add(MaxPooling2D((2, 2)))\n        model.add(Conv2D(64, (3, 3), activation='relu'))\n        model.add(MaxPooling2D((2, 2)))\n        model.add(Conv2D(128, (3, 3), activation='relu'))\n        model.add(MaxPooling2D((2, 2)))\n        model.add(Flatten())\n        model.add(Dense(128, activation='relu'))\n        model.add(Dense(26, activation='softmax'))\n        model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n        # Get the training and validation data for this fold\n        train_data_generator = train_datagen.flow_from_directory(\n            train_folder,\n            target_size=(64, 64),\n            batch_size=32,\n            class_mode='categorical',\n            shuffle=False,\n            subset='training',\n            #indices=train_index\n        )\n        val_data_generator = train_datagen.flow_from_directory(\n            train_folder,\n            target_size=(64, 64),\n            batch_size=32,\n            class_mode='categorical',\n            shuffle=False,\n            subset='training',\n            #indices=val_index\n        )\n        # Train the model for this fold\n        model.fit(train_data_generator, epochs=100, validation_data=val_data_generator)\n        # Save the Keras model for this fold\n        model.save(f'my_asl_model_fold_{fold_idx}.h5')\nelse:\n    # Use simple train-validation split\n    split_ratio = 0.8  # 80% for training, 20% for validation\n    train_samples = int(num_samples * split_ratio)\n    val_samples = num_samples - train_samples\n    train_generator = train_datagen.flow_from_directory(\n        train_folder,\n        target_size=(64, 64),\n        batch_size=32,\n        class_mode='categorical',\n        shuffle=False,\n        subset='training',\n        seed=42\n    )\n    val_generator = train_datagen.flow_from_directory(\n        train_folder,\n        target_size=(64, 64),\n        batch_size=32,\n        class_mode='categorical',\n        shuffle=False,\n        subset='validation',\n        seed=42\n    )\n    # Create the CNN model\n    model = Sequential()\n    model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))\n    model.add(MaxPooling2D((2, 2)))\n    model.add(Conv2D(64, (3, 3), activation='relu'))\n    model.add(MaxPooling2D((2, 2)))\n    model.add(Conv2D(128, (3, 3), activation='relu'))\n    model.add(MaxPooling2D((2, 2)))\n    model.add(Flatten())\n    model.add(Dense(128, activation='relu'))\n    model.add(Dense(26, activation='softmax'))\n    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n    # Train the model on the train_generator and validate on the val_generator\n    model.fit(train_generator, epochs=100, validation_data=val_generator)\n    # Save the Keras model for this fold (train-validation split)\n    model.save('my_asl_model.h5')\n# Convert the Keras model to TFLite format for the last fold (or train-validation split)\nmodel = tf.keras.models.load_model('my_asl_model.h5')\nconverter = tf.lite.TFLiteConverter.from_keras_model(model)\ntflite_model = converter.convert()\n# Save the TFLite model to a file\nwith open('converted_asl_fingerspelling_model.tflite', 'wb') as f:\n    f.write(tflite_model)\n# Generate the submission.zip file containing the TFLite model\ndef generate_submission_zip(tflite_path):\n    with zipfile.ZipFile('submission.zip', 'w') as zipf:\n        zipf.write(tflite_path)\n# Call the function to generate the submission.zip\ngenerate_submission_zip('converted_asl_fingerspelling_model.tflite')\n# Load the new image and predict the alphabet using the last fold's model (or train-validation split model)\nnew_image = tf.keras.preprocessing.image.load_img(new_image_path, target_size=(64, 64))\nnew_image = tf.keras.preprocessing.image.img_to_array(new_image)\nnew_image = np.expand_dims(new_image, axis=0)\nnew_image = new_image / 255.0\n# Load the model from the last fold (or train-validation split model)\nmodel = tf.keras.models.load_model('my_asl_model.h5')\npredictions = model.predict(new_image)\npredicted_label_index = np.argmax(predictions)\npredicted_alphabet = chr(predicted_label_index + 65)\nprint(\"Predicted alphabet:\", predicted_alphabet)\n","metadata":{"execution":{"iopub.status.busy":"2023-07-25T19:37:38.855925Z","iopub.execute_input":"2023-07-25T19:37:38.856756Z","iopub.status.idle":"2023-07-25T19:39:03.821427Z","shell.execute_reply.started":"2023-07-25T19:37:38.856715Z","shell.execute_reply":"2023-07-25T19:39:03.820343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense\nimport pyarrow.parquet as pq\n# Load train.csv\ntrain_data = pd.read_csv('../input/asl-fingerspelling/train.csv')\n# Process the parquet files\nfor index, row in train_data.iterrows():\n    parquet_path = row['path']  # Path to the parquet file\n    \n    # Process the parquet file and extract the relevant information (landmark frames)\n    # You can use the appropriate libraries to read and process the parquet file\n    parquet_data = pq.read_table(parquet_path)\n    landmark_frames = parquet_data.to_pandas()\n    \n    # Perform classification on the landmark frames\n    # Here, you can use your trained model or build a new one based on your requirements\n    # Replace this part with your code to perform classification on the landmark frames\n    predictions = model.predict(landmark_frames)  # Example: Use a trained model to make predictions\n    \n    # Convert the predictions to labels\n    labels = np.argmax(predictions, axis=1)\n    predicted_letters = [chr(ord('A') + label) for label in labels]\n    \n    # Print the predicted letters\n    print(\"Predicted letters:\", predicted_letters)\n    \n    # Save the predicted letters to a file or perform further processing as needed\n    \n    # Example: Save the predicted letters to a CSV file\n    predicted_letters_df = pd.DataFrame({'predicted_letter': predicted_letters})\n    predicted_letters_df.to_csv('predicted_letters.csv', index=False)\n# Convert the model to TFLite format\nconverter = tf.lite.TFLiteConverter.from_keras_model(model)\ntflite_model = converter.convert()\n# Save the TFLite model to a file\nwith open('model.tflite', 'wb') as f:\n    f.write(tflite_model)\n# Zip the TFLite model and submission files\nimport zipfile\nwith zipfile.ZipFile('submission.zip', 'w') as zipf:\n    zipf.write('model.tflite')\n    zipf.write('predicted_letters.csv')\n","metadata":{"execution":{"iopub.status.busy":"2023-07-13T20:08:58.374169Z","iopub.execute_input":"2023-07-13T20:08:58.374496Z","iopub.status.idle":"2023-07-13T20:09:08.742972Z","shell.execute_reply.started":"2023-07-13T20:08:58.37447Z","shell.execute_reply":"2023-07-13T20:09:08.741349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport os\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nimport pandas as pd\nimport pathlib\nimport zipfile\n# Read folder paths from the CSV file\nfolder_paths = pd.read_csv(\"../input/asl-fingerspelling-alphabet-dataset/datasets/folder_paths.csv\")\ntrain_folder = folder_paths.loc[0, \"train_folder\"]\ntest_folder = folder_paths.loc[0, \"test_folder\"]\nnew_image_path = folder_paths.loc[0, \"new_image_path\"]\n# Data generators\ntrain_datagen = ImageDataGenerator(\n    rescale=1.0 / 255.0,\n    rotation_range=10,\n    width_shift_range=0.1,\n    height_shift_range=0.1,\n    shear_range=0.1,\n    zoom_range=0.1,\n    horizontal_flip=True\n)\ntest_datagen = ImageDataGenerator(rescale=1.0 / 255.0)\ntrain_generator = train_datagen.flow_from_directory(\n    train_folder,\n    target_size=(64, 64),\n    batch_size=32,\n    class_mode='categorical'\n)\ntest_generator = test_datagen.flow_from_directory(\n    test_folder,\n    target_size=(64, 64),\n    batch_size=32,\n    class_mode='categorical',\n    shuffle=False\n)\n# Create the CNN model\nmodel = Sequential()\nmodel.add(Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Conv2D(128, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(128, activation='relu'))\nmodel.add(Dense(26, activation='softmax'))\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\nmodel.fit(train_generator, epochs=100)\n# Save the Keras model\nmodel.save('my_asl_model.h5')\n# Convert the Keras model to TFLite format\nconverter = tf.lite.TFLiteConverter.from_keras_model(model)\ntflite_model = converter.convert()\n# Write the TFLite model to a file\nwith open('/kaggle/working/model.tflite', 'wb') as f:\n    f.write(tflite_model)\n# Zip the TFLite model\nwith zipfile.ZipFile('/kaggle/working/submission.zip', 'w') as zipf:\n    zipf.write('/kaggle/working/model.tflite')\n# Load the new image and predict the alphabet\nnew_image = tf.keras.preprocessing.image.load_img(new_image_path, target_size=(64, 64))\nnew_image = tf.keras.preprocessing.image.img_to_array(new_image)\nnew_image = np.expand_dims(new_image, axis=0)\nnew_image = new_image / 255.0\npredictions = model.predict(new_image)\npredicted_label_index = np.argmax(predictions)\npredicted_alphabet = chr(predicted_label_index + 65)\nprint(\"Predicted alphabet:\", predicted_alphabet)\n","metadata":{"execution":{"iopub.status.busy":"2023-07-06T18:48:22.387377Z","iopub.execute_input":"2023-07-06T18:48:22.387882Z","iopub.status.idle":"2023-07-06T18:49:00.127641Z","shell.execute_reply.started":"2023-07-06T18:48:22.387852Z","shell.execute_reply":"2023-07-06T18:49:00.126666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time\nimport json\nimport pandas as pd\nfrom tqdm.auto import tqdm\nimport Levenshtein as Lev\nimport tensorflow as tf\nimport zipfile\n#SEL_FEATURES = json.load(open('/kaggle/working/inference_args.json'))['selected_columns']\ndef load_relevant_data_subset(pq_path):\n    return pd.read_parquet(pq_path, columns=SEL_FEATURES)\nwith open (\"/kaggle/input/asl-fingerspelling/character_to_prediction_index.json\", \"r\") as f:\n    character_map = json.load(f)\nrev_character_map = {j:i for i,j in character_map.items()}\ndf = pd.read_csv('/kaggle/input/asl-fingerspelling/train.csv')\nidx = 0\nsample = df.loc[idx]\nloaded = load_relevant_data_subset('/kaggle/input/asl-fingerspelling/' + sample['path'])\nloaded = loaded[loaded.index == sample['sequence_id']].values\nprint(loaded.shape)\nframes = loaded\ndef wer__(s1, s2):\n    w1 = len(s1.split())\n    lvd = Lev.distance(s1, s2)\n    return lvd / w1\n# Convert the Keras model to TFLite format\nconverter = tf.lite.TFLiteConverter.from_keras_model(infr)  # infr is your TF or Keras model (tried both)\ntflite_model = converter.convert()\n# Save the TFLite model to a file\nwith open('model.tflite', 'wb') as f:\n    f.write(tflite_model)\n# Generate the submission.zip file containing the TFLite model\nwith zipfile.ZipFile('submission.zip', 'w') as zipf:\n    zipf.write('model.tflite')\n    zipf.write('inference_args.json')\ninterpreter = tf.lite.Interpreter(model_path='model.tflite')\ninterpreter.allocate_tensors()\ninput_details = interpreter.get_input_details()\noutput_details = interpreter.get_output_details()\ninterpreter.set_tensor(input_details[0]['index'], frames)\ninterpreter.invoke()\noutput_lite = interpreter.get_tensor(output_details[0]['index'])\nprediction_str = \"\".join([rev_character_map.get(s, \"\") for s in np.argmax(output_lite, axis=1)])\nprint(prediction_str)\nst = time.time()\ncnt = 0\ntotal = 100  # len(df)\nmodel_time = 0\nlevs = []\nfor i in tqdm(range(len(df.iloc[:total]))):\n    sample = df.loc[i]\n    loaded = load_relevant_data_subset('/kaggle/input/asl-fingerspelling/' + sample['path'])\n    loaded = loaded[loaded.index == sample['sequence_id']].values\n    md_st = time.time()\n    interpreter.set_tensor(input_details[0]['index'], loaded)\n    interpreter.invoke()\n    output_ = interpreter.get_tensor(output_details[0]['index'])\n    model_time += time.time() - md_st\n    prediction_str = \"\".join([rev_character_map.get(s, \"\") for s in np.argmax(output_, axis=1)])\n    cur_lev = wer__(sample['phrase'], prediction_str) \n    levs.append(cur_lev)\nprint(f'WER: {np.mean(levs):.5f}')\nprint(f'Mean time: {(time.time() - st) / total:.7f}')\nprint(f'Mean time only infer: {model_time / total:.7f}')\n","metadata":{"execution":{"iopub.status.busy":"2023-07-05T16:00:34.881366Z","iopub.execute_input":"2023-07-05T16:00:34.882003Z","iopub.status.idle":"2023-07-05T16:00:35.849785Z","shell.execute_reply.started":"2023-07-05T16:00:34.881968Z","shell.execute_reply":"2023-07-05T16:00:35.847177Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install tflite-runtime==2.9.1\nimport tflite_runtime.interpreter as tflite\nimport time\nimport json\nimport pandas as pd\nfrom tqdm.auto import tqdm\nimport Levenshtein as Lev\nimport tensorflow as tf\nconverter = tf.lite.TFLiteConverter.from_keras_model(infr)  # infr it's my TF or Keras model (tried both)\ntflite_model = converter.convert()\nwith open('model.tflite', 'wb') as f:\n    f.write(tflite_model)\n!zip submission.zip 'model.tflite' 'inference_args.json'\nSEL_FEATURES = json.load(open('/kaggle/working/inference_args.json'))['selected_columns']\ndef load_relevant_data_subset(pq_path):\n    return pd.read_parquet(pq_path, columns=SEL_FEATURES)\nwith open (\"/kaggle/input/asl-fingerspelling/character_to_prediction_index.json\", \"r\") as f:\n    character_map = json.load(f)\nrev_character_map = {j:i for i,j in character_map.items()}\ndf = pd.read_csv('/kaggle/input/asl-fingerspelling/train.csv')\nidx = 0\nsample = df.loc[idx]\nloaded = load_relevant_data_subset('/kaggle/input/asl-fingerspelling/' + sample['path'])\nloaded = loaded[loaded.index==sample['sequence_id']].values\nprint(loaded.shape)\nframes = loaded\ndef wer__(s1, s2):\n    w1 = len(s1.split())\n    lvd = Lev.distance(s1, s2)\n    return lvd / w1\ninterpreter = tflite.Interpreter('model.tflite')\ninterpreter.allocate_tensors()\ninput_details = interpreter.get_input_details()\noutput_details = interpreter.get_output_details()\nREQUIRED_SIGNATURE = 'serving_default'\nREQUIRED_OUTPUT = 'outputs'\nif REQUIRED_SIGNATURE not in interpreter.get_signature_list():\n    raise ValueError('Required input signature not found.')\nprediction_fn = lambda inputs: interpreter.set_tensor(input_details[0]['index'], inputs), interpreter.invoke(), interpreter.get_tensor(output_details[0]['index'])\noutput_lite = prediction_fn(inputs=frames)\nprediction_str = \"\".join([rev_character_map.get(s, \"\") for s in np.argmax(output_lite[0], axis=1)])\nprint(prediction_str)\nst = time.time()\ncnt = 0\ntotal = 100 #len(df)\nmodel_time = 0\nlevs = []\nfor i in tqdm(range(len(df.iloc[:total]))):\n    sample = df.loc[i]\n    loaded = load_relevant_data_subset('/kaggle/input/asl-fingerspelling/' + sample['path'])\n    loaded = loaded[loaded.index==sample['sequence_id']].values\n    md_st = time.time()\n    output_ = prediction_fn(inputs=loaded)\n    model_time += time.time() - md_st\n    prediction_str = \"\".join([rev_character_map.get(s, \"\") for s in np.argmax(output_[0], axis=1)])\n    cur_lev = wer__(sample['phrase'], prediction_str) \n    #print(sample['phrase'], '|', prediction_str, '|', cur_lev)\n    #print()\n    levs.append(cur_lev)\nprint(f'WER: {np.mean(levs):.5f}')\nprint(f'Mean time: {(time.time() - st)/total:.7f}')\nprint(f'Mean time only infer: {model_time/total:.7f}')\n","metadata":{"execution":{"iopub.status.busy":"2023-07-05T01:59:01.875553Z","iopub.execute_input":"2023-07-05T01:59:01.875908Z","iopub.status.idle":"2023-07-05T02:01:31.551111Z","shell.execute_reply.started":"2023-07-05T01:59:01.875879Z","shell.execute_reply":"2023-07-05T02:01:31.549515Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install tflite-runtime","metadata":{"execution":{"iopub.status.busy":"2023-07-05T02:01:31.552103Z","iopub.status.idle":"2023-07-05T02:01:31.552466Z","shell.execute_reply.started":"2023-07-05T02:01:31.552289Z","shell.execute_reply":"2023-07-05T02:01:31.552306Z"},"trusted":true},"execution_count":null,"outputs":[]}]}