From d1ea3044915a8230e90dc4b59ceb59ca7216663e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=86=E5=88=9A?= Date: Wed, 29 May 2024 20:31:28 +0800 Subject: [PATCH] dotrack haved modified! --- runs/detect/加购_88/detect - 快捷方式.lnk | Bin 0 -> 980 bytes track_reid.py | 9 +- .../__pycache__/dotracks.cpython-39.pyc | Bin 11686 -> 13131 bytes .../__pycache__/dotracks_back.cpython-39.pyc | Bin 4261 -> 5689 bytes .../__pycache__/dotracks_front.cpython-39.pyc | Bin 4157 -> 4497 bytes .../__pycache__/track_back.cpython-39.pyc | Bin 9261 -> 8981 bytes .../__pycache__/track_front.cpython-39.pyc | Bin 4289 -> 4337 bytes tracking/dotrack/dotracks.py | 90 +++++++-- tracking/dotrack/dotracks_back.py | 108 +++++++--- tracking/dotrack/dotracks_front.py | 39 ++-- tracking/dotrack/track_back.py | 186 ++++++++++++------ tracking/dotrack/track_front.py | 11 +- tracking/test_tracking.py | 16 +- .../__pycache__/bot_sort.cpython-39.pyc | Bin 7159 -> 7148 bytes tracking/trackers/bot_sort.py | 2 +- .../__pycache__/drawtracks.cpython-39.pyc | Bin 8920 -> 9017 bytes .../__pycache__/mergetrack.cpython-39.pyc | Bin 3286 -> 3737 bytes tracking/utils/drawtracks.py | 41 ++-- tracking/utils/mergetrack.py | 26 ++- 19 files changed, 379 insertions(+), 149 deletions(-) create mode 100644 runs/detect/加购_88/detect - 快捷方式.lnk diff --git a/runs/detect/加购_88/detect - 快捷方式.lnk b/runs/detect/加购_88/detect - 快捷方式.lnk new file mode 100644 index 0000000000000000000000000000000000000000..eef2b9d9b21f99744e2f7551bb2ec713fab5339e GIT binary patch literal 980 zcmeZaU|?VrVFHp23SxF|4hACu( zsE3obj3Ny30T28yD7>=D6j*eFgF)NCV6G&CzKc~1ToHni!(a&J?2YK;5nymhElEu- z2`NfU&d$tBXJGJS;ACK7c)xE;#L7633O%6OoOlT!$&N4r%zArWhrxv*m7xTPlYwLi zLlHwFkd@7l$&kkYG>SnEXd1+>oe_IO1Q?1+^NJZ5tl&2M0oowI2eRP^RvRislYwTI z0!;&IV-Nw_0CTx7uK+^|*yRiic2M&`cI=Jdvj&;BC6OOU+5s^#5c~LsAqC0B3=CpG z=>Q;>0b)?Ff@p{x3=IB2wkQxY12O-eHzlB`ad8ZBWB>*$YN*A4JQf3U4-YTIlT;Uaa={(~;!YGVcXvcQ9nU zo-sF-kbFPTxtt6P3lf258wLjizctu<%bB6meff_I!b^(Nlw3h}f-IH?Vo4x|1*8Il z1~A&J7-H~7o+d~u7&HJ$kOc-GRky!)ml9a|ktv~P-s?4rKyfaR3Xlb$w1FD3kgx;A z0)qpHIQ|Trra>-Y0r5e)K#ca(Z+@1M5Y>Dj2?rpCr+6Sc6No|fFUv~Su$_8IaO*XO z1O7K9F8Bh)<$xG$5{NK&jE?U004xf+8_V` literal 0 HcmV?d00001 diff --git a/track_reid.py b/track_reid.py index f55a638..9fdfc32 100644 --- a/track_reid.py +++ b/track_reid.py @@ -177,7 +177,7 @@ def run( save_dir = Path(project) / Path(source).stem if save_dir.exists(): print(Path(source).stem) - # return + return save_dir = increment_path(Path(project) / name, exist_ok=exist_ok) # increment run (save_dir / 'labels' if save_txt else save_dir).mkdir(parents=True, exist_ok=True) # make dir @@ -517,9 +517,10 @@ def main_loop(opt): optdict = vars(opt) # p = r"D:\datasets\ym\永辉测试数据_比对" - # p = r"D:\datasets\ym\广告板遮挡测试\8" - p = r"D:\datasets\ym\videos\标记视频" + p = r"D:\datasets\ym\广告板遮挡测试\8" + # p = r"D:\datasets\ym\videos\标记视频" # p = r"D:\datasets\ym\实验室测试" + # p = r"D:\datasets\ym\永辉双摄视频\新建文件夹" k = 0 if os.path.isdir(p): @@ -531,7 +532,7 @@ def main_loop(opt): # r"D:\datasets\ym\广告板遮挡测试\8\2500441577966_20240508-175946_front_addGood_70f75407b7ae_155_17788571404.mp4" # ] - files = [r"D:\datasets\ym\videos\标记视频\test_20240402-173935_6920152400975_back_174037372.mp4"] + # files = [r"D:\datasets\ym\videos\标记视频\test_20240402-173935_6920152400975_back_174037372.mp4"] for file in files: optdict["source"] = file run(**optdict) diff --git a/tracking/dotrack/__pycache__/dotracks.cpython-39.pyc b/tracking/dotrack/__pycache__/dotracks.cpython-39.pyc index e48e9385a0ffb29e1dd4ff9fd545fe6d23a59f56..10c7a0a43fbea1dd40767cd27736f8ee046b68d5 100644 GIT binary patch delta 5580 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 diff --git a/tracking/dotrack/__pycache__/dotracks_back.cpython-39.pyc b/tracking/dotrack/__pycache__/dotracks_back.cpython-39.pyc index fe155c64d33261fa31f6f8b42ca2a03d94bc484a..ff055b2a571107f8799e081115c1152cc2fcf08b 100644 GIT binary patch literal 5689 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 delta 1849 zcmah~&2Jk;6rY*>@Or)eb`qy*N6^^Av3vN{5m-8C4K=WfUD6~Nnb;)j$VD^c99qLJ$_tL@ zV$Mk>x`K3JoZ`@d;S5Ml18!3Du!9)l4p|Vdphw6G!I4gUGBWDpDSCvgcFVqG*K0+~ zSMvFCrR?PMIeBiXx>%$?lM7u@z*|WmahSFY1d$j?(NSS2uE0WsDZsRULevyi2WR94 zaiu24XcILAa9nB<51S$GIA(5pGF8N(2;M|_#SDYfDt#cXXSkslXgUScV%C;*+6;Hl z%hJ_>EZaN42n$j`+5%_TR-E3EGxS&KL@$Fq!dCjfz_WY69y%c(kGB>Ss5@6J zqcFR#&WW~8x+10N*CFk_Uf9yH)yGcu3&k}q24q|hTPgVFq>Dzyw0*g_=oBlauiEvg zyu(b}zOY=b(M6>{rMz3T%Vyn})0H4>Df&dw%hBN8EqE?mtvkRMjM-dtzGzJs&DKfq z9EX@`7E)g+%o(;_E-jsamE8*j2{MUcjc7s)r*J3H*h@UnWK-%!{3~~Z#uYE@schK@HIWx_!>&q@8-c_PZ4gr_kvE^M z!fXXb6jyd5C1Q%E%8a=}BkU?H^%qV%q@lWUOByiU2%OgduXQ6Y>WYo96LF(!a3w%z z;R@%2I}j_&)kvnuL@;7dx4l}(LL@Y(Dgml027J_wxgzj!Hx8Ag(Vh6Us!l8j8L|!n z(XlU?&JvV2+iIQc1}V9VFB`QQOTCa`P1{w=u~^%%27u%uGu3jX zrB+V_xi>`rP8=7H!7)9Re1T3SvvebweT`?9_PigH0I`|hNK}c66|CU|{0?E2^y3ud zSSMCUg8q_xiihbBsj;r30QCjCKF@1NmjZhy>0tU5mG^=k0DM3v)5lg=u=WPy+2qN{ zB4=UJi|?Oot#5C9_vg*KJF8!{ z!Q;7kc+&pQcFUwnJcm=4Tv3p{+#%jz{={9AN4ed*=XfDABa+T1fV^eMA?qr&lD(tPHf z|HqfCVv*w?0KSL*l^Gpme;w9~jJ(bW3$gVUBfROJW88Uqv7=|8ld=36!oaaV0-Ln~ dc-F(pVWm$=C>q`DIEatZhaC$zO1nDy{{cxpo~i%< diff --git a/tracking/dotrack/__pycache__/dotracks_front.cpython-39.pyc b/tracking/dotrack/__pycache__/dotracks_front.cpython-39.pyc index 36c4ddd49e237f0052bbf012cadf9a94634c75ad..917e9178785ded5a09e683f52af117e589a15ad7 100644 GIT binary patch delta 2503 zcmZ`*&2JmW6`z^?UXn|S`XVh$VVXuQ-9oVBBz4`yb(*9|fxvcS2Mv%2?3%lzR#Hf5 zb_tWlY}rBy+DiZj3-nMRDTN-2p4uSrp-qC`a!UV!xfga0MK49tUV{8)MXR!bkeD}b z-n^MNZ|42p+m9RXJm&eOl1uQLPhaV*oqpf@DW%`deohxV2@_;nL(>n~^W=aE(lP>a zjWo5(ZK_sGe;RrN?HXEq3ZzQ}*{r_KQkt@a2rAeCdx!1o*T|m;SDH;tvbD34-jKAD zeM(=VGg+NIxoS!y9_)o&+O1a9i;`ALYPX_2Y3|>g{610!H>;vmY4)DUE%;ZVjQ4hUWs^pK`zVCFhzu0xgX z=7rP}@O<-ZYD3Quwy?0qNlf7!Q2w5FXm8Htz9>J`-Ej}()|u>w)0&gTh#z}O7o$JSPJYuU%fa`uJ(qm>8r zPN<#vzuJGb*{Adq78{sqQvRsY_`2oi?k~Tx`gJN7a}|)wO_$GQ8|KEvSwD{Z?Z{8U z*3Br{YHj(wKx(^TPn!PTUWkGHB1G{|`U7dd9L7;F@OPU9KCiZ#%icAYU8g@tS_yCa zJK0~&wSsii9<8W9h_k!q@-ylhq}|?yp{O&O!zfms63x^+tw@W8M~e(i^Yo(TGLPBJ zrbVh+Ma#Z#HN8imZK36X>1BIX^HP_jT0*y3po40G@it2pcXDjt)pQkvz>}F;m^B36 zaN887u(Fc9w0u>tZR;To1G4)X^|7)48=)g4t+!aofH6y;to56R-LGpmU5|cQaXm%!=Xz7 z4cxbwI>76CT23qJOj;F&@E(xQrgQ0hx{wq_SkPbBe=37t>l&5;I~xpDBr| zSeVY#(^H}@7HedJ{SK)(C2CWCOy@|tghk~V!GcPSV0>E4i&=~p#9TgJ7E9u^SY9Mz zsYZgrB3UBoidcd7I=r`qHYtmuSn0r5N^aAANPytt;1j%P!);7|_x}E?yMO%f-mgFS z=kNb^_x%t5{n76*bv)Z>WWRL&Kv%MFx((15+|}x5DtC3?{@0z!7oYs)Vza`RvR}B@ z$Nbw6OXKEN$U~{U;SWKgp48jB(H?JNuKCDO>~4VP>xwAgNONnND!WI$5huX3)D!}Y ztxgog(&*-$eneG#bCohB-IBB`wc+}@)W#!4hwB?s8!0l}z;L9Sq5a zELN-R)}ulH$GqQ5u5-V=6R&0eD>TNlSbUu3FQ6VF$0EfeZdn&`icrx~U8V2abd#k< zf`p&Pvd;gLFkp>=>VXEtnfX{h9$Sf_bb+WXU=GL-c3|u@d_GduqfHmM9%dEQFLhtr#yS3{WxyCvX5!S0MzBc-X-M zcFI_%`ijseZjOt}!IeA?_iM*~F<#3zGy+2{MoEG)a6TRF*Kj{2lsyeKXa>9oJm}!7 zqKY^!WLHbCj-SMxB0qmmb&RVT{}}bguMY2k+S)-YC>;c>hF!Dt!n&$hcUmT)~HyQme0F! zAGIkr__z`kw);_UYN9!NgoW>9uX*Rr=9?L6msrwB8u>A#-bHE_GF^&;KjnUA>A(F0uub0Gm~_ zdiioieX#H+6j31HBD+~$K3`L8USw5qP)w{!Jqm|quiH;>C2hLWYPEuX8=pi5u5E9` PpUyrlU!}!txzhLwVya2l delta 2035 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 diff --git a/tracking/dotrack/__pycache__/track_front.cpython-39.pyc b/tracking/dotrack/__pycache__/track_front.cpython-39.pyc index b990dd9ff223a8f87397f7b58b6005a362d982bd..2f53f3342d65622cb070bf2051a8bc9f40f76ac0 100644 GIT binary patch delta 1236 zcmZuxT}u>E7@l)xXLnq8bX}wm4PsS_$x>HS5Hzw))96FojUa-)H!Ty{iMc$Ry_uWIvw;Iv#*E5{YnO{s zn|D@iSL#LE@|Fd%Qf0xtXD!(>%59IWWg6??Havr|LfLX%#Tq`}2#nM108nT$ z+7jy^9VA6kG*05GP7~_R7xfuQbwOCFR=F&CfSI~T2P;}{y9tH};S92407JoB?dO$V zH1RWwa{y*Uq>=X{WDtfC4(^t1C70QJ!Da=ju*Wio z%FqNdxX==%!t>xo^QV)ca{oz%Im=5cmf)Xvo+dQ99_k%drQ?NI>y$~Sro>rbW~&%O zZ>V7#vJ?W=CMFQDEO7)tYSUJgyJ7?#q3##at3pN4ZjSK8IM`;QuD~UXg-vFy4TvmQ z;wrjg^-8S<$z*oPU|oque112vaHtLmsIe$)n^l|#_SfKk>%-gFs$rAWABdk@Tt}Ei zxC0=KMu!*da+$GxEp{4H!Y;*MOai9c0-&ocJ;8XgOG8~`z?1!b|FqugY^je`9KKw( QFHqcw8b>spBuG;I3v$;Xy8r+H delta 1162 zcmZuv&rcIU6yBNLZI}M0iV6l15OhUpOVmUKLsP6^6p=R3G$xy+yM>x*N-N2ro><^++vG7kGT&@z?Rj0I;CTLcqdx zfe3~N{1F2qyA6odqK1$W)UJ7k4_*HBe09plW3-3gq{AM0MK2pRzegL_qqE8R87-4d zX6I5`c6RY%W;Pc{B^R^W!nMp?R*U~(B~;mwY||<@@=|5pv>l~bTDDj8RWs)?%&NAL z$nmG*<>4UY45L7O00IpWk2mD)BYh-FqSQxxq9QdUX^TV;!L}pnmc<5usS4}oJM!4x zAuyN=!^rjnoZ_G5ukj;j;_t9g099iB$d4f$M;J%wh~~t*kEHnl@4MJh+`@d#RJ0lT zcL4790$gqQloxaw^L_aVL#1p2_fSpXq=UPDd{f(xy!Zo}g!%b5-{=C0;AVEjlD-a5 zEHhLG3SY7v(K5?y4~9pYPjWS(8*#^Dua&foc&@o7TI)oP8~(AW6L{%KfSi)Al#Qxp z$9GxcA004TSJBq&s$MPTIsf2)Kj2E&p;i0L+Ui}M86O*O0y5on1$V1eFd^2OR%trT zMu4edb{f5|su5(}2v{3Chk#|V9)u7=48i?}v%nk?>VtNwuqrzPwi;;Ge;#{hqOnh(V9XGw$^ zgi8QUP}B03Zrgd&vNWxu!w%ySw@E#~0x)eXRS`oYyc8LdQI#Bj5{ZrfR(iLw9c8jq TG1e^e0>wa7SdtYIAQABw$)WU9 diff --git a/tracking/dotrack/dotracks.py b/tracking/dotrack/dotracks.py index a8d9802..843ad2f 100644 --- a/tracking/dotrack/dotracks.py +++ b/tracking/dotrack/dotracks.py @@ -8,7 +8,7 @@ import numpy as np import cv2 from pathlib import Path from scipy.spatial.distance import cdist -from utils.mergetrack import track_equal_track +from utils.mergetrack import track_equal_track, readDict curpath = Path(__file__).resolve().parents[0] curpath = Path(curpath) @@ -79,16 +79,18 @@ class ShoppingCart: class Track: '''抽象基类,不能实例化对象''' - def __init__(self, boxes, imgshape=(1024, 1280)): + def __init__(self, boxes, features, imgshape=(1024, 1280)): ''' boxes: [x1, y1, x2, y2, track_id, score, cls, frame_index, box_index] 0 1 2 3 4 5 6 7 8 ''' # 不满足以下条件时会如何? - assert len(set(boxes[:, 4].astype(int))) == 1, "For a Track, track_id more than 1" - assert len(set(boxes[:, 6].astype(int))) == 1, "For a Track, class number more than 1" + # assert len(set(boxes[:, 4].astype(int))) == 1, "For a Track, track_id more than 1" + # assert len(set(boxes[:, 6].astype(int))) == 1, "For a Track, class number more than 1" self.boxes = boxes + self.features = features + self.tid = int(boxes[0, 4]) self.cls = int(boxes[0, 6]) self.frnum = boxes.shape[0] @@ -100,6 +102,9 @@ class Track: self.start_fid = int(np.min(boxes[:, 7])) self.end_fid = int(np.max(boxes[:, 7])) + self.Hands = [] + self.HandsIou = [] + '''5个关键点(中心点、左上点、右上点、左下点、右下点 )坐标''' @@ -212,7 +217,7 @@ class Track: self.trajmin = trajmin self.trajmax = trajmax - self.feature = [trajlen_min, trajlen_max, + self.TrajFeat = [trajlen_min, trajlen_max, trajdist_min, trajdist_max, trajlen_rate, trajdist_rate] @@ -268,6 +273,53 @@ class Track: return ranges, rangex + def PositionState(self, camerType="back"): + ''' + camerType: back, 后置摄像头 + front, 前置摄像头 + ''' + if camerType=="front": + incart = cv2.imread("./shopcart/cart_tempt/incart.png", cv2.IMREAD_GRAYSCALE) + outcart = cv2.imread("./shopcart/cart_tempt/outcart.png", cv2.IMREAD_GRAYSCALE) + else: + incart = cv2.imread("./shopcart/cart_tempt/incart_ftmp.png", cv2.IMREAD_GRAYSCALE) + outcart = cv2.imread("./shopcart/cart_tempt/outcart_ftmp.png", cv2.IMREAD_GRAYSCALE) + + xc, yc = self.cornpoints[:,0].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,1].clip(0,self.imgshape[1]-1).astype(np.int64) + x1, y1 = self.cornpoints[:,6].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,7].clip(0,self.imgshape[1]-1).astype(np.int64) + x2, y2 = self.cornpoints[:,8].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,9].clip(0,self.imgshape[1]-1).astype(np.int64) + + # print(self.tid) + Cent_inCartnum = np.count_nonzero(incart[(yc, xc)]) + LB_inCartnum = np.count_nonzero(incart[(y1, x1)]) + RB_inCartnum = np.count_nonzero(incart[(y2, x2)]) + + Cent_outCartnum = np.count_nonzero(outcart[(yc, xc)]) + LB_outCartnum = np.count_nonzero(outcart[(y1, x1)]) + RB_outCartnum = np.count_nonzero(outcart[(y2, x2)]) + + '''Track完全在车内:左下角点、右下角点与 outcart 的交集为 0''' + self.isWholeInCart = False + if LB_outCartnum + RB_outCartnum == 0: + self.isWholeInCart = True + + '''Track完全在车外:左下角点、中心点与 incart 的交集为 0 + 右下角点、中心点与 incart 的交集为 0 + ''' + self.isWholeOutCart = False + if Cent_inCartnum + LB_inCartnum == 0 or Cent_inCartnum + RB_inCartnum == 0: + self.isWholeOutCart = True + + + self.Cent_isIncart = False + self.LB_isIncart = False + self.RB_isIncart = False + if Cent_inCartnum: self.Cent_isIncart = True + if LB_inCartnum: self.LB_isIncart = True + if RB_inCartnum: self.RB_isIncart = True + + self.posState = self.Cent_isIncart+self.LB_isIncart+self.RB_isIncart + def extract_hand_features(self): assert self.cls == 0, "The class of traj must be HAND!" @@ -296,10 +348,12 @@ class doTracks: def __init__(self, bboxes, TracksDict): '''fundamental property''' self.bboxes = bboxes - self.TracksDict = TracksDict + # self.TracksDict = TracksDict self.frameID = np.unique(bboxes[:, 7].astype(int)) self.trackID = np.unique(bboxes[:, 4].astype(int)) - self.lboxes = self.array2list() + + self.lboxes = self.array2list() + self.lfeats = self.getfeats(TracksDict) '''对 self.tracks 中的元素进行分类,将 track 归入相应列表中''' self.Hands = [] @@ -332,6 +386,19 @@ class doTracks: return lboxes + def getfeats(self, TracksDict): + lboxes = self.lboxes + lfeats = [] + for boxes in lboxes: + afeat = readDict(boxes, TracksDict) + lfeats.append(afeat) + + return lfeats + + + + + ''' def classify(self): @@ -362,12 +429,7 @@ class doTracks: return tracks ''' - - - - - - + def similarity(self): nt = len(self.tracks) @@ -428,7 +490,7 @@ class doTracks: blist = [b for b in alist] alist = [] for btrack in blist: - if track_equal_track(atrack, btrack, self.TracksDict): + if track_equal_track(atrack, btrack): cur_list.append(btrack) else: alist.append(btrack) diff --git a/tracking/dotrack/dotracks_back.py b/tracking/dotrack/dotracks_back.py index eab3da0..71f369e 100644 --- a/tracking/dotrack/dotracks_back.py +++ b/tracking/dotrack/dotracks_back.py @@ -16,7 +16,7 @@ class doBackTracks(doTracks): super().__init__(bboxes, TracksDict) - self.tracks = [backTrack(b) for b in self.lboxes] + self.tracks = [backTrack(b, f) for b, f in zip(self.lboxes, self.lfeats)] # self.similar_dict = self.similarity() @@ -67,6 +67,9 @@ class doBackTracks(doTracks): self.Kids = [x for x in zip(kid_tracks, kid_states)] tracks = self.sub_tracks(tracks, kid_tracks) + + out_trcak = [t for t in tracks if t.isWholeOutCart] + tracks = self.sub_tracks(tracks, out_trcak) static_tracks = [t for t in tracks if t.frnum>1 and t.is_static()] self.Static.extend(static_tracks) @@ -75,20 +78,84 @@ class doBackTracks(doTracks): tracks = self.sub_tracks(tracks, static_tracks) - '''购物框边界外具有运动状态的干扰目标''' - out_trcak = [t for t in tracks if t.is_OutTrack()] - - tracks = self.sub_tracks(tracks, out_trcak) + # '''购物框边界外具有运动状态的干扰目标''' + # out_trcak = [t for t in tracks if t.is_OutTrack()] + # tracks = self.sub_tracks(tracks, out_trcak) '''轨迹循环归并''' # merged_tracks = self.merge_tracks(tracks) merged_tracks = self.merge_tracks_loop(tracks) tracks = [t for t in merged_tracks if t.frnum > 1] - + + self.merged_tracks = merged_tracks + + static_tracks = [t for t in tracks if t.frnum>1 and t.is_static()] + self.Static.extend(static_tracks) + + tracks = self.sub_tracks(tracks, static_tracks) + + for gtrack in tracks: + # print(f"Goods ID:{gtrack.tid}") + for htrack in hand_tracks: + hand_ious = self.associate_with_hand(htrack, gtrack) + if len(hand_ious): + gtrack.Hands.append(htrack) + gtrack.HandsIou.append(hand_ious) + self.Residual = tracks - + def associate_with_hand(self, htrack, gtrack): + ''' + 迁移至基类: + 手部 Track、商品 Track 建立关联的依据: + a. 运动帧的帧索引有交集 + b. 帧索引交集部分iou均大于0 + ''' + + assert htrack.cls==0 and gtrack.cls!=0 and gtrack.cls!=9, 'Track cls is Error!' + + hand_ious = [] + + hboxes = np.empty(shape=(0, 9), dtype = np.float) + gboxes = np.empty(shape=(0, 9), dtype = np.float) + + # start, end 为索引值,需要 start:(end+1) + for start, end in htrack.moving_index: + hboxes = np.concatenate((hboxes, htrack.boxes[start:end+1, :]), axis=0) + for start, end in gtrack.moving_index: + gboxes = np.concatenate((gboxes, gtrack.boxes[start:end+1, :]), axis=0) + + hfids, gfids = hboxes[:, 7], gboxes[:, 7] + fids = set(hfids).intersection(set(gfids)) + + + if len(fids)==0: + return hand_ious + + + # print(f"Goods ID: {gtrack.tid}, Hand ID: {htrack.tid}") + + for f in fids: + h = np.where(hfids==f)[0][0] + g = np.where(gfids==f)[0][0] + + x11, y11, x12, y12 = hboxes[h, 0:4] + x21, y21, x22, y22 = gboxes[g, 0:4] + + x1, y1 = max((x11, x21)), max((y11, y21)) + x2, y2 = min((x12, x22)), min((y12, y22)) + + union = (x2 - x1).clip(0) * (y2 - y1).clip(0) + area1 = (x12 - x11) * (y12 - y11) + area2 = (x22 - x21) * (y22 - y21) + + iou = union / (area1 + area2 - union + 1e-6) + + if iou>0: + hand_ious.append((f, iou)) + + return hand_ious def merge_tracks(self, Residual): """ @@ -100,19 +167,27 @@ class doBackTracks(doTracks): for tracklist in mergedTracks: if len(tracklist) > 1: boxes = np.empty((0, 9), dtype=np.float32) + feats = np.empty((0, 256), dtype=np.float32) for i, track in enumerate(tracklist): if i==0: ntid, ncls=track.boxes[0, 4], track.boxes[0, 6] iboxes = track.boxes.copy() + ifeats = track.features.copy() + + # iboxes[:, 4], iboxes[:, 6] = ntid, ncls - iboxes[:, 4], iboxes[:, 6] = ntid, ncls boxes = np.concatenate((boxes, iboxes), axis=0) + feats = np.concatenate((feats, ifeats), axis=0) oldtracks.append(track) fid_indices = np.argsort(boxes[:, 7]) + boxes_fid = boxes[fid_indices] - - newtracks.append(backTrack(boxes_fid)) + feats_fid = feats[fid_indices] + + + + newtracks.append(backTrack(boxes_fid, feats_fid)) elif len(tracklist) == 1: oldtracks.append(tracklist[0]) newtracks.append(tracklist[0]) @@ -137,19 +212,6 @@ class doBackTracks(doTracks): return kidstate - - - def is_associate_with_hand(self): - """ - 分析商品和手之间的关联性 - """ - pass - - - - - - def isuptrack(self, track): Flag = False diff --git a/tracking/dotrack/dotracks_front.py b/tracking/dotrack/dotracks_front.py index be12a07..ccfc97c 100644 --- a/tracking/dotrack/dotracks_front.py +++ b/tracking/dotrack/dotracks_front.py @@ -13,7 +13,9 @@ class doFrontTracks(doTracks): def __init__(self, bboxes, TracksDict): super().__init__(bboxes, TracksDict) - self.tracks = [frontTrack(b) for b in self.lboxes] + # self.tracks = [frontTrack(b) for b in self.lboxes] + self.tracks = [frontTrack(b, f) for b, f in zip(self.lboxes, self.lfeats)] + def classify(self): '''功能:对 tracks 中元素分类 ''' @@ -32,7 +34,9 @@ class doFrontTracks(doTracks): '''提取小孩的 tracks''' kid_tracks = [t for t in tracks if t.cls==9] tracks = self.sub_tracks(tracks, kid_tracks) - + + out_trcak = [t for t in tracks if t.isWholeOutCart] + tracks = self.sub_tracks(tracks, out_trcak) '''静态 tracks''' static_tracks = [t for t in tracks if t.frnum>1 and t.is_static()] @@ -49,8 +53,11 @@ class doFrontTracks(doTracks): for gtrack in tracks: # print(f"Goods ID:{gtrack.tid}") for htrack in hand_tracks: - if self.is_associate_with_hand(htrack, gtrack): - gtrack.hands.append(htrack) + hand_ious = self.associate_with_hand(htrack, gtrack) + if len(hand_ious): + gtrack.Hands.append(htrack) + gtrack.HandsIou.append(hand_ious) + freemoved_tracks = [t for t in tracks if t.is_free_move()] @@ -59,14 +66,17 @@ class doFrontTracks(doTracks): self.Residual = tracks - def is_associate_with_hand(self, htrack, gtrack): - '''手部 Track、商品 Track 建立关联的依据: + def associate_with_hand(self, htrack, gtrack): + ''' + 迁移至基类: + 手部 Track、商品 Track 建立关联的依据: a. 运动帧的帧索引有交集 b. 帧索引交集部分iou均大于0 ''' assert htrack.cls==0 and gtrack.cls!=0 and gtrack.cls!=9, 'Track cls is Error!' + hand_ious = [] hboxes = np.empty(shape=(0, 9), dtype = np.float) gboxes = np.empty(shape=(0, 9), dtype = np.float) @@ -80,7 +90,7 @@ class doFrontTracks(doTracks): fids = set(hfids).intersection(set(gfids)) if len(fids)==0: - return False + return hand_ious # print(f"Goods ID: {gtrack.tid}, Hand ID: {htrack.tid}") @@ -102,9 +112,9 @@ class doFrontTracks(doTracks): iou = union / (area1 + area2 - union + 1e-6) if iou>0: - ious.append(iou) + hand_ious.append((f, iou)) - return len(ious) + return hand_ious @@ -137,17 +147,24 @@ class doFrontTracks(doTracks): for tracklist in mergedTracks: if len(tracklist) > 1: boxes = np.empty((0, 9), dtype=np.float32) + feats = np.empty((0, 256), dtype=np.float32) for i, track in enumerate(tracklist): if i==0: ntid, ncls=track.boxes[0, 4], track.boxes[0, 6] iboxes = track.boxes.copy() - iboxes[:, 4], iboxes[:, 6] = ntid, ncls + ifeats = track.features.copy() + + # iboxes[:, 4], iboxes[:, 6] = ntid, ncls + boxes = np.concatenate((boxes, iboxes), axis=0) + feats = np.concatenate((feats, ifeats), axis=0) + oldtracks.append(track) fid_indices = np.argsort(boxes[:, 7]) boxes_fid = boxes[fid_indices] + feats_fid = feats[fid_indices] - newtracks.append(frontTrack(boxes_fid)) + newtracks.append(frontTrack(boxes_fid, feats_fid)) elif len(tracklist) == 1: oldtracks.append(tracklist[0]) newtracks.append(tracklist[0]) diff --git a/tracking/dotrack/track_back.py b/tracking/dotrack/track_back.py index 5edf008..391e4c8 100644 --- a/tracking/dotrack/track_back.py +++ b/tracking/dotrack/track_back.py @@ -14,29 +14,32 @@ from .dotracks import MoveState, Track class backTrack(Track): # boxes: [x1, y1, x2, y2, track_id, score, cls, frame_index, box_index] # 0, 1, 2, 3, 4, 5, 6, 7, 8 - def __init__(self, boxes, imgshape=(1024, 1280)): + def __init__(self, boxes, features, imgshape=(1024, 1280)): - super().__init__(boxes, imgshape) + super().__init__(boxes, features, imgshape) - '''该函数依赖项: self.cornpoints''' - self.isCornpoint = self.isimgborder() + '''该函数依赖项: self.cornpoints + MarginState: list, seven elements, 表示轨迹中boxes出现在图像的 + [左上,右上,左中,右中,左下,右下底部] + ''' + self.isCornpoint, self.MarginState = self.isimgborder() '''该函数依赖项: self.isCornpoint,不能在父类中初始化''' self.trajfeature() '''静止点帧索引''' - self.static_index = self.compute_static_fids() + # self.static_index = self.compute_static_fids() '''运动点帧索引(运动帧两端的静止帧索引)''' - self.moving_index = self.compute_dynamic_fids() + # self.moving_index = self.compute_dynamic_fids() - # self.static_index, self.moving_index = self.compute_static_dynamic_fids() + self.static_index, self.moving_index = self.compute_static_dynamic_fids() '''该函数依赖项: self.cornpoints,定义 4 个商品位置变量: self.Cent_isIncart, self.LB_isIncart, self.RB_isIncart self.posState = self.Cent_isIncart+self.LB_isIncart+self.RB_isIncart''' - self.PositionState() + self.PositionState(camerType="back") '''self.feature_ious = (incart_iou, outcart_iou, cartboarder_iou, maxbox_iou, minbox_iou) self.incartrates = incartrates''' @@ -51,47 +54,79 @@ class backTrack(Track): x1, y1 = self.cornpoints[:,2], self.cornpoints[:,3], x2, y2 = self.cornpoints[:,8], self.cornpoints[:,9] - cont1 = sum(abs(x1) BoundThresh - cont2 = sum(abs(y1) BoundThresh - cont3 = sum(abs(x2-self.imgshape[0]) BoundThresh - cont4 = sum(abs(y2-self.imgshape[1]) BoundThresh + condt1 = sum(abs(x1) BoundThresh + condt2 = sum(abs(y1) BoundThresh + condt3 = sum(abs(x2-self.imgshape[0]) BoundThresh + condt4 = sum(abs(y2-self.imgshape[1]) BoundThresh - cont = cont1 or cont2 or cont3 or cont4 + condt = condt1 or condt2 or condt3 or condt4 isCornpoint = False - if cont: + if condt: isCornpoint = True - - return isCornpoint + + condtA = condt1 and condt2 + condtB = condt3 and condt2 + condtC = condt1 and not condt2 and not condt4 + condtD = condt3 and not condt2 and not condt4 + condtE = condt1 and condt4 + condtF = condt3 and condt4 + condtG = condt4 and not condt1 and not condt3 + MarginState = [condtA, condtB, condtC, condtD, condtE, condtF, condtG] + + return isCornpoint, MarginState - def PositionState(self, camerType="back"): - ''' - camerType: back, 后置摄像头 - front, 前置摄像头 - ''' - if camerType=="front": - incart = cv2.imread("./shopcart/cart_tempt/incart.png", cv2.IMREAD_GRAYSCALE) - else: - incart = cv2.imread("./shopcart/cart_tempt/incart_ftmp.png", cv2.IMREAD_GRAYSCALE) +# ============================================================================= +# def PositionState(self, camerType="back"): +# ''' +# 已迁移至基类 +# camerType: back, 后置摄像头 +# front, 前置摄像头 +# ''' +# if camerType=="front": +# incart = cv2.imread("./shopcart/cart_tempt/incart.png", cv2.IMREAD_GRAYSCALE) +# outcart = cv2.imread("./shopcart/cart_tempt/outcart.png", cv2.IMREAD_GRAYSCALE) +# else: +# incart = cv2.imread("./shopcart/cart_tempt/incart_ftmp.png", cv2.IMREAD_GRAYSCALE) +# outcart = cv2.imread("./shopcart/cart_tempt/outcart_ftmp.png", cv2.IMREAD_GRAYSCALE) +# +# xc, yc = self.cornpoints[:,0].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,1].clip(0,self.imgshape[1]-1).astype(np.int64) +# x1, y1 = self.cornpoints[:,6].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,7].clip(0,self.imgshape[1]-1).astype(np.int64) +# x2, y2 = self.cornpoints[:,8].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,9].clip(0,self.imgshape[1]-1).astype(np.int64) +# +# # print(self.tid) +# Cent_inCartnum = np.count_nonzero(incart[(yc, xc)]) +# LB_inCartnum = np.count_nonzero(incart[(y1, x1)]) +# RB_inCartnum = np.count_nonzero(incart[(y2, x2)]) +# +# Cent_outCartnum = np.count_nonzero(outcart[(yc, xc)]) +# LB_outCartnum = np.count_nonzero(outcart[(y1, x1)]) +# RB_outCartnum = np.count_nonzero(outcart[(y2, x2)]) +# +# '''Track完全在车内:左下角点、右下角点与 outcart 的交集为 0''' +# self.isWholeInCart = False +# if LB_outCartnum + RB_outCartnum == 0: +# self.isWholeInCart = True +# +# '''Track完全在车外:左下角点、中心点与 incart 的交集为 0 +# 右下角点、中心点与 incart 的交集为 0 +# ''' +# self.isWholeOutCart = False +# if Cent_inCartnum + LB_inCartnum == 0 or Cent_inCartnum + RB_inCartnum == 0: +# self.isWholeOutCart = True +# +# +# self.Cent_isIncart = False +# self.LB_isIncart = False +# self.RB_isIncart = False +# if Cent_inCartnum: self.Cent_isIncart = True +# if LB_inCartnum: self.LB_isIncart = True +# if RB_inCartnum: self.RB_isIncart = True +# +# self.posState = self.Cent_isIncart+self.LB_isIncart+self.RB_isIncart +# ============================================================================= + - xc, yc = self.cornpoints[:,0].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,1].clip(0,self.imgshape[1]-1).astype(np.int64) - x1, y1 = self.cornpoints[:,6].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,7].clip(0,self.imgshape[1]-1).astype(np.int64) - x2, y2 = self.cornpoints[:,8].clip(0,self.imgshape[0]-1).astype(np.int64), self.cornpoints[:,9].clip(0,self.imgshape[1]-1).astype(np.int64) - - # print(self.tid) - Cent_inCartnum = np.count_nonzero(incart[(yc, xc)]) - LB_inCartnum = np.count_nonzero(incart[(y1, x1)]) - RB_inCartnum = np.count_nonzero(incart[(y2, x2)]) - - self.Cent_isIncart = False - self.LB_isIncart = False - self.RB_isIncart = False - if Cent_inCartnum: self.Cent_isIncart = True - if LB_inCartnum: self.LB_isIncart = True - if RB_inCartnum: self.RB_isIncart = True - - self.posState = self.Cent_isIncart+self.LB_isIncart+self.RB_isIncart - def PCA(self): @@ -251,9 +286,25 @@ class backTrack(Track): def compute_static_dynamic_fids(self): - idx2 = self.trajlens.index(min(self.trajlens)) - trajmin = self.trajectory[idx2] + if self.MarginState[0] or self.MarginState[2]: + idx1 = 4 + elif self.MarginState[1] or self.MarginState[3]: + idx1 = 3 + elif self.MarginState[4]: + idx1 = 2 + elif self.MarginState[5]: + idx1 = 1 + elif self.MarginState[6]: + if self.trajlens[1] < self.trajlens[2]: + idx1 = 1 + else: + idx1 = 2 + else: + idx1 = self.trajlens.index(min(self.trajlens)) + # idx1 = self.trajlens.index(min(self.trajlens)) + trajmin = self.trajectory[idx1] + static, dynamic = self.pt_state_fids(trajmin) static = np.array(static) @@ -279,47 +330,60 @@ class backTrack(Track): # # return static_dynamic_fids # ============================================================================= - - - - - - def is_static(self): - + + def is_static(self): '''静态情况 1: 目标关键点最小相对运动轨迹 < 0.2, 指标值偏大 - feature = [trajlen_min, trajlen_max, + TrajFeat = [trajlen_min, trajlen_max, trajdist_min, trajdist_max, trajlen_rate, trajdist_rate] ''' - # print(f"TrackID: {self.tid}") + boxes = self.boxes - - condt1 = self.feature[5] < 0.2 or self.feature[3] < 120 + '''静态情况 1: ''' + condt1 = self.TrajFeat[5] < 0.2 or self.TrajFeat[3] < 120 '''静态情况 2: 目标初始状态为静止,适当放宽关键点最小相对运动轨迹 < 0.5''' condt2 = self.static_index.size > 0 \ and self.static_index[0, 0] <= 2 \ - and self.feature[5] < 0.5 + and self.static_index[0, 1] >= 5 \ + and self.TrajFeat[5] < 0.5 \ + and self.TrajFeat[1] < 240 \ + and self.isWholeInCart + # and self.posState >= 2 + # and self.TrajFeat[0] < 240 \ + '''静态情况 3: 目标初始状态和最终状态均为静止''' condt3 = self.static_index.shape[0] >= 2 \ and self.static_index[0, 0] <= 2 \ + and self.static_index[0, 1] >= 5 \ and self.static_index[-1, 1] >= self.frnum-3 \ + and self.TrajFeat[1] < 240 \ + and self.isWholeInCart + # and self.posState >= 2 + # and self.TrajFeat[0] < 240 \ - condt = condt1 or condt2 or condt3 + condt4 = self.static_index.shape[0] >= 2 \ + and self.static_index[0, 0] <= 2 \ + and self.static_index[0, 1] >= 6 \ + and self.static_index[-1, 0] <= self.frnum-5 \ + and self.static_index[-1, 1] >= self.frnum-2 + + + condt = condt1 or condt2 or condt3 or condt4 return condt # ============================================================================= -# track1 = [t for t in tracks if t.feature[5] < 0.2 -# or t.feature[3] < 120 +# track1 = [t for t in tracks if t.TrajFeat[5] < 0.2 +# or t.TrajFeat[3] < 120 # ] # # track2 = [t for t in tracks if t.static_index.size > 0 # and t.static_index[0, 0] <= 2 -# and t.feature[5] < 0.5] +# and t.TrajFeat[5] < 0.5] # # track3 = [t for t in tracks if t.static_index.shape[0] >= 2 # and t.static_index[0, 0] <= 2 diff --git a/tracking/dotrack/track_front.py b/tracking/dotrack/track_front.py index 42e5d0b..83e178c 100644 --- a/tracking/dotrack/track_front.py +++ b/tracking/dotrack/track_front.py @@ -12,12 +12,10 @@ from .dotracks import MoveState, Track class frontTrack(Track): # boxes: [x1, y1, x2, y2, track_id, score, cls, frame_index, box_index] # 0, 1, 2, 3, 4, 5, 6, 7, 8 - def __init__(self, boxes, imgshape=(1024, 1280)): - - super().__init__(boxes, imgshape) - self.hands = [] - + def __init__(self, boxes, features, imgshape=(1024, 1280)): + super().__init__(boxes, features, imgshape) + '''5个关键点(中心点、左上点、右上点、左下点、右下点 )轨迹特征''' # self.compute_cornpts_feats() @@ -40,6 +38,7 @@ class frontTrack(Track): '''该函数依赖项: self.isCornpoint,不能在父类中初始化''' self.trajfeature() + self.PositionState(camerType="front") '''手部状态分析''' self.HAND_STATIC_THRESH = 100 @@ -245,7 +244,7 @@ class frontTrack(Track): '''情况2:中心点向上 ''' ## 商品中心点向上移动,但没有关联的Hand轨迹,也不是左右边界点 - condt_b = condt0 and len(self.hands)==0 and y0[-1] < y0[0] and (not self.is_edge_cornpoint()) + condt_b = condt0 and len(self.Hands)==0 and y0[-1] < y0[0] and (not self.is_edge_cornpoint()) '''情况3: 商品在购物车内,但运动方向无序''' diff --git a/tracking/test_tracking.py b/tracking/test_tracking.py index 8fd5c4a..8e35b60 100644 --- a/tracking/test_tracking.py +++ b/tracking/test_tracking.py @@ -21,7 +21,7 @@ from pathlib import Path # ================= using for import ultralytics import sys -sys.path.append(r"D:\yolov5track") +sys.path.append(r"D:\DetectTracking") from utils.gen import Profile from dotrack.dotracks_back import doBackTracks @@ -68,7 +68,7 @@ def detect_start_end(bboxes, features_dict, filename): return start, end -def save_subimgs(vts, file): +def save_subimgs(vts, file, TracksDict): imgdir = Path(f'./result/imgs/{file}') if not imgdir.exists(): imgdir.mkdir(parents=True, exist_ok=True) @@ -78,19 +78,21 @@ def save_subimgs(vts, file): for ii in range(len(boxes)): tid, fid, bid = int(boxes[ii, 4]), int(boxes[ii, 7]), int(boxes[ii, 8]) - img = vts.TracksDict[f"frame_{fid}"]["imgs"][bid] + img = TracksDict[f"frame_{fid}"]["imgs"][bid] # feat = TracksDict[f"frame_{fid}"]["feats"][bid] # box = TracksDict[f"frame_{fid}"]["boxes"][bid] cv2.imwrite(str(imgdir) + f"/{tid}_{fid}_{bid}.png", img) def have_tracked(): - trackdict = r'./data/trackdicts' + trackdict = r'./data/trackdicts_1' alltracks = [] k = 0 gt = Profile() for filename in os.listdir(trackdict): - filename = 'test_20240402-173935_6920152400975_back_174037372.pkl' + # filename = 'test_20240402-173935_6920152400975_back_174037372.pkl' + filename = '加购_91.pkl' + file, ext = os.path.splitext(filename) filepath = os.path.join(trackdict, filename) TracksDict = np.load(filepath, allow_pickle=True) @@ -101,7 +103,7 @@ def have_tracked(): vts = doFrontTracks(bboxes, TracksDict) vts.classify() - save_subimgs(vts, file) + save_subimgs(vts, file, TracksDict) plt = plot_frameID_y2(vts) @@ -114,7 +116,7 @@ def have_tracked(): vts.classify() alltracks.append(vts) - save_subimgs(vts, file) + save_subimgs(vts, file, TracksDict) edgeline = cv2.imread("./shopcart/cart_tempt/edgeline.png") draw_all_trajectories(vts, edgeline, save_dir, filename) print(file+f" need time: {gt.dt:.2f}s") diff --git a/tracking/trackers/__pycache__/bot_sort.cpython-39.pyc b/tracking/trackers/__pycache__/bot_sort.cpython-39.pyc index 0be2497ebe48d3e31e44aff6d6c814aa4240b11a..a6bfb5c6912728c17d8daa671a48a56d6ff4ee11 100644 GIT binary patch delta 77 zcmexv{>Gdqk(ZZ?0SMAOLen<#STGCeyI94zq?V*6mxL50CTC~nrEgATHV|e%djk(ZZ?0SNfNT}$1_W5FzIU6{}=ojGD|Yd73eMa-gvI 0.85) + emb_dists_mask = (emb_dists > 0.65) iou_dists[emb_dists_mask] = 1 emb_dists[iou_dists_mask] = 1 diff --git a/tracking/utils/__pycache__/drawtracks.cpython-39.pyc b/tracking/utils/__pycache__/drawtracks.cpython-39.pyc index 915f2cbb06f58b22638c2c0588e5f538d5d031ff..c801a9f2617db89abbe68782103950ada58cc8c8 100644 GIT binary patch delta 1538 zcmZuxO>7%Q6y6!z>)G|%O&mKZI3!LQDRO~|{LxmWqM@X93S8RIifx3o?5Zn~l>PSZP0h^X+?| z-BF*BK)=F~!tWUgdKWQmBX%$&&8N=#Gxb!uioUoMj7?ON^SM{SGN|yHjrCH>h zR7kQBWh!zxR$^2sbeg=c%Sy?;R9`yOsLd66*r&>TD!E|OIom3E)G+5=)~%X(orp!l zyF_PsP7tXq%mop?)T5m7O}woh8GV93k#L8+9}$#7Dkl6+qcq-SavEz$0}UO-9f)3K z|EPcUkQr)JPuYf7h|m%4KxY7E*)Lr^=mVC~&Lfx2YX>J5xE#b?W6>^G=7N~%)LpwE z>$2fEi=IoD;c=|YeO!70I5wK}3j0yZqg(7xEr-^&;>oobx+sjlVVmg&x+(a#?Cq|} z9sbipp8XZ-m;gW=wiRI4*uPyT__!R;4DHj^O3gGV-x<#?CZyO7<~Xk2J@|bmnJss*ab(`Eq<*XY1KPw86g1E}@OBXSx&7 z6$>(U;a)_v7y_vLD4^#s0vH!S-yUnLg~)apgfAWn^b-(n?-9fw+y?<*$AfN4(uxGQ zt3aa2<{=_{H<1ev7#6aVBBDhEusyC}*pA2c&+WW+gy={#gL;CP`NqfEtHDHY?P0Y(6h5eNQ6B?)RNXi!9nd@whnd7LU;)+GM0nM%!epO~%_~qD`J|lfybo=1iM9E)PL50>rdXzBKu^xhf|T*7$cJg-DE2 z#s;PnVt1f@YO_BEp5?y7gGUSSC8k#a)&MpDpacqL0V$Pg#)4fc@ojx;@cG0f$q=0w Iq=Vr900|m*?*IS* delta 1458 zcmYjQO>7%Q6y6!zyX*B&6UTOc?8J_hQrrrJo4BRoKtl<2XgSbEm4ZrFTkqO&;;h~A zI&omF6hinZ>Y3u z-kX`NSALxcYoU-L@Ta-`dZ~Tl%kV#9l8N(Lt5nfh|C#X%Q)*%IY(bqWT$s36$T6Ch zjvz)0(*2aiql#XL?LA@smH2yxzl}pQBEP$g*5wVsb`T3~r5&*L*}|-3D=WCIIK0me za2~MwXCt;^2TEA?>Ecb?mTh@0ygRak zJXX==4IdJ0ysp^Z&x9d8u!c8K+s{KoR@nBhAY0zRNYJH=LN-XR`6uYM|8ReaulOy$ z+L);=K3g}-**N{nKS$@4t7#@%L@UnKtr?lCRcnLM> zjlaICe+JM>s6jc(BMp#-|M zITQNWhpsq@H)(L7j;O=8=#zo*9{*;S$G(Skj6i(}sj#{Rr?A80dGY%df!+VNzAQYE;$dT#|FiahHs` zWXvUbmz;3PNk+}|S+T}5{wvT&=~+~xPYqZ31)#$t{nue4zh;^>OS5Xkxw8WYEv`=U zMl}>p1RUg-Ka6A_vFP8!lL4n6P%xRHh0KdQ(}$T;Sq+3$fLj0$0ANxA$(XFFrZ#V= VDsSW;nU@16<*59ItjT>c{vZCXcLe|d diff --git a/tracking/utils/__pycache__/mergetrack.cpython-39.pyc b/tracking/utils/__pycache__/mergetrack.cpython-39.pyc index 586caff60ac4b5715bc179a8955a3576750734cb..68c94457007db89a49b2defd89ff915f0226ea2e 100644 GIT binary patch delta 1977 zcmbVNOK)366rRU@`Td9++j%x=o7idU@)AW*wLuMPK~R;Zpvr3G+8#SNi60%`h=R_= z5(Wu`kRmQDSQI52BqW63H?Uz+a7y+Y3QRSXm+h z8$>?b^AHw%je@ZrNhwQB1kq0zM`58OZ$83DkhdTVkzqtppE1B3GBJ!W3NhSFe2q8> zJBC||_o>h`q}Qj*Wc58K32{hfi9(^LNtQ6;j5sNX!U(caNM*?e-=^{^#MBrO`3w=E z4eGPLo!}b`rSD+GIR+^RuSYNuqb;0`^2ojniJdqcgV8$MrL;%3>7A<>RT^6c63ZyB zetnBMS!WCwWDjx%9L5eL3~$_-z)Bpp(2rP5I#a3&FnKulFm+h6RKYOHX?I$m=f|BH z_hsy7ofB>s`;*Qo_ntoAn{(zdg$bC0*OmZF-ca>p|jA8I8>3^Lp^|{)TwXTdQUDEy0m~sCw zo;w>>VgkW4n~heZxz+Tv>Sm)O+h&HzG4~_$ zB|7TfH&5h>8s@3%(XvM?MXg+E-}SVLLRPMOtWqx;s4tZ(F1N0a74>SnWj{ISo;th} zw``4P-og+FH>km|nHid4N!_9vcR#ll7Bw2Bvuu{-_yS#E*!TpU_*c{76kislNuH$m z@;H~5-G|l-FAi!cpT#xhIR%OsfM3kmLE$z_U0c47>aKx6C^}{GihDEg%QM4CdFI!^ zqxR8-g6B6IUAx+Db}oFPT;$x_!JA7*C(0$I8?sWxAYVcFObv1fc|Ir%@3cGU{qNw+ zITd`-s&2`Wa^dL})jf7Mp=M34)duJ9WA|EU-nfQytHk}y%D7*I3cZWU%@Tq~s~#0{ zD9hLPHG|Q06mhd^x~F$!qh+J?s{C?ziEYz-`O4 HQrOske`&ue delta 1567 zcmZux&2Jk;6rY*>@Oo{p9eb15v6D7Q^Wh-TNEM<`lmwbolnM?_RaI7tWqab_B({_B z22t@A9}LHeh&gdVj>Lr<2muE;^B>T|9uNnF=z$YRNL=8}x^dFdUG49^_j_;Vy*D5G z>Ey$lQ%NLjg3so68}-jKUpWtHs$|whrMXoOjQUo^>y+eQw3UuvOkm#nun5)MGo^G4&15pUIn^4n~jm4U}e&Vr0ZKA=0Cw#MvhCBGA=<^_Xv=s)t$> zr?kL=Xq|D5>kpW3bHii(C^tPD@a2)7cFeNGk0EbkbPTLPq$)ubr%DU?=>K^&8pp;V z&aE8b(e5r0zlOE2ojBLFDHuBmR}I&=jmZ+Baq1vK;*_a$q`0;*B^x>xX319G)H!|BPwn~ zO6iEmX9?x$c3#_Q~uQgTEOZevl| zWk|21aqq3W%+L7~ph50*5phcdp$0qYUmLq7-Lm{*akL?AR zhlOzhbGQJBapEsR7F(Kw#XK3bG;#3r;CLNrVuiC7dLpHv+00V0$MHUm1_IFK(8Xo zFQPYBg}S5zD5!iR;jHDYgTu;RIn-y6?vxOSW>Qnj(kx3G7S%PI+El)7FHJdghAq)0 z^=SoK_*d6c6knFs(xzCEpV?PlRauHmTtp$36+D$Tc{Xjw6CTENOawwP6%(s+BKFgz z;h-W5*z?N)^`4%`er2!G@oMen{)&%-|0HrYerN5>II)JbcuB#K6{>Ub8p4N4Q9q%g zHduabzrByizmHG9sA?}+wL?)>DFUOa#50?THMhj})?oGCmzl%@y)LgLZgelJ*;VR* z)&k1K&=zl;cm~=HG;y`At59QKG+G{78!G0Sf+q_P^k${e`WPJ@b=K5^SwF=zggI%r}=!Kwn4Xc*s8zxVQ)Bw@OOY&+A@n^wef@nio19dKmj diff --git a/tracking/utils/drawtracks.py b/tracking/utils/drawtracks.py index 436e2c5..f5110a9 100644 --- a/tracking/utils/drawtracks.py +++ b/tracking/utils/drawtracks.py @@ -87,20 +87,29 @@ def draw_all_trajectories(vts, edgeline, save_dir, filename): # edgeline2 = edgeline1.copy() # edgeline = np.concatenate((edgeline1, edgeline2), exis = 1) -# ============================================================================= -# '''1. tracks 5点轨迹''' -# trackpth = save_dir.parent /Path("trajectory")/ Path(f"{file}") -# if not trackpth.exists(): -# trackpth.mkdir(parents=True, exist_ok=True) -# for track in vts.tracks: -# # if track.cls != 0: -# img = edgeline.copy() -# img = draw5points(track, img) -# -# pth = trackpth.joinpath(f"{track.tid}.png") -# cv2.imwrite(str(pth), img) -# -# ============================================================================= + '''1. tracks 5点轨迹''' + trackpth = save_dir.parent /Path("trajectory")/ Path(f"{file}") + if not trackpth.exists(): + trackpth.mkdir(parents=True, exist_ok=True) + for track in vts.tracks: + # if track.cls != 0: + img = edgeline.copy() + img = draw5points(track, img) + + pth = trackpth.joinpath(f"{track.tid}.png") + cv2.imwrite(str(pth), img) + + for track in vts.merged_tracks: + # if track.cls != 0: + img = edgeline.copy() + img = draw5points(track, img) + + pth = trackpth.joinpath(f"{track.tid}_.png") + cv2.imwrite(str(pth), img) + + + + '''2. all tracks 中心轨迹''' img1, img2 = edgeline.copy(), edgeline.copy() @@ -139,7 +148,7 @@ def draw_all_trajectories(vts, edgeline, save_dir, filename): def drawFeatures(allvts, save_dir): # [trajlen_min, trajdist_max, trajlen_rate, trajist_rate]] - feats = [track.feature for vts in allvts for track in vts.tracks] + feats = [track.TrajFeat for vts in allvts for track in vts.tracks] feats = np.array(feats) fig, ax = plt.subplots() ax.scatter(feats[:,3], feats[:, 1], s=10) @@ -269,7 +278,7 @@ def draw5points(track, img): trajstd = 0 - trajlen_min, trajlen_max, trajdist_min, trajdist_max, trajlen_rate, trajdist_rate = track.feature + trajlen_min, trajlen_max, trajdist_min, trajdist_max, trajlen_rate, trajdist_rate = track.TrajFeat for i in range(boxes.shape[0]): cv2.circle(img, (int(cornpoints[i, 0]), int(cornpoints[i, 1])), 6, (255, 255, 255), 2) diff --git a/tracking/utils/mergetrack.py b/tracking/utils/mergetrack.py index a224d1b..d3968d0 100644 --- a/tracking/utils/mergetrack.py +++ b/tracking/utils/mergetrack.py @@ -31,12 +31,19 @@ def readDict(boxes, TracksDict): -def track_equal_track(atrack, btrack, TracksDict): +def track_equal_track(atrack, btrack): # boxes: [x, y, w, h, track_id, score, cls, frame_index, box_index] # 0 1 2 3 4 5 6 7 8 aboxes = atrack.boxes bboxes = btrack.boxes + afeat = atrack.features + bfeat = btrack.features + + # afeat = readDict(aboxes, TracksDict) + # bfeat = readDict(bboxes, TracksDict) + + ''' 1. 判断轨迹在时序上是否有交集 ''' afids = aboxes[:, 7].astype(np.int_) bfids = bboxes[:, 7].astype(np.int_) @@ -50,8 +57,6 @@ def track_equal_track(atrack, btrack, TracksDict): return False ''' 2. 轨迹特征相似度判断''' - afeat = readDict(aboxes, TracksDict) - bfeat = readDict(bboxes, TracksDict) feat = np.concatenate((afeat, bfeat), axis=0) emb_simil = 1-np.maximum(0.0, cdist(feat, feat, 'cosine')) @@ -82,9 +87,15 @@ def track_equal_track(atrack, btrack, TracksDict): idx_pair.append((a_idx, b_idx)) ious = [] + embs = [] for a, b in idx_pair: abox, bbox = aboxes[a, :], bboxes[b, :] + af, bf = afeat[a, :], bfeat[b, :] + + emb_ab = 1-cdist(af[None, :], bf[None, :], 'cosine') + + xa1, ya1 = abox[0] - abox[2]/2, abox[1] - abox[3]/2 xa2, ya2 = abox[0] + abox[2]/2, abox[1] + abox[3]/2 @@ -101,12 +112,15 @@ def track_equal_track(atrack, btrack, TracksDict): union = box1_area + box2_area - inter + 1e-6 ious.append(inter/union) + embs.append(emb_ab[0, 0]) - cont = False if len(interfid) else True - # cont2 = emb_[0, 0]>0.75 - # cont3 = all(iou>0.5 for iou in ious) + cont = False if len(interfid) else True # fid 无交集 + cont1 = all(emb > 0.5 for emb in embs) + cont2 = all(iou > 0.5 for iou in ious) # cont = cont and cont2 and cont3 + + cont = cont and cont1 and cont2 return cont