From 52965fea2e3247544925600791808202197588a7 Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Fri, 1 Dec 2023 18:05:24 -0500 Subject: [PATCH 01/16] multithreading --- src/strongsort/yolov5/detect.py | 36 ++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index 9d81a4fc..51860bf8 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -50,6 +50,9 @@ import torch import torch.backends.cudnn as cudnn +import concurrent.futures +import urllib.request + FILE = Path(__file__).resolve() ROOT = FILE.parents[1] # yolov5 strongsort root directory WEIGHTS = ROOT / "weights" @@ -218,13 +221,10 @@ def run( with open(write_to, "w") as f: f.write("") - # Run tracking - model.warmup(imgsz=(1 if pt else nr_sources, 3, *imgsz)) # warmup - dt, seen = [0.0, 0.0, 0.0, 0.0], 0 - curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources - for frame_idx, (path, im, im0s, vid_cap, s) in enumerate(dataset): - if not frame_idx % skips == 0: - continue + def runEverything(frame_idx, path, img, im0s, vid_cap, output): + dt, seen = [0.0, 0.0, 0.0, 0.0], 0 + curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources + t1 = time_sync() im = torch.from_numpy(im).to(device) im = im.half() if half else im.float() # uint8 to fp16/32 @@ -524,6 +524,28 @@ def run( prev_frames[i] = curr_frames[i] + # Run tracking + model.warmup(imgsz=(1 if pt else nr_sources, 3, *imgsz)) # warmup + # dt, seen = [0.0, 0.0, 0.0, 0.0], 0 + # curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources + + # all = {executor.submit(runEverything, url, 60): url for url in URLS} + all = {} + + with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: + for frame_idx, (path, im, im0s, vid_cap, s) in enumerate(dataset): + all[ + executor.submit(runEverything, frame_idx, path, im, im0s, vid_cap, s) + ] = frame_idx + + for future in concurrent.futures.as_completed(all): + try: + data = future.result() + except Exception as exc: + print("generated an exception: %s" % (exc)) + else: + print("done") + # Print results t = tuple(x / seen * 1e3 for x in dt) # speeds per image LOGGER.info( From eee14297ecba0fd5490f9e3b3b238ab90a754deb Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Fri, 1 Dec 2023 18:32:10 -0500 Subject: [PATCH 02/16] update multithreading --- src/strongsort/yolov5/detect.py | 63 ++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index 51860bf8..13d48688 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -221,9 +221,29 @@ def run( with open(write_to, "w") as f: f.write("") - def runEverything(frame_idx, path, img, im0s, vid_cap, output): + def runEverything( + frame_idx, + path, + im, + im0s, + vid_cap, + outputs, + s, + device, + half, + save_dir, + visualize, + augment, + model, + conf_thres, + iou_thres, + classes, + agnostic_nms, + max_det, + write_to, + ): dt, seen = [0.0, 0.0, 0.0, 0.0], 0 - curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources + # curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources t1 = time_sync() im = torch.from_numpy(im).to(device) @@ -523,11 +543,13 @@ def runEverything(frame_idx, path, img, im0s, vid_cap, output): vid_writer[i].write(im0) prev_frames[i] = curr_frames[i] + return dt, seen # Run tracking model.warmup(imgsz=(1 if pt else nr_sources, 3, *imgsz)) # warmup + # dt, seen = [0.0, 0.0, 0.0, 0.0], 0 - # curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources + curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources # all = {executor.submit(runEverything, url, 60): url for url in URLS} all = {} @@ -535,16 +557,33 @@ def runEverything(frame_idx, path, img, im0s, vid_cap, output): with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: for frame_idx, (path, im, im0s, vid_cap, s) in enumerate(dataset): all[ - executor.submit(runEverything, frame_idx, path, im, im0s, vid_cap, s) - ] = frame_idx - + executor.submit( + runEverything, + frame_idx, + path, + im, + im0s, + vid_cap, + outputs, + s, + device, + half, + save_dir, + visualize, + augment, + model, + conf_thres, + iou_thres, + classes, + agnostic_nms, + max_det, + write_to, + ) + ] = [frame_idx, path, im, im0s, vid_cap, s] + for future in concurrent.futures.as_completed(all): - try: - data = future.result() - except Exception as exc: - print("generated an exception: %s" % (exc)) - else: - print("done") + [frame_idx, path, im, im0s, vid_cap, s] = all[future] + dt, seen = future.result() # Print results t = tuple(x / seen * 1e3 for x in dt) # speeds per image From 02e9758079dc47b6f790d90e3359216cf0ff89d8 Mon Sep 17 00:00:00 2001 From: Eric Guo Date: Sat, 2 Dec 2023 13:13:15 -0500 Subject: [PATCH 03/16] Modified gitignore to not add pycache --- .gitignore | 2 +- src/__pycache__/__init__.cpython-38.pyc | Bin 143 -> 0 bytes src/__pycache__/main.cpython-38.pyc | Bin 2672 -> 0 bytes src/__pycache__/modelrunner.cpython-38.pyc | Bin 4894 -> 0 bytes src/__pycache__/processrunner.cpython-38.pyc | Bin 4183 -> 0 bytes src/__pycache__/state.cpython-38.pyc | Bin 22691 -> 0 bytes src/__pycache__/team_detect.cpython-38.pyc | Bin 5540 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 154 -> 0 bytes .../__pycache__/courtline_detect.cpython-38.pyc | Bin 22647 -> 0 bytes .../__pycache__/general_detect.cpython-38.pyc | Bin 4379 -> 0 bytes .../__pycache__/shot_detect.cpython-38.pyc | Bin 2511 -> 0 bytes .../__pycache__/team_detect.cpython-38.pyc | Bin 5865 -> 0 bytes 12 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 src/__pycache__/__init__.cpython-38.pyc delete mode 100644 src/__pycache__/main.cpython-38.pyc delete mode 100644 src/__pycache__/modelrunner.cpython-38.pyc delete mode 100644 src/__pycache__/processrunner.cpython-38.pyc delete mode 100644 src/__pycache__/state.cpython-38.pyc delete mode 100644 src/__pycache__/team_detect.cpython-38.pyc delete mode 100644 src/processing/__pycache__/__init__.cpython-38.pyc delete mode 100644 src/processing/__pycache__/courtline_detect.cpython-38.pyc delete mode 100644 src/processing/__pycache__/general_detect.cpython-38.pyc delete mode 100644 src/processing/__pycache__/shot_detect.cpython-38.pyc delete mode 100644 src/processing/__pycache__/team_detect.cpython-38.pyc diff --git a/.gitignore b/.gitignore index ea181681..b7565ed8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ venv .env -__pycache__ +*__pycache__* yolov8m-pose.pt *.mp4 tmp/ diff --git a/src/__pycache__/__init__.cpython-38.pyc b/src/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index b49cd62a9c0268697e1b2cefcb1f2ddd570bf35e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmWIL<>g`kf@#lhAW=>gZk-kfQa%paAUP-aOQ({hzuAzaUesNK&ryk0@&Ee@O9{FKt1 MR6CGqpMjVG03+)lHUIzs diff --git a/src/__pycache__/main.cpython-38.pyc b/src/__pycache__/main.cpython-38.pyc deleted file mode 100644 index bba88c28bd19506ca4d5f4ec9e5c12d388757a04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2672 zcmbVO&2QX96!+L(@5cL)-A$S{B{XhnRRZ0nMSxIM5G_TBL#vQbA-PnR0+;gM*qil2PT1P<`@J{s&AhLfecW!F3Ot{G`~wqB zMfnp!^{D~)8h+wOq9|0c6-uZYkWjT%g0vQBp>FGv)`OZ|170mK!n$1#8+L;ztUe@E zr^c^@)@kFHn!UhGx-e2-6TZc2`%P-n<`J=5thL{!E!w7?Bd{#dBJEaCkM`*jT|UxE z={dkF6?`7>g$iB;e6fPx1H4wj@6$^a>+962pv&}11${uTPSJ7aM6nIF$c$G6zV+iS z;2tv`C{M50eP$dlvHl78J6Zt$)|kQis|xF}{$1rYdA`OPtoMq*{uhcb)pwMQYuQEf zq3cJM7e^_N11pH*#0q0N4w(5D=3;~7&4)2%!S*W16)V%iK-u8Dp zxhYsWP8^r-37BSZKs@pwb*B#|)PUbN@DnCTQb;3i>QFf*Cki;S_Otquyi|d&9+Ec- z)ehA+%3B@hJnsTmQmJ~V(Ap7sslnG+Rm9ezcC4K!L`n5hg5Nqw_7C+^qRS$G()Up^PVYz(4P##JSk(7YD;^>mhp>*gVY$K*3G@7+&nT>jwJ`MeZcf}VD0bvi zW_>#xGOuFoC+?@PsWg^$pIqlmjDu7-LqA~GpGv)K>&v-kCv|y>d)#%s5d&{zvAyuq zXVx$dg7^i>eB89SJg0aHvJN^jdouNo_3u?qC;x8(idV;A*`^rzi6g^pwUU!PJk7j-$l?3jD@lEcBR-st2Wj7NR z!%8yR+0}W)U8tNhR2Gnbra}@6c9sJ23xyBoS16+ZejPw*#MO;;PGyDWwRz35N-V6B zs#>dBK4sj!c+AsmUf&9#BSJTs(=B;&!ABdlyq0i3O7j{NXehV}XHBj_w{Q)pjT)~@ z#)wVw+JPI4S>BWx#(rWvZ{V!{s&ATbYOuV|pn`w-Z{ z?OV4u1@|^XI8ARRlUzpvuQ%~23`#>K>N{QQk`*E;-6RdtP>WF|9gsChU%qBJ@;>P0 z4aY%Cj+6DavH7dLgJ&~k!sC9D`f-%C1_POpBJ};lh0cNoEs}&G$I5=jf+TAU24yu~ zn9eGTjQSk1}-Lmr3LlfuSRxDpK4!!7Z1;6v6a zElsm8UIO2&}PQy56-NB&fPv-^m_nxI9yEctu zrEg0aoNnBj#6f)U8HPgk;Z$vXswTVkYz5heQ-!Nj1=+R#QTSqj{Eg+j?l?5|9EW!x z1F{MDB2w4{c>|8O#N|-Z*bH390q^G1l0%;zC-2-VZ;35AIX4QWyya4g_q=R?+>~5- z@8|jf%*=H!PA0ZN@f5w4lTohiu~c?aW$4MB+=a}*pN+5ZZ-TI4(6tt6L34Dq{&f?m f4!k;16?oqn&_FZ#EUKIfGeJ*<7L#w6bm99C#KQ49 diff --git a/src/__pycache__/modelrunner.cpython-38.pyc b/src/__pycache__/modelrunner.cpython-38.pyc deleted file mode 100644 index 36fcd0b5c987b72d6a2bb112d1b8dbd417ac81fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4894 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 H@XY@L77N`3 diff --git a/src/__pycache__/processrunner.cpython-38.pyc b/src/__pycache__/processrunner.cpython-38.pyc deleted file mode 100644 index 58a52f9ee003db127061ca9fbeb770b3ddea2ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4183 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 NbOGPfrODER{}*88{Xzf$ diff --git a/src/__pycache__/team_detect.cpython-38.pyc b/src/__pycache__/team_detect.cpython-38.pyc deleted file mode 100644 index bcdc30299a2635ca923ea74723ac50a982ddadee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5540 zcmcIoTW=gm6|TO{OnYo+gUM|}wqaq(Ag>)qk+L!-0ybJ{r6{bFMMx8}qs~;@?sz;s zuI@?fY>fnRv~iI30U_~#cyJ_M@`l78K>P-t`V|S}zrf4#ol`wG+u2=&m{C`qx>uh% z-*-;+&u3=?f!{y>)s?fCh4=>*CVvhJKgN@-A(5gfq$TZVqG`!9(v{vbt7%JLR#4-} zs;nV*@}UOadZm%VTYNzGDSfbd?6krJQ=N8Tqpi@cPy3Az z6#GzVe`7Q4!&+cAj}sZEJpKsBDee~T?sn3pG}XlHlc#(hKT;5E#cmU}9F1k7d2ZJ90q6gz!)<=V<} zrrOH{nwDflF7@_`d0ug>u_|WEu99+URm;UcDF0RDXGVV;61Dr5nn&NG1te`^j^U3u zhUQ}I{0V{GC;fg5i_04EMG@f)C|awrHx(%!17t2+x^CL~pJ*!r*)Heb^s7E^skX>y96TjE~p{+e2hgJY`_ATuKA!TVDYgz)x@TA8x z_>2zy8gyhi7-bcdat{JMV5&}(mE^RUc3`YfbC{(nX9OhO^;B&~M0+O;7SuOwjbz0z z)i~Q+4ZHpAhlZWjRkR(02vcQ;queTV+UCB~|CsNSAxT|K6 zDzc#?Di;;*(M=n!s!$8rT;W3%7+g3>H*W-mZ`4)Hl#nD+DSV^V!sqkLiVEu^R?RuG z`?#BzFa@sDtkuB?kEh|an=avk0cMgpT6TU67N)Q7qcXdJM9dRj=wG$wESvFCMNY^8 zR_v-(x9l%mJgED^w}Bp4!2?eNha3*QBY`PvplaqN5PRY?W3}0yXBHAyCm)1owtdZ_{F|74Sa&KaxHLNt02lyZqTpX-yjyyi(M+f9 za<~z)D(-k3KyZUyVqCLT0tj`@u#4-r!$_%!y=mDCq>v$o$)Ch=cl3@=He(fk=_ZC7 z8?JRfd2s*HgAlTbk^(}}z4TbSaN#i$=c zU4^KfUg52;Si$W64UB6z>f6W^>4{0J;i*d`6RQ>DxM8=b4v(|260`W*)Q`z#W@5cf z)UwjV>?P}*wO}nUnN)2>6f~u0IyE8^CXuHQa&h47TQ95)@dAYM+cJo*|YO z_5tG9bD)DQM|}d4LFrAR74N)w;U3u1&Fy^ao;;u*S#y)jL#e<*&S^gV$^Z0CcMtr*Oe=YO&hxBkTZk7~fRy^*U%(Eqdt*n|&9P ze1<0@`w<+Z)ve3+S-7O9Z?43UZ1k4R5bX3Q2$0iL3`P_c1R(5V(FVKbeZ zo>-$HJBLJ6s&I1)K^@^@o!p{bN3NF9awL&V9T0gvqL=saWC}@ws}@2Ne>6`svS zAZH;o^t6YXcMwGS2=yxJhP1V2)|t!$rcxir`mVfKTx9B9);U;1{@&YF63_mR$*7$xmoTO|?1B(JK4StmF=MKIEc+!XGW0oj`GK62+($2m!aC3YiK%nNy z%D|UZ+;zxo^#ET@2DRMN$S+bL7qA?#Jfj2j`Cx$CJo2@{EN(Uk=?;Be=Rl66S(0$? z!HuYF7l){CDa|`ZcD`vGV`zu5;Xg=u-~! zQFxy(7l@cR=R3xeGz3lZh05513E$|05U#&$@HGAeriR8&`PeIrx`D1J*f*Y}Tz2A; zGqKeF`T>F&fUi6J@e3cYl5Eqkh4E498VsyqsTE{LbnStB9@&&dI;fy1hvO!~Kthq% z+%I8|1EN0bcN}evp@8V)3c9gNITaJ z&#XxgQDFq}O{S>Da9Xj#^_YVaX8OV<9GVztj$v+K%+b(yX_wzaQh2m%)~t=}p;-et zwHWtJml_L?3#R9a$*wocFET4b;rdt$#yJJ!_xTIG>Jkz$L*PHlPRY=M3z=LL-QDPR zMrnXM8-L^YAx7NA!BEJGjE}5RR9Y>Wwp%T}j`I7DU)tz|#!YNzOj6Y~^SSdDMQRz* Rm|Lm775t>SP`wgd{10Kla8v*Q diff --git a/src/processing/__pycache__/__init__.cpython-38.pyc b/src/processing/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 35c202600c707be5cafc34626eb340cde3f4510e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmWIL<>g`kg3ubbR1p0bL?8o3AjbiSi&=m~3PUi1CZpd~voLXF*nU}5~AD@|*SrQ+w XS5SG2!zMRBr8Fni4rK6WAZ7pnZ!07e diff --git a/src/processing/__pycache__/courtline_detect.cpython-38.pyc b/src/processing/__pycache__/courtline_detect.cpython-38.pyc deleted file mode 100644 index 7f86617a2f6c23f7a455c882fd3886f91f6197f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22647 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 V2}8fKiQ;(iPg~}5I}26ze*o}}jd}n8 diff --git a/src/processing/__pycache__/general_detect.cpython-38.pyc b/src/processing/__pycache__/general_detect.cpython-38.pyc deleted file mode 100644 index 73f8b985180946f0ab300848b77e91a86c28f3c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4379 zcmcIn&2t<_74M#}{m|FiHT}jLLVQl0=}!rrpW&DO35^m;c0^Y;WY=jpUAN&%8gn{c*KhdUpbp%sngnn67(64AmOI;m(+x|ImPN?b&sb>n^w4%lOD)f@sZ+3+SHY&JpFYNFMcpm@t^IyS7vAkS%?fWlZe?|+sC*E0 zI-6OP>7w%UsH<7TxS#UaOm9Ey?`O?^llw`sc03OUk&lO8<|w6VYaKoekVH6CbUNsw&RWt<0R{aQP{x|hrM>FaL92liA=21 zOFaE1Tct2$7ww+uM%h(XeHgWNF*DJj(S4&+on$F|wGChqMu`ery(Ej`#0GEoI-TCL zIN5ji*<5Lr$dF2%zolxP?`H&nvCpmg<=;9ZF^>Iv$P{_+S>we+&`Z_5pMn{S; zlol?q2pZ{k;;aawKD4SnV~9gdnSIz-EXt#uDm;R4;oIre*1j=Kwkceg6jhdaPYaK1 z3Xe=)33CzdzFb?mpK6n?XcM<~_IoQg);Cv(+umJ$Z*?U#t(Cs%wRDe zY|T5Ed#CR3+ZKV**}h4>o<2XqNlek^m4O2?Alh_umr2vHq&e`E11fcM@z^_*pv$*D zb_M}Rv~=Vv_od8&9OEFSD|s;RrPzD0cLkJO&Ry6ROs(()YV|CMf?EGdzH$)fQE5o9 zAmXfIBOE%IcM;S|HUVr#QHB(ZNS_TO{dw;*j%3N$!%C{kBQjO~6EFRQ`|x1<=I?uU z#L_X@S_&pw6odeDk|?Hw6To?GhH@w0O+z(@si8Uk3rVM_nWtufn$u_sk9^#z zSIwI=^et+>P2&}v?011=B=5k!Md9w~%$z4>VBfOvO_c2D!tLl}c>fyZ(OS)S$k$uc ze3$09v3g#}xbXR|nYT&tJ!-yB4c#-_)FBmBduPbk57AG5ghrI;w$yN2PUGvz06%+c zYPc8Y$0MP1#&>2hFh9o3x->t)qeZkd`VbcpW8A zX3!p@`T%fmQ}vOn?=f{y8XjeU zq203>X-HGXrU70PCCk@+#@Sq}Fd|p%oyr3$A}Du%^Bjx*vp7^Ui>B_H%On$&%mo?90w`hO4lOLS38>Bz!5i$K z`D1u*0p8>T*a(lvY3k3)WRIq zgf>qj@OYcO@%%J=bimagv)>e~2vLTxRWC7^3>{f9vvGf`xpA|3_xAN)7jw7nH1BR~ zZhpAAd28d&1bnR6x_AA~=B+I#>OO;@QK2{EphcDGlS49XGV)Hs?bO7mX_+{|5>nz? zQSv~M7eIz@0&q1Z%0)=FPsC|{3ahU$p^JermfIB?DR< zYunk8xwKj&%JN7?DkqC6JAx$XndQR&Bg^q$mL|{>{)P(T!8FB9Rmes1+5;n6vV{6H0R({rW-?;J*&)RznpQIg diff --git a/src/processing/__pycache__/shot_detect.cpython-38.pyc b/src/processing/__pycache__/shot_detect.cpython-38.pyc deleted file mode 100644 index 69c97560f9c54621445cd2c013f380d55751bb8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2511 zcmb_e&2Jk;6rY*>@Y-=w=cBZxg$^Hw7(tRsaGKk)@~diH*1U1y%uJ+^lpyRNcTB853d=Fb;uP+ z_9K+y1&0WT192_OQO%zC{#N1T-Xs2)6@Koov)h-8nsSu;faSGE;xSuid%OtpKzXRs zM`g>fYo}PjF$Nd~#yUm^V*{gmXZcI^0sEZYU|+GE=OTAcu-wVrfm_t8`NVGI^}I0< zIL%Ctq4b8tb@TfAbs1*TZb1#kao>hXEXSEvA654+_4_)tne55Tnj{`(iLuh^T`LD+ zq-EN(Te64Su?*vMY~O{YWHPp}DXEtIBrz(Cdsb&v!emgn6B7>Mjid=j)f$S8^^V+3 zc4cofxvOPpSLCHE8;??|>HN#tWHP7{(n3n25*a5}j%ev}KZ!Hji)|aLOfnvBp`l>?=dr|b>xwUhvndz^lCh6-e3*+Hxww2hf(pLBF zN_wwsT!`>?^^;M0ae?-yLVPCJ{nL0dT^w@dLX`A-QFal=H1dFsaX@t+IHYLN0hM#$ zL$#gKO;R0~b)$PK3S*s>UY16oZO@c->S339Sh|rO*wV2{T6#O7g2&&|;c&~AE(Mj| zWT{I-=|q|B)DYW6w>mWxM#l4JUVvKmz)-Fa&s0j zZC?6D+p&p{^yN5iJ%iV;I5NR$kAEWyKx_yw5X2y!5`_<`K>|qKa=^~n6Z`!8heacA z5X6d^d}f{P^V_y)Dpz@cUh|Q22))^SR)HjnIgCCaC;-9BumM4608rIWvlFa1h8f@o zJu~s0WJN1KmUCLY?Ik}?ZFm6J6KtCo^LYz1WZmY;FH;*H$*zdFHl4vY z-FGSXknMiHh|CZ3rApK8L0+fbCv!Z{X5nFfiu#VCvWM8ep1XKH9>jU%q2BsHJO+jS zTR-kxeoj_uR?Vqns-@=Df?6EbKut^cpZ-6*Gcdi8u2KP~+S~G#s!E#4wTiLMt-V`O%7pDeM^!FLyxf*MVH9Dx z{CXKt=hoV{C!F(XMLLEsdgS%~PqZ@u7@^t(q@Hn3g*VfL?|sN~+Bidpqk{g4H_R;M zI7Vuo)Ep^%Uzs89x!D#6do+0i3iboCiD_VuQLTBavctP%PyFFi9BUeL3T2wNCo!** zUB&nn#LXflBXTta>(Vp5c&JOimx8EN`?z_9Zk?oC4!EV$pd(~mI!vdL_A-2&x*(rt zHpMIw8}*Y2w1|&I7vyhjXa1-Y$vcZgR)32->O@@02j&b_@fxYusT8kje#hSgmv?s$ z$9tV1jHwuSrq;wqDJMR%?!DBkGMKi8o^Q4Z#cIt%cAT>09GI~o7I@$^#S%DDa*2or zMEoiKbRC!b0&Cni`J3G5bBBKanLprju&2M4XWqdsWzfZwMA6;*b9R)jraHl2nH9Th zKWhi2Z||k}Fd2FujYEn!+0;l)SH}QWw_AFt0kU2=SM@qp%pY7BC2Ab$i`4Xt{=Kz$ LaQ4-!0Z9HY*P3c! diff --git a/src/processing/__pycache__/team_detect.cpython-38.pyc b/src/processing/__pycache__/team_detect.cpython-38.pyc deleted file mode 100644 index da078f7f22295ffe0292000dfec7703f0a1eb50c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5865 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 From b44ce042e180051b12fa86d4e5f78f28eb07be54 Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Sat, 2 Dec 2023 13:17:47 -0500 Subject: [PATCH 04/16] fix --- src/strongsort/yolov5/detect.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index 13d48688..b541f97c 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -543,7 +543,7 @@ def runEverything( vid_writer[i].write(im0) prev_frames[i] = curr_frames[i] - return dt, seen + return dt, seen, save_path # Run tracking model.warmup(imgsz=(1 if pt else nr_sources, 3, *imgsz)) # warmup @@ -583,7 +583,7 @@ def runEverything( for future in concurrent.futures.as_completed(all): [frame_idx, path, im, im0s, vid_cap, s] = all[future] - dt, seen = future.result() + dt, seen, save_path = future.result() # Print results t = tuple(x / seen * 1e3 for x in dt) # speeds per image From 42105aef017d6965e92ca52586713c6621a36bb8 Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Sat, 2 Dec 2023 14:35:17 -0500 Subject: [PATCH 05/16] add try except --- src/strongsort/yolov5/detect.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index b541f97c..cc3a7f68 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -294,6 +294,7 @@ def runEverything( ) # get folder name containing current img save_path = str(save_dir / p.parent.name) # im.jpg, vid.mp4, ... curr_frames[i] = im0 + assert im0 is not None txt_path = str(save_dir / "tracks" / txt_file_name) # im.txt if write_to is None: @@ -543,6 +544,7 @@ def runEverything( vid_writer[i].write(im0) prev_frames[i] = curr_frames[i] + assert prev_frames[i] is not None return dt, seen, save_path # Run tracking From 4324e7d90d9066bc2c072a673ad6cc10f109e15e Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Sat, 2 Dec 2023 14:44:54 -0500 Subject: [PATCH 06/16] add try except --- src/strongsort/strong_sort/sort/track.py | 96 ++++++++++++++++-------- 1 file changed, 65 insertions(+), 31 deletions(-) diff --git a/src/strongsort/strong_sort/sort/track.py b/src/strongsort/strong_sort/sort/track.py index 9f3d0e15..982dbbff 100644 --- a/src/strongsort/strong_sort/sort/track.py +++ b/src/strongsort/strong_sort/sort/track.py @@ -66,8 +66,17 @@ class Track: """ - def __init__(self, detection, track_id, class_id, conf, n_init, max_age, ema_alpha, - feature=None): + def __init__( + self, + detection, + track_id, + class_id, + conf, + n_init, + max_age, + ema_alpha, + feature=None, + ): self.track_id = track_id self.class_id = int(class_id) self.hits = 1 @@ -117,13 +126,20 @@ def to_tlbr(self): ret[2:] = ret[:2] + ret[2:] return ret - - def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, - max_iter = 100, scale = 0.1, align = False): + def ECC( + self, + src, + dst, + warp_mode=cv2.MOTION_EUCLIDEAN, + eps=1e-5, + max_iter=100, + scale=0.1, + align=False, + ): """Compute the warp matrix from src to dst. Parameters ---------- - src : ndarray + src : ndarray An NxM matrix of source img(BGR or Gray), it must be the same format as dst. dst : ndarray An NxM matrix of target img(BGR or Gray). @@ -151,10 +167,15 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, """ # skip if current and previous frame are not initialized (1st inference) - if (src.any() or dst.any() is None): - return None, None - # skip if current and previous fames are not the same size - elif (src.shape != dst.shape): + # if src or dst is None: + # return None, None + try: + if src.any() or dst.any() is None: + return None, None + # skip if current and previous fames are not the same size + elif src.shape != dst.shape: + return None, None + except: return None, None # BGR2GRAY @@ -167,16 +188,24 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, if scale is not None: if isinstance(scale, float) or isinstance(scale, int): if scale != 1: - src_r = cv2.resize(src, (0, 0), fx = scale, fy = scale,interpolation = cv2.INTER_LINEAR) - dst_r = cv2.resize(dst, (0, 0), fx = scale, fy = scale,interpolation = cv2.INTER_LINEAR) + src_r = cv2.resize( + src, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_LINEAR + ) + dst_r = cv2.resize( + dst, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_LINEAR + ) scale = [scale, scale] else: src_r, dst_r = src, dst scale = None else: if scale[0] != src.shape[1] and scale[1] != src.shape[0]: - src_r = cv2.resize(src, (scale[0], scale[1]), interpolation = cv2.INTER_LINEAR) - dst_r = cv2.resize(dst, (scale[0], scale[1]), interpolation=cv2.INTER_LINEAR) + src_r = cv2.resize( + src, (scale[0], scale[1]), interpolation=cv2.INTER_LINEAR + ) + dst_r = cv2.resize( + dst, (scale[0], scale[1]), interpolation=cv2.INTER_LINEAR + ) scale = [scale[0] / src.shape[1], scale[1] / src.shape[0]] else: src_r, dst_r = src, dst @@ -185,9 +214,9 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, src_r, dst_r = src, dst # Define 2x3 or 3x3 matrices and initialize the matrix to identity - if warp_mode == cv2.MOTION_HOMOGRAPHY : + if warp_mode == cv2.MOTION_HOMOGRAPHY: warp_matrix = np.eye(3, 3, dtype=np.float32) - else : + else: warp_matrix = np.eye(2, 3, dtype=np.float32) # Define termination criteria @@ -195,10 +224,11 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, # Run the ECC algorithm. The results are stored in warp_matrix. try: - (cc, warp_matrix) = cv2.findTransformECC (src_r, dst_r, warp_matrix, warp_mode, criteria, None, 1) + (cc, warp_matrix) = cv2.findTransformECC( + src_r, dst_r, warp_matrix, warp_mode, criteria, None, 1 + ) except cv2.error as e: return None, None - if scale is not None: warp_matrix[0, 2] = warp_matrix[0, 2] / scale[0] @@ -208,15 +238,18 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, sz = src.shape if warp_mode == cv2.MOTION_HOMOGRAPHY: # Use warpPerspective for Homography - src_aligned = cv2.warpPerspective(src, warp_matrix, (sz[1],sz[0]), flags=cv2.INTER_LINEAR) - else : + src_aligned = cv2.warpPerspective( + src, warp_matrix, (sz[1], sz[0]), flags=cv2.INTER_LINEAR + ) + else: # Use warpAffine for Translation, Euclidean and Affine - src_aligned = cv2.warpAffine(src, warp_matrix, (sz[1],sz[0]), flags=cv2.INTER_LINEAR) + src_aligned = cv2.warpAffine( + src, warp_matrix, (sz[1], sz[0]), flags=cv2.INTER_LINEAR + ) return warp_matrix, src_aligned else: return warp_matrix, None - def get_matrix(self, matrix): eye = np.eye(3) dist = np.linalg.norm(eye - matrix) @@ -229,8 +262,8 @@ def camera_update(self, previous_frame, next_frame): warp_matrix, src_aligned = self.ECC(previous_frame, next_frame) if warp_matrix is None and src_aligned is None: return - [a,b] = warp_matrix - warp_matrix=np.array([a,b,[0,0,1]]) + [a, b] = warp_matrix + warp_matrix = np.array([a, b, [0, 0, 1]]) warp_matrix = warp_matrix.tolist() matrix = self.get_matrix(warp_matrix) @@ -241,7 +274,6 @@ def camera_update(self, previous_frame, next_frame): cx, cy = x1_ + w / 2, y1_ + h / 2 self.mean[:4] = [cx, cy, w / h, h] - def increment_age(self): self.age += 1 self.time_since_update += 1 @@ -270,11 +302,15 @@ def update(self, detection, class_id, conf): """ self.conf = conf self.class_id = class_id.int() - self.mean, self.covariance = self.kf.update(self.mean, self.covariance, detection.to_xyah(), detection.confidence) + self.mean, self.covariance = self.kf.update( + self.mean, self.covariance, detection.to_xyah(), detection.confidence + ) feature = detection.feature / np.linalg.norm(detection.feature) - smooth_feat = self.ema_alpha * self.features[-1] + (1 - self.ema_alpha) * feature + smooth_feat = ( + self.ema_alpha * self.features[-1] + (1 - self.ema_alpha) * feature + ) smooth_feat /= np.linalg.norm(smooth_feat) self.features = [smooth_feat] @@ -284,16 +320,14 @@ def update(self, detection, class_id, conf): self.state = TrackState.Confirmed def mark_missed(self): - """Mark this track as missed (no association at the current time step). - """ + """Mark this track as missed (no association at the current time step).""" if self.state == TrackState.Tentative: self.state = TrackState.Deleted elif self.time_since_update > self._max_age: self.state = TrackState.Deleted def is_tentative(self): - """Returns True if this track is tentative (unconfirmed). - """ + """Returns True if this track is tentative (unconfirmed).""" return self.state == TrackState.Tentative def is_confirmed(self): From 329a981991638ce139e218d68f2e341200119f87 Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Sat, 2 Dec 2023 14:59:54 -0500 Subject: [PATCH 07/16] check of rim is None --- src/processing/action.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/processing/action.py b/src/processing/action.py index b985b93a..da7c77e4 100644 --- a/src/processing/action.py +++ b/src/processing/action.py @@ -1,6 +1,7 @@ from state import GameState, PlayerFrame, BallFrame, Box from args import DARGS + class ActionRecognition: def __init__(self, state: GameState, args=DARGS) -> None: self.state = state @@ -37,14 +38,13 @@ def pose_shot(self, player_frame: PlayerFrame, ANGLE_THRESHOLD): curr += 0.075 return curr - def ball_shot(self, ball_frame: BallFrame, rim: Box): """ Takes in ball data at a frame and returns the weighted sum of the ball features. Currently uses a simple threshold heuristic. """ # checks whether ball y coord is above rim y coord - if ball_frame is None: + if ball_frame is None or rim is None: return 0 ball_pos = ball_frame.box mid_box = ball_pos.center() @@ -61,7 +61,6 @@ def ball_shot(self, ball_frame: BallFrame, rim: Box): # return y_weight + displacement_weight return y_weight + 0.1 - def shot_detect(self): """ Iterates through each frame and computes the classification of shots for each player. @@ -80,10 +79,12 @@ def shot_detect(self): # shots_file.write(str(player_id)) # shots_file.write("\n") for interval in self.state.possessions: - if (interval.start <= frame.frameno <= interval.end and - interval not in self.state.shots): + if ( + interval.start <= frame.frameno <= interval.end + and interval not in self.state.shots + ): self.state.shots.append(interval) - #shot_interval = (frame.frameno, player_id) - #self.state.shots.append(shot_interval) + # shot_interval = (frame.frameno, player_id) + # self.state.shots.append(shot_interval) # shots_file.close() From 9c5a1ba23dcb582ed49db18e3e06ffe9edb61305 Mon Sep 17 00:00:00 2001 From: Eric Guo Date: Sun, 3 Dec 2023 14:41:54 -0500 Subject: [PATCH 08/16] Fixed dt, seen logic in yolov5/detect.py --- src/strongsort/yolov5/detect.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index cc3a7f68..c3fa2e5e 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -583,9 +583,12 @@ def runEverything( ) ] = [frame_idx, path, im, im0s, vid_cap, s] + dt, seen = [0.0, 0.0, 0.0, 0.0], 0 for future in concurrent.futures.as_completed(all): [frame_idx, path, im, im0s, vid_cap, s] = all[future] - dt, seen, save_path = future.result() + per_frame_dt, per_frame_seen, save_path = future.result() + dt += per_frame_dt + seen += per_frame_seen # Print results t = tuple(x / seen * 1e3 for x in dt) # speeds per image From fd2b531412216cda466d75fdf3dc6b6e40f20851 Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Fri, 1 Dec 2023 18:05:24 -0500 Subject: [PATCH 09/16] multithreading --- src/strongsort/yolov5/detect.py | 36 ++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index 9d81a4fc..51860bf8 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -50,6 +50,9 @@ import torch import torch.backends.cudnn as cudnn +import concurrent.futures +import urllib.request + FILE = Path(__file__).resolve() ROOT = FILE.parents[1] # yolov5 strongsort root directory WEIGHTS = ROOT / "weights" @@ -218,13 +221,10 @@ def run( with open(write_to, "w") as f: f.write("") - # Run tracking - model.warmup(imgsz=(1 if pt else nr_sources, 3, *imgsz)) # warmup - dt, seen = [0.0, 0.0, 0.0, 0.0], 0 - curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources - for frame_idx, (path, im, im0s, vid_cap, s) in enumerate(dataset): - if not frame_idx % skips == 0: - continue + def runEverything(frame_idx, path, img, im0s, vid_cap, output): + dt, seen = [0.0, 0.0, 0.0, 0.0], 0 + curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources + t1 = time_sync() im = torch.from_numpy(im).to(device) im = im.half() if half else im.float() # uint8 to fp16/32 @@ -524,6 +524,28 @@ def run( prev_frames[i] = curr_frames[i] + # Run tracking + model.warmup(imgsz=(1 if pt else nr_sources, 3, *imgsz)) # warmup + # dt, seen = [0.0, 0.0, 0.0, 0.0], 0 + # curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources + + # all = {executor.submit(runEverything, url, 60): url for url in URLS} + all = {} + + with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: + for frame_idx, (path, im, im0s, vid_cap, s) in enumerate(dataset): + all[ + executor.submit(runEverything, frame_idx, path, im, im0s, vid_cap, s) + ] = frame_idx + + for future in concurrent.futures.as_completed(all): + try: + data = future.result() + except Exception as exc: + print("generated an exception: %s" % (exc)) + else: + print("done") + # Print results t = tuple(x / seen * 1e3 for x in dt) # speeds per image LOGGER.info( From 3a2a709989b5bcb0fe9a938bc358ca601284572f Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Fri, 1 Dec 2023 18:32:10 -0500 Subject: [PATCH 10/16] update multithreading --- src/strongsort/yolov5/detect.py | 63 ++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index 51860bf8..13d48688 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -221,9 +221,29 @@ def run( with open(write_to, "w") as f: f.write("") - def runEverything(frame_idx, path, img, im0s, vid_cap, output): + def runEverything( + frame_idx, + path, + im, + im0s, + vid_cap, + outputs, + s, + device, + half, + save_dir, + visualize, + augment, + model, + conf_thres, + iou_thres, + classes, + agnostic_nms, + max_det, + write_to, + ): dt, seen = [0.0, 0.0, 0.0, 0.0], 0 - curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources + # curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources t1 = time_sync() im = torch.from_numpy(im).to(device) @@ -523,11 +543,13 @@ def runEverything(frame_idx, path, img, im0s, vid_cap, output): vid_writer[i].write(im0) prev_frames[i] = curr_frames[i] + return dt, seen # Run tracking model.warmup(imgsz=(1 if pt else nr_sources, 3, *imgsz)) # warmup + # dt, seen = [0.0, 0.0, 0.0, 0.0], 0 - # curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources + curr_frames, prev_frames = [None] * nr_sources, [None] * nr_sources # all = {executor.submit(runEverything, url, 60): url for url in URLS} all = {} @@ -535,16 +557,33 @@ def runEverything(frame_idx, path, img, im0s, vid_cap, output): with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: for frame_idx, (path, im, im0s, vid_cap, s) in enumerate(dataset): all[ - executor.submit(runEverything, frame_idx, path, im, im0s, vid_cap, s) - ] = frame_idx - + executor.submit( + runEverything, + frame_idx, + path, + im, + im0s, + vid_cap, + outputs, + s, + device, + half, + save_dir, + visualize, + augment, + model, + conf_thres, + iou_thres, + classes, + agnostic_nms, + max_det, + write_to, + ) + ] = [frame_idx, path, im, im0s, vid_cap, s] + for future in concurrent.futures.as_completed(all): - try: - data = future.result() - except Exception as exc: - print("generated an exception: %s" % (exc)) - else: - print("done") + [frame_idx, path, im, im0s, vid_cap, s] = all[future] + dt, seen = future.result() # Print results t = tuple(x / seen * 1e3 for x in dt) # speeds per image From 2280f1561c22f323cf02bb79060e7884c211639e Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Sat, 2 Dec 2023 13:17:47 -0500 Subject: [PATCH 11/16] fix --- src/strongsort/yolov5/detect.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index 13d48688..b541f97c 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -543,7 +543,7 @@ def runEverything( vid_writer[i].write(im0) prev_frames[i] = curr_frames[i] - return dt, seen + return dt, seen, save_path # Run tracking model.warmup(imgsz=(1 if pt else nr_sources, 3, *imgsz)) # warmup @@ -583,7 +583,7 @@ def runEverything( for future in concurrent.futures.as_completed(all): [frame_idx, path, im, im0s, vid_cap, s] = all[future] - dt, seen = future.result() + dt, seen, save_path = future.result() # Print results t = tuple(x / seen * 1e3 for x in dt) # speeds per image From 1f6c9482dc5729debb2fcf2514be0d9268d404ec Mon Sep 17 00:00:00 2001 From: Eric Guo Date: Sat, 2 Dec 2023 13:13:15 -0500 Subject: [PATCH 12/16] Modified gitignore to not add pycache --- .../__pycache__/__init__.cpython-38.pyc | Bin 154 -> 0 bytes .../__pycache__/courtline_detect.cpython-38.pyc | Bin 22647 -> 0 bytes .../__pycache__/general_detect.cpython-38.pyc | Bin 4379 -> 0 bytes .../__pycache__/shot_detect.cpython-38.pyc | Bin 2511 -> 0 bytes .../__pycache__/team_detect.cpython-38.pyc | Bin 5865 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/processing/__pycache__/__init__.cpython-38.pyc delete mode 100644 src/processing/__pycache__/courtline_detect.cpython-38.pyc delete mode 100644 src/processing/__pycache__/general_detect.cpython-38.pyc delete mode 100644 src/processing/__pycache__/shot_detect.cpython-38.pyc delete mode 100644 src/processing/__pycache__/team_detect.cpython-38.pyc diff --git a/src/processing/__pycache__/__init__.cpython-38.pyc b/src/processing/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index f719609b9e30557b678ea614358e51f56cd59367..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmWIL<>g`k0&BjIR1p0bL?8o3AjbiSi&=m~3PUi1CZpd~voLXF*nU}5~AD@|*SrQ+w XS5SG2!zMRBr8Fni4rK6WAZ7pnDd{7c diff --git a/src/processing/__pycache__/courtline_detect.cpython-38.pyc b/src/processing/__pycache__/courtline_detect.cpython-38.pyc deleted file mode 100644 index 7f86617a2f6c23f7a455c882fd3886f91f6197f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22647 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 V2}8fKiQ;(iPg~}5I}26ze*o}}jd}n8 diff --git a/src/processing/__pycache__/general_detect.cpython-38.pyc b/src/processing/__pycache__/general_detect.cpython-38.pyc deleted file mode 100644 index 73f8b985180946f0ab300848b77e91a86c28f3c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4379 zcmcIn&2t<_74M#}{m|FiHT}jLLVQl0=}!rrpW&DO35^m;c0^Y;WY=jpUAN&%8gn{c*KhdUpbp%sngnn67(64AmOI;m(+x|ImPN?b&sb>n^w4%lOD)f@sZ+3+SHY&JpFYNFMcpm@t^IyS7vAkS%?fWlZe?|+sC*E0 zI-6OP>7w%UsH<7TxS#UaOm9Ey?`O?^llw`sc03OUk&lO8<|w6VYaKoekVH6CbUNsw&RWt<0R{aQP{x|hrM>FaL92liA=21 zOFaE1Tct2$7ww+uM%h(XeHgWNF*DJj(S4&+on$F|wGChqMu`ery(Ej`#0GEoI-TCL zIN5ji*<5Lr$dF2%zolxP?`H&nvCpmg<=;9ZF^>Iv$P{_+S>we+&`Z_5pMn{S; zlol?q2pZ{k;;aawKD4SnV~9gdnSIz-EXt#uDm;R4;oIre*1j=Kwkceg6jhdaPYaK1 z3Xe=)33CzdzFb?mpK6n?XcM<~_IoQg);Cv(+umJ$Z*?U#t(Cs%wRDe zY|T5Ed#CR3+ZKV**}h4>o<2XqNlek^m4O2?Alh_umr2vHq&e`E11fcM@z^_*pv$*D zb_M}Rv~=Vv_od8&9OEFSD|s;RrPzD0cLkJO&Ry6ROs(()YV|CMf?EGdzH$)fQE5o9 zAmXfIBOE%IcM;S|HUVr#QHB(ZNS_TO{dw;*j%3N$!%C{kBQjO~6EFRQ`|x1<=I?uU z#L_X@S_&pw6odeDk|?Hw6To?GhH@w0O+z(@si8Uk3rVM_nWtufn$u_sk9^#z zSIwI=^et+>P2&}v?011=B=5k!Md9w~%$z4>VBfOvO_c2D!tLl}c>fyZ(OS)S$k$uc ze3$09v3g#}xbXR|nYT&tJ!-yB4c#-_)FBmBduPbk57AG5ghrI;w$yN2PUGvz06%+c zYPc8Y$0MP1#&>2hFh9o3x->t)qeZkd`VbcpW8A zX3!p@`T%fmQ}vOn?=f{y8XjeU zq203>X-HGXrU70PCCk@+#@Sq}Fd|p%oyr3$A}Du%^Bjx*vp7^Ui>B_H%On$&%mo?90w`hO4lOLS38>Bz!5i$K z`D1u*0p8>T*a(lvY3k3)WRIq zgf>qj@OYcO@%%J=bimagv)>e~2vLTxRWC7^3>{f9vvGf`xpA|3_xAN)7jw7nH1BR~ zZhpAAd28d&1bnR6x_AA~=B+I#>OO;@QK2{EphcDGlS49XGV)Hs?bO7mX_+{|5>nz? zQSv~M7eIz@0&q1Z%0)=FPsC|{3ahU$p^JermfIB?DR< zYunk8xwKj&%JN7?DkqC6JAx$XndQR&Bg^q$mL|{>{)P(T!8FB9Rmes1+5;n6vV{6H0R({rW-?;J*&)RznpQIg diff --git a/src/processing/__pycache__/shot_detect.cpython-38.pyc b/src/processing/__pycache__/shot_detect.cpython-38.pyc deleted file mode 100644 index 69c97560f9c54621445cd2c013f380d55751bb8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2511 zcmb_e&2Jk;6rY*>@Y-=w=cBZxg$^Hw7(tRsaGKk)@~diH*1U1y%uJ+^lpyRNcTB853d=Fb;uP+ z_9K+y1&0WT192_OQO%zC{#N1T-Xs2)6@Koov)h-8nsSu;faSGE;xSuid%OtpKzXRs zM`g>fYo}PjF$Nd~#yUm^V*{gmXZcI^0sEZYU|+GE=OTAcu-wVrfm_t8`NVGI^}I0< zIL%Ctq4b8tb@TfAbs1*TZb1#kao>hXEXSEvA654+_4_)tne55Tnj{`(iLuh^T`LD+ zq-EN(Te64Su?*vMY~O{YWHPp}DXEtIBrz(Cdsb&v!emgn6B7>Mjid=j)f$S8^^V+3 zc4cofxvOPpSLCHE8;??|>HN#tWHP7{(n3n25*a5}j%ev}KZ!Hji)|aLOfnvBp`l>?=dr|b>xwUhvndz^lCh6-e3*+Hxww2hf(pLBF zN_wwsT!`>?^^;M0ae?-yLVPCJ{nL0dT^w@dLX`A-QFal=H1dFsaX@t+IHYLN0hM#$ zL$#gKO;R0~b)$PK3S*s>UY16oZO@c->S339Sh|rO*wV2{T6#O7g2&&|;c&~AE(Mj| zWT{I-=|q|B)DYW6w>mWxM#l4JUVvKmz)-Fa&s0j zZC?6D+p&p{^yN5iJ%iV;I5NR$kAEWyKx_yw5X2y!5`_<`K>|qKa=^~n6Z`!8heacA z5X6d^d}f{P^V_y)Dpz@cUh|Q22))^SR)HjnIgCCaC;-9BumM4608rIWvlFa1h8f@o zJu~s0WJN1KmUCLY?Ik}?ZFm6J6KtCo^LYz1WZmY;FH;*H$*zdFHl4vY z-FGSXknMiHh|CZ3rApK8L0+fbCv!Z{X5nFfiu#VCvWM8ep1XKH9>jU%q2BsHJO+jS zTR-kxeoj_uR?Vqns-@=Df?6EbKut^cpZ-6*Gcdi8u2KP~+S~G#s!E#4wTiLMt-V`O%7pDeM^!FLyxf*MVH9Dx z{CXKt=hoV{C!F(XMLLEsdgS%~PqZ@u7@^t(q@Hn3g*VfL?|sN~+Bidpqk{g4H_R;M zI7Vuo)Ep^%Uzs89x!D#6do+0i3iboCiD_VuQLTBavctP%PyFFi9BUeL3T2wNCo!** zUB&nn#LXflBXTta>(Vp5c&JOimx8EN`?z_9Zk?oC4!EV$pd(~mI!vdL_A-2&x*(rt zHpMIw8}*Y2w1|&I7vyhjXa1-Y$vcZgR)32->O@@02j&b_@fxYusT8kje#hSgmv?s$ z$9tV1jHwuSrq;wqDJMR%?!DBkGMKi8o^Q4Z#cIt%cAT>09GI~o7I@$^#S%DDa*2or zMEoiKbRC!b0&Cni`J3G5bBBKanLprju&2M4XWqdsWzfZwMA6;*b9R)jraHl2nH9Th zKWhi2Z||k}Fd2FujYEn!+0;l)SH}QWw_AFt0kU2=SM@qp%pY7BC2Ab$i`4Xt{=Kz$ LaQ4-!0Z9HY*P3c! diff --git a/src/processing/__pycache__/team_detect.cpython-38.pyc b/src/processing/__pycache__/team_detect.cpython-38.pyc deleted file mode 100644 index da078f7f22295ffe0292000dfec7703f0a1eb50c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5865 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 From 88063b7ce168af2afd32e0a192b1e03c937af258 Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Sat, 2 Dec 2023 14:35:17 -0500 Subject: [PATCH 13/16] add try except --- src/strongsort/yolov5/detect.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index b541f97c..cc3a7f68 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -294,6 +294,7 @@ def runEverything( ) # get folder name containing current img save_path = str(save_dir / p.parent.name) # im.jpg, vid.mp4, ... curr_frames[i] = im0 + assert im0 is not None txt_path = str(save_dir / "tracks" / txt_file_name) # im.txt if write_to is None: @@ -543,6 +544,7 @@ def runEverything( vid_writer[i].write(im0) prev_frames[i] = curr_frames[i] + assert prev_frames[i] is not None return dt, seen, save_path # Run tracking From b5609ad1f05c44d0e071e670761b457720f74108 Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Sat, 2 Dec 2023 14:44:54 -0500 Subject: [PATCH 14/16] add try except --- src/strongsort/strong_sort/sort/track.py | 96 ++++++++++++++++-------- 1 file changed, 65 insertions(+), 31 deletions(-) diff --git a/src/strongsort/strong_sort/sort/track.py b/src/strongsort/strong_sort/sort/track.py index 9f3d0e15..982dbbff 100644 --- a/src/strongsort/strong_sort/sort/track.py +++ b/src/strongsort/strong_sort/sort/track.py @@ -66,8 +66,17 @@ class Track: """ - def __init__(self, detection, track_id, class_id, conf, n_init, max_age, ema_alpha, - feature=None): + def __init__( + self, + detection, + track_id, + class_id, + conf, + n_init, + max_age, + ema_alpha, + feature=None, + ): self.track_id = track_id self.class_id = int(class_id) self.hits = 1 @@ -117,13 +126,20 @@ def to_tlbr(self): ret[2:] = ret[:2] + ret[2:] return ret - - def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, - max_iter = 100, scale = 0.1, align = False): + def ECC( + self, + src, + dst, + warp_mode=cv2.MOTION_EUCLIDEAN, + eps=1e-5, + max_iter=100, + scale=0.1, + align=False, + ): """Compute the warp matrix from src to dst. Parameters ---------- - src : ndarray + src : ndarray An NxM matrix of source img(BGR or Gray), it must be the same format as dst. dst : ndarray An NxM matrix of target img(BGR or Gray). @@ -151,10 +167,15 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, """ # skip if current and previous frame are not initialized (1st inference) - if (src.any() or dst.any() is None): - return None, None - # skip if current and previous fames are not the same size - elif (src.shape != dst.shape): + # if src or dst is None: + # return None, None + try: + if src.any() or dst.any() is None: + return None, None + # skip if current and previous fames are not the same size + elif src.shape != dst.shape: + return None, None + except: return None, None # BGR2GRAY @@ -167,16 +188,24 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, if scale is not None: if isinstance(scale, float) or isinstance(scale, int): if scale != 1: - src_r = cv2.resize(src, (0, 0), fx = scale, fy = scale,interpolation = cv2.INTER_LINEAR) - dst_r = cv2.resize(dst, (0, 0), fx = scale, fy = scale,interpolation = cv2.INTER_LINEAR) + src_r = cv2.resize( + src, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_LINEAR + ) + dst_r = cv2.resize( + dst, (0, 0), fx=scale, fy=scale, interpolation=cv2.INTER_LINEAR + ) scale = [scale, scale] else: src_r, dst_r = src, dst scale = None else: if scale[0] != src.shape[1] and scale[1] != src.shape[0]: - src_r = cv2.resize(src, (scale[0], scale[1]), interpolation = cv2.INTER_LINEAR) - dst_r = cv2.resize(dst, (scale[0], scale[1]), interpolation=cv2.INTER_LINEAR) + src_r = cv2.resize( + src, (scale[0], scale[1]), interpolation=cv2.INTER_LINEAR + ) + dst_r = cv2.resize( + dst, (scale[0], scale[1]), interpolation=cv2.INTER_LINEAR + ) scale = [scale[0] / src.shape[1], scale[1] / src.shape[0]] else: src_r, dst_r = src, dst @@ -185,9 +214,9 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, src_r, dst_r = src, dst # Define 2x3 or 3x3 matrices and initialize the matrix to identity - if warp_mode == cv2.MOTION_HOMOGRAPHY : + if warp_mode == cv2.MOTION_HOMOGRAPHY: warp_matrix = np.eye(3, 3, dtype=np.float32) - else : + else: warp_matrix = np.eye(2, 3, dtype=np.float32) # Define termination criteria @@ -195,10 +224,11 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, # Run the ECC algorithm. The results are stored in warp_matrix. try: - (cc, warp_matrix) = cv2.findTransformECC (src_r, dst_r, warp_matrix, warp_mode, criteria, None, 1) + (cc, warp_matrix) = cv2.findTransformECC( + src_r, dst_r, warp_matrix, warp_mode, criteria, None, 1 + ) except cv2.error as e: return None, None - if scale is not None: warp_matrix[0, 2] = warp_matrix[0, 2] / scale[0] @@ -208,15 +238,18 @@ def ECC(self, src, dst, warp_mode = cv2.MOTION_EUCLIDEAN, eps = 1e-5, sz = src.shape if warp_mode == cv2.MOTION_HOMOGRAPHY: # Use warpPerspective for Homography - src_aligned = cv2.warpPerspective(src, warp_matrix, (sz[1],sz[0]), flags=cv2.INTER_LINEAR) - else : + src_aligned = cv2.warpPerspective( + src, warp_matrix, (sz[1], sz[0]), flags=cv2.INTER_LINEAR + ) + else: # Use warpAffine for Translation, Euclidean and Affine - src_aligned = cv2.warpAffine(src, warp_matrix, (sz[1],sz[0]), flags=cv2.INTER_LINEAR) + src_aligned = cv2.warpAffine( + src, warp_matrix, (sz[1], sz[0]), flags=cv2.INTER_LINEAR + ) return warp_matrix, src_aligned else: return warp_matrix, None - def get_matrix(self, matrix): eye = np.eye(3) dist = np.linalg.norm(eye - matrix) @@ -229,8 +262,8 @@ def camera_update(self, previous_frame, next_frame): warp_matrix, src_aligned = self.ECC(previous_frame, next_frame) if warp_matrix is None and src_aligned is None: return - [a,b] = warp_matrix - warp_matrix=np.array([a,b,[0,0,1]]) + [a, b] = warp_matrix + warp_matrix = np.array([a, b, [0, 0, 1]]) warp_matrix = warp_matrix.tolist() matrix = self.get_matrix(warp_matrix) @@ -241,7 +274,6 @@ def camera_update(self, previous_frame, next_frame): cx, cy = x1_ + w / 2, y1_ + h / 2 self.mean[:4] = [cx, cy, w / h, h] - def increment_age(self): self.age += 1 self.time_since_update += 1 @@ -270,11 +302,15 @@ def update(self, detection, class_id, conf): """ self.conf = conf self.class_id = class_id.int() - self.mean, self.covariance = self.kf.update(self.mean, self.covariance, detection.to_xyah(), detection.confidence) + self.mean, self.covariance = self.kf.update( + self.mean, self.covariance, detection.to_xyah(), detection.confidence + ) feature = detection.feature / np.linalg.norm(detection.feature) - smooth_feat = self.ema_alpha * self.features[-1] + (1 - self.ema_alpha) * feature + smooth_feat = ( + self.ema_alpha * self.features[-1] + (1 - self.ema_alpha) * feature + ) smooth_feat /= np.linalg.norm(smooth_feat) self.features = [smooth_feat] @@ -284,16 +320,14 @@ def update(self, detection, class_id, conf): self.state = TrackState.Confirmed def mark_missed(self): - """Mark this track as missed (no association at the current time step). - """ + """Mark this track as missed (no association at the current time step).""" if self.state == TrackState.Tentative: self.state = TrackState.Deleted elif self.time_since_update > self._max_age: self.state = TrackState.Deleted def is_tentative(self): - """Returns True if this track is tentative (unconfirmed). - """ + """Returns True if this track is tentative (unconfirmed).""" return self.state == TrackState.Tentative def is_confirmed(self): From 68832943cf0b2e8cd252dfccecec2b80869cf661 Mon Sep 17 00:00:00 2001 From: Audrey Wang Date: Sat, 2 Dec 2023 14:59:54 -0500 Subject: [PATCH 15/16] check of rim is None --- src/processing/action.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/processing/action.py b/src/processing/action.py index b985b93a..da7c77e4 100644 --- a/src/processing/action.py +++ b/src/processing/action.py @@ -1,6 +1,7 @@ from state import GameState, PlayerFrame, BallFrame, Box from args import DARGS + class ActionRecognition: def __init__(self, state: GameState, args=DARGS) -> None: self.state = state @@ -37,14 +38,13 @@ def pose_shot(self, player_frame: PlayerFrame, ANGLE_THRESHOLD): curr += 0.075 return curr - def ball_shot(self, ball_frame: BallFrame, rim: Box): """ Takes in ball data at a frame and returns the weighted sum of the ball features. Currently uses a simple threshold heuristic. """ # checks whether ball y coord is above rim y coord - if ball_frame is None: + if ball_frame is None or rim is None: return 0 ball_pos = ball_frame.box mid_box = ball_pos.center() @@ -61,7 +61,6 @@ def ball_shot(self, ball_frame: BallFrame, rim: Box): # return y_weight + displacement_weight return y_weight + 0.1 - def shot_detect(self): """ Iterates through each frame and computes the classification of shots for each player. @@ -80,10 +79,12 @@ def shot_detect(self): # shots_file.write(str(player_id)) # shots_file.write("\n") for interval in self.state.possessions: - if (interval.start <= frame.frameno <= interval.end and - interval not in self.state.shots): + if ( + interval.start <= frame.frameno <= interval.end + and interval not in self.state.shots + ): self.state.shots.append(interval) - #shot_interval = (frame.frameno, player_id) - #self.state.shots.append(shot_interval) + # shot_interval = (frame.frameno, player_id) + # self.state.shots.append(shot_interval) # shots_file.close() From 73cade9cb0a60ad667780e1cbeb7b59cdb99e33b Mon Sep 17 00:00:00 2001 From: Eric Guo Date: Sun, 3 Dec 2023 14:41:54 -0500 Subject: [PATCH 16/16] Fixed dt, seen logic in yolov5/detect.py --- src/strongsort/yolov5/detect.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strongsort/yolov5/detect.py b/src/strongsort/yolov5/detect.py index cc3a7f68..c3fa2e5e 100644 --- a/src/strongsort/yolov5/detect.py +++ b/src/strongsort/yolov5/detect.py @@ -583,9 +583,12 @@ def runEverything( ) ] = [frame_idx, path, im, im0s, vid_cap, s] + dt, seen = [0.0, 0.0, 0.0, 0.0], 0 for future in concurrent.futures.as_completed(all): [frame_idx, path, im, im0s, vid_cap, s] = all[future] - dt, seen, save_path = future.result() + per_frame_dt, per_frame_seen, save_path = future.result() + dt += per_frame_dt + seen += per_frame_seen # Print results t = tuple(x / seen * 1e3 for x in dt) # speeds per image