dnt 0.2.4__py3-none-any.whl → 0.3.1.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dnt might be problematic. Click here for more details.

Files changed (311) hide show
  1. dnt/__init__.py +3 -2
  2. dnt/analysis/__init__.py +3 -2
  3. dnt/analysis/count.py +54 -37
  4. dnt/analysis/interaction2.py +518 -0
  5. dnt/analysis/stop.py +22 -17
  6. dnt/analysis/stop2.py +289 -0
  7. dnt/analysis/stop3.py +758 -0
  8. dnt/detect/signal/detector.py +326 -0
  9. dnt/detect/timestamp.py +105 -0
  10. dnt/detect/yolov8/detector.py +179 -36
  11. dnt/detect/yolov8/segmentor.py +60 -2
  12. dnt/engine/__init__.py +8 -0
  13. dnt/engine/bbox_interp.py +83 -0
  14. dnt/engine/bbox_iou.py +20 -0
  15. dnt/engine/cluster.py +31 -0
  16. dnt/engine/iob.py +66 -0
  17. dnt/filter/filter.py +333 -2
  18. dnt/label/labeler.py +4 -4
  19. dnt/label/labeler2.py +605 -0
  20. dnt/shared/__init__.py +2 -1
  21. dnt/shared/data/coco.names +0 -0
  22. dnt/shared/data/openimages.names +0 -0
  23. dnt/shared/data/voc.names +0 -0
  24. dnt/shared/download.py +12 -0
  25. dnt/shared/synhcro.py +150 -0
  26. dnt/shared/util.py +17 -4
  27. dnt/third_party/fast-reid/__init__.py +1 -0
  28. dnt/third_party/fast-reid/configs/Base-AGW.yml +19 -0
  29. dnt/third_party/fast-reid/configs/Base-MGN.yml +12 -0
  30. dnt/third_party/fast-reid/configs/Base-SBS.yml +63 -0
  31. dnt/third_party/fast-reid/configs/Base-bagtricks.yml +76 -0
  32. dnt/third_party/fast-reid/configs/DukeMTMC/AGW_R101-ibn.yml +12 -0
  33. dnt/third_party/fast-reid/configs/DukeMTMC/AGW_R50-ibn.yml +11 -0
  34. dnt/third_party/fast-reid/configs/DukeMTMC/AGW_R50.yml +7 -0
  35. dnt/third_party/fast-reid/configs/DukeMTMC/AGW_S50.yml +11 -0
  36. dnt/third_party/fast-reid/configs/DukeMTMC/bagtricks_R101-ibn.yml +12 -0
  37. dnt/third_party/fast-reid/configs/DukeMTMC/bagtricks_R50-ibn.yml +11 -0
  38. dnt/third_party/fast-reid/configs/DukeMTMC/bagtricks_R50.yml +7 -0
  39. dnt/third_party/fast-reid/configs/DukeMTMC/bagtricks_S50.yml +11 -0
  40. dnt/third_party/fast-reid/configs/DukeMTMC/mgn_R50-ibn.yml +11 -0
  41. dnt/third_party/fast-reid/configs/DukeMTMC/sbs_R101-ibn.yml +12 -0
  42. dnt/third_party/fast-reid/configs/DukeMTMC/sbs_R50-ibn.yml +11 -0
  43. dnt/third_party/fast-reid/configs/DukeMTMC/sbs_R50.yml +7 -0
  44. dnt/third_party/fast-reid/configs/DukeMTMC/sbs_S50.yml +11 -0
  45. dnt/third_party/fast-reid/configs/MOT17/AGW_R101-ibn.yml +12 -0
  46. dnt/third_party/fast-reid/configs/MOT17/AGW_R50-ibn.yml +11 -0
  47. dnt/third_party/fast-reid/configs/MOT17/AGW_R50.yml +7 -0
  48. dnt/third_party/fast-reid/configs/MOT17/AGW_S50.yml +11 -0
  49. dnt/third_party/fast-reid/configs/MOT17/bagtricks_R101-ibn.yml +12 -0
  50. dnt/third_party/fast-reid/configs/MOT17/bagtricks_R50-ibn.yml +11 -0
  51. dnt/third_party/fast-reid/configs/MOT17/bagtricks_R50.yml +7 -0
  52. dnt/third_party/fast-reid/configs/MOT17/bagtricks_S50.yml +11 -0
  53. dnt/third_party/fast-reid/configs/MOT17/mgn_R50-ibn.yml +11 -0
  54. dnt/third_party/fast-reid/configs/MOT17/sbs_R101-ibn.yml +12 -0
  55. dnt/third_party/fast-reid/configs/MOT17/sbs_R50-ibn.yml +11 -0
  56. dnt/third_party/fast-reid/configs/MOT17/sbs_R50.yml +7 -0
  57. dnt/third_party/fast-reid/configs/MOT17/sbs_S50.yml +11 -0
  58. dnt/third_party/fast-reid/configs/MOT20/AGW_R101-ibn.yml +12 -0
  59. dnt/third_party/fast-reid/configs/MOT20/AGW_R50-ibn.yml +11 -0
  60. dnt/third_party/fast-reid/configs/MOT20/AGW_R50.yml +7 -0
  61. dnt/third_party/fast-reid/configs/MOT20/AGW_S50.yml +11 -0
  62. dnt/third_party/fast-reid/configs/MOT20/bagtricks_R101-ibn.yml +12 -0
  63. dnt/third_party/fast-reid/configs/MOT20/bagtricks_R50-ibn.yml +11 -0
  64. dnt/third_party/fast-reid/configs/MOT20/bagtricks_R50.yml +7 -0
  65. dnt/third_party/fast-reid/configs/MOT20/bagtricks_S50.yml +11 -0
  66. dnt/third_party/fast-reid/configs/MOT20/mgn_R50-ibn.yml +11 -0
  67. dnt/third_party/fast-reid/configs/MOT20/sbs_R101-ibn.yml +12 -0
  68. dnt/third_party/fast-reid/configs/MOT20/sbs_R50-ibn.yml +11 -0
  69. dnt/third_party/fast-reid/configs/MOT20/sbs_R50.yml +7 -0
  70. dnt/third_party/fast-reid/configs/MOT20/sbs_S50.yml +11 -0
  71. dnt/third_party/fast-reid/configs/MSMT17/AGW_R101-ibn.yml +12 -0
  72. dnt/third_party/fast-reid/configs/MSMT17/AGW_R50-ibn.yml +11 -0
  73. dnt/third_party/fast-reid/configs/MSMT17/AGW_R50.yml +7 -0
  74. dnt/third_party/fast-reid/configs/MSMT17/AGW_S50.yml +11 -0
  75. dnt/third_party/fast-reid/configs/MSMT17/bagtricks_R101-ibn.yml +13 -0
  76. dnt/third_party/fast-reid/configs/MSMT17/bagtricks_R50-ibn.yml +12 -0
  77. dnt/third_party/fast-reid/configs/MSMT17/bagtricks_R50.yml +7 -0
  78. dnt/third_party/fast-reid/configs/MSMT17/bagtricks_S50.yml +12 -0
  79. dnt/third_party/fast-reid/configs/MSMT17/mgn_R50-ibn.yml +11 -0
  80. dnt/third_party/fast-reid/configs/MSMT17/sbs_R101-ibn.yml +12 -0
  81. dnt/third_party/fast-reid/configs/MSMT17/sbs_R50-ibn.yml +11 -0
  82. dnt/third_party/fast-reid/configs/MSMT17/sbs_R50.yml +7 -0
  83. dnt/third_party/fast-reid/configs/MSMT17/sbs_S50.yml +11 -0
  84. dnt/third_party/fast-reid/configs/Market1501/AGW_R101-ibn.yml +12 -0
  85. dnt/third_party/fast-reid/configs/Market1501/AGW_R50-ibn.yml +11 -0
  86. dnt/third_party/fast-reid/configs/Market1501/AGW_R50.yml +7 -0
  87. dnt/third_party/fast-reid/configs/Market1501/AGW_S50.yml +11 -0
  88. dnt/third_party/fast-reid/configs/Market1501/bagtricks_R101-ibn.yml +12 -0
  89. dnt/third_party/fast-reid/configs/Market1501/bagtricks_R50-ibn.yml +11 -0
  90. dnt/third_party/fast-reid/configs/Market1501/bagtricks_R50.yml +7 -0
  91. dnt/third_party/fast-reid/configs/Market1501/bagtricks_S50.yml +11 -0
  92. dnt/third_party/fast-reid/configs/Market1501/bagtricks_vit.yml +88 -0
  93. dnt/third_party/fast-reid/configs/Market1501/mgn_R50-ibn.yml +11 -0
  94. dnt/third_party/fast-reid/configs/Market1501/sbs_R101-ibn.yml +12 -0
  95. dnt/third_party/fast-reid/configs/Market1501/sbs_R50-ibn.yml +11 -0
  96. dnt/third_party/fast-reid/configs/Market1501/sbs_R50.yml +7 -0
  97. dnt/third_party/fast-reid/configs/Market1501/sbs_S50.yml +11 -0
  98. dnt/third_party/fast-reid/configs/VERIWild/bagtricks_R50-ibn.yml +35 -0
  99. dnt/third_party/fast-reid/configs/VeRi/sbs_R50-ibn.yml +35 -0
  100. dnt/third_party/fast-reid/configs/VehicleID/bagtricks_R50-ibn.yml +36 -0
  101. dnt/third_party/fast-reid/configs/__init__.py +0 -0
  102. dnt/third_party/fast-reid/fast_reid_interfece.py +175 -0
  103. dnt/third_party/fast-reid/fastreid/__init__.py +6 -0
  104. dnt/third_party/fast-reid/fastreid/config/__init__.py +15 -0
  105. dnt/third_party/fast-reid/fastreid/config/config.py +319 -0
  106. dnt/third_party/fast-reid/fastreid/config/defaults.py +329 -0
  107. dnt/third_party/fast-reid/fastreid/data/__init__.py +17 -0
  108. dnt/third_party/fast-reid/fastreid/data/build.py +194 -0
  109. dnt/third_party/fast-reid/fastreid/data/common.py +58 -0
  110. dnt/third_party/fast-reid/fastreid/data/data_utils.py +202 -0
  111. dnt/third_party/fast-reid/fastreid/data/datasets/AirportALERT.py +50 -0
  112. dnt/third_party/fast-reid/fastreid/data/datasets/__init__.py +43 -0
  113. dnt/third_party/fast-reid/fastreid/data/datasets/bases.py +183 -0
  114. dnt/third_party/fast-reid/fastreid/data/datasets/caviara.py +44 -0
  115. dnt/third_party/fast-reid/fastreid/data/datasets/cuhk03.py +274 -0
  116. dnt/third_party/fast-reid/fastreid/data/datasets/cuhk_sysu.py +58 -0
  117. dnt/third_party/fast-reid/fastreid/data/datasets/dukemtmcreid.py +70 -0
  118. dnt/third_party/fast-reid/fastreid/data/datasets/grid.py +44 -0
  119. dnt/third_party/fast-reid/fastreid/data/datasets/iLIDS.py +45 -0
  120. dnt/third_party/fast-reid/fastreid/data/datasets/lpw.py +49 -0
  121. dnt/third_party/fast-reid/fastreid/data/datasets/market1501.py +89 -0
  122. dnt/third_party/fast-reid/fastreid/data/datasets/msmt17.py +114 -0
  123. dnt/third_party/fast-reid/fastreid/data/datasets/pes3d.py +44 -0
  124. dnt/third_party/fast-reid/fastreid/data/datasets/pku.py +44 -0
  125. dnt/third_party/fast-reid/fastreid/data/datasets/prai.py +43 -0
  126. dnt/third_party/fast-reid/fastreid/data/datasets/prid.py +41 -0
  127. dnt/third_party/fast-reid/fastreid/data/datasets/saivt.py +47 -0
  128. dnt/third_party/fast-reid/fastreid/data/datasets/sensereid.py +47 -0
  129. dnt/third_party/fast-reid/fastreid/data/datasets/shinpuhkan.py +48 -0
  130. dnt/third_party/fast-reid/fastreid/data/datasets/sysu_mm.py +47 -0
  131. dnt/third_party/fast-reid/fastreid/data/datasets/thermalworld.py +43 -0
  132. dnt/third_party/fast-reid/fastreid/data/datasets/vehicleid.py +126 -0
  133. dnt/third_party/fast-reid/fastreid/data/datasets/veri.py +69 -0
  134. dnt/third_party/fast-reid/fastreid/data/datasets/veriwild.py +140 -0
  135. dnt/third_party/fast-reid/fastreid/data/datasets/viper.py +45 -0
  136. dnt/third_party/fast-reid/fastreid/data/datasets/wildtracker.py +59 -0
  137. dnt/third_party/fast-reid/fastreid/data/samplers/__init__.py +18 -0
  138. dnt/third_party/fast-reid/fastreid/data/samplers/data_sampler.py +85 -0
  139. dnt/third_party/fast-reid/fastreid/data/samplers/imbalance_sampler.py +67 -0
  140. dnt/third_party/fast-reid/fastreid/data/samplers/triplet_sampler.py +260 -0
  141. dnt/third_party/fast-reid/fastreid/data/transforms/__init__.py +11 -0
  142. dnt/third_party/fast-reid/fastreid/data/transforms/autoaugment.py +806 -0
  143. dnt/third_party/fast-reid/fastreid/data/transforms/build.py +100 -0
  144. dnt/third_party/fast-reid/fastreid/data/transforms/functional.py +180 -0
  145. dnt/third_party/fast-reid/fastreid/data/transforms/transforms.py +161 -0
  146. dnt/third_party/fast-reid/fastreid/engine/__init__.py +15 -0
  147. dnt/third_party/fast-reid/fastreid/engine/defaults.py +490 -0
  148. dnt/third_party/fast-reid/fastreid/engine/hooks.py +534 -0
  149. dnt/third_party/fast-reid/fastreid/engine/launch.py +103 -0
  150. dnt/third_party/fast-reid/fastreid/engine/train_loop.py +357 -0
  151. dnt/third_party/fast-reid/fastreid/evaluation/__init__.py +6 -0
  152. dnt/third_party/fast-reid/fastreid/evaluation/clas_evaluator.py +81 -0
  153. dnt/third_party/fast-reid/fastreid/evaluation/evaluator.py +176 -0
  154. dnt/third_party/fast-reid/fastreid/evaluation/query_expansion.py +46 -0
  155. dnt/third_party/fast-reid/fastreid/evaluation/rank.py +200 -0
  156. dnt/third_party/fast-reid/fastreid/evaluation/rank_cylib/__init__.py +20 -0
  157. dnt/third_party/fast-reid/fastreid/evaluation/rank_cylib/setup.py +32 -0
  158. dnt/third_party/fast-reid/fastreid/evaluation/rank_cylib/test_cython.py +106 -0
  159. dnt/third_party/fast-reid/fastreid/evaluation/reid_evaluation.py +143 -0
  160. dnt/third_party/fast-reid/fastreid/evaluation/rerank.py +73 -0
  161. dnt/third_party/fast-reid/fastreid/evaluation/roc.py +90 -0
  162. dnt/third_party/fast-reid/fastreid/evaluation/testing.py +88 -0
  163. dnt/third_party/fast-reid/fastreid/layers/__init__.py +19 -0
  164. dnt/third_party/fast-reid/fastreid/layers/activation.py +59 -0
  165. dnt/third_party/fast-reid/fastreid/layers/any_softmax.py +80 -0
  166. dnt/third_party/fast-reid/fastreid/layers/batch_norm.py +205 -0
  167. dnt/third_party/fast-reid/fastreid/layers/context_block.py +113 -0
  168. dnt/third_party/fast-reid/fastreid/layers/drop.py +161 -0
  169. dnt/third_party/fast-reid/fastreid/layers/frn.py +199 -0
  170. dnt/third_party/fast-reid/fastreid/layers/gather_layer.py +30 -0
  171. dnt/third_party/fast-reid/fastreid/layers/helpers.py +31 -0
  172. dnt/third_party/fast-reid/fastreid/layers/non_local.py +54 -0
  173. dnt/third_party/fast-reid/fastreid/layers/pooling.py +124 -0
  174. dnt/third_party/fast-reid/fastreid/layers/se_layer.py +25 -0
  175. dnt/third_party/fast-reid/fastreid/layers/splat.py +109 -0
  176. dnt/third_party/fast-reid/fastreid/layers/weight_init.py +122 -0
  177. dnt/third_party/fast-reid/fastreid/modeling/__init__.py +23 -0
  178. dnt/third_party/fast-reid/fastreid/modeling/backbones/__init__.py +18 -0
  179. dnt/third_party/fast-reid/fastreid/modeling/backbones/build.py +27 -0
  180. dnt/third_party/fast-reid/fastreid/modeling/backbones/mobilenet.py +195 -0
  181. dnt/third_party/fast-reid/fastreid/modeling/backbones/mobilenetv3.py +283 -0
  182. dnt/third_party/fast-reid/fastreid/modeling/backbones/osnet.py +525 -0
  183. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/__init__.py +4 -0
  184. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/config.py +396 -0
  185. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/effnet/EN-B0_dds_8gpu.yaml +27 -0
  186. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/effnet/EN-B1_dds_8gpu.yaml +27 -0
  187. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/effnet/EN-B2_dds_8gpu.yaml +27 -0
  188. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/effnet/EN-B3_dds_8gpu.yaml +27 -0
  189. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/effnet/EN-B4_dds_8gpu.yaml +27 -0
  190. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/effnet/EN-B5_dds_8gpu.yaml +27 -0
  191. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/effnet.py +281 -0
  192. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnet.py +596 -0
  193. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-1.6GF_dds_8gpu.yaml +26 -0
  194. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-12GF_dds_8gpu.yaml +26 -0
  195. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-16GF_dds_8gpu.yaml +26 -0
  196. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-200MF_dds_8gpu.yaml +26 -0
  197. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-3.2GF_dds_8gpu.yaml +26 -0
  198. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-32GF_dds_8gpu.yaml +26 -0
  199. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-4.0GF_dds_8gpu.yaml +26 -0
  200. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-400MF_dds_8gpu.yaml +26 -0
  201. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-6.4GF_dds_8gpu.yaml +26 -0
  202. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-600MF_dds_8gpu.yaml +26 -0
  203. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-8.0GF_dds_8gpu.yaml +26 -0
  204. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnetx/RegNetX-800MF_dds_8gpu.yaml +26 -0
  205. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-1.6GF_dds_8gpu.yaml +27 -0
  206. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-12GF_dds_8gpu.yaml +27 -0
  207. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-16GF_dds_8gpu.yaml +27 -0
  208. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-200MF_dds_8gpu.yaml +26 -0
  209. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-3.2GF_dds_8gpu.yaml +27 -0
  210. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-32GF_dds_8gpu.yaml +27 -0
  211. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-4.0GF_dds_8gpu.yaml +27 -0
  212. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-400MF_dds_8gpu.yaml +27 -0
  213. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-6.4GF_dds_8gpu.yaml +27 -0
  214. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-600MF_dds_8gpu.yaml +27 -0
  215. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-8.0GF_dds_8gpu.yaml +27 -0
  216. dnt/third_party/fast-reid/fastreid/modeling/backbones/regnet/regnety/RegNetY-800MF_dds_8gpu.yaml +27 -0
  217. dnt/third_party/fast-reid/fastreid/modeling/backbones/repvgg.py +309 -0
  218. dnt/third_party/fast-reid/fastreid/modeling/backbones/resnest.py +365 -0
  219. dnt/third_party/fast-reid/fastreid/modeling/backbones/resnet.py +364 -0
  220. dnt/third_party/fast-reid/fastreid/modeling/backbones/resnext.py +335 -0
  221. dnt/third_party/fast-reid/fastreid/modeling/backbones/shufflenet.py +203 -0
  222. dnt/third_party/fast-reid/fastreid/modeling/backbones/vision_transformer.py +399 -0
  223. dnt/third_party/fast-reid/fastreid/modeling/heads/__init__.py +11 -0
  224. dnt/third_party/fast-reid/fastreid/modeling/heads/build.py +25 -0
  225. dnt/third_party/fast-reid/fastreid/modeling/heads/clas_head.py +36 -0
  226. dnt/third_party/fast-reid/fastreid/modeling/heads/embedding_head.py +151 -0
  227. dnt/third_party/fast-reid/fastreid/modeling/losses/__init__.py +12 -0
  228. dnt/third_party/fast-reid/fastreid/modeling/losses/circle_loss.py +71 -0
  229. dnt/third_party/fast-reid/fastreid/modeling/losses/cross_entroy_loss.py +54 -0
  230. dnt/third_party/fast-reid/fastreid/modeling/losses/focal_loss.py +92 -0
  231. dnt/third_party/fast-reid/fastreid/modeling/losses/triplet_loss.py +113 -0
  232. dnt/third_party/fast-reid/fastreid/modeling/losses/utils.py +48 -0
  233. dnt/third_party/fast-reid/fastreid/modeling/meta_arch/__init__.py +14 -0
  234. dnt/third_party/fast-reid/fastreid/modeling/meta_arch/baseline.py +188 -0
  235. dnt/third_party/fast-reid/fastreid/modeling/meta_arch/build.py +26 -0
  236. dnt/third_party/fast-reid/fastreid/modeling/meta_arch/distiller.py +140 -0
  237. dnt/third_party/fast-reid/fastreid/modeling/meta_arch/mgn.py +394 -0
  238. dnt/third_party/fast-reid/fastreid/modeling/meta_arch/moco.py +126 -0
  239. dnt/third_party/fast-reid/fastreid/solver/__init__.py +8 -0
  240. dnt/third_party/fast-reid/fastreid/solver/build.py +348 -0
  241. dnt/third_party/fast-reid/fastreid/solver/lr_scheduler.py +66 -0
  242. dnt/third_party/fast-reid/fastreid/solver/optim/__init__.py +10 -0
  243. dnt/third_party/fast-reid/fastreid/solver/optim/lamb.py +123 -0
  244. dnt/third_party/fast-reid/fastreid/solver/optim/radam.py +149 -0
  245. dnt/third_party/fast-reid/fastreid/solver/optim/swa.py +246 -0
  246. dnt/third_party/fast-reid/fastreid/utils/__init__.py +6 -0
  247. dnt/third_party/fast-reid/fastreid/utils/checkpoint.py +503 -0
  248. dnt/third_party/fast-reid/fastreid/utils/collect_env.py +158 -0
  249. dnt/third_party/fast-reid/fastreid/utils/comm.py +255 -0
  250. dnt/third_party/fast-reid/fastreid/utils/compute_dist.py +200 -0
  251. dnt/third_party/fast-reid/fastreid/utils/env.py +119 -0
  252. dnt/third_party/fast-reid/fastreid/utils/events.py +461 -0
  253. dnt/third_party/fast-reid/fastreid/utils/faiss_utils.py +127 -0
  254. dnt/third_party/fast-reid/fastreid/utils/file_io.py +520 -0
  255. dnt/third_party/fast-reid/fastreid/utils/history_buffer.py +71 -0
  256. dnt/third_party/fast-reid/fastreid/utils/logger.py +211 -0
  257. dnt/third_party/fast-reid/fastreid/utils/params.py +103 -0
  258. dnt/third_party/fast-reid/fastreid/utils/precision_bn.py +94 -0
  259. dnt/third_party/fast-reid/fastreid/utils/registry.py +66 -0
  260. dnt/third_party/fast-reid/fastreid/utils/summary.py +120 -0
  261. dnt/third_party/fast-reid/fastreid/utils/timer.py +68 -0
  262. dnt/third_party/fast-reid/fastreid/utils/visualizer.py +278 -0
  263. dnt/track/__init__.py +2 -0
  264. dnt/track/botsort/__init__.py +4 -0
  265. dnt/track/botsort/bot_tracker/__init__.py +3 -0
  266. dnt/track/botsort/bot_tracker/basetrack.py +60 -0
  267. dnt/track/botsort/bot_tracker/bot_sort.py +473 -0
  268. dnt/track/botsort/bot_tracker/gmc.py +316 -0
  269. dnt/track/botsort/bot_tracker/kalman_filter.py +269 -0
  270. dnt/track/botsort/bot_tracker/matching.py +194 -0
  271. dnt/track/botsort/bot_tracker/mc_bot_sort.py +505 -0
  272. dnt/track/{dsort/utils → botsort/bot_tracker/tracking_utils}/evaluation.py +14 -4
  273. dnt/track/{dsort/utils → botsort/bot_tracker/tracking_utils}/io.py +19 -36
  274. dnt/track/botsort/bot_tracker/tracking_utils/timer.py +37 -0
  275. dnt/track/botsort/inference.py +96 -0
  276. dnt/track/config.py +120 -0
  277. dnt/track/dsort/configs/bagtricks_R50.yml +7 -0
  278. dnt/track/dsort/configs/deep_sort.yaml +0 -0
  279. dnt/track/dsort/configs/fastreid.yaml +1 -1
  280. dnt/track/dsort/deep_sort/deep/checkpoint/ckpt.t7 +0 -0
  281. dnt/track/dsort/deep_sort/deep/feature_extractor.py +87 -8
  282. dnt/track/dsort/deep_sort/deep_sort.py +31 -20
  283. dnt/track/dsort/deep_sort/sort/detection.py +2 -1
  284. dnt/track/dsort/deep_sort/sort/iou_matching.py +0 -2
  285. dnt/track/dsort/deep_sort/sort/linear_assignment.py +0 -3
  286. dnt/track/dsort/deep_sort/sort/nn_matching.py +5 -5
  287. dnt/track/dsort/deep_sort/sort/preprocessing.py +1 -2
  288. dnt/track/dsort/deep_sort/sort/track.py +2 -1
  289. dnt/track/dsort/deep_sort/sort/tracker.py +1 -1
  290. dnt/track/dsort/dsort.py +43 -33
  291. dnt/track/re_class.py +117 -0
  292. dnt/track/sort/sort.py +9 -6
  293. dnt/track/tracker.py +213 -32
  294. {dnt-0.2.4.dist-info → dnt-0.3.1.7.dist-info}/METADATA +41 -13
  295. dnt-0.3.1.7.dist-info/RECORD +315 -0
  296. {dnt-0.2.4.dist-info → dnt-0.3.1.7.dist-info}/WHEEL +1 -1
  297. dnt/analysis/yield.py +0 -9
  298. dnt/track/dsort/deep_sort/deep/evaluate.py +0 -15
  299. dnt/track/dsort/deep_sort/deep/original_model.py +0 -106
  300. dnt/track/dsort/deep_sort/deep/test.py +0 -77
  301. dnt/track/dsort/deep_sort/deep/train.py +0 -189
  302. dnt/track/dsort/utils/asserts.py +0 -13
  303. dnt/track/dsort/utils/draw.py +0 -36
  304. dnt/track/dsort/utils/json_logger.py +0 -383
  305. dnt/track/dsort/utils/log.py +0 -17
  306. dnt/track/dsort/utils/parser.py +0 -35
  307. dnt/track/dsort/utils/tools.py +0 -39
  308. dnt-0.2.4.dist-info/RECORD +0 -64
  309. /dnt/{track/dsort/utils → third_party/fast-reid/checkpoint}/__init__.py +0 -0
  310. {dnt-0.2.4.dist-info → dnt-0.3.1.7.dist-info/licenses}/LICENSE +0 -0
  311. {dnt-0.2.4.dist-info → dnt-0.3.1.7.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,518 @@
1
+ """
2
+ This module is used to analyze the interaction between two tracks.
3
+ Author: Zhenyu Wang
4
+ Date: 2023/10/20
5
+ Email: wonstran@hotmail.com
6
+ Updates:
7
+ 2025/03/19: Add the function of nearmiss based on PET
8
+ 2023/10/20: Initial version
9
+ """
10
+ from shapely.geometry import Point, Polygon, LineString, box
11
+ from shapely import intersection, distance, intersects
12
+ from shapelysmooth import taubin_smooth, chaikin_smooth, catmull_rom_smooth
13
+ import geopandas as gpd, pandas as pd
14
+ from tqdm import tqdm
15
+ import numpy as np
16
+ from dnt.label.labeler2 import Labeler
17
+ import os
18
+
19
+ class YieldAnalyzer:
20
+ def __init__(self,
21
+ waiting_dist_p:int=600,
22
+ waiting_dist_y:int=300,
23
+ leading_p:bool=False,
24
+ leading_axis_p:str='y',
25
+ leading_y:bool=True,
26
+ leading_axis_y:str='x',
27
+ yield_gap:int=10,
28
+ fps:int=30,
29
+ ref_point='bc',
30
+ ref_offset:tuple=(0,0),
31
+ filter_buffer:int=0,
32
+ p_zone:Polygon=None,
33
+ y_zone:Polygon=None) -> None:
34
+ '''
35
+ Parameters:
36
+ threshold: the hyperparameter to determine if a yield event (frame difference <=yield_gap*fps), default is 3 seconds
37
+ fps: frames per sencond, default is 30
38
+ ref_point: the reference point for lane recognition
39
+ br (buttom-right, default), bl (bottom-left), bc (bottom-center)
40
+ tl (top-left), tr (top-right), tc (top-center)
41
+ cc (center-center), cl (center-left), cr (center-right)
42
+ ref_offset: the offset (x, y) for reference point, default is (0, 0)
43
+ filter_buffer: the buffer between two track frames, default is 0 means tracks will be paired only if two tracks are overlapped in time
44
+ '''
45
+ self.waiting_dist_p = waiting_dist_p
46
+ self.waiting_dist_y = waiting_dist_y
47
+ self.leading_p = leading_p
48
+ self.leading_axis_p = leading_axis_p
49
+ self.leading_y = leading_y
50
+ self.leading_axis_y = leading_axis_y
51
+ self.yield_gap = yield_gap
52
+ self.fps = fps
53
+ self.ref_point = ref_point
54
+ self.ref_offset = ref_offset
55
+ self.filter_buffer = filter_buffer
56
+ self.p_zone = p_zone
57
+ self.y_zone = y_zone
58
+
59
+ def analyze(self, tracks_p:pd.DataFrame, tracks_y:pd.DataFrame, name_p:str='', name_y:str=''):
60
+ '''
61
+ Parameters:
62
+ tracks_p: tracks with priority
63
+ tracks_y: tracks should yield to tracks_p
64
+ '''
65
+ tracks_p = YieldAnalyzer.add_field_names(tracks_p)
66
+ tracks_y = YieldAnalyzer.add_field_names(tracks_y)
67
+
68
+ tracks_p = self.gen_ref(tracks_p, info=name_p)
69
+ tracks_y = self.gen_ref(tracks_y, info=name_y)
70
+
71
+ trajectories_p = self.gen_trajectory(tracks_p, info=name_p)
72
+ trajectories_y = self.gen_trajectory(tracks_y, info=name_y)
73
+
74
+ intersect_pairs = self.scan_intersections(trajectories_p, trajectories_y)
75
+ if (self.p_zone is not None) and (self.y_zone is not None):
76
+ intersect_pairs = self.scan_yield_events_byzone(intersect_pairs, tracks_p, tracks_y)
77
+ else:
78
+ intersect_pairs = self.scan_yield_events(intersect_pairs, tracks_p, tracks_y)
79
+
80
+ return intersect_pairs
81
+
82
+ def gen_ref(self, tracks:pd.DataFrame, info:str='', video_index:int=None, video_tot:int=None)->pd.DataFrame:
83
+ if video_index and video_tot:
84
+ tqdm.pandas(desc='Generating ref {}, {} of {}'.format(info, video_index, video_tot), unit='frames')
85
+ else:
86
+ tqdm.pandas(desc='Generating ref {}'.format(info), unit='frames')
87
+
88
+ if self.ref_point == 'cc':
89
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + track['w']//2 + self.ref_offset[0],
90
+ track['y'] + track['h']//2 + self.ref_offset[1]]), axis=1)
91
+ elif self.ref_point == 'tc':
92
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + track['w']//2 + self.ref_offset[0],
93
+ track['y'] + self.ref_offset[1]]), axis=1)
94
+ elif self.ref_point == 'bc':
95
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + track['w']//2 + self.ref_offset[0],
96
+ track['y'] + track['h'] + self.ref_offset[1]]), axis=1)
97
+ elif self.ref_point == 'cl':
98
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + self.ref_offset[0],
99
+ track['y'] + track['h']//2 + self.ref_offset[1]]), axis=1)
100
+ elif self.ref_point == 'cr':
101
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + track['w'] + self.ref_offset[0],
102
+ track['y'] + track['h']//2 + self.ref_offset[1]]), axis=1)
103
+ elif self.ref_point == 'tl':
104
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + self.ref_offset[0],
105
+ track['y'] + self.ref_offset[1]]), axis=1)
106
+ elif self.ref_point == 'tr':
107
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + track['w'] + self.ref_offset[0],
108
+ track['y'] + self.ref_offset[1]]), axis=1)
109
+ elif self.ref_point == 'bl':
110
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + self.ref_offset[0],
111
+ track['y'] + tracks['h'] + self.ref_offset[1]]), axis=1)
112
+ elif self.ref_point == 'br':
113
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + track['w'] + self.ref_offset[0],
114
+ track['y'] + track['h'] + self.ref_offset[1]]), axis=1)
115
+ else:
116
+ tracks[['ref_x', 'ref_y']] = tracks.progress_apply(lambda track: pd.Series([track['x'] + track['w']//2 + self.ref_offset[0],
117
+ track['y'] + track['h'] + self.ref_offset[1]]), axis=1)
118
+
119
+ return tracks
120
+
121
+ def gen_trajectory(self, tracks:pd.DataFrame, info:str='', video_index:int=None, video_tot:int=None)->gpd.GeoDataFrame:
122
+
123
+ ids = tracks['track'].unique()
124
+ results = []
125
+ lines = []
126
+ pbar = tqdm(total=len(ids), unit='track')
127
+ if video_index and video_tot:
128
+ pbar.desc = 'Generating trajectory {}, {} of {}'.format(info, video_index, video_tot)
129
+ else:
130
+ pbar.desc = 'Generating trajectory {}'.format(info)
131
+
132
+ for id in ids:
133
+ frames = tracks[tracks['track']==id].sort_values(by=['frame'])
134
+ line = LineString(list(zip(frames['ref_x'].values.tolist(), frames['ref_y'].values.tolist())))
135
+ results.append([id, frames['frame'].values, frames['ref_x'].values, frames['ref_y'].values])
136
+ lines.append(line)
137
+ pbar.update()
138
+ pbar.close()
139
+
140
+ df = pd.DataFrame(results, columns=['track', 'frames', 'ref_x', 'ref_y'])
141
+ return gpd.GeoDataFrame(df, geometry=lines)
142
+
143
+ def scan_intersections(self, trajectories_p:gpd.GeoDataFrame, trajectories_y:gpd.GeoDataFrame,
144
+ video_index:int=None, video_tot:int=None):
145
+
146
+ results = []
147
+ points = []
148
+ buffer = self.filter_buffer*self.fps
149
+
150
+ pbar = tqdm(total=len(trajectories_p)*len(trajectories_y), unit=' pair')
151
+ if video_index and video_tot:
152
+ pbar.desc = 'Scan intesections {} of {}'.format(video_index, video_tot)
153
+ else:
154
+ pbar.desc = 'Scan intesections'
155
+ for index1, trj_p in trajectories_p.iterrows():
156
+ for index2, trj_y in trajectories_y.iterrows():
157
+ '''
158
+ if (trj_p['track'] == 511) and (trj_y['track'] == 132590):
159
+ print(trj_p['frames'].min(), trj_p['frames'].max())
160
+ print(trj_y['frames'].min(), trj_y['frames'].max())
161
+ input('...')
162
+ '''
163
+
164
+ if ((trj_p['frames'].min() > (trj_y['frames'].max() + buffer)) or
165
+ (trj_y['frames'].min() > (trj_p['frames'].max() + buffer))):
166
+ pass
167
+ else:
168
+ geo_intersect = intersection(trj_p.geometry, trj_y.geometry)
169
+ if not geo_intersect.is_empty:
170
+ point = self.__recursion(geo_intersect)
171
+ point_xy = np.array([point.x, point.y])
172
+ '''
173
+ if (trj_p['track'] == 2414) & (trj_y['track'] == 386456):
174
+ plt.gca().invert_yaxis()
175
+ plt.plot(*trj_p.geometry.xy, color='red')
176
+ plt.plot(*trj_y.geometry.xy, color='green')
177
+ plt.scatter(*point.xy)
178
+ plt.savefig('/mnt/d/a.jpg')
179
+
180
+ import cv2
181
+ img = cv2.imread('/mnt/d/b.png')
182
+ for x, y in list(zip(trj_p['ref_x'], trj_p['ref_y'])):
183
+ img = cv2.circle(img, (x, y), 1, (0, 0, 255))
184
+ for x, y in list(zip(trj_y['ref_x'], trj_y['ref_y'])):
185
+ img = cv2.circle(img, (x, y), 1, (0, 255, 0))
186
+ img = cv2.circle(img, (int(point.x), int(point.y)), 5, (255, 255, 255), thickness=-1)
187
+ print(int(point.x), int(point.y))
188
+ cv2.imwrite('/mnt/d/c.jpg', img)
189
+ input('...')
190
+ '''
191
+ ref_pxy = np.array(list(zip(trj_p['ref_x'], trj_p['ref_y'])))
192
+ index_p = self.__get_closest_index(ref_pxy, point_xy)
193
+ frame_p = trj_p['frames'][index_p]
194
+
195
+ ref_yxy = np.array(list(zip(trj_y['ref_x'], trj_y['ref_y'])))
196
+ index_y = self.__get_closest_index(ref_yxy, point_xy)
197
+ frame_y = trj_y['frames'][index_y]
198
+
199
+ results.append([trj_p['track'], frame_p, trj_y['track'], frame_y, frame_y-frame_p])
200
+ points.append(point)
201
+ pbar.update()
202
+
203
+ pbar.close()
204
+
205
+ df = pd.DataFrame(results, columns=['track_p', 'frame_p', 'track_y', 'frame_y', 'frame_gap'])
206
+ return gpd.GeoDataFrame(df, geometry=points)
207
+
208
+ def scan_yield_events(self, pairs:gpd.GeoDataFrame, tracks_p:gpd.GeoDataFrame, tracks_y:gpd.GeoDataFrame,
209
+ video_index:int=None, video_tot:int=None)->pd.DataFrame:
210
+
211
+ pbar = tqdm(total=len(pairs), unit=' pair')
212
+ if video_index and video_tot:
213
+ pbar.desc = 'Scan events {} of {}'.format(video_index, video_tot)
214
+ else:
215
+ pbar.desc = 'Scan events'
216
+ for index, pair in pairs.iterrows():
217
+
218
+ if pair['frame_p'] < pair['frame_y']:
219
+
220
+ selected = tracks_y[(tracks_y['track']==pair['track_y']) & (tracks_y['frame']<=pair['frame_y'])].copy() # find the frames for track_y before reaching conflict point
221
+ selected['dif'] = selected['frame'].apply(lambda f: abs(f - pair['frame_p'])) # calculate the frame difference between each before frame and the conflict frame
222
+ selected = selected[selected['dif']<=self.yield_gap] # the frame difference should <= self.yield_gap
223
+ closest = selected[selected['dif']==selected['dif'].min()] # find the closest frame
224
+ if len(closest)>0:
225
+ closest_point = Point(closest['x'].iloc[0]+closest['w'].iloc[0]/2,
226
+ closest['y'].iloc[0]+closest['h'].iloc[0]) # find the cloest point
227
+ dist = distance(closest_point, pair.geometry) # calculate the distance
228
+ pairs.at[index, 'dist_y'] = dist
229
+ inwaiting = 1 if dist<=self.waiting_dist_y else 0
230
+
231
+ if self.leading_y:
232
+ isleading = 1 if self.__is_leading(pair['track_y'], closest['frame'].iloc[0], closest['x'].iloc[0],
233
+ closest['y'].iloc[0], pair.geometry.x, pair.geometry.y, tracks_y, self.leading_axis_y) else 0
234
+ else:
235
+ isleading = 1
236
+
237
+ if (inwaiting == 1) and (isleading == 1):
238
+ pairs.at[index, 'event'] = 'yield'
239
+
240
+ pairs.at[index, 'closest_frame'] = closest['frame'].iloc[0]
241
+
242
+ elif pair['frame_p'] >= pair['frame_y']:
243
+ selected = tracks_p[(tracks_p['track']==pair['track_p']) & (tracks_p['frame']<=pair['frame_p'])].copy()
244
+ selected['dif'] = selected['frame'].apply(lambda f: abs(f - pair['frame_y']))
245
+ selected = selected[selected['dif']<=self.yield_gap]
246
+ closest = selected[selected['dif']==selected['dif'].min()]
247
+ if len(closest)>0:
248
+ closest_point = Point(closest['x'].iloc[0]+closest['w'].iloc[0]/2,
249
+ closest['y'].iloc[0]+closest['h'].iloc[0])
250
+ dist = distance(closest_point, pair.geometry)
251
+ inwaiting = 1 if dist<=self.waiting_dist_p else 0
252
+ pairs.at[index, 'dist_p'] = dist
253
+ if self.leading_p:
254
+ isleading = 1 if self.__is_leading(pair['track_p'], closest['frame'].iloc[0], closest['x'].iloc[0],
255
+ closest['y'].iloc[0], pair.geometry.x, pair.geometry.y, tracks_p, self.leading_axis_p) else 0
256
+ else:
257
+ isleading = 1
258
+
259
+ if (inwaiting == 1) and (isleading == 1):
260
+ pairs.at[index, 'event'] = 'not_yield'
261
+
262
+ pairs.at[index, 'closest_frame'] = closest['frame'].iloc[0]
263
+
264
+ pbar.update()
265
+
266
+ pbar.close()
267
+
268
+ return self.__export(pairs)
269
+
270
+ def scan_yield_events_byzone(self, pairs:gpd.GeoDataFrame, tracks_p:gpd.GeoDataFrame, tracks_y:gpd.GeoDataFrame,
271
+ video_index:int=None, video_tot:int=None)->pd.DataFrame:
272
+
273
+ pbar = tqdm(total=len(pairs), unit=' pair')
274
+ if video_index and video_tot:
275
+ pbar.desc = 'Scan events {} of {}'.format(video_index, video_tot)
276
+ else:
277
+ pbar.desc = 'Scan events'
278
+ for index, pair in pairs.iterrows():
279
+
280
+ if pair['frame_p'] < pair['frame_y']:
281
+
282
+ selected = tracks_y[(tracks_y['track']==pair['track_y']) & (tracks_y['frame']<=pair['frame_y'])].copy() # find the frames for track_y before reaching conflict point
283
+ selected['dif'] = selected['frame'].apply(lambda f: abs(f - pair['frame_p'])) # calculate the frame difference between each before frame and the conflict frame
284
+ selected = selected[selected['dif']<=self.yield_gap] # the frame difference should <= self.yield_gap
285
+ closest = selected[selected['dif']==selected['dif'].min()] # find the closest frame
286
+ if len(closest)>0:
287
+ x, y, w, h = closest['x'].iloc[0], closest['y'].iloc[0], closest['w'].iloc[0], closest['h'].iloc[0]
288
+ closest_bbox = Polygon([(x, y), (x + w, y), (x + w, y + h), (x, y + h)])
289
+
290
+ inwaiting = 1 if intersects(closest_bbox, self.y_zone) else 0
291
+ pairs.at[index, 'dist_y'] = -1
292
+ if self.leading_y:
293
+ isleading = 1 if self.__is_leading(pair['track_y'], closest['frame'].iloc[0], closest['x'].iloc[0],
294
+ closest['y'].iloc[0], pair.geometry.x, pair.geometry.y, tracks_y, self.leading_axis_y) else 0
295
+ else:
296
+ isleading = 1
297
+
298
+ if (inwaiting == 1) and (isleading == 1):
299
+ pairs.at[index, 'event'] = 'yield'
300
+
301
+ pairs.at[index, 'closest_frame'] = closest['frame'].iloc[0]
302
+
303
+ elif pair['frame_p'] >= pair['frame_y']:
304
+ selected = tracks_p[(tracks_p['track']==pair['track_p']) & (tracks_p['frame']<=pair['frame_p'])].copy()
305
+ selected['dif'] = selected['frame'].apply(lambda f: abs(f - pair['frame_y']))
306
+ selected = selected[selected['dif']<=self.yield_gap]
307
+ closest = selected[selected['dif']==selected['dif'].min()]
308
+ if len(closest)>0:
309
+ x, y, w, h = closest['x'].iloc[0], closest['y'].iloc[0], closest['w'].iloc[0], closest['h'].iloc[0]
310
+ closest_bbox = Polygon([(x, y), (x + w, y), (x + w, y + h), (x, y + h)])
311
+
312
+ inwaiting = 1 if intersects(closest_bbox, self.p_zone) else 0
313
+ pairs.at[index, 'dist_p'] = -1
314
+ if self.leading_p:
315
+ isleading = 1 if self.__is_leading(pair['track_p'], closest['frame'].iloc[0], closest['x'].iloc[0],
316
+ closest['y'].iloc[0], pair.geometry.x, pair.geometry.y, tracks_p, self.leading_axis_p) else 0
317
+ else:
318
+ isleading = 1
319
+
320
+ if (inwaiting == 1) and (isleading == 1):
321
+ pairs.at[index, 'event'] = 'not_yield'
322
+
323
+ pairs.at[index, 'closest_frame'] = closest['frame'].iloc[0]
324
+
325
+ pbar.update()
326
+
327
+ pbar.close()
328
+
329
+ return self.__export(pairs)
330
+
331
+
332
+ def __export(self, pairs:gpd.GeoDataFrame):
333
+ pairs['int_x'] = pairs.geometry.x
334
+ pairs['int_y'] = pairs.geometry.y
335
+ return pd.DataFrame(pairs.drop(columns=['geometry']))
336
+
337
+ def __recursion(self, intersect):
338
+ if intersect.geom_type == 'Point':
339
+ return Point(intersect.coords[0])
340
+
341
+ elif intersect.geom_type == 'MultiPoint':
342
+ return Point(intersect.geoms[0].x, intersect.geoms[0].y)
343
+
344
+ elif intersect.geom_type == 'LineString':
345
+ return Point(intersect.coords[0])
346
+
347
+ elif intersect.geom_type == 'MultiLineString':
348
+ return Point(intersect.geoms[0].coords[0])
349
+
350
+ else:
351
+ for geom in intersect.geoms:
352
+ return self.__recursion(geom)
353
+
354
+ def __get_closest_index(self, ref:np.array, point:np.array) -> int:
355
+ return np.argmin(np.sqrt(np.sum(np.square(ref - point), axis=1)))
356
+
357
+ def __is_leading(self, track_id:int, frame_close:int, close_x:int, close_y:int, int_x:int, int_y:int,
358
+ tracks:gpd.GeoDataFrame, leading_axis:str):
359
+
360
+ min_x = min(close_x, int_x)
361
+ max_x = max(close_x, int_x)
362
+ min_y = min(close_y, int_y)
363
+ max_y = max(close_y, int_y)
364
+ if leading_axis == 'x':
365
+ leadings = tracks[(tracks['track']!=track_id) & (tracks['frame']==frame_close) &
366
+ (tracks['ref_x']>=min_x) & (tracks['ref_x']<=max_x)]
367
+ elif leading_axis == 'y':
368
+ leadings = tracks[(tracks['track']!=track_id) & (tracks['frame']==frame_close) &
369
+ (tracks['ref_y']>=min_y) & (tracks['ref_y']<=max_y)]
370
+ elif leading_axis == 'xy':
371
+ leadings = tracks[(tracks['track']!=track_id) & (tracks['frame']==frame_close) &
372
+ (tracks['ref_x']>=min_x) & (tracks['ref_x']<=max_x) &
373
+ (tracks['ref_y']>=min_y) & (tracks['ref_y']<=max_y)]
374
+
375
+ if len(leadings) > 0:
376
+ return False
377
+ else:
378
+ return True
379
+
380
+ def __get_waiting_trj_y(self, track_id:int, frame_id_p:int, frame_id_y:int, intersect_point:Point, trajectories:gpd.GeoDataFrame) -> any:
381
+
382
+ result = -1
383
+ if frame_id_p < frame_id_y:
384
+ selected = trajectories[trajectories['track']==track_id]
385
+ df = pd.DataFrame(np.vstack((selected['frames'].tolist(), selected['ref_x'].tolist(), selected['ref_y'].tolist())).T,
386
+ columns=['frame', 'x', 'y'])
387
+ df = df.loc[df['frame']<=frame_id_y]
388
+ df['dif'] = df['frame'].apply(lambda f: abs((f - frame_id_p)))
389
+ closest = df[df['dif']==df['dif'].min()]
390
+ closest_point = Point(closest['x'].ioc[0], closest['y'].ioc[0])
391
+ dist = distance(closest, intersect_point)
392
+
393
+ return result
394
+
395
+ @staticmethod
396
+ def add_field_names(tracks: pd.DataFrame)->pd.DataFrame:
397
+ if len(tracks.columns)==10:
398
+ tracks.columns = ['frame', 'track', 'x', 'y', 'w', 'h', 'score', 'cls', 'r3','r4']
399
+ tracks['ref_x'] = -1
400
+ tracks['ref_y'] = -1
401
+ elif len(tracks.columns) == 12:
402
+ tracks.columns = ['frame', 'track', 'x', 'y', 'w', 'h', 'score', 'cls', 'r3','r4',
403
+ 'ref_x', 'ref_y']
404
+ else:
405
+ raise Exception('The number of fields is invalid.')
406
+ return tracks
407
+
408
+ @staticmethod
409
+ def draw_event_clips(yields:pd.DataFrame, tracks_p:pd.DataFrame, tracks_y:pd.DataFrame, input_video:str, out_path:str,
410
+ method:str='all', random_number:int=10, event_list:list=None, size:int=1, thick:int=2, padding:int=0,
411
+ show_track:bool=False, show_desc:bool=False, verbose:bool=True,
412
+ video_index:int=None, video_tot:int=None):
413
+ '''
414
+ Parameters:
415
+ - yields: the dataframe of stop events
416
+ - tracks_p: the dataframe of tracks with priority
417
+ - tracks_y: the dataframe of tracks should yield
418
+ - input_video: the raw video file, if None, generate the label files only
419
+ - out_path: the folder for outputing track clips
420
+ - method: 'all' (default) - all tracks, 'specify' - specify events,
421
+ 'yield' - yield events, 'not_yield' - non-yield events, 'none' - non interaction events
422
+ - random_number: the number of track ids if method == 'random'
423
+ - event_list: the list of events [(track_p_id, track_y_id)] if method == 'specify'
424
+ - size: font size, default is 1
425
+ - thick: line thinckness, defualt is 2
426
+ - padding: add addtional frames at beggining and ending, default is 0
427
+ - show_track: show track id, default is False
428
+ - show_desc: show event desc, default is Falase
429
+ - verbose: if show progressing bar, default is True
430
+ - video_idex: the index of the video in processing
431
+ - video_tot: the total number of videos
432
+
433
+ Return:
434
+ - A list of dataframes for labels, ['frame','type','coords','color','size','thick','desc']
435
+ '''
436
+
437
+ tracks_p = YieldAnalyzer.add_field_names(tracks_p)
438
+ tracks_y = YieldAnalyzer.add_field_names(tracks_y)
439
+
440
+ tracks_p_grouped = tracks_p.groupby('track')
441
+ tracks_y_grouped = tracks_y.groupby('track')
442
+
443
+
444
+ if method == 'all':
445
+ events = yields
446
+ elif method == 'specify':
447
+ events = []
448
+ for p, y in event_list:
449
+ events.append(yields[(yields['track_p']==p) & (yields['track_y']==y)])
450
+ events = pd.concat(events)
451
+ elif method == 'yield':
452
+ events = yields[yields['event']=='yield'].copy()
453
+ elif method == 'not_yield':
454
+ events = yields[yields['event']=='not_yield'].copy()
455
+ elif method == 'event':
456
+ events = yields[yields['event'].isin(['yield', 'not_yield'])].copy()
457
+ elif method == 'none':
458
+ events = yields[~yields['event'].isin(['yield', 'not_yield'])].copy()
459
+
460
+ pbar = tqdm(total= len(events) , unit='event')
461
+ if video_index and video_tot:
462
+ pbar.set_description_str("Generating labeles for yielding events {} of {}".format(video_index, video_tot))
463
+ else:
464
+ pbar.set_description_str("Generating labels for yielding events")
465
+
466
+ labeler = Labeler()
467
+ for index, event in events.iterrows():
468
+ result = []
469
+ track_p_id = event['track_p']
470
+ track_y_id = event['track_y']
471
+ int_x = int(event['int_x'])
472
+ int_y = int(event['int_y'])
473
+
474
+ if event['event'] == 'yield':
475
+ desc = 'yield'
476
+ color = (0, 255, 0)
477
+ elif event['event'] == 'not_yield':
478
+ desc = 'not yield'
479
+ color = (0, 0, 255)
480
+ else:
481
+ desc = 'no interaction'
482
+ color = (255, 0, 0)
483
+
484
+ frames_p = tracks_p_grouped.get_group(track_p_id)
485
+ frames_y = tracks_y_grouped.get_group(track_y_id)
486
+ frames = pd.concat([frames_p, frames_y])
487
+ for index2, frame in frames.iterrows():
488
+ label_text = ''
489
+ if show_track:
490
+ label_text+='| T:'+str(int(frame['track']))
491
+
492
+ if show_desc:
493
+ label_text+= ' | '+desc
494
+
495
+ result.append([frame['frame'], 'bbox', [(frame['x'], frame['y']), (frame['x']+frame['w'], frame['y']+frame['h'])],
496
+ color, size, thick, label_text])
497
+ result.append([frame['frame'], 'box', [(int_x - 5, int_y - 5), (int_x + 5, int_y + 5)],
498
+ (255, 255, 0), size, thick, ''])
499
+
500
+ df = pd.DataFrame(result, columns=['frame','type','coords','color','size','thick','desc'])
501
+
502
+ if out_path:
503
+ file_name = os.path.join(out_path, str(track_p_id)+'-'+str(track_y_id)+'_label.csv')
504
+ df.to_csv(file_name, index=False)
505
+
506
+ if input_video:
507
+ file_name = os.path.join(out_path, str(track_p_id)+'-'+str(track_y_id)+'_label.mp4')
508
+ min_frame = df['frame'].min() - padding
509
+ max_frame = df['frame'].max() + padding
510
+ labeler.draw(input_video=input_video, output_video=file_name, draws=df,
511
+ start_frame=min_frame, end_frame=max_frame, verbose=False)
512
+
513
+ if verbose:
514
+ pbar.update()
515
+
516
+ pbar.close()
517
+
518
+
dnt/analysis/stop.py CHANGED
@@ -27,9 +27,9 @@ class StopAnalyzer():
27
27
 
28
28
  tracks = pd.read_csv(track_file, header=None, sep=',')
29
29
 
30
- tracks = self.__stop_scan(tracks, video_index, video_tot)
31
- tracks = self.__event_identify(tracks, video_index, video_tot)
32
- results = self.__event_count(tracks, video_index, video_tot)
30
+ tracks = self.stop_scan(tracks, video_index, video_tot)
31
+ tracks = self.event_identify(tracks, video_index, video_tot)
32
+ results = self.event_count(tracks, video_index, video_tot)
33
33
 
34
34
  if result_file:
35
35
  results.to_csv(result_file, index=False)
@@ -37,7 +37,7 @@ class StopAnalyzer():
37
37
  if output_file:
38
38
  tracks.to_csv(output_file, header=None, index=False)
39
39
 
40
- def __stop_scan(self, tracks:pd.DataFrame, video_index:int=None, video_tot:int=None)->pd.DataFrame:
40
+ def stop_scan(self, tracks:pd.DataFrame, video_index:int=None, video_tot:int=None)->pd.DataFrame:
41
41
  vehicles = tracks[1].unique()
42
42
 
43
43
  pbar = tqdm(total=len(vehicles), unit=' tracks')
@@ -47,7 +47,7 @@ class StopAnalyzer():
47
47
  pbar.set_description_str("Scanning stops ")
48
48
 
49
49
  for vehicle in vehicles:
50
- track = tracks[tracks[1] == vehicle].sort_values(by=0)
50
+ track = tracks[tracks[1] == vehicle].sort_values(by=0) # sort by frame in ascending
51
51
 
52
52
  for i in range(self.frame_buffer, len(track)):
53
53
 
@@ -58,17 +58,22 @@ class StopAnalyzer():
58
58
  bb1 = [track.iloc[i, 2], track.iloc[i, 3], track.iloc[i, 4], track.iloc[i, 5]]
59
59
  tracks.at[index, 6] = StopAnalyzer.iou(bb0, bb1)
60
60
 
61
- center = Point(track.iloc[i,2]+track.iloc[i,4], track.iloc[i,3]+track.iloc[i,5])
62
- for j in range(len(self.vzones)):
63
- if center.within(self.vzones[j]):
64
- tracks.loc[tracks[1]==vehicle, 7]=j
65
- break
61
+ if len(self.vzones)>0:
62
+ center = Point(track.iloc[i,2]+track.iloc[i,4], track.iloc[i,3]+track.iloc[i,5])
63
+ for j in range(len(self.vzones)):
64
+ if center.within(self.vzones[j]):
65
+ tracks.loc[tracks[1]==vehicle, 7]=j
66
+ break
66
67
 
67
- bb = box(track.iat[i, 2], track.iat[i, 3], track.iat[i, 2] + track.iat[i, 4], track.iat[i, 3] + track.iat[i, 5])
68
- for j in range(len(self.hzones)):
69
- if bb.intersects(self.hzones[j]):
70
- if j > tracks.at[index, 8]:
71
- tracks.at[index, 8] = j
68
+ if len(self.hzones)>0:
69
+ bb = box(track.iat[i, 2], track.iat[i, 3], track.iat[i, 2] + track.iat[i, 4], track.iat[i, 3] + track.iat[i, 5])
70
+ for j in range(len(self.hzones)):
71
+ if bb.intersects(self.hzones[j]):
72
+ pass
73
+ #if j > tracks.at[index, 8]:
74
+ #tracks.at[index, 8] = j
75
+
76
+
72
77
  if self.verbose:
73
78
  pbar.update()
74
79
 
@@ -76,7 +81,7 @@ class StopAnalyzer():
76
81
 
77
82
  return tracks
78
83
 
79
- def __event_identify(self, tracks:pd.DataFrame, video_index:int=None, video_tot:int=None)->pd.DataFrame:
84
+ def event_identify(self, tracks:pd.DataFrame, video_index:int=None, video_tot:int=None)->pd.DataFrame:
80
85
 
81
86
  pbar = tqdm(total=len(tracks), unit=' frames')
82
87
  if video_index and video_tot:
@@ -112,7 +117,7 @@ class StopAnalyzer():
112
117
 
113
118
  return tracks
114
119
 
115
- def __event_count(self, tracks:pd.DataFrame, video_index:int=None, video_tot:int=None):
120
+ def event_count(self, tracks:pd.DataFrame, video_index:int=None, video_tot:int=None):
116
121
 
117
122
  pbar = tqdm(unit='events')
118
123
  results = []