{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":46105,"databundleVersionId":5087314,"sourceType":"competition"}],"dockerImageVersionId":30461,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-04-19T02:53:21.937898Z","iopub.execute_input":"2023-04-19T02:53:21.938472Z","iopub.status.idle":"2023-04-19T02:53:43.676567Z","shell.execute_reply.started":"2023-04-19T02:53:21.93842Z","shell.execute_reply":"2023-04-19T02:53:43.675173Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport pandas as pd\nimport numpy as np\nfrom scipy.interpolate import interp1d","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:43.678963Z","iopub.execute_input":"2023-04-19T02:53:43.679344Z","iopub.status.idle":"2023-04-19T02:53:43.685632Z","shell.execute_reply.started":"2023-04-19T02:53:43.679308Z","shell.execute_reply":"2023-04-19T02:53:43.684334Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ls","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:43.687664Z","iopub.execute_input":"2023-04-19T02:53:43.688081Z","iopub.status.idle":"2023-04-19T02:53:44.813928Z","shell.execute_reply.started":"2023-04-19T02:53:43.688044Z","shell.execute_reply":"2023-04-19T02:53:44.812275Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\"\"\"Config\"\"\"\ndiscart_points_face = True\nlandmarks = 75 # 75 sin puntos de la cara y con puntos de la cara son 543\ndata = pd.read_csv(\"/kaggle/input/asl-signs/train.csv\") # Cargar el csv\nword = \"time\" \nwords = data[\"sign\"].unique()\nnumber_words = 33 # Número de palabras a generar\nfiltered_data = data[data[\"sign\"] == word] # Filtrar por palabra\ncsv_path = \"filter_for_word.csv\" # Guardar el csv filtrado\nfiltered_data.to_csv(csv_path, index=False) # Guardar el csv filtrado\nnum_frames = 60 # Número de fotogramas para las secuencias interpoladas","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:44.818689Z","iopub.execute_input":"2023-04-19T02:53:44.819956Z","iopub.status.idle":"2023-04-19T02:53:44.994652Z","shell.execute_reply.started":"2023-04-19T02:53:44.819891Z","shell.execute_reply":"2023-04-19T02:53:44.991948Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#leer un .parquet aleatorio\npath_one_file = \"/kaggle/input/asl-signs/\"+ filtered_data.iloc[6][\"path\"]\ndf = pd.read_parquet(path_one_file)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:44.996661Z","iopub.execute_input":"2023-04-19T02:53:44.99713Z","iopub.status.idle":"2023-04-19T02:53:45.012956Z","shell.execute_reply.started":"2023-04-19T02:53:44.997088Z","shell.execute_reply":"2023-04-19T02:53:45.011582Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def process_path_data(path_number, filtered_data):\n    \"\"\"\n    Procesa los datos de una ruta específica (los .parquet), extrae y reformatea la información relevante de los puntos (x, y).\n\n    Args:\n        path_number (int): El índice de la ruta en el DataFrame filtered_data.\n        filtered_data (pandas.DataFrame): Un DataFrame que contiene información sobre las rutas de los archivos de datos.\n\n    Returns:\n        numpy.ndarray: Un array de la secuencia reformateada con la forma (num_samples, 543, 2), donde num_samples es el\n                       número de fotogramas únicos en los datos.\n    \"\"\"\n    path_file = \"/kaggle/input/asl-signs/\" + filtered_data.iloc[path_number][\"path\"]\n    data = pd.read_parquet(path_file)\n    if discart_points_face == True:\n        data = data[data[\"type\"] != \"face\"]\n    #busca entre los puntos X y Y y cambia los que sean NaN a 0\n    data[\"x\"] = data[\"x\"].fillna(1)\n    data[\"y\"] = data[\"y\"].fillna(1)\n    cleaned_data = data[[\"frame\", \"x\", \"y\"]]\n    num_samples = cleaned_data[\"frame\"].nunique()\n    cleaned_data = cleaned_data[[\"x\", \"y\"]].to_numpy()\n    seq = cleaned_data.reshape(num_samples, landmarks, 2)\n    return seq","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:45.014863Z","iopub.execute_input":"2023-04-19T02:53:45.015222Z","iopub.status.idle":"2023-04-19T02:53:45.023985Z","shell.execute_reply.started":"2023-04-19T02:53:45.015187Z","shell.execute_reply":"2023-04-19T02:53:45.022691Z"},"jupyter":{"source_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def add_descriptors(sequence):\n    \"\"\"\n    Añade los descriptores de derivada a una secuencia.\n\n    Args:\n        sequence (numpy.ndarray): La secuencia de entrada con la forma (num_frames, landmarks, 2).\n\n    Returns:\n        numpy.ndarray: La secuencia con los descriptores de derivada añadidos con la forma (num_frames, landmarks, 4).\n    \"\"\"\n    # Calcula la derivada x e y para cada fotograma de la secuencia\n    dx = np.gradient(sequence[:, :, 0], axis=0)\n    dy = np.gradient(sequence[:, :, 1], axis=0)\n    \n    # Concatena la secuencia original con las derivadas dx e dy\n    sequence_with_descriptors = np.concatenate([sequence, dx[:, :, np.newaxis], dy[:, :, np.newaxis]], axis=2)\n\n    return sequence_with_descriptors","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:45.026026Z","iopub.execute_input":"2023-04-19T02:53:45.026537Z","iopub.status.idle":"2023-04-19T02:53:45.041121Z","shell.execute_reply.started":"2023-04-19T02:53:45.026463Z","shell.execute_reply":"2023-04-19T02:53:45.040161Z"},"jupyter":{"source_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def interpolate_sequence(seq, num_frames):\n    \"\"\"\n    Interpola una secuencia única a una longitud específica en la dimensión del tiempo.\n    \n    Args:\n        seq (numpy.ndarray): La secuencia de entrada con la forma (T, landmarks, 2), donde T es el número de fotogramas.\n        num_frames (int): El número de fotogramas para la secuencia interpolada.\n\n    Returns:\n        numpy.ndarray: La secuencia interpolada con la forma (num_frames, landmarks, 2).\n    \"\"\"\n    seq_interp = np.zeros((num_frames, landmarks, 2))\n    seq = np.nan_to_num(seq)\n    \n    for i in range(landmarks):\n        for j in range(2):\n            f = interp1d(np.arange(seq.shape[0]), seq[:, i, j], kind='linear')\n            seq_interp[:, i, j] = f(np.linspace(0, seq.shape[0] - 1, num_frames))\n\n    return seq_interp","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:45.042703Z","iopub.execute_input":"2023-04-19T02:53:45.04413Z","iopub.status.idle":"2023-04-19T02:53:45.059381Z","shell.execute_reply.started":"2023-04-19T02:53:45.04407Z","shell.execute_reply":"2023-04-19T02:53:45.057101Z"},"jupyter":{"source_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def interpolate_sequences_list(sequences, num_frames):\n    \"\"\"\n    Interpola una lista de secuencias a una longitud específica en la dimensión del tiempo.\n    \n    Args:\n        sequences (list): Una lista de secuencias, cada una con la forma (T, 543, 2), donde T es el número de fotogramas.\n        num_frames (int): El número de fotogramas para las secuencias interpoladas.\n\n    Returns:\n        numpy.ndarray: Un array que contiene las secuencias interpoladas con la forma (num_frames, 543, 2, num_sequences),\n                       donde num_sequences es el número de secuencias en la lista de entrada.\n    \"\"\"\n    num_sequences = len(sequences)\n    interpolated_sequences = np.zeros((num_frames, landmarks, 2, num_sequences))\n    \n    for idx, seq in enumerate(sequences):\n        seq_interp = interpolate_sequence(seq, num_frames)\n        interpolated_sequences[:, :, :, idx] = seq_interp\n    \n    return interpolated_sequences\n","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:45.062295Z","iopub.execute_input":"2023-04-19T02:53:45.062901Z","iopub.status.idle":"2023-04-19T02:53:45.078573Z","shell.execute_reply.started":"2023-04-19T02:53:45.062843Z","shell.execute_reply":"2023-04-19T02:53:45.077136Z"},"jupyter":{"source_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def export_file_train(filtered_data, num_frames):\n    \"\"\"unic word train data select in the config\"\"\"\n    sequences = [] # Lista de secuencias\n    for i in range(filtered_data.shape[0]):\n        seq = process_path_data(i, filtered_data)\n        sequences.append(seq)\n\n    interpolated_sequences = interpolate_sequences_list(sequences, num_frames)\n    interpolated_sequences = interpolated_sequences.transpose((3,0,1,2)) #reorganizacion\n\n    # Añade los descriptores de derivada para cada secuencia interpolada\n    interpolated_sequences_with_descriptors = []\n    for seq in interpolated_sequences:\n        seq_with_descriptors = add_descriptors(seq)\n        interpolated_sequences_with_descriptors.append(seq_with_descriptors)\n\n    # Convierte la lista de secuencias interpoladas con descriptores en un array de NumPy\n    interpolated_sequences_with_descriptors = np.array(interpolated_sequences_with_descriptors)\n\n    print(interpolated_sequences_with_descriptors.shape) # (num_sequences, num_frames, landmarks, n-descriptors)\n\n    \"\"\" export interpolated_sequences to npy\"\"\"\n    if discart_points_face is True:\n        np.save(f\"interpolated_sequences_{word}_75points_with_descriptors.npy\", interpolated_sequences_with_descriptors)\n        plt.plot(interpolated_sequences_with_descriptors[1, :, 0], interpolated_sequences_with_descriptors[1, :, 1], 'o')\n    else:\n        np.save(f\"interpolated_sequences_{word}_543points_with_descriptors.npy\", interpolated_sequences_with_descriptors)\n        plt.plot(interpolated_sequences_with_descriptors[1, :, 0], interpolated_sequences_with_descriptors[1, :, 1], 'o')\n","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:45.082629Z","iopub.execute_input":"2023-04-19T02:53:45.083028Z","iopub.status.idle":"2023-04-19T02:53:45.095468Z","shell.execute_reply.started":"2023-04-19T02:53:45.082993Z","shell.execute_reply":"2023-04-19T02:53:45.093972Z"},"jupyter":{"source_hidden":true},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\"\"\"main\"\"\"\n# se seleccionan de forma aleatoria y de un tamaño de \"number_words\" las palabras que se van a utilizar de forma tal de que no se repitan\nwords_select = np.random.choice(words, size=number_words, replace=False)\nfor word in words_select:\n    filtered_data = data[data[\"sign\"] == word] # Filtrar por palabra\n    export_file_train(filtered_data, num_frames)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T02:53:45.097188Z","iopub.execute_input":"2023-04-19T02:53:45.097587Z","iopub.status.idle":"2023-04-19T03:05:54.627061Z","shell.execute_reply.started":"2023-04-19T02:53:45.097547Z","shell.execute_reply":"2023-04-19T03:05:54.623655Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras import Input, Model\nfrom tensorflow.keras import layers, models","metadata":{"execution":{"iopub.status.busy":"2023-04-19T03:44:43.174658Z","iopub.execute_input":"2023-04-19T03:44:43.175065Z","iopub.status.idle":"2023-04-19T03:44:43.182045Z","shell.execute_reply.started":"2023-04-19T03:44:43.175026Z","shell.execute_reply":"2023-04-19T03:44:43.18007Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"val = []\ntime = np.load(\"/kaggle/working/interpolated_sequences_noisy_75points_with_descriptors.npy\")\npuzzle = np.load(\"/kaggle/working/interpolated_sequences_snow_75points_with_descriptors.npy\")\n\ntime = time[:, :, :, 0:2]\npuzzle = puzzle[:, :, :, 0:2]\n\n# %% separar trainy test\na, b, c, d = time.shape\nl_train = int(0.5 * a)\ntime_train = time[0:l_train, :, :, :]\ntime_test = time[l_train:-1, :, :, :]\na, b, c, d = puzzle.shape\nl_train = int(0.5 * a)\npuzzle_train = puzzle[0:l_train, :, :, :]\npuzzle_test = puzzle[l_train:-1, :, :, :]\n# %% concatenar clases\nX_train = np.concatenate((time_train, puzzle_train), axis=0)\nX_test = np.concatenate((time_test, puzzle_test), axis=0)\n# Reemplazar valores nan\n# X_train = np.nan_to_num(X_train, nan=0.5)\n# X_test = np.nan_to_num(X_test, nan=0.5)\ny_train = np.concatenate(\n    (np.zeros(len(time_train)), np.ones(len(puzzle_train))), axis=0\n)\ny_test = np.concatenate((np.zeros(len(time_test)), np.ones(len(puzzle_test))), axis=0)\n\ny_train_oh = keras.utils.to_categorical(y_train)\ny_test_oh = keras.utils.to_categorical(y_test)\na, b, c, d = X_train.shape\nprint(a, b, c, d)","metadata":{"execution":{"iopub.status.busy":"2023-04-19T03:45:48.793616Z","iopub.execute_input":"2023-04-19T03:45:48.79404Z","iopub.status.idle":"2023-04-19T03:45:48.896908Z","shell.execute_reply.started":"2023-04-19T03:45:48.794005Z","shell.execute_reply":"2023-04-19T03:45:48.89548Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\"\"\"Model train\"\"\"\nmodel = models.Sequential()\n\nmodel.add(\n    layers.Conv2D(\n        256,\n        (7, 1),\n        activation=\"relu\",\n        padding=\"same\",\n        strides=(3, 3),\n        input_shape=(b, c, d),\n    )\n)\n# model.add(layers.MaxPooling2D((2, 2)))\n\nmodel.add(\n    layers.Conv2D(128, (3, 3), activation=\"relu\", padding=\"valid\", strides=(1, 1))\n)\n# model.add(layers.MaxPooling2D((2, 2)))\n\nmodel.add(\n    layers.Conv2D(128, (3, 3), activation=\"relu\", padding=\"valid\", strides=(1, 1))\n)\n# model.add(layers.MaxPooling2D((2, 2)))\n\nmodel.add(layers.Flatten())\nmodel.add(keras.layers.Dense(128, activation=\"relu\"))\nmodel.add(keras.layers.Dense(2, activation=\"softmax\"))\nmodel.summary()\n\nmodel.compile(\n    loss=\"categorical_crossentropy\",\n    optimizer=keras.optimizers.SGD(lr=0.001),\n    metrics=[\"accuracy\"],\n)\nhistory = model.fit(\n    x=X_train,\n    y=y_train_oh,\n    batch_size=64,\n    epochs=300,\n    validation_data=(X_test, y_test_oh),\n)\n\nmax_val_acc = np.max(history.history[\"val_acc\"])\n\nval = np.append(val, max_val_acc)\nplt.figure()\nplt.plot(val, \"--*\")\nplt.xlabel(\"punto\")\nplt.ylabel(\"val accuracy\")\n\nplt.figure()\nplt.plot(history.history[\"loss\"], label=\"train loss\")\nplt.plot(history.history[\"val_loss\"], label=\"val loss\")\nplt.xlabel(\"epochs\", fontsize=15)\nplt.legend(fontsize=20)\nplt.figure()\nplt.plot(history.history[\"acc\"], label=\"train accuracy\")\nplt.plot(history.history[\"val_acc\"], label=\"val accuracy\")\nplt.xlabel(\"epochs\", fontsize=15)\nplt.legend(fontsize=20)\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-04-19T04:03:07.932316Z","iopub.execute_input":"2023-04-19T04:03:07.932957Z","iopub.status.idle":"2023-04-19T04:03:47.095616Z","shell.execute_reply.started":"2023-04-19T04:03:07.932918Z","shell.execute_reply":"2023-04-19T04:03:47.094219Z"},"trusted":true},"outputs":[],"execution_count":null}]}