{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "94f2e11d",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/root/anaconda3/envs/yt38/lib/python3.8/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import numpy as np\n",
    "import cv2\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython.display import clear_output\n",
    "import os\n",
    "%matplotlib inline\n",
    "\n",
    "import pandas as pd\n",
    "import time\n",
    "from PIL import Image"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d725cf91",
   "metadata": {},
   "source": [
    "# Test "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "12ec77ad",
   "metadata": {},
   "outputs": [],
   "source": [
    "cctv_path = './video/cctv/'\n",
    "\n",
    "cctv_vid_list = [file for file in os.listdir(cctv_path) if file.endswith(\".mp4\") or file.endswith(\".avi\")]\n",
    "youtube_vid_list = [file for file in os.listdir(youtube_path) if file.endswith(\".mp4\") or file.endswith(\".avi\")]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b5e4241b",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "YOLOv5 🚀 v7.0-74-gd02ee60 Python-3.8.0 torch-1.10.0 CUDA:0 (NVIDIA RTX A6000, 48685MiB)\n",
      "\n",
      "Fusing layers... \n",
      "YOLOv5m summary: 212 layers, 20856975 parameters, 0 gradients, 47.9 GFLOPs\n",
      "Adding AutoShape... \n"
     ]
    }
   ],
   "source": [
    "model1 = torch.hub.load(\"/data/kwater/yolov5\",\n",
    "                       'custom', path='/data/kwater/yolov5/runs/train/exp13/weights/best.pt',\n",
    "                       source='local',device=\"cuda:0\")  # local repo\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f2af7353",
   "metadata": {},
   "outputs": [],
   "source": [
    "def draw_bbox(img, vehicle_results, thres):\n",
    "    for obj in vehicle_results:\n",
    "        if obj[4]>thres:\n",
    "            x = int(obj[0])\n",
    "            y = int(obj[1])\n",
    "            x2 = int(obj[2])\n",
    "            y2 = int(obj[3])\n",
    "            \n",
    "            color = (255,0,0)\n",
    "\n",
    "            tk = 1\n",
    "            # if obj['risk1'] == 'danger':\n",
    "            #     tk = 5\n",
    "            \n",
    "            class_dic = {0:\"Leak\",\n",
    "                        1:\"Pole\"}\n",
    "            content =  class_dic[obj[5]]+\"_\"+str(round(obj[4],2))\n",
    "            \n",
    "            font =  cv2.FONT_HERSHEY_PLAIN\n",
    "            img = cv2.rectangle(img, (x,y), (x2,y2), color, tk) # bbox\n",
    "            img = cv2.putText(img, content, (x, y-2), font, tk, color, tk, cv2.LINE_AA) # label\n",
    "    return img"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3a7dedee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['yungtong_augmented.mp4',\n",
       " 'mannam_waterfall_augmented_20230207_06_05_38.mp4',\n",
       " 'kyunbbu_augmented.mp4',\n",
       " 'yungtong_night_augmented.mp4',\n",
       " 'mannam_waterfall_augmented.mp4',\n",
       " 'yungtong_night_augmented_20230207_05_37_26.mp4']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cctv_vid_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "708c943f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[     398.52      226.14      442.04      269.96      0.9512           0]]\n",
      "[[     387.23      271.72      430.63      310.64     0.95897           0]]\n",
      "[]\n",
      "[[     100.35      277.11      143.27      319.75     0.93648           0]]\n",
      "[[     397.73      196.21      442.24      243.37     0.55383           0]]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "OpenCV: FFMPEG: tag 0x58564944/'DIVX' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'\n",
      "OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'\n",
      "OpenCV: FFMPEG: tag 0x58564944/'DIVX' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'\n",
      "OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'\n",
      "OpenCV: FFMPEG: tag 0x58564944/'DIVX' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'\n",
      "OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'\n",
      "OpenCV: FFMPEG: tag 0x58564944/'DIVX' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'\n",
      "OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'\n",
      "OpenCV: FFMPEG: tag 0x58564944/'DIVX' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'\n",
      "OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[     389.31      271.96      430.38      308.87     0.95795           0]]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "OpenCV: FFMPEG: tag 0x58564944/'DIVX' is not supported with codec id 12 and format 'mp4 / MP4 (MPEG-4 Part 14)'\n",
      "OpenCV: FFMPEG: fallback to use tag 0x7634706d/'mp4v'\n"
     ]
    }
   ],
   "source": [
    "frame_results = []\n",
    "for file in cctv_vid_list:\n",
    "#     print(file)\n",
    "#     print(file.split('.')[0]+'.csv')\n",
    "    \n",
    "    csv_file = os.path.join(cctv_path,file.split('.')[0]+'.csv')\n",
    "    data = np.array(pd.read_csv(csv_file, header=None))\n",
    "    \n",
    "    video_file = os.path.join(cctv_path,file)\n",
    "    cap = cv2.VideoCapture(video_file) \n",
    "    ret, frame = cap.read()   \n",
    "    \n",
    "    video_length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))\n",
    "    video_fps = int(cap.get(cv2.CAP_PROP_FPS))\n",
    "    image_size = frame.shape\n",
    "    \n",
    "    # image array\n",
    "    image_array = []\n",
    "    count = 0\n",
    "\n",
    "    while frame is not None:\n",
    "\n",
    "#         frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)\n",
    "\n",
    "        results = model1(frame)\n",
    "        bbox_results=results.xyxy[0].cpu().numpy() \n",
    "        \n",
    "        print(bbox_results)\n",
    "        break\n",
    "        \n",
    "        result_img=draw_bbox(frame.copy(), bbox_results, 0.25)\n",
    "        \n",
    "        ######### SCORING\n",
    "        # COMPARE AND SCORING\n",
    "        gt = []\n",
    "        for row in data:\n",
    "            if row[0] == count:\n",
    "                gt.append(list(row[1:]))\n",
    "                \n",
    "        gt = np.array(gt)\n",
    "        \n",
    "        img_w = image_size[1]\n",
    "        img_h = image_size[0]\n",
    "        \n",
    "        # bbox to float\n",
    "        pred_bb1 = np.array(bbox_results[:,:4], dtype=np.float64)\n",
    "        pred_cls1 = np.array(bbox_results[:,5], dtype=np.int64)\n",
    "        pred_conf1 = np.array(np.round(bbox_results[:,4],2), dtype=np.float64)\n",
    "        gt_bb1 = np.array(gt[:,:4], dtype=np.float64)\n",
    "        gt_cls1 = np.array(gt[:,4], dtype=np.int64)\n",
    "        \n",
    "        for idx,row in enumerate(pred_bb1):\n",
    "            pred_bb1[idx][0] /= img_w\n",
    "            pred_bb1[idx][1] /= img_h\n",
    "            pred_bb1[idx][2] /= img_w\n",
    "            pred_bb1[idx][3] /= img_h\n",
    "            \n",
    "        for idx,row in enumerate(gt_bb1):\n",
    "            gt_bb1[idx][0] /= img_w\n",
    "            gt_bb1[idx][1] /= img_h\n",
    "            gt_bb1[idx][2] /= img_w\n",
    "            gt_bb1[idx][3] /= img_h    \n",
    "\n",
    "        frame_results.append([pred_bb1, pred_cls1, pred_conf1, gt_bb1, gt_cls1])\n",
    "        \n",
    "\n",
    "        clear_output(wait=True)\n",
    "#         %matplotlib inline\n",
    "#         plt.imshow(result_img)\n",
    "#         plt.show()\n",
    "        \n",
    "#         print(results)\n",
    "#         print(bbox_results)\n",
    "#         print(np.array(data)[0][1:])\n",
    "\n",
    "        image_array.append(result_img)\n",
    "\n",
    "        count+=1\n",
    "        ret, frame = cap.read()\n",
    "\n",
    "        print(\"total L : \", video_length)\n",
    "        print(\"now : \",count)\n",
    "        \n",
    "        \n",
    "    out = cv2.VideoWriter(\"./cctv_results/inferenced_\"+file.split('.')[0]+\".mp4\",\n",
    "                      cv2.VideoWriter_fourcc(*'DIVX'), video_fps, (image_size[1],image_size[0]))\n",
    "\n",
    "    for i in range(len(image_array)):\n",
    "        out.write(image_array[i])\n",
    "    out.release()\n",
    "    \n",
    "    \n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ed5ae133",
   "metadata": {},
   "outputs": [],
   "source": [
    "from mean_average_precision.detection_map import DetectionMAP\n",
    "from mean_average_precision.utils.show_frame import show_frame\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "25038ad9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Ijd33iFDhohGo5HmzZvLrFmzpKioyKpOVFSUtG7d2qrMbDZLamqqhIaGilqtlsjISNm9e7dN/2fPnpUxY8aIr6+vaLVaSUpKEqPR6Mgp1WlO5Q8LrOiVmJhoqZeamipdunQRX19fady4sXTs2FHmz59v079S5rVnzx6Jjo6WZs2aSaNGjaRZs2YSHx9v9bDAcg1lW5WbNWuWqNVqq2+qt3Lltjp16lSl/5527NghIg1vv2po3DG2ibhnfHPH2CbinvGtocQ2lYhI7U6QEhEREZGjucWNA0RERETuhkkaERERkQIxSSMiIiJSICZpRERERArEJI2IiIhIgZikERERESkQkzQiIiIiBWKSRkRERKRATNLIIebPnw+VSmV5NW3aFAMHDsTmzZtdMp6dO3dCpVLh+++/t5SpVCqkp6e7ZDxE1HAxvpGzMEkjh9FoNNizZw/27NmDlStXorCwECNHjsTu3btdPTQionphfCNnaOTqAZD78vDwQL9+/SzvIyMjERYWhnfffRcDBgxw4ciIiOqH8Y2cgUfSyGl+97vfISgoCKdPn7aU7dmzBzExMfDx8UFAQAASEhJw6dIlq3ZFRUV44YUX0K5dO6jVaoSGhmLSpElWfYwaNQohISHw8fFBz5498f777ztrWkREjG/kEDySRk5z7do15Ofno23btgBuBp/o6GjExcXh448/xvXr1/HCCy/goYcewp49eyztxo4di+3bt2POnDno168ffvvtN2RmZlo+z83Nxb333ospU6bA29sb3377Lf7whz/AbDYjMTHR6fMkojsP4xs5hBA5wLx588THx0dKSkqkpKREcnNz5ZFHHhGdTid6vV5ERAYPHiwDBgwQs9lsaXf48GFRqVSyadMmERHZunWrAJCMjIwaLddsNktJSYk8+eST0r9/f0v5jh07BIDs37/fUgZAXn31VXtMl4juIIxv5Cw8kkYOc/36dTRu3Njy3tPTE59//jk6deqEgoICfPvtt0hPT0dZWZmlTseOHREWFob9+/cjLi4O2dnZaNKkCcaPH1/pcgwGA+bNm4fPP/8c586ds/TXtGlTx02OiO5ojG/kDLwmjRxGo9Fg//792Lt3Lz744AMEBwfj8ccfx4ULF2AwGFBWVobnnnsOjRs3tnqdPn0aZ86cAQDk5eUhODgYKpWq0uVMmjQJH374IWbNmoWtW7di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\n",
      "text/plain": [
       "<Figure size 640x480 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_class = 2\n",
    "\n",
    "mAP = DetectionMAP(n_class)\n",
    "for i, frame in enumerate(frame_results):\n",
    "#     print(\"Evaluate frame {}\".format(i))\n",
    "#     show_frame(*frame)\n",
    "    mAP.evaluate(*frame)\n",
    "\n",
    "# class_index\n",
    "# %matplotlib inline\n",
    "mAP.plot()\n",
    "# plt.show()\n",
    "plt.savefig(\"pr_curve_example.png\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "botsort",
   "language": "python",
   "name": "botsort"
  },
  "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.8.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
