#!/usr/bin/env python # coding: utf-8 # # ZDO zadání 2020 # # * Navrhněte a naprogramujte nástroj pro měření pohybu zvířat v boxech. # * Vstupem jsou videa s pohledem shora # * Cílem je naměřit počet metrů, které zvíře ujde v určitém čase. # * Polohu zvířat zaznamenávejte v metrech, čas v sekundách. # * Bonusová úloha je určení natočení zvířete # # Data # # [data ke stažení naleznete zde](https://drive.google.com/drive/folders/1CCNoKKFSFHQfV4W0sm_Civ7pQ0IkElLB?usp=sharing) # # ## Rozdělení anotací # # Každá ze skupin má za úkol provedení anotace videí ze dvou kamer. # # * Skupina 1 # * Kamera 1, videa 001 až 010 # * Kamera 2, videa 001 až 004 # * Skupina 2 # * Kamera 1, videa 011 až 015 # * Kamera 2, videa 005 až 006 # * Skupina 3 # * Kamera 1, videa 021 až 030 # * Kamera 2, videa 009 až 012 # # # # Práce s videem # In[72]: get_ipython().run_line_magic('pylab', 'inline') import skimage from skimage.io import imread import cv2 from pathlib import Path import pandas as pd import seaborn as sns pd.__version__ # In[99]: # imread() pth = Path('~/Downloads/zverinec02-006.mp4').expanduser() cap = cv2.VideoCapture(str(pth)) # prostor pro inicializaci # In[101]: get_ipython().run_line_magic('matplotlib', 'inline') ret, frame = cap.read() plt.imshow(frame) # In[76]: step = 25 # read every 10th step cap = cv2.VideoCapture(str(pth)) frames = [] amount_of_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) print(f"amount_of_frames={amount_of_frames}") for frame_number in range(0, int(amount_of_frames), step): cap.set(cv2.CAP_PROP_POS_FRAMES, int(frame_number-1)) res, frame = cap.read() frames.append(frame) cap.release() cv2.destroyAllWindows() # In[40]: # # Alternative reading # while(cap.isOpened()): # ret, frame = cap.read() # # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # # zde místo pro práci s každým snímkem # # cv2.imshow('frame',gray) # if cv2.waitKey(1) & 0xFF == ord('q'): # break # cap.release() # cv2.destroyAllWindows() # # Anotace # # * Pozice prasete je dána bodem mezi předníma nohama na spojnici ramen zvířete. # * Dodržujte ID zvířete. Na všech framech musí být první zvíře vždy označováno jako první. # * Výstup je v XLSX formátu, případně v CSV # * Pravým tlačítkem myši lze bod odebrat # * Prostředním tlačítkem myši se ukončuje zadávání a dojde ke zobrazení dalšího snímku # # ## Ukázka na jednom snímku # In[102]: get_ipython().run_line_magic('matplotlib', 'qt') plt.figure(figsize=[15,10]) plt.imshow(frame) points = plt.ginput(-1) points # In[60]: pth.parts[-1] # ## Anotace celého videa # In[85]: get_ipython().run_line_magic('matplotlib', 'qt') annotation={ "filename": [], # pth.parts[-1] "frame_id": [], "animal_id": [], "x_px": [], "y_px": [], "annotation_timestamp": [], } plt.figure(figsize=[15,10]) # for i, frame in enumerate(frames[3:9]): for i, frame in enumerate(frames): plt.imshow(frame) plt.draw() points = plt.ginput(-1) for j, point in enumerate(points): annotation["filename"].append(pth.parts[-1]) annotation["frame_id"].append(i * step) annotation["animal_id"].append(j) annotation["x_px"].append(point[0]) annotation["y_px"].append(point[1]) annotation["annotation_timestamp"].append(str(pd.Timestamp.now())) plt.close() df_one_video = pd.DataFrame(annotation) df_one_video # ## Vizualizace pomocí `seaborn` # In[91]: sns.lineplot(data=df_one_video, x="x_px", y="y_px",hue="animal_id") # In[72]: annotation # ## Uložení do souboru # In[69]: ann_fn = Path("annotation.xlsx") sheet_name = "Sheet1" if ann_fn.exists(): dfold = pd.read_excel(str(ann_fn), sheet_name=sheet_name) # dfout = pd.concat([dfin, df], axis=0, ignore_index=True) dfcombine = dfold.append(df_one_video, ignore_index=True, sort=True) dfcombine.to_excel(str(ann_fn), sheet_name=sheet_name, index=False) else: df_one_video.to_excel(ann_fn, index=False, sheet_name=sheet_name) # In[82]: # # Návrh # # * Limity # * Požadované vstupy # * Návrh API # # Dodatečné informace # * Rozměr boxu je 180x110 cm # # * [Skript užitečný pro vyhodnocení](https://nbviewer.jupyter.org/github/mjirik/ZDO/blob/master/ZDOsem2020-eval.ipynb) # In[ ]: