From 0b763b72ac37236ccf8960828074932f6a805b3a Mon Sep 17 00:00:00 2001 From: thgc Date: Sun, 24 Jul 2022 16:24:33 -0300 Subject: [PATCH] updating models --- extraction_model.ipynb | 326 ++++++++++++++++++++++++++ predict_model.ipynb | 277 ++++++++++++++++++++++ train_model.ipynb | 517 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1120 insertions(+) create mode 100644 extraction_model.ipynb create mode 100644 predict_model.ipynb create mode 100644 train_model.ipynb diff --git a/extraction_model.ipynb b/extraction_model.ipynb new file mode 100644 index 0000000..350fff1 --- /dev/null +++ b/extraction_model.ipynb @@ -0,0 +1,326 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#%pip install tensorflow tensorflow-gpu opencv-python mediapipe sklearn matplotlib" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import cv2\n", + "import numpy as np\n", + "import os\n", + "from matplotlib import pyplot as plt\n", + "import time\n", + "import datetime\n", + "import mediapipe as mp" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Diretório para os pontos coletados\n", + "DATA_DIR = os.path.join('Dados_extraidos') \n", + "\n", + "# Sinais\n", + "sinais = np.array(['Ola','Tudo bem','Obrigado','Entendo','Calma'])\n", + "\n", + "# Quantidade de vídeos por sinal\n", + "num_videos = 10\n", + "\n", + "# Quantidade de frames por vídeo\n", + "num_frames = 30" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mp_holistic = mp.solutions.holistic \n", + "mp_drawing = mp.solutions.drawing_utils\n", + "mp_drawing_styles = mp.solutions.drawing_styles\n", + "cam = cv2.VideoCapture(0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def mediapipe_extrai(imagem, modelo):\n", + " imagem = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB) \n", + " imagem.flags.writeable = False \n", + " resultados = modelo.process(imagem) \n", + " imagem.flags.writeable = True \n", + " imagem = cv2.cvtColor(imagem, cv2.COLOR_RGB2BGR) \n", + " return imagem, resultados" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def mediapipe_desenha(imagem, resultados):\n", + " # Pontos do rosto\n", + " mp_drawing.draw_landmarks(imagem, resultados.face_landmarks, mp_holistic.FACEMESH_CONTOURS, \n", + " mp_drawing.DrawingSpec(color=(153,0,153), thickness=1, circle_radius=1), \n", + " mp_drawing_styles.get_default_face_mesh_contours_style()\n", + " ) \n", + " # Pontos do corpo\n", + " mp_drawing.draw_landmarks(imagem, resultados.pose_landmarks, mp_holistic.POSE_CONNECTIONS,\n", + " mp_drawing.DrawingSpec(color=(153,0,153), thickness=2, circle_radius=3), \n", + " mp_drawing.DrawingSpec(color=(255,40,130), thickness=2, circle_radius=1)\n", + " ) \n", + " # Pontos da mão esquerda\n", + " mp_drawing.draw_landmarks(imagem, resultados.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS, \n", + " mp_drawing.DrawingSpec(color=(153,0,153), thickness=1, circle_radius=3), \n", + " mp_drawing.DrawingSpec(color=(35,100,255), thickness=1, circle_radius=1)\n", + " ) \n", + " # Pontos da mão direita \n", + " mp_drawing.draw_landmarks(imagem, resultados.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS, \n", + " mp_drawing.DrawingSpec(color=(153,0,153), thickness=1, circle_radius=3), \n", + " mp_drawing.DrawingSpec(color=(247,0,247), thickness=1, circle_radius=1)\n", + " ) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def mediapipe_desenha_extrai(cam, modelo):\n", + " ret, frame = cam.read() # Ler o frame\n", + " imagem, resultados = mediapipe_extrai(frame, modelo)# Fazer detecções\n", + " mediapipe_desenha(imagem, resultados) # Desenhar pontos\n", + " return imagem, resultados" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def trata_pontos(resultados):\n", + "\n", + " rosto = []\n", + " corpo = []\n", + " mao_esquerda = []\n", + " mao_direita = []\n", + "\n", + " if resultados.face_landmarks:\n", + " for r in resultados.face_landmarks.landmark:\n", + " ponto = np.array([r.x, r.y, r.z])\n", + " rosto.append(ponto)\n", + " else:\n", + " rosto = np.zeros(468*3) \n", + "\n", + " if resultados.pose_landmarks:\n", + " for r in resultados.pose_landmarks.landmark:\n", + " ponto = np.array([r.x, r.y, r.z, r.visibility])\n", + " corpo.append(ponto)\n", + " else:\n", + " corpo = np.zeros(33*4) \n", + " \n", + " if resultados.left_hand_landmarks:\n", + " for r in resultados.left_hand_landmarks.landmark:\n", + " ponto = np.array([r.x, r.y, r.z])\n", + " mao_esquerda.append(ponto)\n", + " else:\n", + " mao_esquerda = np.zeros(21*3) \n", + "\n", + " if resultados.right_hand_landmarks:\n", + " for r in resultados.right_hand_landmarks.landmark:\n", + " ponto = np.array([r.x, r.y, r.z])\n", + " mao_direita.append(ponto)\n", + " else:\n", + " mao_direita = np.zeros(21*3)\n", + "\n", + " rosto = np.array(rosto).flatten() \n", + " corpo = np.array(corpo).flatten()\n", + " mao_esquerda = np.array(mao_esquerda).flatten()\n", + " mao_direita = np.array(mao_direita).flatten()\n", + "\n", + " return np.concatenate([corpo, rosto, mao_esquerda, mao_direita]) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Monta toda estrutura de diretórios\n", + "for sinal in sinais: \n", + " for video in range(num_videos):\n", + " try: \n", + " os.makedirs(os.path.join(DATA_DIR, sinal, str(video)))\n", + " except:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with mp_holistic.Holistic() as holistic:\n", + " \n", + " while cam.isOpened():\n", + "\n", + " # Desenha pontos na imagem e extrai características em resultados\n", + " imagem, resultados = mediapipe_desenha_extrai(cam, holistic)\n", + "\n", + " # Enunciado na tela\n", + " cv2.putText(imagem,'Por favor, posicione-se da cintura para cima',(20, 40),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=0.8,color=(0, 255, 255), thickness = 2,lineType=cv2.LINE_AA) \n", + " cv2.putText(imagem,'Tecle barra para continuar',(20, 80),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 255, 255), thickness = 2,lineType=cv2.LINE_AA) \n", + " \n", + " # Mostra a tela\n", + " cv2.imshow('LIBRAS', imagem)\n", + "\n", + " # Espera pela tecla\n", + " if cv2.waitKey(10) & 0xFF == ord(' '):\n", + " cv2.destroyAllWindows()\n", + " break\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_polegar_direito = resultados.pose_landmarks.landmark[22].x\n", + "pontos_tratados = trata_pontos(resultados)\n", + "indice = np.where(pontos_tratados == x_polegar_direito)[0]\n", + "print(indice)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with mp_holistic.Holistic() as holistic:\n", + "\n", + " for sinal in sinais:\n", + "\n", + " #video inicial\n", + " video = 0\n", + "\n", + " while video < num_videos:\n", + " \n", + " # Enunciado\n", + " while cam.isOpened():\n", + " imagem, resultados = mediapipe_desenha_extrai(cam, holistic)\n", + " cv2.putText(imagem,'Sinal {}, video numero {}'.format(sinal, video),(20, 40),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 255, 255), thickness = 2) \n", + " cv2.putText(imagem,'Tecle barra para gravar',(20, 80),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 255, 255), thickness = 2) \n", + " cv2.imshow('LIBRAS', imagem)\n", + " if cv2.waitKey(10) & 0xFF == ord(' '):\n", + " break\n", + "\n", + " # Contagem regressiva\n", + " contador = 3\n", + " inicio = time.time()\n", + " while contador > 0:\n", + " imagem, resultados = mediapipe_desenha_extrai(cam, holistic)\n", + " cv2.putText(imagem,'Preparando pra gravar: {}'.format(contador),(20, 40),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 255, 255), thickness = 2)\n", + " cv2.imshow('LIBRAS', imagem)\n", + " cv2.waitKey(10)\n", + " final = time.time()\n", + " if final - inicio >= 1:\n", + " contador-=1\n", + " inicio=final\n", + "\n", + " # Gravando\n", + " for frame_num in range(num_frames):\n", + "\n", + " # Desenha pontos na imagem e extrai características em resultados\n", + " imagem, resultados = mediapipe_desenha_extrai(cam, holistic)\n", + "\n", + " # Mostra na tela\n", + " cv2.putText(imagem,'Sinal {}, video numero {}'.format(sinal, video),(20, 40),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 255, 255), thickness = 2) \n", + " cv2.putText(imagem,'Gravando...',(20, 80),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 0, 255), thickness = 2) \n", + " cv2.imshow('LIBRAS', imagem)\n", + " cv2.waitKey(10)\n", + "\n", + " # Trata os pontos e arquiva\n", + " pontos_tratados = trata_pontos(resultados)\n", + " nome_arquivo = os.path.join(DATA_DIR, sinal, str(video), str(frame_num))\n", + " np.save(nome_arquivo, pontos_tratados)\n", + "\n", + " # Gravar novamente\n", + " while cam.isOpened():\n", + " # Desenha pontos na imagem e extrai características em resultados\n", + " imagem, resultados = mediapipe_desenha_extrai(cam, holistic)\n", + " cv2.putText(imagem,'Sinal {}, video numero {}'.format(sinal, video),(20, 40),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 255, 255), thickness = 2) \n", + " cv2.putText(imagem,'Para repetir, tecle \"r\"',(20, 80),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 255, 255), thickness = 2)\n", + " cv2.putText(imagem,'Para prosseguir, tecle barra',(20, 120),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 255, 255), thickness = 2) \n", + " cv2.imshow('LIBRAS', imagem)\n", + " k = cv2.waitKey(10)\n", + " if k & 0xFF == ord('r'):\n", + " video-=1\n", + " break\n", + " if k & 0xFF == ord(' '):\n", + " break\n", + " video +=1\n", + "\n", + "cam.release()\n", + "cv2.destroyAllWindows()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Zipando a pasta dos dados coletados\n", + "import shutil\n", + "shutil.make_archive('Dados_extraidos', 'zip', 'Dados_extraidos')" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "362f9b98393e3f0a487724f0683d667170a7d1c551755b1686e5e3f1c636f922" + }, + "kernelspec": { + "display_name": "Python 3.9.5 64-bit", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/predict_model.ipynb b/predict_model.ipynb new file mode 100644 index 0000000..9b12cb1 --- /dev/null +++ b/predict_model.ipynb @@ -0,0 +1,277 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import cv2\n", + "import numpy as np\n", + "import os\n", + "import time\n", + "import datetime\n", + "import mediapipe as mp\n", + "\n", + "from matplotlib import pyplot as plt\n", + "from statistics import mode\n", + "from sklearn.model_selection import train_test_split\n", + "from tensorflow.keras.utils import to_categorical\n", + "\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import LSTM, Dense, Dropout, GaussianNoise\n", + "from tensorflow.keras.callbacks import TensorBoard" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Diretório para os pontos coletados\n", + "DATA_DIR = os.path.join('Dados_extraidos') \n", + "\n", + "# Sinais\n", + "sinais = np.array(['Ola','Tudo bem','Obrigado','Entendo','Calma'])\n", + "\n", + "# Quantidade de vídeos por sinal\n", + "num_videos = 400\n", + "\n", + "# Quantidade de frames por vídeo\n", + "num_frames = 30\n", + "\n", + "#Quantidade de coordenadas por frame\n", + "num_coordenadas = 1662\n", + "\n", + "# Quantidade de frames por vídeo\n", + "num_frames = 30" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "mp_holistic = mp.solutions.holistic \n", + "mp_drawing = mp.solutions.drawing_utils\n", + "mp_drawing_styles = mp.solutions.drawing_styles\n", + "cam = cv2.VideoCapture(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def mediapipe_extrai(imagem, modelo):\n", + " imagem = cv2.cvtColor(imagem, cv2.COLOR_BGR2RGB) \n", + " imagem.flags.writeable = False \n", + " resultados = modelo.process(imagem) \n", + " imagem.flags.writeable = True \n", + " imagem = cv2.cvtColor(imagem, cv2.COLOR_RGB2BGR) \n", + " return imagem, resultados" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def mediapipe_desenha(imagem, resultados):\n", + " # Pontos do rosto\n", + " mp_drawing.draw_landmarks(imagem, resultados.face_landmarks, mp_holistic.FACEMESH_CONTOURS, \n", + " mp_drawing.DrawingSpec(color=(153,0,153), thickness=1, circle_radius=1), \n", + " mp_drawing_styles.get_default_face_mesh_contours_style()\n", + " ) \n", + " # Pontos do corpo\n", + " mp_drawing.draw_landmarks(imagem, resultados.pose_landmarks, mp_holistic.POSE_CONNECTIONS,\n", + " mp_drawing.DrawingSpec(color=(153,0,153), thickness=2, circle_radius=3), \n", + " mp_drawing.DrawingSpec(color=(255,40,130), thickness=2, circle_radius=1)\n", + " ) \n", + " # Pontos da mão esquerda\n", + " mp_drawing.draw_landmarks(imagem, resultados.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS, \n", + " mp_drawing.DrawingSpec(color=(153,0,153), thickness=1, circle_radius=3), \n", + " mp_drawing.DrawingSpec(color=(35,100,255), thickness=1, circle_radius=1)\n", + " ) \n", + " # Pontos da mão direita \n", + " mp_drawing.draw_landmarks(imagem, resultados.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS, \n", + " mp_drawing.DrawingSpec(color=(153,0,153), thickness=1, circle_radius=3), \n", + " mp_drawing.DrawingSpec(color=(247,0,247), thickness=1, circle_radius=1)\n", + " ) " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def mediapipe_desenha_extrai(cam, modelo):\n", + " ret, frame = cam.read() # Ler o frame\n", + " imagem, resultados = mediapipe_extrai(frame, modelo)# Fazer detecções\n", + " mediapipe_desenha(imagem, resultados) # Desenhar pontos\n", + " return imagem, resultados" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def trata_pontos(resultados):\n", + "\n", + " rosto = []\n", + " corpo = []\n", + " mao_esquerda = []\n", + " mao_direita = []\n", + "\n", + " if resultados.face_landmarks:\n", + " for r in resultados.face_landmarks.landmark:\n", + " ponto = np.array([r.x, r.y, r.z])\n", + " rosto.append(ponto)\n", + " else:\n", + " rosto = np.zeros(468*3) \n", + "\n", + " if resultados.pose_landmarks:\n", + " for r in resultados.pose_landmarks.landmark:\n", + " ponto = np.array([r.x, r.y, r.z, r.visibility])\n", + " corpo.append(ponto)\n", + " else:\n", + " corpo = np.zeros(33*4) \n", + " \n", + " if resultados.left_hand_landmarks:\n", + " for r in resultados.left_hand_landmarks.landmark:\n", + " ponto = np.array([r.x, r.y, r.z])\n", + " mao_esquerda.append(ponto)\n", + " else:\n", + " mao_esquerda = np.zeros(21*3) \n", + "\n", + " if resultados.right_hand_landmarks:\n", + " for r in resultados.right_hand_landmarks.landmark:\n", + " ponto = np.array([r.x, r.y, r.z])\n", + " mao_direita.append(ponto)\n", + " else:\n", + " mao_direita = np.zeros(21*3)\n", + "\n", + " rosto = np.array(rosto).flatten() \n", + " corpo = np.array(corpo).flatten()\n", + " mao_esquerda = np.array(mao_esquerda).flatten()\n", + " mao_direita = np.array(mao_direita).flatten()\n", + "\n", + " return np.concatenate([corpo, rosto, mao_esquerda, mao_direita]) " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Configura a rede neural\n", + "\n", + "model = Sequential()\n", + "model.add(LSTM(512, activation='relu', input_shape=(num_frames,num_coordenadas)))\n", + "model.add(Dense(512, activation='relu'))\n", + "model.add(Dense(sinais.shape[0], activation='softmax'))\n", + "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['categorical_accuracy'])\n", + "\n", + "model.load_weights('pesosbons.h5')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "sequencia = []\n", + "predicao = ''\n", + "limiar_predicao = 0.5\n", + "contador_neutro = 0\n", + "tempo_inativo = 45\n", + "cam = cv2.VideoCapture(0)\n", + "\n", + "with mp_holistic.Holistic() as holistic:\n", + " \n", + " while cam.isOpened():\n", + "\n", + " # Desenha pontos na imagem e extrai características em resultados\n", + " imagem, resultados = mediapipe_desenha_extrai(cam, holistic)\n", + "\n", + " # Começa a predição caso saia da posição neutra\n", + " if resultados.left_hand_landmarks or resultados.right_hand_landmarks:\n", + " \n", + " # Trata os pontos e monta a sequencia\n", + " pontos_tratados = trata_pontos(resultados)\n", + " sequencia.append(pontos_tratados)\n", + "\n", + " # Envia para o modelo preditivo quando possuir num_frame frames\n", + " if len(sequencia) == num_frames:\n", + " sequencia_dimensionada = np.expand_dims(sequencia, axis=0)\n", + " sequencia.clear()\n", + " resultados = model.predict(sequencia_dimensionada)[0]\n", + " maior_indice = np.argmax(resultados)\n", + "\n", + " # Controle para evitar falso-positivos\n", + " if resultados[maior_indice] > limiar_predicao:\n", + " predicao = sinais[maior_indice]\n", + "\n", + " contador_neutro = 0\n", + "\n", + " else:\n", + " contador_neutro +=1\n", + " sequencia.clear()\n", + " \n", + " # Caso não haja mais predições, apaga a última da tela\n", + " if contador_neutro > tempo_inativo:\n", + " predicao = ''\n", + "\n", + " # Mostra na tela\n", + " cv2.putText(imagem,'{}'.format(predicao), (20, 40),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=1,color=(0, 255, 255), thickness = 2)\n", + " cv2.imshow('LIBRAS', imagem)\n", + "\n", + " # Espera pela tecla\n", + " if cv2.waitKey(3) & 0xFF == ord(' '):\n", + " break\n", + "\n", + "cam.release()\n", + "cv2.destroyAllWindows()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "interpreter": { + "hash": "362f9b98393e3f0a487724f0683d667170a7d1c551755b1686e5e3f1c636f922" + }, + "kernelspec": { + "display_name": "Python 3.9.5 64-bit", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/train_model.ipynb b/train_model.ipynb new file mode 100644 index 0000000..ebfdcb8 --- /dev/null +++ b/train_model.ipynb @@ -0,0 +1,517 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import os\n", + "from matplotlib import pyplot as plt\n", + "import time\n", + "import datetime\n", + "\n", + "from sklearn.model_selection import train_test_split\n", + "from tensorflow.keras.utils import to_categorical\n", + "\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import LSTM, Dense, Dropout\n", + "from tensorflow.keras.optimizers import Adam\n", + "\n", + "from tensorflow.keras.callbacks import TensorBoard\n", + "from tensorflow.keras.callbacks import EarlyStopping\n", + "from tensorflow.keras.callbacks import ReduceLROnPlateau" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Diretório para os pontos coletados\n", + "DATA_DIR = os.path.join('Dados_extraidos') \n", + "\n", + "# Sinais\n", + "sinais = np.array(['Ola','Tudo bem','Obrigado','Entendo','Calma'])\n", + "\n", + "# Quantidade de vídeos por sinal\n", + "num_videos = 600\n", + "\n", + "# Quantidade de frames por vídeo\n", + "num_frames = 30\n", + "\n", + "#Quantidade de coordenadas por frame\n", + "num_coordenadas = 1662\n", + "\n", + "classe_dic = {classe:num for num, classe in enumerate(sinais)}\n", + "videos, classes = [], []" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import keras_tuner as kt\n", + "\n", + "def build_model(hp):\n", + "\n", + " model = Sequential()\n", + "\n", + " model.add(LSTM(units=hp.Int(\"units\", min_value=64, max_value=1024, step=64), activation='relu', input_shape=(30,1662)))\n", + "\n", + " for i in range(hp.Int(\"num_layers\", 1, 3)):\n", + " model.add(Dense(units=hp.Int(\"units\", min_value=64, max_value=1024, step=64), activation='relu'))\n", + "\n", + " model.add(Dense(5, activation='softmax'))\n", + "\n", + " learning_rate = hp.Float(\"lr\", min_value=1e-4, max_value=1e-2, sampling=\"log\")\n", + " \n", + " model.compile(optimizer=Adam(learning_rate=learning_rate), loss='categorical_crossentropy', metrics=['categorical_accuracy'])\n", + "\n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tuner = kt.RandomSearch(\n", + " hypermodel=build_model,\n", + " objective=\"categorical_accuracy\",\n", + " max_trials=10,\n", + " executions_per_trial=1,\n", + " overwrite=True,\n", + " directory=\"Searchs\",\n", + " project_name=\"arquitecture\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Configura a rede neural\n", + "\n", + "model = Sequential()\n", + "model.add(LSTM(512, activation='relu', dropout=0.2, input_shape=(num_frames,num_coordenadas)))\n", + "model.add(Dense(512, activation='relu'))\n", + "model.add(Dense(sinais.shape[0], activation='softmax'))\n", + "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['categorical_accuracy'])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Monta os vídeos e classes\n", + "\n", + "for sinal in sinais:\n", + "\n", + " lista_videos = os.listdir(os.path.join(DATA_DIR, sinal))\n", + "\n", + " for video_num in np.array(lista_videos).astype(int):\n", + "\n", + " video = []\n", + "\n", + " for frame_num in range(num_frames):\n", + " frame_npy = os.path.join(DATA_DIR, sinal, str(video_num), \"{}.npy\".format(frame_num))\n", + " frame = np.load(frame_npy)\n", + " video.append(frame)\n", + "\n", + " videos.append(video)\n", + " classes.append(classe_dic[sinal])" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'np' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mC:\\Users\\THIAGO~1.VAS\\AppData\\Local\\Temp/ipykernel_11012/1207957836.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Cria variáveis de treino, validação e teste\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mX\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvideos\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mY\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mto_categorical\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mclasses\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mint\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m X_treino, X_teste, Y_treino, Y_teste = train_test_split(X, \n", + "\u001b[1;31mNameError\u001b[0m: name 'np' is not defined" + ] + } + ], + "source": [ + "# Cria variáveis de treino, validação e teste\n", + "\n", + "X = np.array(videos)\n", + "Y = to_categorical(classes).astype(int)\n", + "X_treino, X_teste, Y_treino, Y_teste = train_test_split(X, \n", + " Y, \n", + " test_size=0.2,\n", + " stratify=Y)\n", + "X_teste, X_val, Y_teste, Y_val = train_test_split(X_teste,\n", + " Y_teste,\n", + " test_size=0.5,\n", + " stratify=Y_teste)\n", + "print(X_treino.shape)\n", + "print(X_val.shape)\n", + "print(X_teste.shape)\n", + "print(Y_treino.shape)\n", + "print(Y_val.shape)\n", + "print(Y_teste.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0 1 2 3 4]\n", + "[0 1 2 3 4]\n", + "[0 1 2 3 4]\n" + ] + } + ], + "source": [ + "print(np.unique(np.argmax(Y_treino, axis=1)))\n", + "print(np.unique(np.argmax(Y_teste, axis=1)))\n", + "print(np.unique(np.argmax(Y_val, axis=1)))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Cria pasta de logs e seta os callbacks\n", + "\n", + "log_dir = os.path.join('Logs', '6')\n", + "tensorboard = TensorBoard(log_dir=log_dir)\n", + "reduceLR = ReduceLROnPlateau(monitor='val_categorical_accuracy', factor=0.1, patience=10)\n", + "early_stopping = EarlyStopping(monitor='val_categorical_accuracy', patience=50, restore_best_weights=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/120\n", + "75/75 [==============================] - 32s 402ms/step - loss: 244.0064 - categorical_accuracy: 0.2179 - val_loss: 71.4594 - val_categorical_accuracy: 0.1167\n", + "Epoch 2/120\n", + "75/75 [==============================] - 31s 414ms/step - loss: 19.1018 - categorical_accuracy: 0.2417 - val_loss: 1.9983 - val_categorical_accuracy: 0.2567\n", + "Epoch 3/120\n", + "75/75 [==============================] - 31s 411ms/step - loss: 1.4264 - categorical_accuracy: 0.4062 - val_loss: 1.1433 - val_categorical_accuracy: 0.5400\n", + "Epoch 4/120\n", + "75/75 [==============================] - 31s 413ms/step - loss: 1.0248 - categorical_accuracy: 0.5487 - val_loss: 0.7976 - val_categorical_accuracy: 0.6067\n", + "Epoch 5/120\n", + "75/75 [==============================] - 30s 401ms/step - loss: 0.8506 - categorical_accuracy: 0.6246 - val_loss: 0.6540 - val_categorical_accuracy: 0.7333\n", + "Epoch 6/120\n", + "75/75 [==============================] - 30s 407ms/step - loss: 0.8617 - categorical_accuracy: 0.6388 - val_loss: 0.5918 - val_categorical_accuracy: 0.6967\n", + "Epoch 7/120\n", + "75/75 [==============================] - 31s 414ms/step - loss: 0.6337 - categorical_accuracy: 0.7154 - val_loss: 0.4756 - val_categorical_accuracy: 0.8367\n", + "Epoch 8/120\n", + "75/75 [==============================] - 31s 417ms/step - loss: 0.6791 - categorical_accuracy: 0.7025 - val_loss: 0.4088 - val_categorical_accuracy: 0.8900\n", + "Epoch 9/120\n", + "75/75 [==============================] - 31s 409ms/step - loss: 0.5608 - categorical_accuracy: 0.7450 - val_loss: 0.5001 - val_categorical_accuracy: 0.7600\n", + "Epoch 10/120\n", + "75/75 [==============================] - 31s 413ms/step - loss: 0.6320 - categorical_accuracy: 0.7271 - val_loss: 0.5075 - val_categorical_accuracy: 0.7600\n", + "Epoch 11/120\n", + "75/75 [==============================] - 31s 408ms/step - loss: 0.5963 - categorical_accuracy: 0.7496 - val_loss: 0.3923 - val_categorical_accuracy: 0.8700\n", + "Epoch 12/120\n", + "75/75 [==============================] - 30s 407ms/step - loss: 0.5316 - categorical_accuracy: 0.7704 - val_loss: 0.4125 - val_categorical_accuracy: 0.8433\n", + "Epoch 13/120\n", + "75/75 [==============================] - 30s 405ms/step - loss: 0.4549 - categorical_accuracy: 0.8083 - val_loss: 0.3873 - val_categorical_accuracy: 0.8133\n", + "Epoch 14/120\n", + "75/75 [==============================] - 31s 407ms/step - loss: 0.4707 - categorical_accuracy: 0.8037 - val_loss: 0.3799 - val_categorical_accuracy: 0.8400\n", + "Epoch 15/120\n", + "75/75 [==============================] - 30s 403ms/step - loss: 0.5629 - categorical_accuracy: 0.7850 - val_loss: 0.6081 - val_categorical_accuracy: 0.7900\n", + "Epoch 16/120\n", + "75/75 [==============================] - 31s 418ms/step - loss: 0.5721 - categorical_accuracy: 0.7850 - val_loss: 0.2891 - val_categorical_accuracy: 0.9267\n", + "Epoch 17/120\n", + "75/75 [==============================] - 31s 417ms/step - loss: 0.3628 - categorical_accuracy: 0.8554 - val_loss: 0.2490 - val_categorical_accuracy: 0.9200\n", + "Epoch 18/120\n", + "75/75 [==============================] - 30s 405ms/step - loss: 0.5561 - categorical_accuracy: 0.7937 - val_loss: 0.3010 - val_categorical_accuracy: 0.8933\n", + "Epoch 19/120\n", + "75/75 [==============================] - 31s 409ms/step - loss: 0.4014 - categorical_accuracy: 0.8417 - val_loss: 0.3902 - val_categorical_accuracy: 0.8400\n", + "Epoch 20/120\n", + "75/75 [==============================] - 31s 412ms/step - loss: 0.3262 - categorical_accuracy: 0.8742 - val_loss: 0.2255 - val_categorical_accuracy: 0.9433\n", + "Epoch 21/120\n", + "75/75 [==============================] - 32s 431ms/step - loss: 0.3105 - categorical_accuracy: 0.8846 - val_loss: 0.1998 - val_categorical_accuracy: 0.9400\n", + "Epoch 22/120\n", + "75/75 [==============================] - 30s 402ms/step - loss: 0.2781 - categorical_accuracy: 0.8929 - val_loss: 0.1757 - val_categorical_accuracy: 0.9467\n", + "Epoch 23/120\n", + "75/75 [==============================] - 31s 414ms/step - loss: 0.2655 - categorical_accuracy: 0.9025 - val_loss: 0.2372 - val_categorical_accuracy: 0.9067\n", + "Epoch 24/120\n", + "75/75 [==============================] - 30s 404ms/step - loss: 0.2596 - categorical_accuracy: 0.9054 - val_loss: 0.1397 - val_categorical_accuracy: 0.9567\n", + "Epoch 25/120\n", + "75/75 [==============================] - 31s 413ms/step - loss: 0.2206 - categorical_accuracy: 0.9233 - val_loss: 0.2079 - val_categorical_accuracy: 0.9333\n", + "Epoch 26/120\n", + "75/75 [==============================] - 30s 404ms/step - loss: 0.2873 - categorical_accuracy: 0.8917 - val_loss: 0.1360 - val_categorical_accuracy: 0.9433\n", + "Epoch 27/120\n", + "75/75 [==============================] - 31s 411ms/step - loss: 0.3209 - categorical_accuracy: 0.8746 - val_loss: 0.2692 - val_categorical_accuracy: 0.8533\n", + "Epoch 28/120\n", + "75/75 [==============================] - 31s 413ms/step - loss: 0.4426 - categorical_accuracy: 0.8379 - val_loss: 0.2042 - val_categorical_accuracy: 0.9267\n", + "Epoch 29/120\n", + "75/75 [==============================] - 31s 417ms/step - loss: 0.2919 - categorical_accuracy: 0.8867 - val_loss: 0.7677 - val_categorical_accuracy: 0.7800\n", + "Epoch 30/120\n", + "75/75 [==============================] - 31s 413ms/step - loss: 0.2573 - categorical_accuracy: 0.9013 - val_loss: 0.1061 - val_categorical_accuracy: 0.9767\n", + "Epoch 31/120\n", + "75/75 [==============================] - 31s 410ms/step - loss: 0.1800 - categorical_accuracy: 0.9362 - val_loss: 0.1991 - val_categorical_accuracy: 0.9367\n", + "Epoch 32/120\n", + "75/75 [==============================] - 31s 407ms/step - loss: 0.1738 - categorical_accuracy: 0.9371 - val_loss: 0.1002 - val_categorical_accuracy: 0.9800\n", + "Epoch 33/120\n", + "75/75 [==============================] - 30s 399ms/step - loss: 0.2081 - categorical_accuracy: 0.9200 - val_loss: 0.5267 - val_categorical_accuracy: 0.8500\n", + "Epoch 34/120\n", + "75/75 [==============================] - 30s 400ms/step - loss: 0.2714 - categorical_accuracy: 0.9154 - val_loss: 0.3097 - val_categorical_accuracy: 0.8767\n", + "Epoch 35/120\n", + "75/75 [==============================] - 31s 411ms/step - loss: 0.2131 - categorical_accuracy: 0.9254 - val_loss: 0.1337 - val_categorical_accuracy: 0.9700\n", + "Epoch 36/120\n", + "75/75 [==============================] - 31s 415ms/step - loss: 0.2020 - categorical_accuracy: 0.9250 - val_loss: 0.1204 - val_categorical_accuracy: 0.9633\n", + "Epoch 37/120\n", + "75/75 [==============================] - 31s 411ms/step - loss: 0.1740 - categorical_accuracy: 0.9404 - val_loss: 0.1367 - val_categorical_accuracy: 0.9567\n", + "Epoch 38/120\n", + "75/75 [==============================] - 31s 411ms/step - loss: 0.1508 - categorical_accuracy: 0.9471 - val_loss: 0.1119 - val_categorical_accuracy: 0.9667\n", + "Epoch 39/120\n", + "75/75 [==============================] - 31s 416ms/step - loss: 0.1981 - categorical_accuracy: 0.9379 - val_loss: 0.2794 - val_categorical_accuracy: 0.9333\n", + "Epoch 40/120\n", + "75/75 [==============================] - 31s 416ms/step - loss: 0.2522 - categorical_accuracy: 0.9121 - val_loss: 0.3052 - val_categorical_accuracy: 0.8767\n", + "Epoch 41/120\n", + "75/75 [==============================] - 31s 407ms/step - loss: 0.2270 - categorical_accuracy: 0.9204 - val_loss: 0.1492 - val_categorical_accuracy: 0.9367\n", + "Epoch 42/120\n", + "75/75 [==============================] - 31s 410ms/step - loss: 0.1196 - categorical_accuracy: 0.9583 - val_loss: 0.2799 - val_categorical_accuracy: 0.8667\n", + "Epoch 43/120\n", + "75/75 [==============================] - 31s 416ms/step - loss: 0.0880 - categorical_accuracy: 0.9700 - val_loss: 0.0607 - val_categorical_accuracy: 0.9833\n", + "Epoch 44/120\n", + "75/75 [==============================] - 30s 405ms/step - loss: 0.0666 - categorical_accuracy: 0.9812 - val_loss: 0.0623 - val_categorical_accuracy: 0.9833\n", + "Epoch 45/120\n", + "75/75 [==============================] - 30s 401ms/step - loss: 0.0679 - categorical_accuracy: 0.9808 - val_loss: 0.0619 - val_categorical_accuracy: 0.9833\n", + "Epoch 46/120\n", + "75/75 [==============================] - 32s 428ms/step - loss: 0.0689 - categorical_accuracy: 0.9804 - val_loss: 0.0600 - val_categorical_accuracy: 0.9800\n", + "Epoch 47/120\n", + "75/75 [==============================] - 33s 444ms/step - loss: 0.0647 - categorical_accuracy: 0.9837 - val_loss: 0.0595 - val_categorical_accuracy: 0.9800\n", + "Epoch 48/120\n", + "75/75 [==============================] - 30s 402ms/step - loss: 0.0654 - categorical_accuracy: 0.9804 - val_loss: 0.0601 - val_categorical_accuracy: 0.9800\n", + "Epoch 49/120\n", + "75/75 [==============================] - 30s 400ms/step - loss: 0.0628 - categorical_accuracy: 0.9858 - val_loss: 0.0620 - val_categorical_accuracy: 0.9767\n", + "Epoch 50/120\n", + "75/75 [==============================] - 30s 402ms/step - loss: 0.0631 - categorical_accuracy: 0.9842 - val_loss: 0.0634 - val_categorical_accuracy: 0.9800\n", + "Epoch 51/120\n", + "75/75 [==============================] - 31s 413ms/step - loss: 0.0574 - categorical_accuracy: 0.9842 - val_loss: 0.0586 - val_categorical_accuracy: 0.9833\n", + "Epoch 52/120\n", + "75/75 [==============================] - 30s 407ms/step - loss: 0.0566 - categorical_accuracy: 0.9858 - val_loss: 0.0571 - val_categorical_accuracy: 0.9833\n", + "Epoch 53/120\n", + "75/75 [==============================] - 31s 420ms/step - loss: 0.0584 - categorical_accuracy: 0.9817 - val_loss: 0.0564 - val_categorical_accuracy: 0.9833\n", + "Epoch 54/120\n", + "75/75 [==============================] - 35s 468ms/step - loss: 0.0528 - categorical_accuracy: 0.9858 - val_loss: 0.0547 - val_categorical_accuracy: 0.9800\n", + "Epoch 55/120\n", + "75/75 [==============================] - 36s 483ms/step - loss: 0.0527 - categorical_accuracy: 0.9846 - val_loss: 0.0553 - val_categorical_accuracy: 0.9800\n", + "Epoch 56/120\n", + "75/75 [==============================] - 35s 462ms/step - loss: 0.0508 - categorical_accuracy: 0.9875 - val_loss: 0.0547 - val_categorical_accuracy: 0.9800\n", + "Epoch 57/120\n", + "75/75 [==============================] - 32s 430ms/step - loss: 0.0519 - categorical_accuracy: 0.9862 - val_loss: 0.0546 - val_categorical_accuracy: 0.9800\n", + "Epoch 58/120\n", + "75/75 [==============================] - 32s 429ms/step - loss: 0.0518 - categorical_accuracy: 0.9846 - val_loss: 0.0539 - val_categorical_accuracy: 0.9800\n", + "Epoch 59/120\n", + "75/75 [==============================] - 32s 431ms/step - loss: 0.0519 - categorical_accuracy: 0.9850 - val_loss: 0.0543 - val_categorical_accuracy: 0.9800\n", + "Epoch 60/120\n", + "75/75 [==============================] - 33s 436ms/step - loss: 0.0497 - categorical_accuracy: 0.9867 - val_loss: 0.0534 - val_categorical_accuracy: 0.9800\n", + "Epoch 61/120\n", + "75/75 [==============================] - 32s 431ms/step - loss: 0.0509 - categorical_accuracy: 0.9867 - val_loss: 0.0542 - val_categorical_accuracy: 0.9800\n", + "Epoch 62/120\n", + "75/75 [==============================] - 33s 438ms/step - loss: 0.0489 - categorical_accuracy: 0.9871 - val_loss: 0.0542 - val_categorical_accuracy: 0.9833\n", + "Epoch 63/120\n", + "75/75 [==============================] - 33s 438ms/step - loss: 0.0476 - categorical_accuracy: 0.9879 - val_loss: 0.0531 - val_categorical_accuracy: 0.9833\n", + "Epoch 64/120\n", + "75/75 [==============================] - 33s 437ms/step - loss: 0.0486 - categorical_accuracy: 0.9862 - val_loss: 0.0530 - val_categorical_accuracy: 0.9800\n", + "Epoch 65/120\n", + "75/75 [==============================] - 34s 458ms/step - loss: 0.0560 - categorical_accuracy: 0.9846 - val_loss: 0.0529 - val_categorical_accuracy: 0.9800\n", + "Epoch 66/120\n", + "75/75 [==============================] - 40s 534ms/step - loss: 0.0500 - categorical_accuracy: 0.9883 - val_loss: 0.0528 - val_categorical_accuracy: 0.9800\n", + "Epoch 67/120\n", + "75/75 [==============================] - 40s 541ms/step - loss: 0.0477 - categorical_accuracy: 0.9871 - val_loss: 0.0527 - val_categorical_accuracy: 0.9800\n", + "Epoch 68/120\n", + "75/75 [==============================] - 40s 533ms/step - loss: 0.0465 - categorical_accuracy: 0.9879 - val_loss: 0.0527 - val_categorical_accuracy: 0.9800\n", + "Epoch 69/120\n", + "75/75 [==============================] - 34s 450ms/step - loss: 0.0478 - categorical_accuracy: 0.9871 - val_loss: 0.0526 - val_categorical_accuracy: 0.9800\n", + "Epoch 70/120\n", + "75/75 [==============================] - 39s 519ms/step - loss: 0.0483 - categorical_accuracy: 0.9875 - val_loss: 0.0527 - val_categorical_accuracy: 0.9800\n", + "Epoch 71/120\n", + "75/75 [==============================] - 37s 494ms/step - loss: 0.0489 - categorical_accuracy: 0.9867 - val_loss: 0.0526 - val_categorical_accuracy: 0.9800\n", + "Epoch 72/120\n", + "75/75 [==============================] - 39s 521ms/step - loss: 0.0502 - categorical_accuracy: 0.9879 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 73/120\n", + "75/75 [==============================] - 39s 524ms/step - loss: 0.0498 - categorical_accuracy: 0.9858 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 74/120\n", + "75/75 [==============================] - 40s 540ms/step - loss: 0.0456 - categorical_accuracy: 0.9892 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 75/120\n", + "75/75 [==============================] - 39s 525ms/step - loss: 0.0466 - categorical_accuracy: 0.9892 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 76/120\n", + "75/75 [==============================] - 38s 508ms/step - loss: 0.0501 - categorical_accuracy: 0.9846 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 77/120\n", + "75/75 [==============================] - 39s 526ms/step - loss: 0.0474 - categorical_accuracy: 0.9871 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 78/120\n", + "75/75 [==============================] - 38s 507ms/step - loss: 0.0489 - categorical_accuracy: 0.9867 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 79/120\n", + "75/75 [==============================] - 39s 518ms/step - loss: 0.0497 - categorical_accuracy: 0.9871 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 80/120\n", + "75/75 [==============================] - 40s 527ms/step - loss: 0.0481 - categorical_accuracy: 0.9879 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 81/120\n", + "75/75 [==============================] - 40s 540ms/step - loss: 0.0498 - categorical_accuracy: 0.9858 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 82/120\n", + "75/75 [==============================] - 41s 546ms/step - loss: 0.0523 - categorical_accuracy: 0.9858 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 83/120\n", + "75/75 [==============================] - 38s 504ms/step - loss: 0.0527 - categorical_accuracy: 0.9871 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 84/120\n", + "75/75 [==============================] - 39s 520ms/step - loss: 0.0530 - categorical_accuracy: 0.9850 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 85/120\n", + "75/75 [==============================] - 34s 454ms/step - loss: 0.0509 - categorical_accuracy: 0.9867 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 86/120\n", + "75/75 [==============================] - 38s 514ms/step - loss: 0.0505 - categorical_accuracy: 0.9879 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 87/120\n", + "75/75 [==============================] - 40s 528ms/step - loss: 0.0505 - categorical_accuracy: 0.9858 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 88/120\n", + "75/75 [==============================] - 39s 518ms/step - loss: 0.0491 - categorical_accuracy: 0.9871 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 89/120\n", + "75/75 [==============================] - 41s 548ms/step - loss: 0.0488 - categorical_accuracy: 0.9854 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 90/120\n", + "75/75 [==============================] - 40s 528ms/step - loss: 0.0495 - categorical_accuracy: 0.9858 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 91/120\n", + "75/75 [==============================] - 39s 513ms/step - loss: 0.0496 - categorical_accuracy: 0.9862 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 92/120\n", + "75/75 [==============================] - 39s 518ms/step - loss: 0.0479 - categorical_accuracy: 0.9879 - val_loss: 0.0525 - val_categorical_accuracy: 0.9800\n", + "Epoch 93/120\n", + "75/75 [==============================] - 41s 543ms/step - loss: 0.0476 - categorical_accuracy: 0.9875 - val_loss: 0.0524 - val_categorical_accuracy: 0.9800\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(X_treino, \n", + " Y_treino, \n", + " epochs=120, \n", + " callbacks=[tensorboard, early_stopping, reduceLR], \n", + " validation_data=(X_val, Y_val))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "lstm (LSTM) (None, 512) 4454400 \n", + "_________________________________________________________________\n", + "dense (Dense) (None, 512) 262656 \n", + "_________________________________________________________________\n", + "dense_1 (Dense) (None, 5) 2565 \n", + "=================================================================\n", + "Total params: 4,719,621\n", + "Trainable params: 4,719,621\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "# Resumo do modelo\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10/10 [==============================] - 2s 166ms/step - loss: 0.0624 - categorical_accuracy: 0.9833\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.06244867295026779, 0.9833333492279053]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Testa o modelo\n", + "model.evaluate(X_teste, Y_teste)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Salva os pesos\n", + "model.save('pesosbons.h5')" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "362f9b98393e3f0a487724f0683d667170a7d1c551755b1686e5e3f1c636f922" + }, + "kernelspec": { + "display_name": "Python 3.9.5 64-bit", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}