{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "jk-N4PLSF14u" }, "source": [ "# [IAPR][iapr]: Project\n", "\n", "\n", "**Group ID:** 32\n", "\n", "**Author 1 (350508):** Ziyi ZHAO \n", "**Author 2 (321657):** Yujie HE \n", "**Author 3 (337088):** Xufeng GAO \n", "\n", "\n", "## Important notes\n", "\n", "The assignments are designed to teach practical implementation of the topics presented during class as well as preparation for the final project, which is a practical project which ties together the topics of the course. \n", "\n", "As such, in the lab assignments/final project, unless otherwise specified, you may, if you choose, use external functions from image processing/ML libraries like opencv and sklearn as long as there is sufficient explanation in the lab report. For example, you do not need to implement your own edge detector, etc.\n", "\n", "**! Before handling back the notebook !** rerun the notebook from scratch `Kernel` > `Restart & Run All`\n", "\n", "\n", "[iapr]: https://github.com/LTS5/iapr" ] }, { "cell_type": "markdown", "metadata": { "id": "df_vdMzkF14-" }, "source": [ "---\n", "## 0. Introduction\n", "\n", "An anonymous card player that we will name Bartick Pruel is willing to improve his poker skills. To do so, he asked our lab to design a tool that will automatically detect the hands of the players around the table. \n", "\n", "---\n", "\n", "## 1. Data\n", "\n", "To achieve your task, you will be given images that look like this (without the overlay)\n", "\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "id": "3u5H2953F15G" }, "source": [ "### 1.1. Table layout\n", "\n", "The table is divided into 3 main parts:\n", "* **Table cards (T1-T5)**: These cards are shared by every player. They are defined as the flop (T1-T3), the turn (T4) and the river (T5). The table cards are *always* visible.\n", "* **Player cards (P11-P42)**: The cards played by each player (4 pairs). Each player *always* has 2 cards in hand. When a player is not playing, you can see the back of the cards (ex: player 3 here).\n", "* **Chips**: The chips at the center of the table are named the pot.\n", "\n", "### 1.2. Cards & Chips\n", "\n", "The cards deck are composed of 52 cards split into 4 different colors: (D)imanond, (H)eart, (S)pade, (C)lub. Each color is composed of 13 different cards: 2, 3, 4, 5, 6, 7, 8, 9, 10, (J)ack, (Q)ueen, (K)ing and (A)ce.\n", "\n", "Th chips can be of 5 different colors: (r)ed, (g)reen, (b)lue, blac(k) or (w)hite.\n", "\n", "\n", "### 1.3 Structure\n", "\n", "You can download the data for the project here: [download data](https://drive.google.com/file/d/1d7rOe88kEK1CEaLvYgNZkxrtKImLVC9X/view)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "ghaJ0cT7F15J" }, "source": [ "---\n", "\n", "## 2. Tasks\n", "\n", "\n", "Your task is to predict the following parameters for a set of images.\n", "\n", "* **T1** (str): String code of the first card of the flop (far left) \n", "* **T2** (str): String code of the second card of the flop\n", "* **T3** (str): String code of the third card of the flop\n", "* **T4** (str): String code of the turn\n", "* **T5** (str): String code of the river\n", "\n", "\n", "* **P11** (str or int): String code of player 1 card 1. Should be 0 if player 1 is not Playing.\n", "* **P12** (str or int): String code of player 1 card 2. Should be 0 if player 1 is not Playing.\n", "* **P21** (str or int): String code of player 2 card 1. Should be 0 if player 2 is not Playing.\n", "* **P22** (str or int): String code of player 2 card 2. Should be 0 if player 2 is not Playing.\n", "* **P31** (str or int): String code of player 3 card 1. Should be 0 if player 3 is not Playing.\n", "* **P32** (str or int): String code of player 3 card 2. Should be 0 if player 3 is not Playing.\n", "* **P41** (str or int): String code of player 4 card 1. Should be 0 if player 4 is not Playing.\n", "* **P42** (str or int): String code of player 4 card 2. Should be 0 if player 5 is not Playing.\n", "\n", "\n", "* **CR** (int): Number of (r)ed chips in the pot\n", "* **CG** (int): Number of (g)reen chips in the pot\n", "* **CB** (int): Number of (b)lue chips in the pot\n", "* **CK** (int): Number of blac(k) chips in the pot\n", "* **CW** (int): Number of (w)hite chips in the pot\n", "\n", "\n", "The output is saved using the function **save_results** as presented below.\n", "\n", "---\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "IFWnOh8Egfs_" }, "source": [ "## 3. Evaluation\n", "\n", "**Before the exam**\n", " - Create a zipped folder named **groupid_xx.zip** that you upload on moodle (xx being your group number).\n", " - Include a **runnable** code (Jupyter Notebook and external files) and your presentation in the zip folder.\n", " \n", "**The day of the exam**\n", " - You will be given a **new folder** with few images, but **no ground truth** (csv file).\n", " - We will ask you to run your pipeline in **real time** and to send us your prediction of the task you obtain with the provided function **save_results**. \n", " - On our side, we will compute the performance of your classification algorithm. \n", " - To evaluate your method, we will use the **evaluate_game** function presented below. To understand how the provided functions work, please read the documentation of the functions in **utils.py**.\n", " - **Please make sure your function returns the proper data format to avoid points penalty on the day of the exam**. \n", "---" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 30190, "status": "ok", "timestamp": 1653667835717, "user": { "displayName": "Ziyi Zhao", "userId": "02036043023923694158" }, "user_tz": -120 }, "id": "VcvFy86Fbq-q", "outputId": "57117618-5480-412a-e8f0-79263dc5a6dc" }, "outputs": [], "source": [ "# std\n", "from typing import Union, List, Dict\n", "from glob import glob\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "import os,sys\n", "\n", "# imported\n", "import cv2 as cv\n", "import matplotlib.pyplot as plt\n", "import PIL.Image\n", "import numpy as np\n", "import pandas as pd\n", "from termcolor import colored\n", "from treys import Card\n", "\n", "# custom\n", "from utils import eval_listof_games , debug_listof_games, save_results , load_results, eval_listof_games_custom\n", "from viz_utils import plotMultipleImages, vizCropProcedures\n", "from preprocess_utils import cropTable, cropImgParts, PART_NAMES\n", "from chip_utils import getChipRes\n", "from card_utils import checkNoPlay, extractTableCard, getPlayerRes, checkPlaying, checkPlayingSplit\n", "from utils import getGameDict" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "project_dir_path = os.path.dirname(os.path.realpath(\"__file__\"))" ] }, { "cell_type": "markdown", "metadata": { "id": "hGRS0dCQKlxC" }, "source": [ "## Final evaluation Code" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "data_sz = 28\n", "mode = \"train\" # test | train" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from test_process_image import process_image" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": false }, "outputs": [], "source": [ "# process_image('data/train/train_22.jpg', debug=False, verbose=False)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "IYMgA5RyF15Q" }, "outputs": [], "source": [ "## load train size dataset\n", "path_data = os.path.join(project_dir_path, \"data\", mode)\n", "group_id = 32" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "sHwBUbetF15W" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Size of trainset:\n", "\t28\n", "Prediciton game:\n", "\t0: {'T1': '2C', 'T2': '6H', 'T3': '8D', 'T4': 'JC', 'T5': 'JS', 'P11': '2H', 'P12': '4S', 'P21': '0', 'P22': 'QC', 'P31': 'AD', 'P32': '5S', 'P41': '7H', 'P42': '8C', 'CR': 1, 'CG': 1, 'CB': 1, 'CK': 1, 'CW': 1}\n" ] } ], "source": [ "if mode == 'train':\n", " ## load train size dataset\n", " train_size = np.loadtxt(os.path.join(path_data, \"train_size.txt\")).astype(int)\n", " print(\"Size of trainset:\\n\\t{}\".format(train_size))\n", "\n", "# Load images from folder\n", "game_results = {}\n", "\n", "# Evaluate three images\n", "games_id = [i for i in range(data_sz)] # to evaluate images\n", "\n", "for i in games_id :\n", " file = os.path.join(path_data, \"{}_{}.jpg\".format(mode, str(i).zfill(2))) # Fill the string with zeros until it is 2 characters long\n", " # open the image\n", " im = PIL.Image.open(file)\n", " # Process the image\n", " # results = process_image(image=im)\n", " results = process_image(file=file)\n", " # Append result to array\n", " game_results[i] = results\n", "\n", "# Outputs prediction of game 0\n", "print(\"Prediciton game:\\n\\t{}: {}\".format(0, game_results[0]))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "mKMcEn85F15a" }, "outputs": [], "source": [ "# Saving results\n", "file_results = save_results(results=game_results, groupid=group_id)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "-yMSvgzJF15c" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27'])\n" ] } ], "source": [ "# Checking the results were loaded correctly\n", "loaded_results = load_results(file_results)\n", "print(loaded_results.keys())" ] }, { "cell_type": "markdown", "metadata": { "id": "h0ACh7wqF15d" }, "source": [ "# Evaluation and Debugging" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "id": "0h9PIENiF15e", "outputId": "1eb8f061-c836-4b5f-bb02-6d21ee3e16ed" }, "outputs": [], "source": [ "if mode == 'train':\n", " # Read training data\n", " game_labels = pd.read_csv('data/train/updated_train_labels.csv')\n", " game_labels = game_labels.fillna('0')\n", " # game_labels" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "id": "5D8xuLh5F15f", "outputId": "fc583954-a3a9-4329-9130-e28bec5adc07" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Average SCORE = 0.8232600732600732\n" ] } ], "source": [ "if mode == 'train':\n", " # Evaluate\n", " # eval_listof_games( game_results , game_labels , game_id = games_id)\n", " avg_score, score_list = eval_listof_games_custom( game_results , game_labels , game_id = games_id)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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NpsueTG23akUQUFBxMfHk5SUBEBSUhLx8fEEBgZesN2hQ4d4/PHHef755xk5cqQdwhYRERER6T4d6mP89NNPs2rVKubMmcOqVatYsWIFAMuWLePw4cMArFixgoaGBp566ikWLVrEokWLOH78uOMiFxERERGxI5NhGPafu3CFNJVCOkLj2XdoLPsWjWffobHsOzSWF+vSVAoRERERkauBEmMREREREZQYi4iIiIgASoxFRERERAAlxiIiIiIigBJjERERERFAibGIiIiICKDEWEREREQEUGIsIiIiIgIoMRYRERERAZQYi4iIiIgASoxFRERERAAlxiIiIiIigBJjERERERFAibGIiIiICKDEWEREREQEUGIsIiIiIgIoMRYRERERAZQYi4iIiIgASoxFRERERAAlxiIiIiIigBJjERERERFAibGIiIiICKDEWEREREQEUGIsIiIiIgIoMRYRERERAZQYi4iIiIgASoxFRERERAAlxiIiIiIigBJjERERERFAibGIiIiICKDEWEREREQEUGIsIiIiIgIoMRYRERERAZQYi4iIiIgAHUyMMzMzWbJkCXPmzGHJkiVkZWVdtI3VamXFihUkJCRw4403smbNGnvHKiIiIiLiMB1KjJcvX87SpUvZvHkzS5cu5amnnrpom3Xr1pGTk8OWLVt49913eeGFFzhz5ozdAxYRERERcQSX9jYoKysjLS2NlStXApCYmMgzzzxDeXk5gYGBrdtt2LCBO++8E7PZTGBgIAkJCWzatIkHH3yww8GYzaYreAnO37d0P41n36Gx7Fs0nn2HxrLv0Fhe6HLvR7uJcUFBAaGhoVgsFgAsFgshISEUFBRckBgXFBQQERHR+u/w8HAKCws7FWi/ft6d2r4zgoJ8HLZv6X4az75DY9m3aDz7Do1l36Gx7DgV34mIiIiI0IHEODw8nKKiIqxWK3CuyK64uJjw8PCLtsvPz2/9d0FBAWFhYXYOV0RERETEMdpNjIOCgoiPjycpKQmApKQk4uPjL5hGATB37lzWrFmDzWajvLycrVu3MmfOHMdELSIiIiJiZybDMIz2NsrIyODJJ5+kuroaPz8/nn32WWJjY1m2bBmPPfYYo0ePxmq18rvf/Y4vv/wSgGXLlrFkyRKHvwAREREREXvoUGIsIiIiItLXqfhORERERAQlxiIiIiIigBJjERERERFAibGIiIiICNCBle96s8zMTJ588kkqKysJCAjg2WefJSYmxtlhyRWaPXs2bm5uuLu7A/Dzn/+cGTNmODkq6Yhnn32WzZs3k5eXx7p16xg6dCigY7S3utR46hjtfSoqKnjiiSfIycnBzc2N6Ohofve73xEYGKjjs5e53Fjq2OwEow+79957jY8++sgwDMP46KOPjHvvvdfJEUlXzJo1yzh+/Lizw5ArsHfvXiM/P/+iMdQx2jtdajx1jPY+FRUVxp49e1r//cc//tH41a9+ZRiGjs/e5nJjqWOz4/rsVIqysjLS0tJITEwEIDExkbS0NMrLy50cmcjVZ9KkSRetlqljtPdqazyldwoICGDKlCmt/x43bhz5+fk6PnuhS42ldE6fnUpRUFBAaGgoFosFAIvFQkhICAUFBRet2ie9x89//nMMw2DixIn89Kc/xc/Pz9khyRXSMdo36RjtvWw2G//617+YPXu2js9e7utjeZ6OzY7ps1eMpe/55z//yccff8z777+PYRj87ne/c3ZIIvI1OkZ7t2eeeQYvLy/uueceZ4ciXfTNsdSx2XF9NjEODw+nqKgIq9UKgNVqpbi4WD//9WLnx87NzY2lS5dy4MABJ0ckXaFjtO/RMdp7Pfvss2RnZ/Pcc89hNpt1fPZi3xxL0LHZGX02MQ4KCiI+Pp6kpCQAkpKSiI+P109AvVRdXR1nz54FwDAMNmzYQHx8vJOjkq7QMdq36Bjtvf7yl79w5MgRXnzxRdzc3AAdn71VW2OpY7NzTIZhGM4OwlEyMjJ48sknqa6uxs/Pj2effZbY2FhnhyVXIDc3l0cffRSr1YrNZiMuLo7f/OY3hISEODs06YDf//73bNmyhdLSUvr160dAQADr16/XMdpLtTWeL7/8so7RXujkyZMkJiYSExODh4cHAAMGDODFF1/U8dnLXGosn3zySR2bndCnE2MRERERkY7qs1MpREREREQ6Q4mxiIiIiAhKjEVEREREACXGIiIiIiKAEmMREREREUCJsYiIiIgIoMRYRERERARQYiwiIiIiAsD/D82oXJ4EzNesAAAAAElFTkSuQmCC", "text/plain": [ "<Figure size 864x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from viz_utils import vizGameScores\n", "if mode == 'train':\n", " vizGameScores(avg_score, score_list, data_sz)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "colab": { "collapsed_sections": [ "hGRS0dCQKlxC", "h0ACh7wqF15d" ], "name": "project.ipynb", "provenance": [], "toc_visible": true }, "interpreter": { "hash": "5703420bfb30ae2c24d24d1d40d78a864a15594d103c0f0fa2390811638759c4" }, "kernelspec": { "display_name": "Python 3.7.13 ('pytracking')", "language": "python", "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.7.13" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "298.55px" }, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 1 }