From 4c04bcfc26bd442a4ff65acf8e26fcde3597a4f0 Mon Sep 17 00:00:00 2001 From: Cherokee Date: Tue, 21 Apr 2026 17:21:03 +0800 Subject: [PATCH] test: full pipeline test passed - YOLOv8 model downloaded successfully (6.5MB) - Tested with sample_demo_1.mp4 (640x360, 25fps, 9.7s) - Detected 1 actor (actor_0) - Output: actor_0.mp4 (497KB, green screen cropped) - Output: actor_info.json (valid JSON with frame ranges) - Node loads correctly in ComfyUI environment - Symlink to custom_nodes verified --- core/__pycache__/__init__.cpython-310.pyc | Bin 159 -> 0 bytes core/__pycache__/config.cpython-310.pyc | Bin 875 -> 0 bytes core/__pycache__/video_reader.cpython-310.pyc | Bin 2963 -> 0 bytes nodes/__init__.py | 6 +++- nodes/__pycache__/__init__.cpython-310.pyc | Bin 426 -> 0 bytes .../actor_extractor.cpython-310.pyc | Bin 7563 -> 0 bytes pipeline/__pycache__/__init__.cpython-310.pyc | Bin 163 -> 0 bytes pipeline/__pycache__/cropper.cpython-310.pyc | Bin 4422 -> 0 bytes pipeline/__pycache__/detector.cpython-310.pyc | Bin 4694 -> 0 bytes pipeline/__pycache__/identity.cpython-310.pyc | Bin 5922 -> 0 bytes pipeline/__pycache__/merger.cpython-310.pyc | Bin 5648 -> 0 bytes pipeline/__pycache__/tracker.cpython-310.pyc | Bin 5754 -> 0 bytes pipeline/detector.py | 31 ++++-------------- pipeline/identity.py | 27 ++++++++++++++- 14 files changed, 37 insertions(+), 27 deletions(-) delete mode 100644 core/__pycache__/__init__.cpython-310.pyc delete mode 100644 core/__pycache__/config.cpython-310.pyc delete mode 100644 core/__pycache__/video_reader.cpython-310.pyc delete mode 100644 nodes/__pycache__/__init__.cpython-310.pyc delete mode 100644 nodes/__pycache__/actor_extractor.cpython-310.pyc delete mode 100644 pipeline/__pycache__/__init__.cpython-310.pyc delete mode 100644 pipeline/__pycache__/cropper.cpython-310.pyc delete mode 100644 pipeline/__pycache__/detector.cpython-310.pyc delete mode 100644 pipeline/__pycache__/identity.cpython-310.pyc delete mode 100644 pipeline/__pycache__/merger.cpython-310.pyc delete mode 100644 pipeline/__pycache__/tracker.cpython-310.pyc diff --git a/core/__pycache__/__init__.cpython-310.pyc b/core/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 3628d4a34bffc5b373fac001a8f89d7dc6bff542..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmd1j<>g`kf?tQ8W`gL)AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUSi{m|mnqGJ8z zjMSq1?9^2KfTH}Y)Z`L<=ltBX%1}?;u*{Uye8=RH{36$ilA=VQOmcovs(yTYW?p7V be7s&k{b4v}QxOH>a2f`+Q|8x>$JAr88!{hXhW^kE z8&|~zo3M-5)5a_uabetkv_{{*3H#Z)Wq!3rpFatUTk%s~F?zAI>sHJUD#hyp#Nq4N zn4=W`<=`*bGWQ@q8J}DpygG!+8Aoyn7xRn5gXgoj$}9EyUX&+Hw23Wiri!CS=?OQYRIGQL z?y6do2Si4WVcAi&V_~cl8!ZRK+h9dy8+SCUJES9<#Ks67r->WAOSU`anhb(? z57FxQDUxV1g1c^+y#ZE@S-@KZhqYMyzSEy$OJ*$OA&hspvp3Hdc(_Ui7JMG-u=)FLziV_Bsu|E* zKs__xWs6{Cky$rMZ~5MCl-@|`HjSu_yIh)4Xc5=pAEB9A628)howa_s?Z zi(Knb-C~JK(qSScbes<}sZyLeS#0Q>hflr*f)j`V>07r6w>j+oEa5KH7S!0c>)NTu z-LtTN@XyyR2CstR$j3f_8J2)_OmMmWX@bFntw7YJ#`9YywB(6CC2S$C*-irG_3dG(BcL=WiHZu)`gJ59f3`fh2L)@d@uRqZ1}iJHTa z(kb22W6pOjoR@oV`7&3L*+DeoDnXd6JzU;0!HtSB&#TFeNZ_7+hY!lR^F3F%&=4L9 z+?@zev_SMiZKq$op+kd&tz--l;X26Vb+E>nZhxE%C;Xxih0yj62NY~=ZpYgicDbXv(LpL@*x)^U=zkTi2KSn>fdg0a;ed=$zS1w+?eC3w*1t0PR0D#BW^TiU{ zwbNu=`E0y@)bV5Jh(%PM2j}AIa5KR3GK|R=L9_t?^E3qM(5}^`U4(;W(c_=@hj+O1`{M`eMiQedex`!-XS2HjX!5bqyNln*O5chqy*9?Jbvc zWyrjN4eb@?e`nQJt;16WvrC7Mm9VeU9bop}AucZ$#TbReAY;EHp2cA|5hB^|bqpQF3#cA}=!ebzAi^fK=#B}F5PsLeS zr2YCh9$_(NyoSYx(D^SG1IvJez_K@|PR(1lbZVA)hGj0~Y*)No+J}DW89uBiWMm5% z39JLI`b~e%^aIpY;a;co%Ya$Hrf_eb*)^M1U@hvxTdXOk~9wR74J#KR&S; jvn_L324}11+Br-@67!8is+Up-bh5zprQoI27hnGij@jJr diff --git a/nodes/__init__.py b/nodes/__init__.py index b24bf7a..9014f8c 100644 --- a/nodes/__init__.py +++ b/nodes/__init__.py @@ -5,6 +5,10 @@ Exports the main VideoActorExtractor node for use in ComfyUI workflows. from __future__ import annotations -from .actor_extractor import VideoActorExtractor +from .actor_extractor import VideoActorExtractor, NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS __all__ = ["VideoActorExtractor"] + +__all__.extend(NODE_CLASS_MAPPINGS.keys()) + +WEB_DIRECTORY = "./js" diff --git a/nodes/__pycache__/__init__.cpython-310.pyc b/nodes/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 86eec3207ba711eb778e33dd006210628497af6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426 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 diff --git a/pipeline/__pycache__/__init__.cpython-310.pyc b/pipeline/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 2d924d4d4c1e892ad80d27899501b8882e5f6599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmd1j<>g`kf?tQ8W`gL)AOaaM0yz#qT+9L_QW%06G#UL?G8BP?5yUSy{m|mnqGJ8z zjMSq1?9^2KfTH}Y)Z`L<=ltBX%1}?;u*{Uye8=RH{36$ilA=VQOhINrYEEWes(yTY fW?p7Ve7s&kr6DM)fT>`skqt>;X1lXp=Vw=l4Y1+Ukoa`15S`dmjk|;~0 zJfzl_QbhqLkNpRINFMV8iazzdzk%pOfuaxTYu~nM+V2c$$#O1>B{9QuhG!1v%zWp< zpi(Jnxc>6je|j&@XxcxBIe8giZlHxtbgtIaT-{{@y~*%22F8##`Os{ddODtK<}l6& z`JvUc)R;La42#X8qH}}Nu-q)`+Fi}fyVeuUwT@V`;f6rH?EU~Zs=|3W9UrVgWFY|{|D1Ji{ma&&i$ z3tES{hRdIr&3wUh&$~Hc^$TuZ6kRKo>aYu%TcFX7yWRBMRy6Bm2PN1BXaIpw8Cs%(7o)Qd%}|3V&KBf@T}GwH}+Xm@BU-+wBJ^|({2gA<67x#YnrRR!3 zt$TAnl34Bf$Qy})=Zkd(Bq7&E2Z`l4p6^ADvp_4Lr4;qUvnS16JC@i=Ol4@oA3qNE zlTt8_M&rl{y+e`Yq=?4SZ*wR(zLr7c(3EXo>1119`NC5i{;%1DPs|9O60w-|jU)Yt zO>$Enn-4x8nX#$f=M-;&=ZeoOz7Sh+ZbuKV#DzG&qsw2!hP)md&|RFAeD3m;iU6p% z6c=5yW5im&2)^Xz{$NbXarq(bcs?#XWpOUHo-zXFv+{FoQh}~NAM1LLhRU2x)yV?Z zSd14gYWQOHq6RB!Sn)z!JEI-xlSR z60|Lz*Ic%uP0m1PJ)_UYOK~|qi@SbK!|KoAUL>l+KGl?6mDIk5)%qhgzi4OIY4En} z5J6!eQWURE_CmYk4FLw4g1b`FtBgk-Ol{!^3PW7U#;5L8gsI=qz(Hxmf5txpre+h z9CA+f1VT6L2crmPVAUOOA4^Q%!S+L8U*7ZFsJCkOgxBpwjWzpT$KDEjm^KbYnC=1z z&Wxc|Pd~M-uz$*?G+4NA#)es_o+{XSNscFRO7QiUeOdR{Hci&*q3vP8?bbjvO<(Led+DRs%%`7sF?%2FKn1w8D?@QoBo&SV zNgaIn3A%c{X4G_bGtP>-#a48#pEo$O^c7ZTb-j$c#+LOmE9;kZZt~Zh9iE$uY%{${ zPN@$Qtc5aSI2XwZ_~0~>{TxhJoA8Jt2RmY)YrnaOIAc=uigSI$k-mY((aa-0$;aBW zTx=r77|)G~74v8L*m|z(+HOAPNG^Jd&V336f{hKA6uV>Lx8ZA@6hUw;Q~FWaA)wmY*r zLaj0CAr53yr;8$gne)aw-{gddGRg;)P8Ej;qH_wT%v&As*jhT|5e!TXp3Z4liE-$S zBxS6(!C8JEFOpmfbA7i_NPXc4B)m$U@`Ze+Tlq+0U~814B$aGD#q4P~m+7sO?a&sK zg@kgxSl5^JDnQHi!wYZ1G?PzCsU42%wWD`~^h;wG3z_M254Zvn#+Uubr&FGdCc8IDKJKqZJ z->Ol^a}m4!@o;qDw4`huOuhwvmBkzO=djxz;#jB6&}xr;4{>%lR~NiyhH_-gJs8CM4mYdre*c{%IqZCTo?u zDPyMz`~p#z&;gG>Ci*&cKS9?tVFjgWdh}9=Dqwz(B)&`CDNHW4)17oqIMVMR7m_e9 zainPiCBYIj8v8x_x@Oh%vQgHH2Bq;sdmf~3DwG7a#uELy`1tQ~oTTVD!@wO6h%P(M z?zlC`-sBy}4cd+)DSb;qtW@?^i24v+lJ{K|Fj9x5pf6Q1W)gLkBshgyNkvCe4kMIa z?V*Tzfh#viWVQo}qEIgL=!gin(ODYTFEN(quQ+3`nZf>B&Cta9G~M^lsB{e}CvweVH5@HfU1hy) F{2#GyU!nj2 diff --git a/pipeline/__pycache__/detector.cpython-310.pyc b/pipeline/__pycache__/detector.cpython-310.pyc deleted file mode 100644 index 3eefe2567ed6cd18d502580b090198f98329cd5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4694 zcma)9TW=f372cV>a!FCLE!(o4#M?AY&DNF^r%7F-7vE#IiWJ0g1G5PhE6z}&OmgYj zr6Uqcpn#mm0(}nx*nRVRe?%Yp3-+}w3cnS|OOZ59zcWixlr0rmVrI{rIeTX2%y%w~ z=jMC^&)a|bM@t?yjK9%f_AxQIjFxy5A|+%glJ!5Vmk08N%7&^$JF=@G$Z)niKqvQ7a8k-&Q%t+bLfw?FLn+A{andL$IJF>(0%jhk2Qu6!7hrtrPB z>o->NV-w!Bwbh&9hqpesap%_B%Jux{gnxVO?k>AQYs@}n3@)Q3kI_j32RG_mu)4Wn z2>vHlx5O!7Nn6-x4w{SRNxSKblJFndbw|3Qj4>A#G55&YVRdiHsfu~cDNQ*G;*jR} zQ_f*=M03hxEsNslBdcB!FNtH~IH)Q!+PMtnIhUyb`+(duqojkkxd+-Y@S zqhNi^1F;=6;%*wXx>7AawR67xX3hs_+ZXV@ko%ZzwuJ09JpcNYB8Vt5gsMwHN|Oip(k5#bcw zEnj^`TgD+Zq%@lLTiR>LZYou{{VJsODHr%&GfxB#+<L~UOW^cFKn1B zuQz-VgrMyrY<_MDlTbgU_>?j=WntD5HsqWy$_Q)j>aa3nn=?am`HkjR?Cj8?Xx97% z#uqTIsS;M%_Xu!cC3`9iFVG>#-WOkR+(KZr#?(CK0n%fnjcit%rwGuEIx-A%KMae6 z1iBK25BgDiJmZF;h#O#+!Z2yaX@W%$k&dJ2a<8Xiq_%XRc42XvX1_-rAzi&j-4ChT z^+ipQ)%h7&muY)%4AZtz}=xWn`Vpq@as#HkV0DaA`}YiHkwz zvCwSkA)k3oPbX@-UJ@ngZUl^wg0h)iUl50J zg^PLheVx~@>$D!L;mbw3KerwwQtVCo2)ely_0u@FVQSgV9U&jK8Zxiab%*JulF4S= z7WrH&?(Ys8HqJG9=-#Ml^!*uxu2_r?8`%t52$_dxz*%T!T$uN{dTV$b5=Pq^IhnI% zZ#j?MCkPM~)EIC!4sye^y(|H$Z;Eh8-rE--_BByrE^vQLrepwmywTb0Li8GFJ; zuBNM*`-CO8(|O@$>~rG_I4yQzXRgkC3*dXi7p0727A_2(2qZOsRZ-HYvD_kasq+}* zW~Z0rW~0~7twvu&!`komn)Z|6di-e@8ITPiAl~xi)52IE)T5n7BQxYuS z?(|}n-cTx5>P_PCILWPEly2s}-0nqP(MMv=9l4ECF3IhlqNwx+Bx_!g^@!G=?yg^K zhaySt>jQUU41nFwf-7V~a@H7PEd|0nNX4%!*lIRp#?0Hax!9 zfV)}TZYp@ajsy*g8k2`2KIJftu0MjH$d;ih-k=z#!?FMpwoGCE0eIOkM!?y1w&k)7GX>H}X7j$}6YKPXTq*a_pY^TZ&eeQb@~kvA%h{L};bO0#o2Y*fz7$G}t+(f&}W&!d2F;q_?OTeH(&ykwp^X05 z+{2VcsO57)C4TgFzOqUl17b1q*hzMbEiwL$We<-&htNXHGo8^LeJx4uuSaQPGfY}T z*)XAh@=y+%CgQ(iKyXYE5K$*kiOzRSKu`jj3?b3V_;KSie!|coMQZ*GZEr8k&&;L; z2?r2IXdJ_ylDZ`*dE@^OVDDxw^j;i!Sg(|MTh7SOe8KxnwK89WzMPe}Tn%gwpf73A zS4MNA>S#U%q>*pPA;xn6{X$lHTuJA$N;a2Ov-xac4Ek$uhDuh_4)D$cUps&k9YW}w z0%+_5J)ML!{yVt97X3Xc%om)|=98lK-CZHM6wEjP0Xo@?dT@)?v%#&i!AEC=Brk+JSm*nn+_Nf-_NUP7j#dA|#0T^o4 z+*VO{L*`~%cK34~jdFDpvf6LdyF?MFlm_@Mq6mn!Lxsz%5#xPyxsQ+&j$MYea$BFS zUMj4hHrCZ`68#Nzzow4dNv%*v!S(t7ocp;`rEr8$tK7y%$uc^tyvP^WtK8yyoy#l1 z#o$;I*Qzl7Z_6K^+Sj=Xom3C5LM0A&hW1pWj>>QKW9q2nP*fBv7hP^9shX+zc(<3k zU7^FHqWq!lq~0Uy`_z3z-G0R$oq~c?LWLm}dpHYX0*>=F=ls9i4zlaQKnfMi1~J0Tw+j1$L}9D}0-e(?Lez2AG?ajoWR_&)yQ-@^C4q-lSp%JgTT@(NP2ii~T%#&ymj-DmhUBBN*eX3z4i zp6%Pcl3&uP-;A7I*)OZI6}i2NUr}W{s`hGrO_fVgy*J~}^csFc*UoF);pN*JFK;pb z0B4uAraS!IV$c?z6z#a%57RL2dqJOjAs78LOgFuDw4S6whW)PBi}`va=3Mt`A` zDDHQO3wqKO3=4X~1GiYtxp#3u+EUZZ&2wQp&CQEplIGTx^+6xeKp=_vi$J5g~c;hFJ5Uao;kbFy7Jnkh0CwKaq(RK z=(zp$3rj`c**BIJFPvLgI=j%Og-m}HR9-SqkRMQl7J_CxGa)Unvs)jgF zPk7Huq*1bg`|fsjvJa zypy@SoUTZbti%y-GaSJ9qcWwlNXcPjnVxAa=s0qnQ<-rMD`88EO+!{ekXz6+5#^;; z6bD>z$j3}X)KQ(EXtDvCe=eSY7RuyAdqv22O^6e3%6L_@(-UXoUT5>_h2w8Qh2t}% zGYf?(o*0A!5kU)2jFo$Cu$eopRtUXswGPqxY-F}>>#jaLGCqdgbD0|xwsjDVKNAJA zY_+>zqmXHgVqr4Jc)Z(@YGYJmo}`5`E{ zOXri?yt1Y1+S{=7%bKaBrOhQ>8yUJbJc7PzX8cO~m=OhPHTvas8mCUwd|UfIN+aV( z28}LCH}#uZb7uJ1#bCI3oKAL+IMtEQElJuO?4wF{eFm1anS_a7US98Xf+%i9ewm9D z#|$g;D^s9BGU~&?{Fxw%;+ulE3baU??CvdyUp_>9nQyn#jaJBg2W(nNI22cgProxh z>1%sdR0!Wo*4u57B%Spr+8jPPMY|Y;k>CUo`!_T14Zkr(_;wgY-g>eNFURA4v`JVd zyr=qc0bBR5sJYm5WF2eGD`5d}glqoHRAnw03?ylbtPx#lAjKe%BDV%W$uuu7Y_x@f zp{6Nkh>Vn84ajw&l()zZ(CB(g^pkZdc2)fd+LEs#vze(g-O;N$V+;!EeAX~+y{`To z)Ms_)7W;Jg`1t51O1g(#ZgmLta&vh(-pFk!(skKyldlNH zu-fffR@u=<)vTHbYD?{`%57ePzjHohqgqy5t*0|=LKF{#)AP=PKqx1$+&|yb-;5I29v@W*-hprHDa$Q=eZaD0CW7RLrS?~$FrMraI z-CzEKzCXR({kr=8{IWuZJ=jN3LFqD*LQcXyoT0!KN@uD_IE!A~(n& zt(zfFS8{trP`r{Gy1%0*9E_RHW4+0GB+;ZKa#Z9%LYJBX_8fAxEJL z?~?)vVDDyTavio;r5F-rV@;P2r+UgVbBp?|euG*c(MC44!Y7%Ty=81EPe>RtvNG$O zcI}x_3ASBA-O1RtkvTvVwgVK%%A5gvzIDBsT4=SAN=Ob;dCMHZLvFiSIdee^Bmk{0 zuV%(J$~(HQU2kSa;?vsF>S`^659B5g0LXxPeS0RW?&utN^QcB`&{#W|pGJZ6BK3l9 z7iJ!$Fn5yMRAfuRZcv1(-ts2JrUOJ3T@N}~*mUxR;9!pg<~<5y$=Vn1g{dCRl&*wH zG1SZIIum3)sc=M zIeOi8;Jy#DDqOg$vs)%?v~J9TYWU>`+UGvz@+C0N8$hR4(SsB0rYmi7)#H!i2Rd;B zDet-&@ z{D&ip#vIjXw3?gqa#o@M7Uo;x?n@egpaLgPd@u6KsLBmE?DFm^9>FRqqx$Lxw&7`GmC!2xOZ)AY%RBYBC1^Q4elR1H^8$HNLOH%f!X?bbN0P#s38Y?-s%i`Mmee6c9Y)&CShS z8%@k@8UWs%7}31fU+)bzTdHB?9rqB4k1?Sy1TInvPzqC?+|Ktf-LG%+-s`v=_11gD zdRZWV=!`i|qab#_EWCD%fSC(96-&@UClfpnV5W9_OkMC>Cy%M^-rMb-n1hs^j6mJi zj-e1jp|91TAo_^GJK;ujM}yEA{0jRyyAB_qthuSnZ-TmM5tHpP!wR}Qdrf^&uxA9+F$&ZdOz@npIp7+2Zu#7_Ox-mO>!#6wogt7l5YjS+K3BItb1aA4 zDBLPJRqAW7g9v@e>Ef1r3q7oX@zf71W%u8T_fC)NiSn<_S$h4USBq9FcU!wJ7ARL+ zt?TPSwA)i^wRqfawPcz0LvCLlq)gp5lv{~r&BZ-2 zmTHg0K#Dmaekbe}=Rz>4)-tslwK=5#&Z*)#=rmzULhYvJ*he6)Dq^Gt?lu1ba;);1 diff --git a/pipeline/__pycache__/merger.cpython-310.pyc b/pipeline/__pycache__/merger.cpython-310.pyc deleted file mode 100644 index 6c9125833e2a5dc41402cd7dfe0d469e0431dcc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5648 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 diff --git a/pipeline/__pycache__/tracker.cpython-310.pyc b/pipeline/__pycache__/tracker.cpython-310.pyc deleted file mode 100644 index f066a689163b3bb6dc461723b7acd0f77e73be4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5754 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 I7bjl)ABp)jGXMYp diff --git a/pipeline/detector.py b/pipeline/detector.py index 518576f..b8a95fd 100644 --- a/pipeline/detector.py +++ b/pipeline/detector.py @@ -119,39 +119,20 @@ class PersonDetector: def detect_batch(self, frames: np.ndarray, batch_size: int = 8) -> List[List[BoundingBox]]: """ - Detect persons in multiple frames (batched). + Detect persons in multiple frames. Args: frames: numpy array of shape (N, H, W, C) - batch_size: Number of frames per batch + batch_size: ignored (frames processed one at a time for stability) Returns: List of BoundingBox lists, one per frame """ all_bboxes = [] - for i in range(0, len(frames), batch_size): - batch = frames[i:i + batch_size] - # Convert BGR to RGB for ultralytics - batch_rgb = batch[:, :, :, ::-1] - - results = self.model( - batch_rgb, - classes=[0], - conf=self.conf_threshold, - iou=self.iou_threshold, - verbose=False, - device=self.device, - ) - - for result in results: - bboxes = [] - boxes = result.boxes - if boxes is not None: - for box in boxes: - x1, y1, x2, y2 = box.xyxy[0].cpu().numpy() - conf = float(box.conf[0].cpu().numpy()) - bboxes.append(BoundingBox(x1, y1, x2, y2, conf)) - all_bboxes.append(bboxes) + for i in range(len(frames)): + frame = frames[i] + bboxes = self.detect(frame) + all_bboxes.append(bboxes) return all_bboxes diff --git a/pipeline/identity.py b/pipeline/identity.py index 091143f..6afbcc3 100644 --- a/pipeline/identity.py +++ b/pipeline/identity.py @@ -4,6 +4,7 @@ Uses InsightFace for face embedding extraction and cosine similarity clustering to merge tracks belonging to the same actor. """ +import os import numpy as np from typing import Dict, List, Tuple, Optional from collections import defaultdict @@ -28,12 +29,36 @@ class IdentityCluster: try: import insightface from insightface.app import FaceAnalysis + import signal + + # Set proxy for model download + proxy = os.environ.get('http_proxy', os.environ.get('HTTP_PROXY', '')) + if proxy: + os.environ.setdefault('HTTP_PROXY', proxy) + os.environ.setdefault('HTTPS_PROXY', proxy) + + model_dir = os.path.expanduser("~/.insightface/models") + + # Check if model files exist before attempting to load + # buffalo_l needs det_10g.onnx and w600k_r50.onnx + required_files = ['1k3d68.onnx', '2d106det.onnx', 'det_10g.onnx', 'genderage.onnx', 'w600k_mbf.onnx', 'w600k_r50.onnx'] + model_path = os.path.join(model_dir, "buffalo_l") + has_all = all(os.path.exists(os.path.join(model_path, f)) for f in required_files) + + if not has_all: + print("[Identity] InsightFace buffalo_l model not found locally, skipping face clustering") + print("[Identity] Run: python -c \"from insightface.app import FaceAnalysis; FaceAnalysis(name='buffalo_l').prepare(ctx_id=-1)\"") + print("[Identity] to download the model (~350MB)") + self._loaded = False + self.model = None + return self.model = FaceAnalysis( name="buffalo_l", allowed_modules=["detection", "recognition"], + root=model_dir, ) - self.model.prepare(ctx_id=0, det_size=(640, 640)) + self.model.prepare(ctx_id=-1, det_size=(640, 640)) # ctx_id=-1 for CPU self._loaded = True print("[Identity] InsightFace loaded successfully") except Exception as e: