Compare commits

..

No commits in common. "master" and "model" have entirely different histories.

50 changed files with 0 additions and 2884 deletions

View File

@ -1,17 +0,0 @@
# Projekt na przedmiot Widzenie Komputerowe
## Wymagania
Python 3.9
## Instalacja
`pip install -r requirements.txt`
## Link do zbioru danych
https://drive.google.com/file/d/1BoF4F75cviqTRO83EmVS5UF_g9rgONyQ/view?usp=sharing
## Autorzy
Michał Kozłowski
Szymon Jadczak

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 750 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 595 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 617 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

View File

@ -1,627 +0,0 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import cv2\n",
"import matplotlib.pyplot as plt\n",
"import keras\n",
"import numpy as np\n",
"import threading\n",
"from tqdm import tqdm\n",
"import torch\n",
"from ultralytics import YOLO\n",
"import tensorflow as tf"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def object_movie_detection(movie_name, background_substract_method, substractor_threshold, mask_parameters, movie_resize, detection_area,object_area_to_detect):\n",
" if background_substract_method == 'KNN':\n",
" object_detector = cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=substractor_threshold)\n",
" else :\n",
" object_detector = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=substractor_threshold)\n",
" \n",
" cap = cv2.VideoCapture(movie_name)\n",
" #cap.set(cv2.CAP_PROP_FPS, 60)\n",
" frames = []\n",
" pbar = tqdm(total = cap.get(cv2.CAP_PROP_FRAME_COUNT))\n",
" while True:\n",
" _, frame = cap.read()\n",
" if(frame is not None):\n",
" pbar.update(1)\n",
" detection_field = frame[detection_area[0][0]: detection_area[0][1],detection_area[1][0]:detection_area[1][1]]\n",
" mask = object_detector.apply(detection_field)\n",
" _, mask = cv2.threshold(mask,mask_parameters[0],mask_parameters[1], cv2.THRESH_BINARY)\n",
" conturs, _ =cv2.findContours(mask, cv2.RETR_LIST , cv2.CHAIN_APPROX_TC89_L1)\n",
"\n",
" images = []\n",
" counter = 0\n",
" for cnt in conturs:\n",
" area = cv2.contourArea(cnt)\n",
" if area > object_area_to_detect:\n",
" counter += 1\n",
" x,y,w,h = cv2.boundingRect(cnt)\n",
" rectangle = cv2.rectangle(detection_field,(x,y),(x+w,y+h),(0,255,0),3)\n",
" rectangle = cv2.rectangle(frame,(330,100),(1900,900),(255,0,0),3)\n",
" cv2.putText(rectangle,f'DETECTION AREA DETECTED OBJECTS: {counter}',(330,80),cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,0,255), 4)\n",
" frames.append(frame)\n",
" frame = cv2.resize(frame, (movie_resize[0], movie_resize[1])) \n",
" #cv2.imshow(\"roi\", frame)\n",
"\n",
" key = cv2.waitKey(30)\n",
" if key == 27:\n",
" cv2.destroyAllWindows()\n",
" pbar.close()\n",
" return frames\n",
" else:\n",
" cv2.destroyAllWindows()\n",
" pbar.close()\n",
" return frames"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def save_video(video_name, frames, frame_sizes,fps):\n",
" out = cv2.VideoWriter(f'{video_name}.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), fps, (frame_sizes[1], frame_sizes[0]))\n",
" for frame in frames:\n",
" out.write(frame)\n",
" out.release()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 660/660.0 [01:12<00:00, 9.14it/s]\n"
]
}
],
"source": [
"movie_detection_1 = object_movie_detection(\n",
" '../examples_movie/rybki.mp4',\n",
" background_substract_method='KNN',\n",
" substractor_threshold=100,\n",
" mask_parameters=[254,255],\n",
" movie_resize=[960,540],\n",
" detection_area=[(100,900),(330,1900)],\n",
" object_area_to_detect=1000\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/example_detection_1',movie_detection_1,movie_detection_1[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 1037/1037.0 [03:21<00:00, 5.15it/s]\n"
]
}
],
"source": [
"movie_detection_2 = object_movie_detection(\n",
" '../examples_movie/rybki2.mp4',\n",
" background_substract_method='KNN',\n",
" substractor_threshold=100,\n",
" mask_parameters=[254,255],\n",
" movie_resize=[960,540],\n",
" detection_area=[(100,900),(330,1900)],\n",
" object_area_to_detect=1000\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/example_detection_2',movie_detection_2,movie_detection_2[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|█████████▉| 962/963.0 [01:20<00:00, 11.98it/s]\n"
]
}
],
"source": [
"movie_detection_3 = object_movie_detection(\n",
" '../examples_movie/rybki3.mp4',\n",
" background_substract_method='KNN',\n",
" substractor_threshold=100,\n",
" mask_parameters=[254,255],\n",
" movie_resize=[960,540],\n",
" detection_area=[(100,900),(330,1900)],\n",
" object_area_to_detect=1000\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/example_detection_3',movie_detection_3,movie_detection_3[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|█████████▉| 857/858.0 [01:55<00:00, 7.43it/s]\n"
]
}
],
"source": [
"movie_detection_4 = object_movie_detection(\n",
" '../examples_movie/rybki4.mp4',\n",
" background_substract_method='KNN',\n",
" substractor_threshold=100,\n",
" mask_parameters=[254,255],\n",
" movie_resize=[960,540],\n",
" detection_area=[(100,900),(330,1900)],\n",
" object_area_to_detect=1000\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/example_detection_4',movie_detection_4,movie_detection_4[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|█████████▉| 779/780.0 [01:01<00:00, 12.64it/s]\n"
]
}
],
"source": [
"movie_detection_5 = object_movie_detection(\n",
" '../examples_movie/rybki5.mp4',\n",
" background_substract_method='KNN',\n",
" substractor_threshold=100,\n",
" mask_parameters=[254,255],\n",
" movie_resize=[960,540],\n",
" detection_area=[(100,900),(330,1900)],\n",
" object_area_to_detect=1000\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/example_detection_5',movie_detection_5,movie_detection_5[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 388/388.0 [00:26<00:00, 14.55it/s]\n"
]
}
],
"source": [
"movie_detection_6 = object_movie_detection(\n",
" '../examples_movie/jelly2.mp4',\n",
" background_substract_method='KNN',\n",
" substractor_threshold=100,\n",
" mask_parameters=[254,255],\n",
" movie_resize=[960,540],\n",
" detection_area=[(100,900),(330,1900)],\n",
" object_area_to_detect=1000\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/example_detection_6',movie_detection_6,movie_detection_6[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 388/388.0 [00:37<00:00, 10.38it/s]\n"
]
}
],
"source": [
"movie_detection_7 = object_movie_detection(\n",
" '../examples_movie/jelly3.mp4',\n",
" background_substract_method='KNN',\n",
" substractor_threshold=100,\n",
" mask_parameters=[254,255],\n",
" movie_resize=[960,540],\n",
" detection_area=[(100,900),(330,1900)],\n",
" object_area_to_detect=1000\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/example_detection_7',movie_detection_7,movie_detection_7[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"frames = object_movie_detection(\n",
" '../examples_movie/rybki.mp4',\n",
" background_substract_method='KNN',\n",
" substractor_threshold=100,\n",
" mask_parameters=[254,255],\n",
" movie_resize=[960,540],\n",
" detection_area=[(100,900),(330,1900)],\n",
" object_area_to_detect=1000\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"def object_movie_yolo_detection(movie_name,model,detection_time):\n",
"\n",
" cap = cv2.VideoCapture(movie_name)\n",
" cap.set(cv2.CAP_PROP_FPS, 60)\n",
"\n",
" frames = []\n",
" pbar = tqdm(total = detection_time * 60)\n",
" i = 0\n",
"\n",
" while True:\n",
" i += 1\n",
" ret, frame = cap.read()\n",
" if(frame is not None):\n",
" pbar.update(1)\n",
" model.predict(frame,save_crop=True)\n",
" frames.append(frame)\n",
" key = cv2.waitKey(30)\n",
" if key == 27:\n",
" cv2.destroyAllWindows()\n",
" return frames\n",
" if i >= detection_time * 60:\n",
" pbar.close\n",
" cv2.destroyAllWindows()\n",
" return frames\n",
" else:\n",
" cv2.destroyAllWindows()\n",
" pbar.close\n",
" return frames"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"model = YOLO(\"../yolo_model/best.pt\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"jelly2 = object_movie_yolo_detection('../examples_movie/jelly2.mp4',model)\n",
"jelly3 = object_movie_yolo_detection('../examples_movie/jelly3.mp4',model)"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/yolo_jelly1', jelly2,jelly2[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/yolo_jelly2', jelly3,jelly3[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"yolo_detect_1 = object_movie_yolo_detection('../examples_movie/rybki3.mp4',model,1)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/example_detection_8', yolo_detect_1,yolo_detect_1[0].shape,60)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def object_detection_with_neural_pred(\n",
" movie_name, \n",
" background_substract_method, \n",
" substractor_threshold, \n",
" mask_parameters, \n",
" movie_resize, \n",
" detection_area,\n",
" object_area_to_detect,\n",
" model,\n",
" class_names,\n",
" time_to_capture):\n",
" if background_substract_method == 'KNN':\n",
" object_detector = cv2.createBackgroundSubtractorKNN(history=500, dist2Threshold=substractor_threshold)\n",
" else :\n",
" object_detector = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=substractor_threshold)\n",
" \n",
" cap = cv2.VideoCapture(movie_name)\n",
" cap.set(cv2.CAP_PROP_FPS, 60)\n",
"\n",
" pbar = tqdm(total = time_to_capture * 60)\n",
" i = 0\n",
" frames = []\n",
" while True:\n",
" ret, frame = cap.read()\n",
" if(frame is not None):\n",
" pbar.update(1)\n",
" i += 1\n",
" detection_field = frame[detection_area[0][0]: detection_area[0][1],detection_area[1][0]:detection_area[1][1]]\n",
" mask = object_detector.apply(detection_field)\n",
" _, mask = cv2.threshold(mask,mask_parameters[0],mask_parameters[1], cv2.THRESH_BINARY)\n",
" conturs, _ =cv2.findContours(mask, cv2.RETR_LIST , cv2.CHAIN_APPROX_TC89_L1)\n",
"\n",
" images = []\n",
" counter = 0\n",
" for cnt in conturs:\n",
" area = cv2.contourArea(cnt)\n",
" if area > object_area_to_detect:\n",
" counter += 1\n",
" x,y,w,h = cv2.boundingRect(cnt)\n",
" rectangle = cv2.rectangle(detection_field,(x,y),(x+w,y+h),(0,255,0),3)\n",
" image_to_predict = detection_field[y:y+h,x:x+w]\n",
" image_to_predict = cv2.resize(image_to_predict,(224,224))\n",
" images.append((x,y,rectangle,image_to_predict))\n",
" if images:\n",
" for i,image in enumerate(images):\n",
" pred = model(x=tf.convert_to_tensor(image[3][None, :], dtype='float32'))\n",
" labels = [class_names[np.argmax(pre)] for pre in pred]\n",
" cv2.putText(image[2], labels[0], (image[0], image[1]-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36,255,12), 1)\n",
" rectangle = cv2.rectangle(frame,(detection_area[1][0],detection_area[0][0]),(detection_area[1][1],detection_area[0][1]),(255,0,0),3)\n",
" cv2.putText(rectangle,f'DETECTION AREA DETECTED OBJECTS: {counter}',(330,80),cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,0,255), 4)\n",
" frames.append(frame)\n",
" if i >= time_to_capture * 60:\n",
" cv2.destroyAllWindows()\n",
" pbar.close()\n",
" return frames\n",
" #frame = cv2.resize(frame, (movie_resize[0], movie_resize[1])) \n",
" #cv2.imshow(\"roi\", frame)\n",
"\n",
" key = cv2.waitKey(30)\n",
" if key == 27:\n",
" cv2.destroyAllWindows()\n",
" pbar.close()\n",
" return frames\n",
" else:\n",
" cv2.destroyAllWindows()\n",
" pbar.close()\n",
" return frames"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def wrap_frozen_graph(graph_def, inputs, outputs, print_graph=False):\n",
" def _imports_graph_def():\n",
" tf.compat.v1.import_graph_def(graph_def, name=\"\")\n",
"\n",
" wrapped_import = tf.compat.v1.wrap_function(_imports_graph_def, [])\n",
" import_graph = wrapped_import.graph\n",
"\n",
" if print_graph == True:\n",
" print(\"-\" * 50)\n",
" print(\"Frozen model layers: \")\n",
" layers = [op.name for op in import_graph.get_operations()]\n",
" for layer in layers:\n",
" print(layer)\n",
" print(\"-\" * 50)\n",
"\n",
" return wrapped_import.prune(\n",
" tf.nest.map_structure(import_graph.as_graph_element, inputs),\n",
" tf.nest.map_structure(import_graph.as_graph_element, outputs))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"with tf.io.gfile.GFile(\"../frozen_models/frozen_graph_best_vgg.pb\", \"rb\") as f:\n",
" graph_def = tf.compat.v1.GraphDef()\n",
" loaded = graph_def.ParseFromString(f.read())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"frozen_func = wrap_frozen_graph(graph_def=graph_def,\n",
" inputs=[\"x:0\"],\n",
" outputs=[\"Identity:0\"],\n",
" print_graph=False)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"class_names=sorted(['Fish', \"Jellyfish\", 'Lionfish', 'Shark', 'Stingray', 'Turtle'])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"1037it [27:07, 1.57s/it] \n"
]
}
],
"source": [
"frames = object_detection_with_neural_pred(\n",
" '../examples_movie/rybki2.mp4',\n",
" background_substract_method='KNN',\n",
" substractor_threshold=100,\n",
" mask_parameters=[254,255],\n",
" movie_resize=[960,540],\n",
" detection_area=[(500,900),(800,1900)],\n",
" object_area_to_detect=1000,\n",
" model=frozen_func,\n",
" class_names=class_names,\n",
" time_to_capture = 5\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"save_video('saved_movies/example_detection_9', frames,frames[0].shape,60)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)]"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "393784674bcf6e74f2fc9b1b5fb3713f9bd5fc6f8172c594e5cfa8e8c12849bc"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.