Browse Source

meta learning added

master
Mahdi Abdollah Pour 3 years ago
commit
daffe87b3c
100 changed files with 17603 additions and 0 deletions
  1. 142
    0
      .gitignore
  2. 12
    0
      .idea/ByteTrack.iml
  3. 22
    0
      .idea/deployment.xml
  4. 15
    0
      .idea/inspectionProfiles/Project_Default.xml
  5. 7
    0
      .idea/misc.xml
  6. 8
    0
      .idea/modules.xml
  7. 6
    0
      .idea/vcs.xml
  8. 719
    0
      .idea/workspace.xml
  9. 53
    0
      Dockerfile
  10. 21
    0
      LICENSE
  11. 297
    0
      README.md
  12. BIN
      assets/MOT17-01-SDP.gif
  13. BIN
      assets/MOT17-07-SDP.gif
  14. BIN
      assets/MOT20-07.gif
  15. BIN
      assets/MOT20-08.gif
  16. BIN
      assets/palace_demo.gif
  17. BIN
      assets/sota.png
  18. BIN
      assets/teasing.png
  19. 2500
    0
      datasets/data_path/citypersons.train
  20. 152
    0
      datasets/data_path/citypersons/aachen.train
  21. 58
    0
      datasets/data_path/citypersons/bochum.train
  22. 251
    0
      datasets/data_path/citypersons/bremen.train
  23. 141
    0
      datasets/data_path/citypersons/cologne.train
  24. 72
    0
      datasets/data_path/citypersons/darmstadt.train
  25. 151
    0
      datasets/data_path/citypersons/dusseldorf.train
  26. 88
    0
      datasets/data_path/citypersons/erfurt.train
  27. 243
    0
      datasets/data_path/citypersons/hamburg.train
  28. 188
    0
      datasets/data_path/citypersons/hanover.train
  29. 101
    0
      datasets/data_path/citypersons/jena.train
  30. 91
    0
      datasets/data_path/citypersons/krefeld.train
  31. 73
    0
      datasets/data_path/citypersons/monchengladbach.train
  32. 324
    0
      datasets/data_path/citypersons/strasbourg.train
  33. 165
    0
      datasets/data_path/citypersons/stuttgart.train
  34. 112
    0
      datasets/data_path/citypersons/tubingen.train
  35. 70
    0
      datasets/data_path/citypersons/ulm.train
  36. 113
    0
      datasets/data_path/citypersons/weimar.train
  37. 107
    0
      datasets/data_path/citypersons/zurich.train
  38. 2056
    0
      datasets/data_path/eth.train
  39. 999
    0
      datasets/data_path/eth/eth01.train
  40. 446
    0
      datasets/data_path/eth/eth02.train
  41. 354
    0
      datasets/data_path/eth/eth03.train
  42. 56
    0
      datasets/data_path/eth/eth05.train
  43. 201
    0
      datasets/data_path/eth/eth07.train
  44. 19
    0
      deploy/ONNXRuntime/README.md
  45. 160
    0
      deploy/ONNXRuntime/onnx_inference.py
  46. 39
    0
      deploy/TensorRT/cpp/CMakeLists.txt
  47. 58
    0
      deploy/TensorRT/cpp/README.md
  48. 49
    0
      deploy/TensorRT/cpp/include/BYTETracker.h
  49. 50
    0
      deploy/TensorRT/cpp/include/STrack.h
  50. 36
    0
      deploy/TensorRT/cpp/include/dataType.h
  51. 31
    0
      deploy/TensorRT/cpp/include/kalmanFilter.h
  52. 63
    0
      deploy/TensorRT/cpp/include/lapjv.h
  53. 503
    0
      deploy/TensorRT/cpp/include/logging.h
  54. 241
    0
      deploy/TensorRT/cpp/src/BYTETracker.cpp
  55. 192
    0
      deploy/TensorRT/cpp/src/STrack.cpp
  56. 506
    0
      deploy/TensorRT/cpp/src/bytetrack.cpp
  57. 152
    0
      deploy/TensorRT/cpp/src/kalmanFilter.cpp
  58. 343
    0
      deploy/TensorRT/cpp/src/lapjv.cpp
  59. 429
    0
      deploy/TensorRT/cpp/src/utils.cpp
  60. 22
    0
      deploy/TensorRT/python/README.md
  61. 84
    0
      deploy/ncnn/cpp/CMakeLists.txt
  62. 103
    0
      deploy/ncnn/cpp/README.md
  63. 49
    0
      deploy/ncnn/cpp/include/BYTETracker.h
  64. 50
    0
      deploy/ncnn/cpp/include/STrack.h
  65. 36
    0
      deploy/ncnn/cpp/include/dataType.h
  66. 31
    0
      deploy/ncnn/cpp/include/kalmanFilter.h
  67. 63
    0
      deploy/ncnn/cpp/include/lapjv.h
  68. 241
    0
      deploy/ncnn/cpp/src/BYTETracker.cpp
  69. 192
    0
      deploy/ncnn/cpp/src/STrack.cpp
  70. 396
    0
      deploy/ncnn/cpp/src/bytetrack.cpp
  71. 152
    0
      deploy/ncnn/cpp/src/kalmanFilter.cpp
  72. 343
    0
      deploy/ncnn/cpp/src/lapjv.cpp
  73. 429
    0
      deploy/ncnn/cpp/src/utils.cpp
  74. 1
    0
      experiments/track_mot20.sh
  75. 1
    0
      experiments/train_mot17_on_mot20.sh
  76. 39
    0
      exps/default/nano.py
  77. 89
    0
      exps/default/yolov3.py
  78. 15
    0
      exps/default/yolox_l.py
  79. 15
    0
      exps/default/yolox_m.py
  80. 15
    0
      exps/default/yolox_s.py
  81. 19
    0
      exps/default/yolox_tiny.py
  82. 15
    0
      exps/default/yolox_x.py
  83. 151
    0
      exps/example/metamot/yolox_x_mot17_on_mot20.py
  84. 138
    0
      exps/example/mot/yolox_l_mix_det.py
  85. 138
    0
      exps/example/mot/yolox_m_mix_det.py
  86. 158
    0
      exps/example/mot/yolox_nano_mix_det.py
  87. 138
    0
      exps/example/mot/yolox_s_mix_det.py
  88. 139
    0
      exps/example/mot/yolox_tiny_mix_det.py
  89. 138
    0
      exps/example/mot/yolox_x_ablation.py
  90. 138
    0
      exps/example/mot/yolox_x_ch.py
  91. 138
    0
      exps/example/mot/yolox_x_mix_det.py
  92. 139
    0
      exps/example/mot/yolox_x_mix_mot20_ch.py
  93. 138
    0
      exps/example/mot/yolox_x_mot17_half.py
  94. 139
    0
      exps/example/mot/yolox_x_mot20.py
  95. 22
    0
      requirements.txt
  96. 18
    0
      setup.cfg
  97. 64
    0
      setup.py
  98. 60
    0
      tools/convert_cityperson_to_coco.py
  99. 62
    0
      tools/convert_cityperson_to_coco_metaway.py
  100. 0
    0
      tools/convert_crowdhuman_to_coco.py

+ 142
- 0
.gitignore View File

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# output
docs/api
.code-workspace.code-workspace
*.pkl
*.npy
*.pth
*.onnx
*.engine
events.out.tfevents*
pretrained
YOLOX_outputs


+ 12
- 0
.idea/ByteTrack.iml View File

<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Remote Python 3.6.8 (sftp://[email protected]:22/home/abdollahpoor/abd_venv2/bin/python)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="projectConfiguration" value="pytest" />
<option name="PROJECT_TEST_RUNNER" value="pytest" />
</component>
</module>

+ 22
- 0
.idea/deployment.xml View File

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" autoUpload="Always" serverName="[email protected]:22">
<serverData>
<paths name="[email protected]:22">
<serverdata>
<mappings>
<mapping deploy="/home/abdollahpoor/ByteTrack" local="$PROJECT_DIR$" />
</mappings>
</serverdata>
</paths>
<paths name="[email protected]:22 (1)">
<serverdata>
<mappings>
<mapping local="$PROJECT_DIR$" web="/" />
</mappings>
</serverdata>
</paths>
</serverData>
<option name="myAutoUpload" value="ALWAYS" />
</component>
</project>

+ 15
- 0
.idea/inspectionProfiles/Project_Default.xml View File

<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="2">
<item index="0" class="java.lang.String" itemvalue="filterpy" />
<item index="1" class="java.lang.String" itemvalue="h5py" />
</list>
</value>
</option>
</inspection_tool>
</profile>
</component>

+ 7
- 0
.idea/misc.xml View File

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Remote Python 3.6.8 (sftp://[email protected]:22/home/abdollahpoor/abd_venv2/bin/python)" project-jdk-type="Python SDK" />
</project>

+ 8
- 0
.idea/modules.xml View File

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/ByteTrack.iml" filepath="$PROJECT_DIR$/.idea/ByteTrack.iml" />
</modules>
</component>
</project>

+ 6
- 0
.idea/vcs.xml View File

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

+ 719
- 0
.idea/workspace.xml View File

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="1c3314de-6806-4cdb-bbdc-085922009a88" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FUSProjectUsageTrigger">
<session id="1182338384">
<usages-collector id="statistics.lifecycle.project">
<counts>
<entry key="project.closed" value="7" />
<entry key="project.open.time.0" value="3" />
<entry key="project.open.time.1" value="2" />
<entry key="project.open.time.10" value="1" />
<entry key="project.open.time.9" value="2" />
<entry key="project.opened" value="8" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.open">
<counts>
<entry key="gitignore" value="1" />
<entry key="py" value="143" />
<entry key="sh" value="4" />
<entry key="train" value="30" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.open">
<counts>
<entry key="PLAIN_TEXT" value="35" />
<entry key="Python" value="143" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.edit">
<counts>
<entry key="dummy" value="23" />
<entry key="gitignore" value="2" />
<entry key="py" value="1984" />
<entry key="sh" value="65" />
<entry key="train" value="26" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.edit">
<counts>
<entry key="PLAIN_TEXT" value="116" />
<entry key="Python" value="1984" />
</counts>
</usages-collector>
</session>
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/tools/train.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="37" column="104" selection-start-line="37" selection-start-column="104" selection-end-line="37" selection-end-column="104" />
<folding>
<element signature="e#0#25#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/yolox/core/meta_trainer.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="47">
<caret line="84" column="21" selection-start-line="84" selection-start-column="12" selection-end-line="84" selection-end-column="21" />
<folding>
<element signature="e#65#90#0" expanded="true" />
<marker date="1638341974573" expanded="true" signature="2896:3166" ph="..." />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="237">
<caret line="142" lean-forward="true" selection-start-line="142" selection-end-line="142" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/experiments/train_mot17_on_mot20.sh">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="152" selection-end-column="152" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/exps/example/metamot/yolox_x_mot17_on_mot20.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1729">
<caret line="100" column="24" selection-start-line="100" selection-start-column="12" selection-end-line="100" selection-end-column="24" />
<folding>
<element signature="e#18#27#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/yolox/exp/meta_yolox_base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2641">
<caret line="147" column="39" selection-start-line="147" selection-start-column="28" selection-end-line="147" selection-end-column="39" />
<folding>
<element signature="e#65#77#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>num_class</find>
<find>track</find>
<find>DATA_ROOT</find>
<find>val_half</find>
<find>batch_size</find>
<find>use_model_ema</find>
<find>ema_model</find>
<find>ema</find>
<find>learn</find>
<find>clone</find>
<find>-b</find>
<find>-t</find>
<find>-c</find>
<find>max_iter</find>
<find>device</find>
<find>model</find>
<find>resume_train</find>
<find>self.mode</find>
<find>self.model =</find>
<find>optimizer</find>
<find>get_eval_loader</find>
<find>name</find>
<find>self.model</find>
<find>-d</find>
<find>self.name</find>
<find>lr</find>
<find>save</find>
<find>train_loader,</find>
<find>train_loader</find>
<find>self.iter</find>
</findStrings>
<replaceStrings>
<replace>Citypersons</replace>
</replaceStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/tools/convert_mot20_to_coco.py" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons.train" />
<option value="$PROJECT_DIR$/tools/convert_cityperson_to_coco.py" />
<option value="$PROJECT_DIR$/yolox/data/dataloading.py" />
<option value="$PROJECT_DIR$/exps/example/mot/yolox_x_mot20.py" />
<option value="$PROJECT_DIR$/yolox/evaluators/__init__.py" />
<option value="$PROJECT_DIR$/tools/track.py" />
<option value="$PROJECT_DIR$/experiments/track_mot20.sh" />
<option value="$PROJECT_DIR$/yolox/models/yolo_head.py" />
<option value="$PROJECT_DIR$/yolox/models/yolox.py" />
<option value="$PROJECT_DIR$/yolox/evaluators/mot_evaluator.py" />
<option value="$PROJECT_DIR$/tools/convert_mot20_to_coco_metaway.py" />
<option value="$PROJECT_DIR$/tools/convert_mot17_to_coco_metaway.py" />
<option value="$PROJECT_DIR$/datasets/data_path/eth/eth07.train" />
<option value="$PROJECT_DIR$/datasets/data_path/eth/eth05.train" />
<option value="$PROJECT_DIR$/datasets/data_path/eth/eth03.train" />
<option value="$PROJECT_DIR$/datasets/data_path/eth_c.train" />
<option value="$PROJECT_DIR$/datasets/data_path/eth/eth02.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/monchengladbach.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/erfurt.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/cologne.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/strasbourg.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/weimar.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/hanover.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/krefeld.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/aachen.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/tubingen.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/hamburg.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/bochum.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/bremen.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/zurich.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/darmstadt.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/dusseldorf.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/ulm.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons_c.train" />
<option value="$PROJECT_DIR$/datasets/data_path/citypersons/stuttgart.train" />
<option value="$PROJECT_DIR$/tools/convert_ethz_to_coco.py" />
<option value="$PROJECT_DIR$/tools/convert_cityperson_to_coco_metaway.py" />
<option value="$PROJECT_DIR$/tools/convert_ethz_to_coco_metaway.py" />
<option value="$PROJECT_DIR$/tools/convert_crowdhuman_to_coco.py" />
<option value="$PROJECT_DIR$/yolox/exp/__init__.py" />
<option value="$PROJECT_DIR$/yolox/core/trainer.py" />
<option value="$PROJECT_DIR$/yolox/core/__init__.py" />
<option value="$PROJECT_DIR$/experiments/train_mot17_on_mot20.sh" />
<option value="$PROJECT_DIR$/yolox/utils/checkpoint.py" />
<option value="$PROJECT_DIR$/yolox/exp/meta_yolox_base.py" />
<option value="$PROJECT_DIR$/exps/example/metamot/yolox_x_mot17_on_mot20.py" />
<option value="$PROJECT_DIR$/yolox/data/datasets/mot.py" />
<option value="$PROJECT_DIR$/tools/train.py" />
<option value="$PROJECT_DIR$/yolox/core/meta_trainer.py" />
<option value="$PROJECT_DIR$/.gitignore" />
</list>
</option>
</component>
<component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsGulpfileManager">
<detection-done>true</detection-done>
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="-440" />
<option name="y" value="305" />
<option name="width" value="1625" />
<option name="height" value="925" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="ByteTrack" type="b2602c69:ProjectViewProjectNode" />
<item name="ByteTrack" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="WebServerToolWindowFactoryState" value="true" />
<property name="WebServerToolWindowPanel.toolwindow.highlight.mappings" value="true" />
<property name="WebServerToolWindowPanel.toolwindow.highlight.symlinks" value="true" />
<property name="WebServerToolWindowPanel.toolwindow.show.date" value="false" />
<property name="WebServerToolWindowPanel.toolwindow.show.permissions" value="false" />
<property name="WebServerToolWindowPanel.toolwindow.show.size" value="false" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\ASUS\PycharmProjects\ByteTrack\exps\example\metamot" />
<recent name="C:\Users\ASUS\PycharmProjects\ByteTrack\tools" />
<recent name="C:\Users\ASUS\PycharmProjects\ByteTrack\datasets\data_path" />
<recent name="C:\Users\ASUS\PycharmProjects\ByteTrack\exps\example\mot" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\ASUS\PycharmProjects\ByteTrack\datasets\data_path\citypersons" />
<recent name="C:\Users\ASUS\PycharmProjects\ByteTrack\datasets\data_path\eth" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="1c3314de-6806-4cdb-bbdc-085922009a88" name="Default Changelist" comment="" />
<created>1637766872008</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1637766872008</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="-7" y="-7" width="1294" height="694" extended-state="6" />
<layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.27876824" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="Version Control" order="8" />
<window_info anchor="bottom" id="File Transfer" order="9" weight="0.24777183" />
<window_info anchor="bottom" id="Database Changes" order="10" show_stripe_button="false" />
<window_info anchor="bottom" id="Terminal" order="11" sideWeight="0.49918962" visible="true" weight="0.32976827" />
<window_info anchor="bottom" id="Event Log" order="12" sideWeight="0.5008104" side_tool="true" weight="0.32976827" />
<window_info anchor="bottom" id="Python Console" order="13" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="Remote Host" order="3" weight="0.3298217" />
<window_info anchor="right" id="SciView" order="4" />
<window_info anchor="right" id="Database" order="5" />
</layout>
<layout-to-restore>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.27147487" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="bottom" id="Docker" order="7" show_stripe_button="false" />
<window_info anchor="bottom" id="Version Control" order="8" show_stripe_button="false" />
<window_info anchor="bottom" id="File Transfer" order="9" weight="0.32976827" />
<window_info anchor="bottom" id="Database Changes" order="10" show_stripe_button="false" />
<window_info anchor="bottom" id="Terminal" order="11" />
<window_info anchor="bottom" id="Event Log" order="12" side_tool="true" />
<window_info anchor="bottom" id="Python Console" order="13" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="Remote Host" order="3" weight="0.3298217" />
<window_info anchor="right" id="SciView" order="4" />
<window_info anchor="right" id="Database" order="5" />
</layout-to-restore>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="UnknownFeatures">
<option featureType="com.intellij.fileTypeFactory" implementationName="*.sh" />
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/tubingen.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="498">
<caret line="112" selection-start-line="112" selection-end-line="112" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/hamburg.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="498">
<caret line="243" selection-start-line="243" selection-end-line="243" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/bochum.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="498">
<caret line="58" selection-start-line="58" selection-end-line="58" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/bremen.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="498">
<caret line="251" selection-start-line="251" selection-end-line="251" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/zurich.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="498">
<caret line="107" selection-start-line="107" selection-end-line="107" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/darmstadt.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="498">
<caret line="72" selection-start-line="72" selection-end-line="72" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/dusseldorf.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="498">
<caret line="151" selection-start-line="151" selection-end-line="151" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/ulm.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="498">
<caret line="70" selection-start-line="70" selection-end-line="70" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/stuttgart.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="498">
<caret line="165" selection-start-line="165" selection-end-line="165" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/datasets/data_path/citypersons/jena.train">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1919">
<caret line="101" selection-start-line="101" selection-end-line="101" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/convert_mot20_to_coco_metaway.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="370">
<caret line="40" column="12" selection-start-line="40" selection-start-column="12" selection-end-line="40" selection-end-column="41" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/convert_mot17_to_coco_metaway.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="271">
<caret line="24" column="56" lean-forward="true" selection-start-line="24" selection-start-column="56" selection-end-line="24" selection-end-column="56" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/convert_cityperson_to_coco.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="38">
<caret line="5" column="72" selection-start-line="5" selection-start-column="72" selection-end-line="5" selection-end-column="72" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/mix_data_test_mot20.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/tools/mix_data_test_mot17.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-532">
<caret line="102" column="35" selection-start-line="102" selection-start-column="28" selection-end-line="102" selection-end-column="35" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/tracker/byte_tracker.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="95">
<caret line="144" column="17" selection-start-line="144" selection-start-column="6" selection-end-line="144" selection-end-column="17" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/evaluators/mot_evaluator.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="171">
<caret line="348" column="25" selection-start-line="348" selection-start-column="25" selection-end-line="348" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/track.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="217">
<caret line="161" column="21" lean-forward="true" selection-start-line="161" selection-start-column="21" selection-end-line="161" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/convert_ethz_to_coco_metaway.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/exps/example/mot/yolox_x_ch.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1387">
<caret line="48" column="34" selection-start-line="48" selection-start-column="34" selection-end-line="48" selection-end-column="34" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/exps/example/mot/yolox_x_mot20.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="360">
<caret line="42" column="21" selection-start-line="42" selection-start-column="21" selection-end-line="42" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/data/samplers.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-39">
<caret line="20" column="8" selection-start-line="20" selection-start-column="8" selection-end-line="20" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/convert_crowdhuman_to_coco.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="190">
<caret line="28" column="21" lean-forward="true" selection-start-line="28" selection-start-column="21" selection-end-line="28" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/convert_cityperson_to_coco_metaway.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="95">
<caret line="8" selection-start-line="8" selection-end-line="8" selection-end-column="60" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/models/losses.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1221" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/models/yolox.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-456" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/convert_mot17_to_coco.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="37" column="70" selection-start-line="37" selection-start-column="65" selection-end-line="37" selection-end-column="70" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/mix_data_ablation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-342">
<caret line="30" selection-start-line="30" selection-end-line="30" selection-end-column="14" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/exp/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="133">
<caret line="7" column="36" selection-start-line="7" selection-start-column="36" selection-end-line="7" selection-end-column="36" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/exps/example/mot/yolox_x_ablation.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/yolox/utils/lr_scheduler.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-115">
<caret line="8" column="17" selection-start-line="8" selection-start-column="6" selection-end-line="8" selection-end-column="17" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/exps/example/mot/yolox_x_mix_det.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/yolox/exp/base_meta_exp.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-518">
<caret line="19" column="6" selection-start-line="19" selection-start-column="6" selection-end-line="19" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/exps/example/mot/yolox_x_mot17_half.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="114">
<caret line="87" column="75" selection-start-line="87" selection-start-column="75" selection-end-line="87" selection-end-column="75" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/experiments/track_mot20.sh">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/exps/example/mot/yolox_x_mix_mot20_ch.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="145">
<caret line="118" column="20" selection-start-line="118" selection-start-column="20" selection-end-line="118" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/core/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="114">
<caret line="6" column="37" selection-start-line="6" selection-start-column="37" selection-end-line="6" selection-end-column="37" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/exps/example/mot/yolox_m_mix_det.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2223" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/exps/example/mot/yolox_s_mix_det.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="19">
<caret line="1" lean-forward="true" selection-start-line="1" selection-end-line="1" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/exp/yolox_base.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret line="152" lean-forward="true" selection-start-line="152" selection-end-line="152" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/evaluators/coco_evaluator.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="133">
<caret line="32" column="8" selection-start-line="32" selection-start-column="8" selection-end-line="32" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/data/dataloading.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="132">
<caret line="14" column="4" selection-start-line="14" selection-start-column="4" selection-end-line="14" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/utils/checkpoint.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="171">
<caret line="23" column="14" selection-start-line="23" selection-start-column="8" selection-end-line="23" selection-end-column="14" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/core/trainer.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="171">
<caret line="166" column="18" selection-start-line="166" selection-start-column="8" selection-end-line="166" selection-end-column="18" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/exps/example/metamot/yolox_x_mot17_on_mot20.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1729">
<caret line="100" column="24" selection-start-line="100" selection-start-column="12" selection-end-line="100" selection-end-column="24" />
<folding>
<element signature="e#18#27#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/exp/meta_yolox_base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2641">
<caret line="147" column="39" selection-start-line="147" selection-start-column="28" selection-end-line="147" selection-end-column="39" />
<folding>
<element signature="e#65#77#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/data/datasets/mot.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret line="92" column="8" selection-start-line="92" selection-start-column="8" selection-end-line="92" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tools/train.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="37" column="104" selection-start-line="37" selection-start-column="104" selection-end-line="37" selection-end-column="104" />
<folding>
<element signature="e#0#25#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/experiments/train_mot17_on_mot20.sh">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="152" selection-end-column="152" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/yolox/core/meta_trainer.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="47">
<caret line="84" column="21" selection-start-line="84" selection-start-column="12" selection-end-line="84" selection-end-column="21" />
<folding>
<element signature="e#65#90#0" expanded="true" />
<marker date="1638341974573" expanded="true" signature="2896:3166" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="237">
<caret line="142" lean-forward="true" selection-start-line="142" selection-end-line="142" />
</state>
</provider>
</entry>
</component>
</project>

+ 53
- 0
Dockerfile View File

FROM nvcr.io/nvidia/tensorrt:21.09-py3

ENV DEBIAN_FRONTEND=noninteractive
ARG USERNAME=user
ARG WORKDIR=/workspace/ByteTrack

RUN apt-get update && apt-get install -y \
automake autoconf libpng-dev nano python3-pip \
curl zip unzip libtool swig zlib1g-dev pkg-config \
python3-mock libpython3-dev libpython3-all-dev \
g++ gcc cmake make pciutils cpio gosu wget \
libgtk-3-dev libxtst-dev sudo apt-transport-https \
build-essential gnupg git xz-utils vim \
libva-drm2 libva-x11-2 vainfo libva-wayland2 libva-glx2 \
libva-dev libdrm-dev xorg xorg-dev protobuf-compiler \
openbox libx11-dev libgl1-mesa-glx libgl1-mesa-dev \
libtbb2 libtbb-dev libopenblas-dev libopenmpi-dev \
&& sed -i 's/# set linenumbers/set linenumbers/g' /etc/nanorc \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/ifzhang/ByteTrack \
&& cd ByteTrack \
&& git checkout 3434c5e8bc6a5ae8ad530528ba8d9a431967f237 \
&& mkdir -p YOLOX_outputs/yolox_x_mix_det/track_vis \
&& sed -i 's/torch>=1.7/torch==1.9.1+cu111/g' requirements.txt \
&& sed -i 's/torchvision==0.10.0/torchvision==0.10.1+cu111/g' requirements.txt \
&& sed -i "s/'cuda'/0/g" tools/demo_track.py \
&& pip3 install pip --upgrade \
&& pip3 install -r requirements.txt -f https://download.pytorch.org/whl/torch_stable.html \
&& python3 setup.py develop \
&& pip3 install cython \
&& pip3 install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI' \
&& pip3 install cython_bbox gdown \
&& ldconfig \
&& pip cache purge

RUN git clone https://github.com/NVIDIA-AI-IOT/torch2trt \
&& cd torch2trt \
&& git checkout 0400b38123d01cc845364870bdf0a0044ea2b3b2 \
# https://github.com/NVIDIA-AI-IOT/torch2trt/issues/619
&& wget https://github.com/NVIDIA-AI-IOT/torch2trt/commit/8b9fb46ddbe99c2ddf3f1ed148c97435cbeb8fd3.patch \
&& git apply 8b9fb46ddbe99c2ddf3f1ed148c97435cbeb8fd3.patch \
&& python3 setup.py install

RUN echo "root:root" | chpasswd \
&& adduser --disabled-password --gecos "" "${USERNAME}" \
&& echo "${USERNAME}:${USERNAME}" | chpasswd \
&& echo "%${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/${USERNAME} \
&& chmod 0440 /etc/sudoers.d/${USERNAME}
USER ${USERNAME}
RUN sudo chown -R ${USERNAME}:${USERNAME} ${WORKDIR}
WORKDIR ${WORKDIR}

+ 21
- 0
LICENSE View File

MIT License

Copyright (c) 2021 Yifu Zhang

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

+ 297
- 0
README.md View File

# ByteTrack

[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/bytetrack-multi-object-tracking-by-1/multi-object-tracking-on-mot17)](https://paperswithcode.com/sota/multi-object-tracking-on-mot17?p=bytetrack-multi-object-tracking-by-1)

[![PWC](https://img.shields.io/endpoint.svg?url=https://paperswithcode.com/badge/bytetrack-multi-object-tracking-by-1/multi-object-tracking-on-mot20-1)](https://paperswithcode.com/sota/multi-object-tracking-on-mot20-1?p=bytetrack-multi-object-tracking-by-1)

#### ByteTrack is a simple, fast and strong multi-object tracker.

<p align="center"><img src="assets/sota.png" width="500"/></p>

> [**ByteTrack: Multi-Object Tracking by Associating Every Detection Box**](https://arxiv.org/abs/2110.06864)
>
> Yifu Zhang, Peize Sun, Yi Jiang, Dongdong Yu, Zehuan Yuan, Ping Luo, Wenyu Liu, Xinggang Wang
>
> *[arXiv 2110.06864](https://arxiv.org/abs/2110.06864)*

## Demo Links
| Google Colab demo | Huggingface Demo | Original Paper: ByteTrack |
|:-:|:-:|:-:|
|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1bDilg4cmXFa8HCKHbsZ_p16p0vrhLyu0?usp=sharing)|[![Hugging Face Spaces](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Spaces-blue)](https://huggingface.co/spaces/akhaliq/bytetrack)|[arXiv 2110.06864](https://arxiv.org/abs/2110.06864)|
* Integrated to [Huggingface Spaces](https://huggingface.co/spaces) with [Gradio](https://github.com/gradio-app/gradio).


## Abstract
Multi-object tracking (MOT) aims at estimating bounding boxes and identities of objects in videos. Most methods obtain identities by associating detection boxes whose scores are higher than a threshold. The objects with low detection scores, e.g. occluded objects, are simply thrown away, which brings non-negligible true object missing and fragmented trajectories. To solve this problem, we present a simple, effective and generic association method, tracking by associating every detection box instead of only the high score ones. For the low score detection boxes, we utilize their similarities with tracklets to recover true objects and filter out the background detections. When applied to 9 different state-of-the-art trackers, our method achieves consistent improvement on IDF1 scores ranging from 1 to 10 points. To put forwards the state-of-the-art performance of MOT, we design a simple and strong tracker, named ByteTrack. For the first time, we achieve 80.3 MOTA, 77.3 IDF1 and 63.1 HOTA on the test set of MOT17 with 30 FPS running speed on a single V100 GPU.
<p align="center"><img src="assets/teasing.png" width="400"/></p>

## Tracking performance
### Results on MOT challenge test set
| Dataset | MOTA | IDF1 | HOTA | MT | ML | FP | FN | IDs | FPS |
|------------|-------|------|------|-------|-------|------|------|------|------|
|MOT17 | 80.3 | 77.3 | 63.1 | 53.2% | 14.5% | 25491 | 83721 | 2196 | 29.6 |
|MOT20 | 77.8 | 75.2 | 61.3 | 69.2% | 9.5% | 26249 | 87594 | 1223 | 13.7 |

### Visualization results on MOT challenge test set
<img src="assets/MOT17-01-SDP.gif" width="400"/> <img src="assets/MOT17-07-SDP.gif" width="400"/>
<img src="assets/MOT20-07.gif" width="400"/> <img src="assets/MOT20-08.gif" width="400"/>

## Installation
### 1. Installing on the host machine
Step1. Install ByteTrack.
```shell
git clone https://github.com/ifzhang/ByteTrack.git
cd ByteTrack
pip3 install -r requirements.txt
python3 setup.py develop
```

Step2. Install [pycocotools](https://github.com/cocodataset/cocoapi).

```shell
pip3 install cython; pip3 install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
```

Step3. Others
```shell
pip3 install cython_bbox
```
### 2. Docker build
```shell
docker build -t bytetrack:latest .

# Startup sample
mkdir -p pretrained && \
mkdir -p YOLOX_outputs && \
xhost +local: && \
docker run --gpus all -it --rm \
-v $PWD/pretrained:/workspace/ByteTrack/pretrained \
-v $PWD/datasets:/workspace/ByteTrack/datasets \
-v $PWD/YOLOX_outputs:/workspace/ByteTrack/YOLOX_outputs \
-v /tmp/.X11-unix/:/tmp/.X11-unix:rw \
--device /dev/video0:/dev/video0:mwr \
--net=host \
-e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \
-e DISPLAY=$DISPLAY \
--privileged \
bytetrack:latest
```

## Data preparation

Download [MOT17](https://motchallenge.net/), [MOT20](https://motchallenge.net/), [CrowdHuman](https://www.crowdhuman.org/), [Cityperson](https://github.com/Zhongdao/Towards-Realtime-MOT/blob/master/DATASET_ZOO.md), [ETHZ](https://github.com/Zhongdao/Towards-Realtime-MOT/blob/master/DATASET_ZOO.md) and put them under <ByteTrack_HOME>/datasets in the following structure:
```
datasets
|——————mot
| └——————train
| └——————test
└——————crowdhuman
| └——————Crowdhuman_train
| └——————Crowdhuman_val
| └——————annotation_train.odgt
| └——————annotation_val.odgt
└——————MOT20
| └——————train
| └——————test
└——————Cityscapes
| └——————images
| └——————labels_with_ids
└——————ETHZ
└——————eth01
└——————...
└——————eth07
```

Then, you need to turn the datasets to COCO format and mix different training data:

```shell
cd <ByteTrack_HOME>
python3 tools/convert_mot17_to_coco.py
python3 tools/convert_mot20_to_coco.py
python3 tools/convert_crowdhuman_to_coco.py
python3 tools/convert_cityperson_to_coco.py
python3 tools/convert_ethz_to_coco.py
```

Before mixing different datasets, you need to follow the operations in [mix_xxx.py](https://github.com/ifzhang/ByteTrack/blob/c116dfc746f9ebe07d419caa8acba9b3acfa79a6/tools/mix_data_ablation.py#L6) to create a data folder and link. Finally, you can mix the training data:

```shell
cd <ByteTrack_HOME>
python3 tools/mix_data_ablation.py
python3 tools/mix_data_test_mot17.py
python3 tools/mix_data_test_mot20.py
```


## Model zoo

### Ablation model

Train on CrowdHuman and MOT17 half train, evaluate on MOT17 half val

| Model | MOTA | IDF1 | IDs | FPS |
|------------|-------|------|------|------|
|ByteTrack_ablation [[google]](https://drive.google.com/file/d/1iqhM-6V_r1FpOlOzrdP_Ejshgk0DxOob/view?usp=sharing), [[baidu(code:eeo8)]](https://pan.baidu.com/s/1W5eRBnxc4x9V8gm7dgdEYg) | 76.6 | 79.3 | 159 | 29.6 |

### MOT17 test model

Train on CrowdHuman, MOT17, Cityperson and ETHZ, evaluate on MOT17 train.

* **Standard models**

| Model | MOTA | IDF1 | IDs | FPS |
|------------|-------|------|------|------|
|bytetrack_x_mot17 [[google]](https://drive.google.com/file/d/1P4mY0Yyd3PPTybgZkjMYhFri88nTmJX5/view?usp=sharing), [[baidu(code:ic0i)]](https://pan.baidu.com/s/1OJKrcQa_JP9zofC6ZtGBpw) | 90.0 | 83.3 | 422 | 29.6 |
|bytetrack_l_mot17 [[google]](https://drive.google.com/file/d/1XwfUuCBF4IgWBWK2H7oOhQgEj9Mrb3rz/view?usp=sharing), [[baidu(code:1cml)]](https://pan.baidu.com/s/1242adimKM6TYdeLU2qnuRA) | 88.7 | 80.7 | 460 | 43.7 |
|bytetrack_m_mot17 [[google]](https://drive.google.com/file/d/11Zb0NN_Uu7JwUd9e6Nk8o2_EUfxWqsun/view?usp=sharing), [[baidu(code:u3m4)]](https://pan.baidu.com/s/1fKemO1uZfvNSLzJfURO4TQ) | 87.0 | 80.1 | 477 | 54.1 |
|bytetrack_s_mot17 [[google]](https://drive.google.com/file/d/1uSmhXzyV1Zvb4TJJCzpsZOIcw7CCJLxj/view?usp=sharing), [[baidu(code:qflm)]](https://pan.baidu.com/s/1PiP1kQfgxAIrnGUbFP6Wfg) | 79.2 | 74.3 | 533 | 64.5 |

* **Light models**

| Model | MOTA | IDF1 | IDs | Params(M) | FLOPs(G) |
|------------|-------|------|------|------|-------|
|bytetrack_nano_mot17 [[google]](https://drive.google.com/file/d/1AoN2AxzVwOLM0gJ15bcwqZUpFjlDV1dX/view?usp=sharing), [[baidu(code:1ub8)]](https://pan.baidu.com/s/1dMxqBPP7lFNRZ3kFgDmWdw) | 69.0 | 66.3 | 531 | 0.90 | 3.99 |
|bytetrack_tiny_mot17 [[google]](https://drive.google.com/file/d/1LFAl14sql2Q5Y9aNFsX_OqsnIzUD_1ju/view?usp=sharing), [[baidu(code:cr8i)]](https://pan.baidu.com/s/1jgIqisPSDw98HJh8hqhM5w) | 77.1 | 71.5 | 519 | 5.03 | 24.45 |



### MOT20 test model

Train on CrowdHuman and MOT20, evaluate on MOT20 train.


| Model | MOTA | IDF1 | IDs | FPS |
|------------|-------|------|------|------|
|bytetrack_x_mot20 [[google]](https://drive.google.com/file/d/1HX2_JpMOjOIj1Z9rJjoet9XNy_cCAs5U/view?usp=sharing), [[baidu(code:3apd)]](https://pan.baidu.com/s/1bowJJj0bAnbhEQ3_6_Am0A) | 93.4 | 89.3 | 1057 | 17.5 |


## Training

The COCO pretrained YOLOX model can be downloaded from their [model zoo](https://github.com/Megvii-BaseDetection/YOLOX/tree/0.1.0). After downloading the pretrained models, you can put them under <ByteTrack_HOME>/pretrained.

* **Train ablation model (MOT17 half train and CrowdHuman)**

```shell
cd <ByteTrack_HOME>
python3 tools/train.py -f exps/example/mot/yolox_x_ablation.py -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth
```

* **Train MOT17 test model (MOT17 train, CrowdHuman, Cityperson and ETHZ)**

```shell
cd <ByteTrack_HOME>
python3 tools/train.py -f exps/example/mot/yolox_x_mix_det.py -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth
```

* **Train MOT20 test model (MOT20 train, CrowdHuman)**

For MOT20, you need to clip the bounding boxes inside the image.

Add clip operation in [line 134-135 in data_augment.py](https://github.com/ifzhang/ByteTrack/blob/72cd6dd24083c337a9177e484b12bb2b5b3069a6/yolox/data/data_augment.py#L134), [line 122-125 in mosaicdetection.py](https://github.com/ifzhang/ByteTrack/blob/72cd6dd24083c337a9177e484b12bb2b5b3069a6/yolox/data/datasets/mosaicdetection.py#L122), [line 217-225 in mosaicdetection.py](https://github.com/ifzhang/ByteTrack/blob/72cd6dd24083c337a9177e484b12bb2b5b3069a6/yolox/data/datasets/mosaicdetection.py#L217), [line 115-118 in boxes.py](https://github.com/ifzhang/ByteTrack/blob/72cd6dd24083c337a9177e484b12bb2b5b3069a6/yolox/utils/boxes.py#L115).

```shell
cd <ByteTrack_HOME>
python3 tools/train.py -f exps/example/mot/yolox_x_mix_mot20_ch.py -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth
```

* **Train custom dataset**

First, you need to prepare your dataset in COCO format. You can refer to [MOT-to-COCO](https://github.com/ifzhang/ByteTrack/blob/main/tools/convert_mot17_to_coco.py) or [CrowdHuman-to-COCO](https://github.com/ifzhang/ByteTrack/blob/main/tools/convert_crowdhuman_to_coco.py). Then, you need to create a Exp file for your dataset. You can refer to the [CrowdHuman](https://github.com/ifzhang/ByteTrack/blob/main/exps/example/mot/yolox_x_ch.py) training Exp file. Don't forget to modify get_data_loader() and get_eval_loader in your Exp file. Finally, you can train bytetrack on your dataset by running:

```shell
cd <ByteTrack_HOME>
python3 tools/train.py -f exps/example/mot/your_exp_file.py -d 8 -b 48 --fp16 -o -c pretrained/yolox_x.pth
```


## Tracking

* **Evaluation on MOT17 half val**

Run ByteTrack:

```shell
cd <ByteTrack_HOME>
python3 tools/track.py -f exps/example/mot/yolox_x_ablation.py -c pretrained/bytetrack_ablation.pth.tar -b 1 -d 1 --fp16 --fuse
```
You can get 76.6 MOTA using our pretrained model.

Run other trackers:
```shell
python3 tools/track_sort.py -f exps/example/mot/yolox_x_ablation.py -c pretrained/bytetrack_ablation.pth.tar -b 1 -d 1 --fp16 --fuse
python3 tools/track_deepsort.py -f exps/example/mot/yolox_x_ablation.py -c pretrained/bytetrack_ablation.pth.tar -b 1 -d 1 --fp16 --fuse
python3 tools/track_motdt.py -f exps/example/mot/yolox_x_ablation.py -c pretrained/bytetrack_ablation.pth.tar -b 1 -d 1 --fp16 --fuse
```

* **Test on MOT17**

Run ByteTrack:

```shell
cd <ByteTrack_HOME>
python3 tools/track.py -f exps/example/mot/yolox_x_mix_det.py -c pretrained/bytetrack_x_mot17.pth.tar -b 1 -d 1 --fp16 --fuse
python3 tools/interpolation.py
```
Submit the txt files to [MOTChallenge](https://motchallenge.net/) website and you can get 79+ MOTA (For 80+ MOTA, you need to carefully tune the test image size and high score detection threshold of each sequence).

* **Test on MOT20**

We use the input size 1600 x 896 for MOT20-04, MOT20-07 and 1920 x 736 for MOT20-06, MOT20-08. You can edit it in [yolox_x_mix_mot20_ch.py](https://github.com/ifzhang/ByteTrack/blob/main/exps/example/mot/yolox_x_mix_mot20_ch.py)

Run ByteTrack:

```shell
cd <ByteTrack_HOME>
python3 tools/track.py -f exps/example/mot/yolox_x_mix_mot20_ch.py -c pretrained/bytetrack_x_mot20.pth.tar -b 1 -d 1 --fp16 --fuse --match_thresh 0.7 --mot20
python3 tools/interpolation.py
```
Submit the txt files to [MOTChallenge](https://motchallenge.net/) website and you can get 77+ MOTA (For higher MOTA, you need to carefully tune the test image size and high score detection threshold of each sequence).

## Applying BYTE to other trackers

See [tutorials](https://github.com/ifzhang/ByteTrack/tree/main/tutorials).

## Combining BYTE with other detectors

Suppose you have already got the detection results 'dets' (x1, y1, x2, y2, score) from other detectors, you can simply pass the detection results to BYTETracker (you need to first modify some post-processing code according to the format of your detection results in [byte_tracker.py](https://github.com/ifzhang/ByteTrack/blob/main/yolox/tracker/byte_tracker.py)):

```
from yolox.tracker.byte_tracker import BYTETracker
tracker = BYTETracker(args)
for image in images:
dets = detector(image)
online_targets = tracker.update(dets, info_imgs, img_size)
```

You can get the tracking results in each frame from 'online_targets'. You can refer to [mot_evaluators.py](https://github.com/ifzhang/ByteTrack/blob/main/yolox/evaluators/mot_evaluator.py) to pass the detection results to BYTETracker.

## Demo

<img src="assets/palace_demo.gif" width="600"/>

```shell
cd <ByteTrack_HOME>
python3 tools/demo_track.py video -f exps/example/mot/yolox_x_mix_det.py -c pretrained/bytetrack_x_mot17.pth.tar --fp16 --fuse --save_result
```

## Deploy

1. [ONNX export and ONNXRuntime](./deploy/ONNXRuntime)
2. [TensorRT in Python](./deploy/TensorRT/python)
3. [TensorRT in C++](./deploy/TensorRT/cpp)
4. [ncnn in C++](./deploy/ncnn/cpp)

## Citation

```
@article{zhang2021bytetrack,
title={ByteTrack: Multi-Object Tracking by Associating Every Detection Box},
author={Zhang, Yifu and Sun, Peize and Jiang, Yi and Yu, Dongdong and Yuan, Zehuan and Luo, Ping and Liu, Wenyu and Wang, Xinggang},
journal={arXiv preprint arXiv:2110.06864},
year={2021}
}
```

## Acknowledgement

A large part of the code is borrowed from [YOLOX](https://github.com/Megvii-BaseDetection/YOLOX), [FairMOT](https://github.com/ifzhang/FairMOT), [TransTrack](https://github.com/PeizeSun/TransTrack) and [JDE-Cpp](https://github.com/samylee/Towards-Realtime-MOT-Cpp). Many thanks for their wonderful works.

BIN
assets/MOT17-01-SDP.gif View File


BIN
assets/MOT17-07-SDP.gif View File


BIN
assets/MOT20-07.gif View File


BIN
assets/MOT20-08.gif View File


BIN
assets/palace_demo.gif View File


BIN
assets/sota.png View File


BIN
assets/teasing.png View File


+ 2500
- 0
datasets/data_path/citypersons.train
File diff suppressed because it is too large
View File


+ 152
- 0
datasets/data_path/citypersons/aachen.train View File

Citypersons/images/train/aachen/aachen_000025_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000070_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000048_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000097_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000091_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000006_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000142_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000020_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000129_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000150_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000003_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000110_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000040_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000082_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000023_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000059_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000135_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000138_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000131_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000029_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000137_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000047_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000031_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000076_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000127_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000159_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000073_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000102_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000153_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000086_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000085_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000058_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000123_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000143_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000017_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000141_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000101_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000081_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000125_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000105_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000038_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000032_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000054_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000009_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000088_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000139_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000090_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000111_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000136_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000077_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000072_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000005_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000034_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000166_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000164_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000039_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000067_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000056_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000026_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000162_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000021_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000148_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000098_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000122_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000075_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000161_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000000_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000093_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000099_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000071_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000087_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000066_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000053_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000103_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000116_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000106_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000172_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000080_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000033_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000065_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000035_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000024_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000046_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000114_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000019_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000092_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000119_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000155_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000063_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000094_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000030_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000084_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000016_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000112_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000132_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000154_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000089_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000069_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000062_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000168_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000010_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000133_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000173_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000169_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000042_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000120_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000134_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000145_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000022_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000045_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000109_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000049_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000074_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000041_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000068_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000027_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000050_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000008_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000057_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000147_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000055_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000051_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000018_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000115_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000171_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000140_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000126_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000100_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000052_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000118_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000156_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000013_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000121_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000012_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000002_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000146_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000144_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000036_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000108_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000083_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000015_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000004_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000107_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000095_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000064_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000163_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000014_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000113_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000128_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000011_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000117_000019_leftImg8bit.png
Citypersons/images/train/aachen/aachen_000160_000019_leftImg8bit.png

+ 58
- 0
datasets/data_path/citypersons/bochum.train View File

Citypersons/images/train/bochum/bochum_000000_036606_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_037039_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_025833_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_015645_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_014803_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_006026_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_023648_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_029203_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_028297_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_022210_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_022414_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_015038_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_020673_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_034936_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_024343_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_023040_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_000885_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_024855_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_015321_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_024196_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_002293_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_017216_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_006484_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_038150_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_006746_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_007651_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_014658_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_000600_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_016758_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_020776_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_004748_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_037223_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_015880_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_010562_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_025746_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_021606_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_016260_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_035958_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_009554_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_003674_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_003245_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_019188_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_008162_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_005936_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_001828_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_011711_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_016591_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_017453_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_016125_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_018195_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_007150_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_020899_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_011255_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_007950_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_014332_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_009951_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_002562_leftImg8bit.png
Citypersons/images/train/bochum/bochum_000000_023174_leftImg8bit.png

+ 251
- 0
datasets/data_path/citypersons/bremen.train View File

Citypersons/images/train/bremen/bremen_000193_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000165_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000223_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000032_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000280_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000175_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000076_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000295_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000002_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000084_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000009_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000085_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000244_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000299_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000099_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000206_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000110_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000090_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000228_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000214_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000078_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000037_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000016_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000083_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000144_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000158_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000057_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000105_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000097_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000207_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000140_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000208_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000047_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000253_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000260_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000087_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000026_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000044_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000168_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000136_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000176_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000292_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000235_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000311_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000014_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000191_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000242_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000029_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000104_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000170_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000285_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000224_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000067_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000288_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000131_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000286_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000298_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000036_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000213_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000103_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000255_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000275_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000065_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000094_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000204_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000064_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000171_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000252_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000148_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000287_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000290_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000120_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000221_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000056_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000315_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000205_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000048_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000222_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000313_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000259_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000226_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000186_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000030_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000243_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000055_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000212_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000059_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000303_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000312_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000043_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000174_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000086_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000238_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000075_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000246_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000134_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000066_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000257_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000049_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000185_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000069_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000282_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000229_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000211_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000194_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000309_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000283_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000053_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000218_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000126_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000138_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000179_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000188_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000015_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000198_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000011_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000058_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000019_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000135_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000040_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000182_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000305_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000300_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000233_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000220_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000046_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000314_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000124_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000190_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000081_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000022_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000023_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000128_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000100_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000035_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000273_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000020_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000063_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000248_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000137_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000041_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000250_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000209_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000163_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000304_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000160_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000038_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000210_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000308_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000306_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000025_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000141_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000291_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000061_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000142_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000073_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000054_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000042_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000264_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000070_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000006_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000310_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000187_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000201_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000013_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000106_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000162_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000297_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000072_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000269_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000216_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000199_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000177_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000095_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000098_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000281_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000184_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000254_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000109_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000068_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000028_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000296_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000050_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000077_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000258_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000200_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000196_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000080_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000062_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000079_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000241_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000119_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000268_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000132_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000003_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000045_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000133_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000172_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000266_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000231_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000108_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000034_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000146_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000276_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000008_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000261_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000249_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000251_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000219_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000101_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000139_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000145_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000052_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000157_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000118_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000031_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000007_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000256_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000102_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000051_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000074_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000197_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000089_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000173_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000217_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000180_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000302_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000001_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000143_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000227_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000027_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000262_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000004_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000010_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000116_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000307_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000121_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000271_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000021_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000149_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000012_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000071_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000092_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000017_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000263_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000060_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000178_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000130_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000082_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000301_000019_leftImg8bit.png
Citypersons/images/train/bremen/bremen_000153_000019_leftImg8bit.png

+ 141
- 0
datasets/data_path/citypersons/cologne.train View File

Citypersons/images/train/cologne/cologne_000004_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000029_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000119_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000021_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000081_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000077_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000085_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000040_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000006_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000046_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000140_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000010_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000032_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000078_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000036_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000037_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000045_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000023_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000005_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000087_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000109_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000103_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000069_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000147_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000148_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000128_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000122_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000132_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000080_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000144_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000143_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000101_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000152_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000089_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000093_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000071_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000126_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000053_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000033_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000051_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000055_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000044_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000075_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000083_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000130_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000129_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000066_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000135_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000092_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000073_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000019_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000039_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000104_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000138_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000116_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000043_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000031_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000088_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000011_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000094_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000113_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000015_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000098_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000014_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000145_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000076_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000142_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000007_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000125_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000079_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000054_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000102_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000123_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000091_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000124_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000017_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000118_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000057_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000137_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000022_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000026_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000082_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000012_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000000_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000139_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000072_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000041_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000003_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000008_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000063_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000061_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000064_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000117_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000020_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000131_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000025_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000100_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000030_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000009_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000146_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000084_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000105_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000065_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000047_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000106_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000028_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000108_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000068_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000074_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000067_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000121_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000114_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000134_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000150_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000127_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000059_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000034_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000107_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000095_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000096_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000048_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000052_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000070_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000120_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000001_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000042_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000049_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000141_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000099_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000111_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000058_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000018_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000056_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000090_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000038_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000002_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000136_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000086_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000027_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000133_000019_leftImg8bit.png
Citypersons/images/train/cologne/cologne_000035_000019_leftImg8bit.png

+ 72
- 0
datasets/data_path/citypersons/darmstadt.train View File

Citypersons/images/train/darmstadt/darmstadt_000050_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000071_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000073_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000019_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000046_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000083_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000036_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000001_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000062_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000034_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000044_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000068_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000074_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000075_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000055_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000025_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000029_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000082_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000006_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000053_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000043_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000016_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000031_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000037_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000064_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000048_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000008_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000010_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000078_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000042_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000084_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000045_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000070_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000033_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000059_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000035_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000054_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000018_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000080_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000026_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000030_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000028_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000056_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000024_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000066_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000049_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000003_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000058_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000081_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000002_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000051_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000041_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000023_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000021_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000022_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000007_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000000_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000047_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000067_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000015_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000027_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000061_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000052_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000032_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000017_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000060_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000069_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000076_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000065_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000063_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000072_000019_leftImg8bit.png
Citypersons/images/train/darmstadt/darmstadt_000079_000019_leftImg8bit.png

+ 151
- 0
datasets/data_path/citypersons/dusseldorf.train View File

Citypersons/images/train/dusseldorf/dusseldorf_000114_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000099_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000014_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000204_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000205_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000055_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000052_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000162_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000126_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000118_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000159_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000024_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000077_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000092_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000131_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000021_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000155_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000062_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000179_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000151_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000012_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000160_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000038_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000139_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000152_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000167_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000031_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000081_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000111_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000149_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000108_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000202_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000036_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000170_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000174_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000005_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000173_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000008_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000163_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000022_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000056_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000019_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000140_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000175_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000088_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000078_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000135_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000107_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000124_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000083_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000029_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000009_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000156_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000000_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000143_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000066_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000192_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000082_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000057_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000119_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000079_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000067_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000068_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000172_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000073_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000030_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000037_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000063_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000069_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000209_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000070_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000169_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000178_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000150_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000032_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000080_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000120_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000018_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000176_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000115_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000110_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000026_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000041_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000185_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000189_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000075_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000044_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000071_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000002_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000094_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000093_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000203_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000121_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000136_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000117_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000051_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000193_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000089_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000147_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000013_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000165_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000201_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000206_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000157_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000197_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000153_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000113_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000198_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000164_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000122_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000064_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000123_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000208_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000010_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000134_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000090_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000199_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000187_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000015_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000154_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000035_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000180_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000074_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000025_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000086_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000210_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000195_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000040_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000065_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000200_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000076_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000096_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000158_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000023_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000145_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000072_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000104_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000060_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000125_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000027_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000098_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000211_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000138_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000061_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000190_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000084_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000034_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000045_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000137_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000181_000019_leftImg8bit.png
Citypersons/images/train/dusseldorf/dusseldorf_000059_000019_leftImg8bit.png

+ 88
- 0
datasets/data_path/citypersons/erfurt.train View File

Citypersons/images/train/erfurt/erfurt_000063_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000051_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000067_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000100_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000068_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000052_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000000_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000021_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000091_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000017_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000087_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000098_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000059_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000070_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000071_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000054_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000034_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000086_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000083_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000060_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000106_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000102_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000104_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000072_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000016_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000105_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000074_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000108_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000064_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000007_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000012_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000011_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000097_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000065_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000061_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000053_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000103_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000036_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000062_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000048_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000090_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000082_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000022_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000015_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000050_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000084_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000069_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000005_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000055_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000006_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000101_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000004_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000037_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000032_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000024_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000075_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000080_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000040_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000002_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000042_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000049_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000046_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000023_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000014_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000047_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000029_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000025_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000008_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000057_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000066_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000073_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000020_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000001_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000041_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000076_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000043_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000018_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000085_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000026_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000003_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000035_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000031_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000039_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000038_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000056_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000033_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000028_000019_leftImg8bit.png
Citypersons/images/train/erfurt/erfurt_000093_000019_leftImg8bit.png

+ 243
- 0
datasets/data_path/citypersons/hamburg.train View File

Citypersons/images/train/hamburg/hamburg_000000_073314_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_084746_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_047108_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_067338_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_098862_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_008221_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_041667_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_046566_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_038511_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_057678_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_059720_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_007737_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_068693_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_086499_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_093572_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_000042_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_042885_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_025986_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_077927_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_048750_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_025802_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_028608_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_046510_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_082301_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_103856_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_080169_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_047157_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_038915_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_016928_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_049558_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_053886_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_065983_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_069096_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_104857_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_073549_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_015350_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_065604_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_073672_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_042505_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_104428_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_052122_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_063698_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_090398_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_030279_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_099902_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_067799_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_085321_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_102574_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_002095_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_097447_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_064269_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_067587_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_097086_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_021961_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_080674_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_089491_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_068916_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_080438_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_039420_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_074425_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_044747_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_098616_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_036427_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_032266_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_070334_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_032460_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_040021_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_063403_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_043944_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_031971_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_045437_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_073999_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_092850_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_006322_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_035568_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_045908_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_088054_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_074267_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_085073_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_103075_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_085645_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_066706_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_026675_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_028439_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_062371_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_020211_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_048138_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_019373_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_032906_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_019760_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_003488_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_059339_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_079657_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_083696_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_105464_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_096063_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_053776_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_039264_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_037279_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_088783_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_048494_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_061790_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_073389_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_018592_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_054850_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_064825_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_078579_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_086636_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_046619_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_070444_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_054029_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_077756_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_087216_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_047057_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_078407_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_091900_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_014030_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_037036_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_029676_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_088983_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_073758_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_093325_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_033506_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_016691_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_006192_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_053086_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_001613_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_065843_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_100300_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_079376_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_027304_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_067223_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_060907_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_046872_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_077144_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_089696_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_091155_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_002338_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_098061_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_074545_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_101724_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_057816_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_056229_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_098400_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_003904_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_054555_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_060215_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_029144_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_081299_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_044400_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_038446_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_103367_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_036003_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_076392_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_058591_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_046078_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_036527_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_099109_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_102379_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_105123_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_029378_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_095561_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_020563_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_069417_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_077642_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_062964_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_076966_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_038729_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_088197_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_048960_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_066424_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_037741_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_060586_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_094717_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_062039_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_105296_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_019892_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_044996_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_071675_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_080878_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_055039_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_023472_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_008494_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_005639_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_047390_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_069177_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_069289_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_044251_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_084865_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_050160_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_090742_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_103541_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_087822_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_094185_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_018878_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_055414_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_065055_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_055894_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_092476_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_106102_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_051855_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_001106_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_088939_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_071942_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_053486_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_074694_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_085982_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_071150_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_037161_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_071016_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_062710_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_085413_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_088627_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_096624_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_066988_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_034049_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_045704_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_014940_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_099368_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_004985_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_024251_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_061468_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_091038_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_047220_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_027857_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_052904_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_061048_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_032719_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_083586_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_105724_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_053563_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_028056_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_054220_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_016447_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_082187_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_022524_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_039546_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_030953_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_103186_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_057487_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_013577_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_078842_leftImg8bit.png
Citypersons/images/train/hamburg/hamburg_000000_056508_leftImg8bit.png

+ 188
- 0
datasets/data_path/citypersons/hanover.train View File

Citypersons/images/train/hanover/hanover_000000_015849_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_008200_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_037039_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_045004_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_029455_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_044085_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_014537_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_003224_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_046954_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_002140_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_044195_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_020655_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_005970_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_058189_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_053027_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_026356_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_041610_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_040793_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_048379_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_034347_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_054965_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_046200_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_048274_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_055124_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_015587_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_024136_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_052512_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_038773_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_030781_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_034720_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_005599_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_029325_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_020089_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_007897_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_057532_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_051842_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_012675_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_019456_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_023881_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_027007_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_023975_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_047629_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_019282_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_052729_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_043550_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_043653_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_026804_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_001173_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_046572_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_027561_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_003853_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_052649_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_010553_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_017041_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_013814_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_029769_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_013094_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_036051_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_055800_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_012347_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_056361_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_021337_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_042581_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_032681_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_040221_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_056142_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_035768_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_010403_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_032351_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_040294_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_043102_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_027481_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_038855_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_005175_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_039021_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_056601_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_014319_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_043236_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_011170_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_022645_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_038927_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_051059_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_043822_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_031856_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_007342_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_014713_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_057710_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_011971_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_034935_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_009128_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_047499_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_006355_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_045188_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_052887_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_039470_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_016038_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_056457_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_049005_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_053437_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_008017_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_023614_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_029404_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_013205_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_044622_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_051271_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_032210_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_034141_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_037516_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_042992_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_016558_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_005288_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_004752_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_040051_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_014919_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_051536_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_026743_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_034015_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_028460_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_027650_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_025437_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_026183_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_027282_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_027766_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_033457_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_018546_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_001620_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_049269_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_024276_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_023239_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_029043_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_053604_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_024441_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_040133_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_023276_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_041232_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_052013_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_036562_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_031144_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_009420_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_042770_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_026014_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_042255_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_007780_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_006922_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_004230_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_054276_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_050228_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_034560_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_042382_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_011471_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_046398_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_030889_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_004646_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_019116_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_027998_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_051152_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_046646_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_055937_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_027390_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_035491_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_056800_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_040456_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_046732_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_019672_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_024989_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_025335_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_050398_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_030546_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_018800_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_044344_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_030346_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_045841_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_024719_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_002357_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_045657_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_037298_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_002458_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_030276_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_048508_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_028202_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_045446_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_048765_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_035606_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_047870_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_049465_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_009004_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_055592_leftImg8bit.png
Citypersons/images/train/hanover/hanover_000000_005732_leftImg8bit.png

+ 101
- 0
datasets/data_path/citypersons/jena.train View File

Citypersons/images/train/jena/jena_000078_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000032_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000055_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000067_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000111_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000105_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000021_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000045_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000058_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000096_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000042_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000109_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000065_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000068_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000052_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000051_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000091_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000037_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000050_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000092_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000101_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000081_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000074_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000040_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000030_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000059_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000100_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000034_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000089_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000104_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000080_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000082_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000044_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000026_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000115_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000023_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000095_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000102_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000094_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000010_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000009_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000070_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000039_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000079_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000071_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000018_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000008_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000076_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000090_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000085_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000116_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000049_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000022_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000118_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000004_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000087_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000047_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000007_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000033_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000097_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000028_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000086_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000073_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000056_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000069_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000088_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000103_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000057_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000038_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000061_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000048_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000060_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000027_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000031_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000072_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000043_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000054_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000083_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000077_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000108_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000106_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000084_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000075_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000024_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000110_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000029_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000000_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000117_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000036_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000046_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000062_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000035_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000019_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000112_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000025_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000013_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000113_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000053_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000098_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000066_000019_leftImg8bit.png
Citypersons/images/train/jena/jena_000041_000019_leftImg8bit.png

+ 91
- 0
datasets/data_path/citypersons/krefeld.train View File

Citypersons/images/train/krefeld/krefeld_000000_025434_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_021553_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_029704_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_012353_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_030400_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_015116_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_005252_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_000108_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_023338_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_030701_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_026580_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_024921_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_028378_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_032390_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_026919_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_003096_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_014146_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_029050_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_017342_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_034231_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_020033_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_023510_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_030560_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_011655_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_027954_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_001908_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_002083_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_017042_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_015868_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_013139_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_019125_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_018514_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_022162_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_008305_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_036299_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_019697_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_016342_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_034389_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_034156_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_016863_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_020334_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_010653_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_030221_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_018747_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_021000_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_020873_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_012505_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_020933_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_024604_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_018004_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_021814_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_000316_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_009926_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_027596_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_020624_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_013766_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_025812_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_031257_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_035398_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_008584_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_034686_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_004447_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_024276_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_014673_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_030111_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_005503_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_007325_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_021222_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_015494_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_026269_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_009574_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_014886_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_017489_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_024362_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_003937_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_018866_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_027075_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_033478_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_019791_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_010160_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_023143_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_023698_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_004608_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_009404_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_011483_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_028638_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_010329_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_032614_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_000926_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_015687_leftImg8bit.png
Citypersons/images/train/krefeld/krefeld_000000_006274_leftImg8bit.png

+ 73
- 0
datasets/data_path/citypersons/monchengladbach.train View File

Citypersons/images/train/monchengladbach/monchengladbach_000000_033683_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_001068_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_011383_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_010505_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_025215_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_006169_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_020856_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_010733_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_002255_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_004580_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_020596_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_035650_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_020303_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_002478_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_035083_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_021663_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_019500_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_010280_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_009615_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_005876_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_030662_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_030010_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_009930_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_026006_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000001_002229_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_007098_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_035718_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000001_002353_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_006518_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_001294_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_026908_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_010860_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_012672_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000001_000537_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_027628_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_018445_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_003442_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_032540_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_028883_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000001_000054_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_031005_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_005138_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_023375_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_009690_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_022748_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_023856_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_021104_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_026305_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_024964_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_013352_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000001_001936_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_018294_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_018114_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_017950_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_007851_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000001_000168_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_031360_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_018575_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_007695_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_034930_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_014685_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_018720_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_033454_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_002972_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_034621_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_031623_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_015685_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_009191_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_000383_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_015928_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000001_000876_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_005686_leftImg8bit.png
Citypersons/images/train/monchengladbach/monchengladbach_000000_013228_leftImg8bit.png

+ 324
- 0
datasets/data_path/citypersons/strasbourg.train View File

Citypersons/images/train/strasbourg/strasbourg_000000_015602_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_055934_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_014503_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_054275_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_004660_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_007524_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_045135_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_008771_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_014416_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_023515_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_037090_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_029178_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_019247_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_007813_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_031582_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_020956_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_049399_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_049977_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_059433_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_019891_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_028379_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_008310_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_056330_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_029696_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_049143_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_035255_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_058105_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_025268_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_006995_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029179_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_020432_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_002949_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_013266_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_034375_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_009246_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_033425_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_043886_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_001722_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_000508_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_030122_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_020653_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_012070_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_002081_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_016481_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_045880_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_002216_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_017540_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_026606_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_042869_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_009333_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_031683_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_033062_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_052497_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_021951_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_005995_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_027156_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029281_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_024152_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_051661_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_021651_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_016247_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_061472_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_035008_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_035689_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_051877_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_014743_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_036232_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_030120_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_060173_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_013944_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_025907_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_003489_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_017159_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_000113_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_042434_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_042309_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_053976_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_040761_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_026575_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_039231_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_003632_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_025089_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_033838_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_014066_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_022489_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_051934_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_037645_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_031427_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_052430_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_009471_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_017283_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_030269_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_039114_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_016681_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_057517_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_009795_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_008677_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_003159_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_022067_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_006386_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_034387_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_060821_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_036937_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_025772_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_030839_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_028852_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_015506_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_006483_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_017761_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_024945_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_005289_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_065214_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_047619_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029577_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_035942_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_002354_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_009619_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_028912_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_010755_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_010816_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_055860_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_031223_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_014629_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_009618_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_055273_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_052979_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_011990_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_030706_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029400_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_015131_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_062691_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_014101_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_061685_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_042558_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_039558_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_011880_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_014584_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_001449_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_004745_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_022151_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_057811_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_057930_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_039703_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_025833_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_036697_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_028628_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_047955_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_032346_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_010640_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_024701_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_025426_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_052050_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029839_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_032315_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_030017_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_026741_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_064393_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_016376_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_046324_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_024379_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_040620_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_019355_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_025491_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_014258_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_033747_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_034923_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_030539_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_017675_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_003676_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_015974_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_037776_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_035276_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_013654_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_011775_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029051_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_058373_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_034494_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_026106_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_014033_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_016024_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_034040_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_030941_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_027233_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_040981_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_017469_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_002519_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_013322_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_051574_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_007441_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_019698_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_014931_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_052198_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_017844_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_019229_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_047755_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_019617_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_040564_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_030725_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_027097_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_011225_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_056142_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_060061_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_031976_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_052840_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029339_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_054639_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_061285_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_013863_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_051317_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_003991_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_062362_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_010372_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_017593_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_007727_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_033129_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_053579_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_061384_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_004951_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_008603_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_051134_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_006264_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_033448_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_056857_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_020904_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_038281_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_016253_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_004983_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_002644_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029481_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_015764_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_023064_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_006621_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_005219_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_006153_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_023271_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_028556_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_030997_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_026882_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_014235_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_047702_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_018153_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_004248_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_013574_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_026355_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_063808_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_005249_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_013223_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029729_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_049776_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_064224_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_004106_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_048605_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_017044_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_026998_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_008784_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_010162_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_030324_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_031067_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_052544_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_052297_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_057191_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_017081_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_017450_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_039446_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029915_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_051448_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_004383_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_034633_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_026316_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_000710_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_041215_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_035713_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_010445_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_036480_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_048121_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_030435_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_016436_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_039374_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_063385_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_029020_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_058954_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_012956_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_026611_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_055698_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_001072_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_025351_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_006106_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_005666_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_033027_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_031272_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_011617_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_018155_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_027771_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_005876_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_004112_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_035562_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_004260_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_031602_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_008576_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_023694_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_028822_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_032660_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_018432_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_053222_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_050098_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_016311_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_009097_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_010049_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_059914_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_013767_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_031116_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_028240_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_013914_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_003846_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_000778_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_032962_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_034097_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_047336_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_062542_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_022363_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_029980_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000000_018358_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_001901_leftImg8bit.png
Citypersons/images/train/strasbourg/strasbourg_000001_042235_leftImg8bit.png

+ 165
- 0
datasets/data_path/citypersons/stuttgart.train View File

Citypersons/images/train/stuttgart/stuttgart_000110_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000107_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000087_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000188_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000175_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000147_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000043_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000042_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000191_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000189_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000007_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000112_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000032_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000085_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000077_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000144_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000161_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000149_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000017_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000010_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000067_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000178_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000070_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000026_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000056_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000171_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000157_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000100_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000158_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000125_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000134_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000168_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000156_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000162_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000024_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000037_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000094_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000129_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000069_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000011_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000095_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000002_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000160_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000111_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000039_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000184_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000165_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000046_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000065_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000022_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000135_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000030_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000133_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000172_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000105_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000014_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000142_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000079_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000183_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000173_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000028_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000083_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000071_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000106_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000169_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000126_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000019_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000148_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000078_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000023_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000108_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000153_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000033_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000088_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000027_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000016_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000181_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000044_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000182_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000140_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000186_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000090_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000099_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000124_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000176_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000009_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000008_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000004_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000048_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000020_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000093_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000152_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000155_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000138_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000136_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000103_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000145_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000163_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000101_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000005_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000029_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000063_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000139_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000150_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000123_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000064_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000190_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000092_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000091_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000130_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000164_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000170_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000131_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000031_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000159_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000054_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000167_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000012_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000104_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000021_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000053_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000058_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000001_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000179_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000066_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000034_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000050_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000013_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000068_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000137_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000086_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000187_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000080_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000097_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000192_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000132_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000015_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000025_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000096_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000059_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000102_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000174_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000166_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000180_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000185_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000098_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000141_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000151_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000006_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000047_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000146_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000072_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000073_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000089_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000055_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000193_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000018_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000109_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000076_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000074_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000177_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000127_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000121_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000084_000019_leftImg8bit.png
Citypersons/images/train/stuttgart/stuttgart_000061_000019_leftImg8bit.png

+ 112
- 0
datasets/data_path/citypersons/tubingen.train View File

Citypersons/images/train/tubingen/tubingen_000118_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000021_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000112_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000081_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000059_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000119_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000001_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000077_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000137_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000044_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000071_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000046_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000016_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000006_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000117_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000026_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000047_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000105_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000037_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000075_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000108_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000027_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000029_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000084_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000138_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000030_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000082_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000022_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000056_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000019_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000106_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000034_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000132_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000079_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000131_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000009_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000004_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000126_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000100_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000057_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000113_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000124_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000050_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000032_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000058_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000018_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000123_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000063_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000042_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000068_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000072_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000115_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000062_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000055_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000049_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000060_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000064_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000076_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000085_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000120_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000007_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000033_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000087_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000028_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000111_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000036_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000023_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000089_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000065_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000109_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000002_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000054_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000128_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000038_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000107_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000086_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000020_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000010_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000048_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000122_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000066_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000080_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000008_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000051_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000078_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000043_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000011_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000003_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000074_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000012_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000090_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000140_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000024_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000083_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000143_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000025_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000052_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000114_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000015_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000116_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000139_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000035_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000069_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000017_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000070_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000073_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000125_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000014_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000005_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000031_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000053_000019_leftImg8bit.png
Citypersons/images/train/tubingen/tubingen_000134_000019_leftImg8bit.png

+ 70
- 0
datasets/data_path/citypersons/ulm.train View File

Citypersons/images/train/ulm/ulm_000019_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000063_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000066_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000037_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000091_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000004_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000050_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000092_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000079_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000020_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000071_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000027_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000068_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000002_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000084_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000003_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000013_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000000_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000069_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000065_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000077_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000017_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000012_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000074_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000055_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000072_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000093_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000018_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000028_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000075_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000044_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000043_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000062_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000059_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000052_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000082_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000053_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000006_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000087_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000024_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000007_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000070_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000080_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000057_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000085_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000011_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000064_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000005_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000067_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000060_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000040_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000010_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000073_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000023_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000031_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000089_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000039_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000016_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000058_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000047_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000030_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000078_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000041_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000086_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000051_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000014_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000056_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000015_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000008_000019_leftImg8bit.png
Citypersons/images/train/ulm/ulm_000049_000019_leftImg8bit.png

+ 113
- 0
datasets/data_path/citypersons/weimar.train View File

Citypersons/images/train/weimar/weimar_000018_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000077_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000114_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000036_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000041_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000133_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000089_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000093_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000027_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000058_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000083_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000116_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000053_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000082_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000105_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000084_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000091_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000038_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000043_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000029_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000057_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000101_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000121_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000064_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000039_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000000_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000113_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000034_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000020_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000075_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000109_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000046_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000138_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000025_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000085_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000037_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000092_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000078_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000099_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000107_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000032_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000117_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000028_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000074_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000130_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000096_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000090_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000106_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000111_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000052_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000126_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000065_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000056_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000031_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000019_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000035_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000033_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000127_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000006_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000061_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000071_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000049_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000086_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000055_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000134_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000014_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000135_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000072_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000087_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000003_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000042_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000094_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000129_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000030_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000131_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000128_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000081_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000076_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000007_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000070_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000104_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000066_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000088_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000017_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000073_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000015_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000108_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000102_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000016_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000047_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000098_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000040_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000100_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000050_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000063_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000139_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000136_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000140_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000115_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000112_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000001_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000010_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000103_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000045_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000080_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000095_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000024_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000002_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000026_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000097_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000013_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000132_000019_leftImg8bit.png
Citypersons/images/train/weimar/weimar_000054_000019_leftImg8bit.png

+ 107
- 0
datasets/data_path/citypersons/zurich.train View File

Citypersons/images/train/zurich/zurich_000040_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000074_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000103_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000089_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000037_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000019_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000101_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000072_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000008_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000051_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000015_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000020_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000114_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000062_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000115_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000070_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000069_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000081_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000005_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000119_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000079_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000096_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000110_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000117_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000054_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000002_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000042_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000012_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000085_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000045_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000077_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000084_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000031_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000034_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000011_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000021_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000022_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000073_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000111_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000113_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000090_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000053_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000006_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000120_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000030_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000088_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000010_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000055_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000038_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000035_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000004_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000083_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000016_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000102_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000013_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000066_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000064_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000001_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000099_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000078_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000118_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000067_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000033_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000121_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000028_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000094_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000068_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000014_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000080_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000109_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000023_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000105_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000025_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000024_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000061_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000009_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000060_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000075_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000087_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000027_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000104_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000106_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000000_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000071_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000007_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000065_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000003_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000058_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000018_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000057_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000086_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000063_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000032_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000092_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000052_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000039_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000056_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000043_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000026_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000059_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000095_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000041_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000017_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000076_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000044_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000116_000019_leftImg8bit.png
Citypersons/images/train/zurich/zurich_000029_000019_leftImg8bit.png

+ 2056
- 0
datasets/data_path/eth.train
File diff suppressed because it is too large
View File


+ 999
- 0
datasets/data_path/eth/eth01.train
File diff suppressed because it is too large
View File


+ 446
- 0
datasets/data_path/eth/eth02.train View File

ETHZ/eth02/images/image_00000000_0.png
ETHZ/eth02/images/image_00000001_0.png
ETHZ/eth02/images/image_00000002_0.png
ETHZ/eth02/images/image_00000003_0.png
ETHZ/eth02/images/image_00000004_0.png
ETHZ/eth02/images/image_00000005_0.png
ETHZ/eth02/images/image_00000006_0.png
ETHZ/eth02/images/image_00000007_0.png
ETHZ/eth02/images/image_00000008_0.png
ETHZ/eth02/images/image_00000009_0.png
ETHZ/eth02/images/image_00000010_0.png
ETHZ/eth02/images/image_00000011_0.png
ETHZ/eth02/images/image_00000012_0.png
ETHZ/eth02/images/image_00000013_0.png
ETHZ/eth02/images/image_00000014_0.png
ETHZ/eth02/images/image_00000015_0.png
ETHZ/eth02/images/image_00000016_0.png
ETHZ/eth02/images/image_00000017_0.png
ETHZ/eth02/images/image_00000018_0.png
ETHZ/eth02/images/image_00000019_0.png
ETHZ/eth02/images/image_00000020_0.png
ETHZ/eth02/images/image_00000021_0.png
ETHZ/eth02/images/image_00000022_0.png
ETHZ/eth02/images/image_00000023_0.png
ETHZ/eth02/images/image_00000024_0.png
ETHZ/eth02/images/image_00000025_0.png
ETHZ/eth02/images/image_00000026_0.png
ETHZ/eth02/images/image_00000027_0.png
ETHZ/eth02/images/image_00000028_0.png
ETHZ/eth02/images/image_00000029_0.png
ETHZ/eth02/images/image_00000030_0.png
ETHZ/eth02/images/image_00000031_0.png
ETHZ/eth02/images/image_00000032_0.png
ETHZ/eth02/images/image_00000033_0.png
ETHZ/eth02/images/image_00000034_0.png
ETHZ/eth02/images/image_00000035_0.png
ETHZ/eth02/images/image_00000036_0.png
ETHZ/eth02/images/image_00000037_0.png
ETHZ/eth02/images/image_00000038_0.png
ETHZ/eth02/images/image_00000039_0.png
ETHZ/eth02/images/image_00000040_0.png
ETHZ/eth02/images/image_00000041_0.png
ETHZ/eth02/images/image_00000042_0.png
ETHZ/eth02/images/image_00000043_0.png
ETHZ/eth02/images/image_00000044_0.png
ETHZ/eth02/images/image_00000045_0.png
ETHZ/eth02/images/image_00000046_0.png
ETHZ/eth02/images/image_00000047_0.png
ETHZ/eth02/images/image_00000048_0.png
ETHZ/eth02/images/image_00000049_0.png
ETHZ/eth02/images/image_00000050_0.png
ETHZ/eth02/images/image_00000051_0.png
ETHZ/eth02/images/image_00000052_0.png
ETHZ/eth02/images/image_00000053_0.png
ETHZ/eth02/images/image_00000054_0.png
ETHZ/eth02/images/image_00000055_0.png
ETHZ/eth02/images/image_00000056_0.png
ETHZ/eth02/images/image_00000057_0.png
ETHZ/eth02/images/image_00000058_0.png
ETHZ/eth02/images/image_00000059_0.png
ETHZ/eth02/images/image_00000060_0.png
ETHZ/eth02/images/image_00000061_0.png
ETHZ/eth02/images/image_00000062_0.png
ETHZ/eth02/images/image_00000063_0.png
ETHZ/eth02/images/image_00000064_0.png
ETHZ/eth02/images/image_00000065_0.png
ETHZ/eth02/images/image_00000066_0.png
ETHZ/eth02/images/image_00000067_0.png
ETHZ/eth02/images/image_00000068_0.png
ETHZ/eth02/images/image_00000069_0.png
ETHZ/eth02/images/image_00000070_0.png
ETHZ/eth02/images/image_00000071_0.png
ETHZ/eth02/images/image_00000072_0.png
ETHZ/eth02/images/image_00000073_0.png
ETHZ/eth02/images/image_00000074_0.png
ETHZ/eth02/images/image_00000075_0.png
ETHZ/eth02/images/image_00000076_0.png
ETHZ/eth02/images/image_00000077_0.png
ETHZ/eth02/images/image_00000078_0.png
ETHZ/eth02/images/image_00000079_0.png
ETHZ/eth02/images/image_00000080_0.png
ETHZ/eth02/images/image_00000081_0.png
ETHZ/eth02/images/image_00000082_0.png
ETHZ/eth02/images/image_00000083_0.png
ETHZ/eth02/images/image_00000084_0.png
ETHZ/eth02/images/image_00000085_0.png
ETHZ/eth02/images/image_00000086_0.png
ETHZ/eth02/images/image_00000087_0.png
ETHZ/eth02/images/image_00000088_0.png
ETHZ/eth02/images/image_00000089_0.png
ETHZ/eth02/images/image_00000090_0.png
ETHZ/eth02/images/image_00000091_0.png
ETHZ/eth02/images/image_00000092_0.png
ETHZ/eth02/images/image_00000093_0.png
ETHZ/eth02/images/image_00000094_0.png
ETHZ/eth02/images/image_00000095_0.png
ETHZ/eth02/images/image_00000096_0.png
ETHZ/eth02/images/image_00000097_0.png
ETHZ/eth02/images/image_00000098_0.png
ETHZ/eth02/images/image_00000099_0.png
ETHZ/eth02/images/image_00000100_0.png
ETHZ/eth02/images/image_00000101_0.png
ETHZ/eth02/images/image_00000102_0.png
ETHZ/eth02/images/image_00000103_0.png
ETHZ/eth02/images/image_00000104_0.png
ETHZ/eth02/images/image_00000105_0.png
ETHZ/eth02/images/image_00000106_0.png
ETHZ/eth02/images/image_00000107_0.png
ETHZ/eth02/images/image_00000108_0.png
ETHZ/eth02/images/image_00000109_0.png
ETHZ/eth02/images/image_00000110_0.png
ETHZ/eth02/images/image_00000111_0.png
ETHZ/eth02/images/image_00000112_0.png
ETHZ/eth02/images/image_00000113_0.png
ETHZ/eth02/images/image_00000114_0.png
ETHZ/eth02/images/image_00000115_0.png
ETHZ/eth02/images/image_00000116_0.png
ETHZ/eth02/images/image_00000117_0.png
ETHZ/eth02/images/image_00000118_0.png
ETHZ/eth02/images/image_00000119_0.png
ETHZ/eth02/images/image_00000120_0.png
ETHZ/eth02/images/image_00000121_0.png
ETHZ/eth02/images/image_00000122_0.png
ETHZ/eth02/images/image_00000123_0.png
ETHZ/eth02/images/image_00000124_0.png
ETHZ/eth02/images/image_00000125_0.png
ETHZ/eth02/images/image_00000126_0.png
ETHZ/eth02/images/image_00000127_0.png
ETHZ/eth02/images/image_00000128_0.png
ETHZ/eth02/images/image_00000129_0.png
ETHZ/eth02/images/image_00000130_0.png
ETHZ/eth02/images/image_00000131_0.png
ETHZ/eth02/images/image_00000132_0.png
ETHZ/eth02/images/image_00000133_0.png
ETHZ/eth02/images/image_00000134_0.png
ETHZ/eth02/images/image_00000135_0.png
ETHZ/eth02/images/image_00000136_0.png
ETHZ/eth02/images/image_00000137_0.png
ETHZ/eth02/images/image_00000138_0.png
ETHZ/eth02/images/image_00000139_0.png
ETHZ/eth02/images/image_00000140_0.png
ETHZ/eth02/images/image_00000141_0.png
ETHZ/eth02/images/image_00000142_0.png
ETHZ/eth02/images/image_00000143_0.png
ETHZ/eth02/images/image_00000144_0.png
ETHZ/eth02/images/image_00000145_0.png
ETHZ/eth02/images/image_00000146_0.png
ETHZ/eth02/images/image_00000147_0.png
ETHZ/eth02/images/image_00000148_0.png
ETHZ/eth02/images/image_00000149_0.png
ETHZ/eth02/images/image_00000150_0.png
ETHZ/eth02/images/image_00000151_0.png
ETHZ/eth02/images/image_00000152_0.png
ETHZ/eth02/images/image_00000153_0.png
ETHZ/eth02/images/image_00000154_0.png
ETHZ/eth02/images/image_00000155_0.png
ETHZ/eth02/images/image_00000156_0.png
ETHZ/eth02/images/image_00000157_0.png
ETHZ/eth02/images/image_00000158_0.png
ETHZ/eth02/images/image_00000159_0.png
ETHZ/eth02/images/image_00000160_0.png
ETHZ/eth02/images/image_00000161_0.png
ETHZ/eth02/images/image_00000162_0.png
ETHZ/eth02/images/image_00000163_0.png
ETHZ/eth02/images/image_00000164_0.png
ETHZ/eth02/images/image_00000165_0.png
ETHZ/eth02/images/image_00000166_0.png
ETHZ/eth02/images/image_00000167_0.png
ETHZ/eth02/images/image_00000168_0.png
ETHZ/eth02/images/image_00000169_0.png
ETHZ/eth02/images/image_00000170_0.png
ETHZ/eth02/images/image_00000171_0.png
ETHZ/eth02/images/image_00000172_0.png
ETHZ/eth02/images/image_00000173_0.png
ETHZ/eth02/images/image_00000174_0.png
ETHZ/eth02/images/image_00000175_0.png
ETHZ/eth02/images/image_00000176_0.png
ETHZ/eth02/images/image_00000177_0.png
ETHZ/eth02/images/image_00000178_0.png
ETHZ/eth02/images/image_00000179_0.png
ETHZ/eth02/images/image_00000180_0.png
ETHZ/eth02/images/image_00000181_0.png
ETHZ/eth02/images/image_00000182_0.png
ETHZ/eth02/images/image_00000183_0.png
ETHZ/eth02/images/image_00000184_0.png
ETHZ/eth02/images/image_00000185_0.png
ETHZ/eth02/images/image_00000186_0.png
ETHZ/eth02/images/image_00000187_0.png
ETHZ/eth02/images/image_00000188_0.png
ETHZ/eth02/images/image_00000189_0.png
ETHZ/eth02/images/image_00000190_0.png
ETHZ/eth02/images/image_00000191_0.png
ETHZ/eth02/images/image_00000192_0.png
ETHZ/eth02/images/image_00000193_0.png
ETHZ/eth02/images/image_00000194_0.png
ETHZ/eth02/images/image_00000195_0.png
ETHZ/eth02/images/image_00000196_0.png
ETHZ/eth02/images/image_00000197_0.png
ETHZ/eth02/images/image_00000198_0.png
ETHZ/eth02/images/image_00000199_0.png
ETHZ/eth02/images/image_00000200_0.png
ETHZ/eth02/images/image_00000201_0.png
ETHZ/eth02/images/image_00000202_0.png
ETHZ/eth02/images/image_00000203_0.png
ETHZ/eth02/images/image_00000204_0.png
ETHZ/eth02/images/image_00000205_0.png
ETHZ/eth02/images/image_00000206_0.png
ETHZ/eth02/images/image_00000207_0.png
ETHZ/eth02/images/image_00000208_0.png
ETHZ/eth02/images/image_00000209_0.png
ETHZ/eth02/images/image_00000210_0.png
ETHZ/eth02/images/image_00000211_0.png
ETHZ/eth02/images/image_00000212_0.png
ETHZ/eth02/images/image_00000213_0.png
ETHZ/eth02/images/image_00000214_0.png
ETHZ/eth02/images/image_00000215_0.png
ETHZ/eth02/images/image_00000216_0.png
ETHZ/eth02/images/image_00000217_0.png
ETHZ/eth02/images/image_00000218_0.png
ETHZ/eth02/images/image_00000219_0.png
ETHZ/eth02/images/image_00000220_0.png
ETHZ/eth02/images/image_00000221_0.png
ETHZ/eth02/images/image_00000222_0.png
ETHZ/eth02/images/image_00000223_0.png
ETHZ/eth02/images/image_00000224_0.png
ETHZ/eth02/images/image_00000225_0.png
ETHZ/eth02/images/image_00000226_0.png
ETHZ/eth02/images/image_00000227_0.png
ETHZ/eth02/images/image_00000228_0.png
ETHZ/eth02/images/image_00000229_0.png
ETHZ/eth02/images/image_00000230_0.png
ETHZ/eth02/images/image_00000231_0.png
ETHZ/eth02/images/image_00000232_0.png
ETHZ/eth02/images/image_00000233_0.png
ETHZ/eth02/images/image_00000234_0.png
ETHZ/eth02/images/image_00000235_0.png
ETHZ/eth02/images/image_00000236_0.png
ETHZ/eth02/images/image_00000237_0.png
ETHZ/eth02/images/image_00000238_0.png
ETHZ/eth02/images/image_00000239_0.png
ETHZ/eth02/images/image_00000240_0.png
ETHZ/eth02/images/image_00000241_0.png
ETHZ/eth02/images/image_00000242_0.png
ETHZ/eth02/images/image_00000243_0.png
ETHZ/eth02/images/image_00000244_0.png
ETHZ/eth02/images/image_00000245_0.png
ETHZ/eth02/images/image_00000246_0.png
ETHZ/eth02/images/image_00000247_0.png
ETHZ/eth02/images/image_00000248_0.png
ETHZ/eth02/images/image_00000249_0.png
ETHZ/eth02/images/image_00000250_0.png
ETHZ/eth02/images/image_00000251_0.png
ETHZ/eth02/images/image_00000252_0.png
ETHZ/eth02/images/image_00000253_0.png
ETHZ/eth02/images/image_00000254_0.png
ETHZ/eth02/images/image_00000255_0.png
ETHZ/eth02/images/image_00000256_0.png
ETHZ/eth02/images/image_00000257_0.png
ETHZ/eth02/images/image_00000258_0.png
ETHZ/eth02/images/image_00000259_0.png
ETHZ/eth02/images/image_00000260_0.png
ETHZ/eth02/images/image_00000261_0.png
ETHZ/eth02/images/image_00000262_0.png
ETHZ/eth02/images/image_00000263_0.png
ETHZ/eth02/images/image_00000264_0.png
ETHZ/eth02/images/image_00000265_0.png
ETHZ/eth02/images/image_00000266_0.png
ETHZ/eth02/images/image_00000267_0.png
ETHZ/eth02/images/image_00000268_0.png
ETHZ/eth02/images/image_00000269_0.png
ETHZ/eth02/images/image_00000270_0.png
ETHZ/eth02/images/image_00000271_0.png
ETHZ/eth02/images/image_00000272_0.png
ETHZ/eth02/images/image_00000273_0.png
ETHZ/eth02/images/image_00000274_0.png
ETHZ/eth02/images/image_00000275_0.png
ETHZ/eth02/images/image_00000276_0.png
ETHZ/eth02/images/image_00000277_0.png
ETHZ/eth02/images/image_00000278_0.png
ETHZ/eth02/images/image_00000279_0.png
ETHZ/eth02/images/image_00000280_0.png
ETHZ/eth02/images/image_00000281_0.png
ETHZ/eth02/images/image_00000282_0.png
ETHZ/eth02/images/image_00000283_0.png
ETHZ/eth02/images/image_00000284_0.png
ETHZ/eth02/images/image_00000285_0.png
ETHZ/eth02/images/image_00000286_0.png
ETHZ/eth02/images/image_00000287_0.png
ETHZ/eth02/images/image_00000288_0.png
ETHZ/eth02/images/image_00000289_0.png
ETHZ/eth02/images/image_00000290_0.png
ETHZ/eth02/images/image_00000291_0.png
ETHZ/eth02/images/image_00000292_0.png
ETHZ/eth02/images/image_00000293_0.png
ETHZ/eth02/images/image_00000294_0.png
ETHZ/eth02/images/image_00000295_0.png
ETHZ/eth02/images/image_00000296_0.png
ETHZ/eth02/images/image_00000297_0.png
ETHZ/eth02/images/image_00000298_0.png
ETHZ/eth02/images/image_00000299_0.png
ETHZ/eth02/images/image_00000300_0.png
ETHZ/eth02/images/image_00000301_0.png
ETHZ/eth02/images/image_00000302_0.png
ETHZ/eth02/images/image_00000303_0.png
ETHZ/eth02/images/image_00000304_0.png
ETHZ/eth02/images/image_00000305_0.png
ETHZ/eth02/images/image_00000306_0.png
ETHZ/eth02/images/image_00000307_0.png
ETHZ/eth02/images/image_00000308_0.png
ETHZ/eth02/images/image_00000309_0.png
ETHZ/eth02/images/image_00000310_0.png
ETHZ/eth02/images/image_00000311_0.png
ETHZ/eth02/images/image_00000312_0.png
ETHZ/eth02/images/image_00000313_0.png
ETHZ/eth02/images/image_00000314_0.png
ETHZ/eth02/images/image_00000315_0.png
ETHZ/eth02/images/image_00000316_0.png
ETHZ/eth02/images/image_00000317_0.png
ETHZ/eth02/images/image_00000318_0.png
ETHZ/eth02/images/image_00000319_0.png
ETHZ/eth02/images/image_00000320_0.png
ETHZ/eth02/images/image_00000321_0.png
ETHZ/eth02/images/image_00000322_0.png
ETHZ/eth02/images/image_00000323_0.png
ETHZ/eth02/images/image_00000324_0.png
ETHZ/eth02/images/image_00000325_0.png
ETHZ/eth02/images/image_00000326_0.png
ETHZ/eth02/images/image_00000327_0.png
ETHZ/eth02/images/image_00000328_0.png
ETHZ/eth02/images/image_00000329_0.png
ETHZ/eth02/images/image_00000330_0.png
ETHZ/eth02/images/image_00000331_0.png
ETHZ/eth02/images/image_00000332_0.png
ETHZ/eth02/images/image_00000333_0.png
ETHZ/eth02/images/image_00000334_0.png
ETHZ/eth02/images/image_00000335_0.png
ETHZ/eth02/images/image_00000336_0.png
ETHZ/eth02/images/image_00000337_0.png
ETHZ/eth02/images/image_00000338_0.png
ETHZ/eth02/images/image_00000339_0.png
ETHZ/eth02/images/image_00000340_0.png
ETHZ/eth02/images/image_00000341_0.png
ETHZ/eth02/images/image_00000342_0.png
ETHZ/eth02/images/image_00000343_0.png
ETHZ/eth02/images/image_00000344_0.png
ETHZ/eth02/images/image_00000345_0.png
ETHZ/eth02/images/image_00000346_0.png
ETHZ/eth02/images/image_00000347_0.png
ETHZ/eth02/images/image_00000348_0.png
ETHZ/eth02/images/image_00000349_0.png
ETHZ/eth02/images/image_00000350_0.png
ETHZ/eth02/images/image_00000351_0.png
ETHZ/eth02/images/image_00000352_0.png
ETHZ/eth02/images/image_00000353_0.png
ETHZ/eth02/images/image_00000354_0.png
ETHZ/eth02/images/image_00000355_0.png
ETHZ/eth02/images/image_00000356_0.png
ETHZ/eth02/images/image_00000357_0.png
ETHZ/eth02/images/image_00000358_0.png
ETHZ/eth02/images/image_00000359_0.png
ETHZ/eth02/images/image_00000360_0.png
ETHZ/eth02/images/image_00000361_0.png
ETHZ/eth02/images/image_00000362_0.png
ETHZ/eth02/images/image_00000363_0.png
ETHZ/eth02/images/image_00000364_0.png
ETHZ/eth02/images/image_00000365_0.png
ETHZ/eth02/images/image_00000366_0.png
ETHZ/eth02/images/image_00000367_0.png
ETHZ/eth02/images/image_00000368_0.png
ETHZ/eth02/images/image_00000369_0.png
ETHZ/eth02/images/image_00000370_0.png
ETHZ/eth02/images/image_00000371_0.png
ETHZ/eth02/images/image_00000372_0.png
ETHZ/eth02/images/image_00000373_0.png
ETHZ/eth02/images/image_00000374_0.png
ETHZ/eth02/images/image_00000375_0.png
ETHZ/eth02/images/image_00000376_0.png
ETHZ/eth02/images/image_00000377_0.png
ETHZ/eth02/images/image_00000378_0.png
ETHZ/eth02/images/image_00000379_0.png
ETHZ/eth02/images/image_00000380_0.png
ETHZ/eth02/images/image_00000381_0.png
ETHZ/eth02/images/image_00000382_0.png
ETHZ/eth02/images/image_00000383_0.png
ETHZ/eth02/images/image_00000384_0.png
ETHZ/eth02/images/image_00000385_0.png
ETHZ/eth02/images/image_00000386_0.png
ETHZ/eth02/images/image_00000387_0.png
ETHZ/eth02/images/image_00000388_0.png
ETHZ/eth02/images/image_00000389_0.png
ETHZ/eth02/images/image_00000390_0.png
ETHZ/eth02/images/image_00000391_0.png
ETHZ/eth02/images/image_00000392_0.png
ETHZ/eth02/images/image_00000393_0.png
ETHZ/eth02/images/image_00000394_0.png
ETHZ/eth02/images/image_00000395_0.png
ETHZ/eth02/images/image_00000396_0.png
ETHZ/eth02/images/image_00000397_0.png
ETHZ/eth02/images/image_00000398_0.png
ETHZ/eth02/images/image_00000399_0.png
ETHZ/eth02/images/image_00000400_0.png
ETHZ/eth02/images/image_00000401_0.png
ETHZ/eth02/images/image_00000402_0.png
ETHZ/eth02/images/image_00000403_0.png
ETHZ/eth02/images/image_00000404_0.png
ETHZ/eth02/images/image_00000405_0.png
ETHZ/eth02/images/image_00000406_0.png
ETHZ/eth02/images/image_00000407_0.png
ETHZ/eth02/images/image_00000408_0.png
ETHZ/eth02/images/image_00000409_0.png
ETHZ/eth02/images/image_00000410_0.png
ETHZ/eth02/images/image_00000411_0.png
ETHZ/eth02/images/image_00000412_0.png
ETHZ/eth02/images/image_00000413_0.png
ETHZ/eth02/images/image_00000414_0.png
ETHZ/eth02/images/image_00000415_0.png
ETHZ/eth02/images/image_00000416_0.png
ETHZ/eth02/images/image_00000417_0.png
ETHZ/eth02/images/image_00000418_0.png
ETHZ/eth02/images/image_00000419_0.png
ETHZ/eth02/images/image_00000420_0.png
ETHZ/eth02/images/image_00000421_0.png
ETHZ/eth02/images/image_00000422_0.png
ETHZ/eth02/images/image_00000423_0.png
ETHZ/eth02/images/image_00000424_0.png
ETHZ/eth02/images/image_00000425_0.png
ETHZ/eth02/images/image_00000426_0.png
ETHZ/eth02/images/image_00000427_0.png
ETHZ/eth02/images/image_00000428_0.png
ETHZ/eth02/images/image_00000429_0.png
ETHZ/eth02/images/image_00000430_0.png
ETHZ/eth02/images/image_00000431_0.png
ETHZ/eth02/images/image_00000432_0.png
ETHZ/eth02/images/image_00000433_0.png
ETHZ/eth02/images/image_00000434_0.png
ETHZ/eth02/images/image_00000435_0.png
ETHZ/eth02/images/image_00000436_0.png
ETHZ/eth02/images/image_00000437_0.png
ETHZ/eth02/images/image_00000438_0.png
ETHZ/eth02/images/image_00000439_0.png
ETHZ/eth02/images/image_00000440_0.png
ETHZ/eth02/images/image_00000441_0.png
ETHZ/eth02/images/image_00000442_0.png
ETHZ/eth02/images/image_00000443_0.png
ETHZ/eth02/images/image_00000444_0.png
ETHZ/eth02/images/image_00000445_0.png

+ 354
- 0
datasets/data_path/eth/eth03.train View File

ETHZ/eth03/images/image_00000100_0.png
ETHZ/eth03/images/image_00000101_0.png
ETHZ/eth03/images/image_00000102_0.png
ETHZ/eth03/images/image_00000103_0.png
ETHZ/eth03/images/image_00000104_0.png
ETHZ/eth03/images/image_00000105_0.png
ETHZ/eth03/images/image_00000106_0.png
ETHZ/eth03/images/image_00000107_0.png
ETHZ/eth03/images/image_00000108_0.png
ETHZ/eth03/images/image_00000109_0.png
ETHZ/eth03/images/image_00000110_0.png
ETHZ/eth03/images/image_00000111_0.png
ETHZ/eth03/images/image_00000112_0.png
ETHZ/eth03/images/image_00000113_0.png
ETHZ/eth03/images/image_00000114_0.png
ETHZ/eth03/images/image_00000115_0.png
ETHZ/eth03/images/image_00000116_0.png
ETHZ/eth03/images/image_00000117_0.png
ETHZ/eth03/images/image_00000118_0.png
ETHZ/eth03/images/image_00000119_0.png
ETHZ/eth03/images/image_00000120_0.png
ETHZ/eth03/images/image_00000121_0.png
ETHZ/eth03/images/image_00000122_0.png
ETHZ/eth03/images/image_00000123_0.png
ETHZ/eth03/images/image_00000124_0.png
ETHZ/eth03/images/image_00000125_0.png
ETHZ/eth03/images/image_00000126_0.png
ETHZ/eth03/images/image_00000127_0.png
ETHZ/eth03/images/image_00000128_0.png
ETHZ/eth03/images/image_00000129_0.png
ETHZ/eth03/images/image_00000130_0.png
ETHZ/eth03/images/image_00000131_0.png
ETHZ/eth03/images/image_00000132_0.png
ETHZ/eth03/images/image_00000133_0.png
ETHZ/eth03/images/image_00000134_0.png
ETHZ/eth03/images/image_00000135_0.png
ETHZ/eth03/images/image_00000136_0.png
ETHZ/eth03/images/image_00000137_0.png
ETHZ/eth03/images/image_00000138_0.png
ETHZ/eth03/images/image_00000139_0.png
ETHZ/eth03/images/image_00000140_0.png
ETHZ/eth03/images/image_00000141_0.png
ETHZ/eth03/images/image_00000142_0.png
ETHZ/eth03/images/image_00000143_0.png
ETHZ/eth03/images/image_00000144_0.png
ETHZ/eth03/images/image_00000145_0.png
ETHZ/eth03/images/image_00000146_0.png
ETHZ/eth03/images/image_00000147_0.png
ETHZ/eth03/images/image_00000148_0.png
ETHZ/eth03/images/image_00000149_0.png
ETHZ/eth03/images/image_00000150_0.png
ETHZ/eth03/images/image_00000151_0.png
ETHZ/eth03/images/image_00000152_0.png
ETHZ/eth03/images/image_00000153_0.png
ETHZ/eth03/images/image_00000154_0.png
ETHZ/eth03/images/image_00000155_0.png
ETHZ/eth03/images/image_00000156_0.png
ETHZ/eth03/images/image_00000157_0.png
ETHZ/eth03/images/image_00000158_0.png
ETHZ/eth03/images/image_00000159_0.png
ETHZ/eth03/images/image_00000160_0.png
ETHZ/eth03/images/image_00000161_0.png
ETHZ/eth03/images/image_00000162_0.png
ETHZ/eth03/images/image_00000163_0.png
ETHZ/eth03/images/image_00000164_0.png
ETHZ/eth03/images/image_00000165_0.png
ETHZ/eth03/images/image_00000166_0.png
ETHZ/eth03/images/image_00000167_0.png
ETHZ/eth03/images/image_00000168_0.png
ETHZ/eth03/images/image_00000169_0.png
ETHZ/eth03/images/image_00000170_0.png
ETHZ/eth03/images/image_00000171_0.png
ETHZ/eth03/images/image_00000172_0.png
ETHZ/eth03/images/image_00000173_0.png
ETHZ/eth03/images/image_00000174_0.png
ETHZ/eth03/images/image_00000175_0.png
ETHZ/eth03/images/image_00000176_0.png
ETHZ/eth03/images/image_00000177_0.png
ETHZ/eth03/images/image_00000178_0.png
ETHZ/eth03/images/image_00000179_0.png
ETHZ/eth03/images/image_00000180_0.png
ETHZ/eth03/images/image_00000181_0.png
ETHZ/eth03/images/image_00000182_0.png
ETHZ/eth03/images/image_00000183_0.png
ETHZ/eth03/images/image_00000184_0.png
ETHZ/eth03/images/image_00000185_0.png
ETHZ/eth03/images/image_00000186_0.png
ETHZ/eth03/images/image_00000187_0.png
ETHZ/eth03/images/image_00000188_0.png
ETHZ/eth03/images/image_00000189_0.png
ETHZ/eth03/images/image_00000190_0.png
ETHZ/eth03/images/image_00000191_0.png
ETHZ/eth03/images/image_00000192_0.png
ETHZ/eth03/images/image_00000193_0.png
ETHZ/eth03/images/image_00000194_0.png
ETHZ/eth03/images/image_00000195_0.png
ETHZ/eth03/images/image_00000196_0.png
ETHZ/eth03/images/image_00000197_0.png
ETHZ/eth03/images/image_00000198_0.png
ETHZ/eth03/images/image_00000199_0.png
ETHZ/eth03/images/image_00000200_0.png
ETHZ/eth03/images/image_00000201_0.png
ETHZ/eth03/images/image_00000202_0.png
ETHZ/eth03/images/image_00000203_0.png
ETHZ/eth03/images/image_00000204_0.png
ETHZ/eth03/images/image_00000205_0.png
ETHZ/eth03/images/image_00000206_0.png
ETHZ/eth03/images/image_00000207_0.png
ETHZ/eth03/images/image_00000208_0.png
ETHZ/eth03/images/image_00000209_0.png
ETHZ/eth03/images/image_00000210_0.png
ETHZ/eth03/images/image_00000211_0.png
ETHZ/eth03/images/image_00000212_0.png
ETHZ/eth03/images/image_00000213_0.png
ETHZ/eth03/images/image_00000214_0.png
ETHZ/eth03/images/image_00000215_0.png
ETHZ/eth03/images/image_00000216_0.png
ETHZ/eth03/images/image_00000217_0.png
ETHZ/eth03/images/image_00000218_0.png
ETHZ/eth03/images/image_00000219_0.png
ETHZ/eth03/images/image_00000220_0.png
ETHZ/eth03/images/image_00000221_0.png
ETHZ/eth03/images/image_00000222_0.png
ETHZ/eth03/images/image_00000223_0.png
ETHZ/eth03/images/image_00000224_0.png
ETHZ/eth03/images/image_00000225_0.png
ETHZ/eth03/images/image_00000226_0.png
ETHZ/eth03/images/image_00000227_0.png
ETHZ/eth03/images/image_00000228_0.png
ETHZ/eth03/images/image_00000229_0.png
ETHZ/eth03/images/image_00000230_0.png
ETHZ/eth03/images/image_00000231_0.png
ETHZ/eth03/images/image_00000232_0.png
ETHZ/eth03/images/image_00000233_0.png
ETHZ/eth03/images/image_00000234_0.png
ETHZ/eth03/images/image_00000235_0.png
ETHZ/eth03/images/image_00000236_0.png
ETHZ/eth03/images/image_00000237_0.png
ETHZ/eth03/images/image_00000238_0.png
ETHZ/eth03/images/image_00000239_0.png
ETHZ/eth03/images/image_00000240_0.png
ETHZ/eth03/images/image_00000241_0.png
ETHZ/eth03/images/image_00000242_0.png
ETHZ/eth03/images/image_00000243_0.png
ETHZ/eth03/images/image_00000244_0.png
ETHZ/eth03/images/image_00000245_0.png
ETHZ/eth03/images/image_00000246_0.png
ETHZ/eth03/images/image_00000247_0.png
ETHZ/eth03/images/image_00000248_0.png
ETHZ/eth03/images/image_00000249_0.png
ETHZ/eth03/images/image_00000250_0.png
ETHZ/eth03/images/image_00000251_0.png
ETHZ/eth03/images/image_00000252_0.png
ETHZ/eth03/images/image_00000253_0.png
ETHZ/eth03/images/image_00000254_0.png
ETHZ/eth03/images/image_00000255_0.png
ETHZ/eth03/images/image_00000256_0.png
ETHZ/eth03/images/image_00000257_0.png
ETHZ/eth03/images/image_00000258_0.png
ETHZ/eth03/images/image_00000259_0.png
ETHZ/eth03/images/image_00000260_0.png
ETHZ/eth03/images/image_00000261_0.png
ETHZ/eth03/images/image_00000262_0.png
ETHZ/eth03/images/image_00000263_0.png
ETHZ/eth03/images/image_00000264_0.png
ETHZ/eth03/images/image_00000265_0.png
ETHZ/eth03/images/image_00000266_0.png
ETHZ/eth03/images/image_00000267_0.png
ETHZ/eth03/images/image_00000268_0.png
ETHZ/eth03/images/image_00000269_0.png
ETHZ/eth03/images/image_00000270_0.png
ETHZ/eth03/images/image_00000271_0.png
ETHZ/eth03/images/image_00000272_0.png
ETHZ/eth03/images/image_00000273_0.png
ETHZ/eth03/images/image_00000274_0.png
ETHZ/eth03/images/image_00000275_0.png
ETHZ/eth03/images/image_00000276_0.png
ETHZ/eth03/images/image_00000277_0.png
ETHZ/eth03/images/image_00000278_0.png
ETHZ/eth03/images/image_00000279_0.png
ETHZ/eth03/images/image_00000280_0.png
ETHZ/eth03/images/image_00000281_0.png
ETHZ/eth03/images/image_00000282_0.png
ETHZ/eth03/images/image_00000283_0.png
ETHZ/eth03/images/image_00000284_0.png
ETHZ/eth03/images/image_00000285_0.png
ETHZ/eth03/images/image_00000286_0.png
ETHZ/eth03/images/image_00000287_0.png
ETHZ/eth03/images/image_00000288_0.png
ETHZ/eth03/images/image_00000289_0.png
ETHZ/eth03/images/image_00000290_0.png
ETHZ/eth03/images/image_00000291_0.png
ETHZ/eth03/images/image_00000292_0.png
ETHZ/eth03/images/image_00000293_0.png
ETHZ/eth03/images/image_00000294_0.png
ETHZ/eth03/images/image_00000295_0.png
ETHZ/eth03/images/image_00000296_0.png
ETHZ/eth03/images/image_00000297_0.png
ETHZ/eth03/images/image_00000298_0.png
ETHZ/eth03/images/image_00000299_0.png
ETHZ/eth03/images/image_00000300_0.png
ETHZ/eth03/images/image_00000301_0.png
ETHZ/eth03/images/image_00000302_0.png
ETHZ/eth03/images/image_00000303_0.png
ETHZ/eth03/images/image_00000304_0.png
ETHZ/eth03/images/image_00000305_0.png
ETHZ/eth03/images/image_00000306_0.png
ETHZ/eth03/images/image_00000307_0.png
ETHZ/eth03/images/image_00000308_0.png
ETHZ/eth03/images/image_00000309_0.png
ETHZ/eth03/images/image_00000310_0.png
ETHZ/eth03/images/image_00000311_0.png
ETHZ/eth03/images/image_00000312_0.png
ETHZ/eth03/images/image_00000313_0.png
ETHZ/eth03/images/image_00000314_0.png
ETHZ/eth03/images/image_00000315_0.png
ETHZ/eth03/images/image_00000316_0.png
ETHZ/eth03/images/image_00000317_0.png
ETHZ/eth03/images/image_00000318_0.png
ETHZ/eth03/images/image_00000319_0.png
ETHZ/eth03/images/image_00000320_0.png
ETHZ/eth03/images/image_00000321_0.png
ETHZ/eth03/images/image_00000322_0.png
ETHZ/eth03/images/image_00000323_0.png
ETHZ/eth03/images/image_00000324_0.png
ETHZ/eth03/images/image_00000325_0.png
ETHZ/eth03/images/image_00000326_0.png
ETHZ/eth03/images/image_00000327_0.png
ETHZ/eth03/images/image_00000328_0.png
ETHZ/eth03/images/image_00000329_0.png
ETHZ/eth03/images/image_00000330_0.png
ETHZ/eth03/images/image_00000331_0.png
ETHZ/eth03/images/image_00000332_0.png
ETHZ/eth03/images/image_00000333_0.png
ETHZ/eth03/images/image_00000334_0.png
ETHZ/eth03/images/image_00000335_0.png
ETHZ/eth03/images/image_00000336_0.png
ETHZ/eth03/images/image_00000337_0.png
ETHZ/eth03/images/image_00000338_0.png
ETHZ/eth03/images/image_00000339_0.png
ETHZ/eth03/images/image_00000340_0.png
ETHZ/eth03/images/image_00000341_0.png
ETHZ/eth03/images/image_00000342_0.png
ETHZ/eth03/images/image_00000343_0.png
ETHZ/eth03/images/image_00000344_0.png
ETHZ/eth03/images/image_00000345_0.png
ETHZ/eth03/images/image_00000346_0.png
ETHZ/eth03/images/image_00000347_0.png
ETHZ/eth03/images/image_00000348_0.png
ETHZ/eth03/images/image_00000349_0.png
ETHZ/eth03/images/image_00000350_0.png
ETHZ/eth03/images/image_00000351_0.png
ETHZ/eth03/images/image_00000352_0.png
ETHZ/eth03/images/image_00000353_0.png
ETHZ/eth03/images/image_00000354_0.png
ETHZ/eth03/images/image_00000355_0.png
ETHZ/eth03/images/image_00000356_0.png
ETHZ/eth03/images/image_00000357_0.png
ETHZ/eth03/images/image_00000358_0.png
ETHZ/eth03/images/image_00000359_0.png
ETHZ/eth03/images/image_00000360_0.png
ETHZ/eth03/images/image_00000361_0.png
ETHZ/eth03/images/image_00000362_0.png
ETHZ/eth03/images/image_00000363_0.png
ETHZ/eth03/images/image_00000364_0.png
ETHZ/eth03/images/image_00000365_0.png
ETHZ/eth03/images/image_00000366_0.png
ETHZ/eth03/images/image_00000367_0.png
ETHZ/eth03/images/image_00000368_0.png
ETHZ/eth03/images/image_00000369_0.png
ETHZ/eth03/images/image_00000370_0.png
ETHZ/eth03/images/image_00000371_0.png
ETHZ/eth03/images/image_00000372_0.png
ETHZ/eth03/images/image_00000373_0.png
ETHZ/eth03/images/image_00000374_0.png
ETHZ/eth03/images/image_00000375_0.png
ETHZ/eth03/images/image_00000376_0.png
ETHZ/eth03/images/image_00000377_0.png
ETHZ/eth03/images/image_00000378_0.png
ETHZ/eth03/images/image_00000379_0.png
ETHZ/eth03/images/image_00000380_0.png
ETHZ/eth03/images/image_00000381_0.png
ETHZ/eth03/images/image_00000382_0.png
ETHZ/eth03/images/image_00000383_0.png
ETHZ/eth03/images/image_00000384_0.png
ETHZ/eth03/images/image_00000385_0.png
ETHZ/eth03/images/image_00000386_0.png
ETHZ/eth03/images/image_00000387_0.png
ETHZ/eth03/images/image_00000388_0.png
ETHZ/eth03/images/image_00000389_0.png
ETHZ/eth03/images/image_00000390_0.png
ETHZ/eth03/images/image_00000391_0.png
ETHZ/eth03/images/image_00000392_0.png
ETHZ/eth03/images/image_00000393_0.png
ETHZ/eth03/images/image_00000394_0.png
ETHZ/eth03/images/image_00000395_0.png
ETHZ/eth03/images/image_00000396_0.png
ETHZ/eth03/images/image_00000397_0.png
ETHZ/eth03/images/image_00000398_0.png
ETHZ/eth03/images/image_00000399_0.png
ETHZ/eth03/images/image_00000400_0.png
ETHZ/eth03/images/image_00000401_0.png
ETHZ/eth03/images/image_00000402_0.png
ETHZ/eth03/images/image_00000403_0.png
ETHZ/eth03/images/image_00000404_0.png
ETHZ/eth03/images/image_00000405_0.png
ETHZ/eth03/images/image_00000406_0.png
ETHZ/eth03/images/image_00000407_0.png
ETHZ/eth03/images/image_00000408_0.png
ETHZ/eth03/images/image_00000409_0.png
ETHZ/eth03/images/image_00000410_0.png
ETHZ/eth03/images/image_00000411_0.png
ETHZ/eth03/images/image_00000412_0.png
ETHZ/eth03/images/image_00000413_0.png
ETHZ/eth03/images/image_00000414_0.png
ETHZ/eth03/images/image_00000415_0.png
ETHZ/eth03/images/image_00000416_0.png
ETHZ/eth03/images/image_00000417_0.png
ETHZ/eth03/images/image_00000418_0.png
ETHZ/eth03/images/image_00000419_0.png
ETHZ/eth03/images/image_00000420_0.png
ETHZ/eth03/images/image_00000421_0.png
ETHZ/eth03/images/image_00000422_0.png
ETHZ/eth03/images/image_00000423_0.png
ETHZ/eth03/images/image_00000424_0.png
ETHZ/eth03/images/image_00000425_0.png
ETHZ/eth03/images/image_00000426_0.png
ETHZ/eth03/images/image_00000427_0.png
ETHZ/eth03/images/image_00000428_0.png
ETHZ/eth03/images/image_00000429_0.png
ETHZ/eth03/images/image_00000430_0.png
ETHZ/eth03/images/image_00000431_0.png
ETHZ/eth03/images/image_00000432_0.png
ETHZ/eth03/images/image_00000433_0.png
ETHZ/eth03/images/image_00000434_0.png
ETHZ/eth03/images/image_00000435_0.png
ETHZ/eth03/images/image_00000436_0.png
ETHZ/eth03/images/image_00000437_0.png
ETHZ/eth03/images/image_00000438_0.png
ETHZ/eth03/images/image_00000439_0.png
ETHZ/eth03/images/image_00000440_0.png
ETHZ/eth03/images/image_00000441_0.png
ETHZ/eth03/images/image_00000442_0.png
ETHZ/eth03/images/image_00000443_0.png
ETHZ/eth03/images/image_00000444_0.png
ETHZ/eth03/images/image_00000445_0.png
ETHZ/eth03/images/image_00000446_0.png
ETHZ/eth03/images/image_00000447_0.png
ETHZ/eth03/images/image_00000448_0.png
ETHZ/eth03/images/image_00000449_0.png
ETHZ/eth03/images/image_00000450_0.png
ETHZ/eth03/images/image_00000451_0.png
ETHZ/eth03/images/image_00000452_0.png
ETHZ/eth03/images/image_00000453_0.png

+ 56
- 0
datasets/data_path/eth/eth05.train View File

ETHZ/eth05/images/image_00000000_0.png
ETHZ/eth05/images/image_00000004_0.png
ETHZ/eth05/images/image_00000008_0.png
ETHZ/eth05/images/image_00000012_0.png
ETHZ/eth05/images/image_00000016_0.png
ETHZ/eth05/images/image_00000022_0.png
ETHZ/eth05/images/image_00000026_0.png
ETHZ/eth05/images/image_00000030_0.png
ETHZ/eth05/images/image_00000034_0.png
ETHZ/eth05/images/image_00000038_0.png
ETHZ/eth05/images/image_00000042_0.png
ETHZ/eth05/images/image_00000046_0.png
ETHZ/eth05/images/image_00000050_0.png
ETHZ/eth05/images/image_00000054_0.png
ETHZ/eth05/images/image_00000058_0.png
ETHZ/eth05/images/image_00000062_0.png
ETHZ/eth05/images/image_00000066_0.png
ETHZ/eth05/images/image_00000070_0.png
ETHZ/eth05/images/image_00000074_0.png
ETHZ/eth05/images/image_00000078_0.png
ETHZ/eth05/images/image_00000082_0.png
ETHZ/eth05/images/image_00000086_0.png
ETHZ/eth05/images/image_00000090_0.png
ETHZ/eth05/images/image_00000094_0.png
ETHZ/eth05/images/image_00000098_0.png
ETHZ/eth05/images/image_00000101_0.png
ETHZ/eth05/images/image_00000105_0.png
ETHZ/eth05/images/image_00000109_0.png
ETHZ/eth05/images/image_00000113_0.png
ETHZ/eth05/images/image_00000115_0.png
ETHZ/eth05/images/image_00000119_0.png
ETHZ/eth05/images/image_00000123_0.png
ETHZ/eth05/images/image_00000127_0.png
ETHZ/eth05/images/image_00000130_0.png
ETHZ/eth05/images/image_00000134_0.png
ETHZ/eth05/images/image_00000138_0.png
ETHZ/eth05/images/image_00000142_0.png
ETHZ/eth05/images/image_00000145_0.png
ETHZ/eth05/images/image_00000149_0.png
ETHZ/eth05/images/image_00000153_0.png
ETHZ/eth05/images/image_00000157_0.png
ETHZ/eth05/images/image_00000161_0.png
ETHZ/eth05/images/image_00000165_0.png
ETHZ/eth05/images/image_00000169_0.png
ETHZ/eth05/images/image_00000173_0.png
ETHZ/eth05/images/image_00000177_0.png
ETHZ/eth05/images/image_00000181_0.png
ETHZ/eth05/images/image_00000185_0.png
ETHZ/eth05/images/image_00000189_0.png
ETHZ/eth05/images/image_00000193_0.png
ETHZ/eth05/images/image_00000197_0.png
ETHZ/eth05/images/image_00000201_0.png
ETHZ/eth05/images/image_00000205_0.png
ETHZ/eth05/images/image_00000209_0.png
ETHZ/eth05/images/image_00000213_0.png
ETHZ/eth05/images/image_00000217_0.png

+ 201
- 0
datasets/data_path/eth/eth07.train View File

ETHZ/eth07/images/image_00004900_0.png
ETHZ/eth07/images/image_00004904_0.png
ETHZ/eth07/images/image_00004908_0.png
ETHZ/eth07/images/image_00004912_0.png
ETHZ/eth07/images/image_00004916_0.png
ETHZ/eth07/images/image_00004920_0.png
ETHZ/eth07/images/image_00004924_0.png
ETHZ/eth07/images/image_00004928_0.png
ETHZ/eth07/images/image_00004932_0.png
ETHZ/eth07/images/image_00004936_0.png
ETHZ/eth07/images/image_00004940_0.png
ETHZ/eth07/images/image_00004944_0.png
ETHZ/eth07/images/image_00004948_0.png
ETHZ/eth07/images/image_00004952_0.png
ETHZ/eth07/images/image_00004956_0.png
ETHZ/eth07/images/image_00004960_0.png
ETHZ/eth07/images/image_00004964_0.png
ETHZ/eth07/images/image_00004968_0.png
ETHZ/eth07/images/image_00004972_0.png
ETHZ/eth07/images/image_00004976_0.png
ETHZ/eth07/images/image_00004980_0.png
ETHZ/eth07/images/image_00004984_0.png
ETHZ/eth07/images/image_00004988_0.png
ETHZ/eth07/images/image_00004992_0.png
ETHZ/eth07/images/image_00004996_0.png
ETHZ/eth07/images/image_00005000_0.png
ETHZ/eth07/images/image_00005004_0.png
ETHZ/eth07/images/image_00005008_0.png
ETHZ/eth07/images/image_00005012_0.png
ETHZ/eth07/images/image_00005016_0.png
ETHZ/eth07/images/image_00005020_0.png
ETHZ/eth07/images/image_00005024_0.png
ETHZ/eth07/images/image_00005028_0.png
ETHZ/eth07/images/image_00005032_0.png
ETHZ/eth07/images/image_00005036_0.png
ETHZ/eth07/images/image_00005040_0.png
ETHZ/eth07/images/image_00005044_0.png
ETHZ/eth07/images/image_00005048_0.png
ETHZ/eth07/images/image_00005052_0.png
ETHZ/eth07/images/image_00005056_0.png
ETHZ/eth07/images/image_00005060_0.png
ETHZ/eth07/images/image_00005064_0.png
ETHZ/eth07/images/image_00005068_0.png
ETHZ/eth07/images/image_00005072_0.png
ETHZ/eth07/images/image_00005076_0.png
ETHZ/eth07/images/image_00005080_0.png
ETHZ/eth07/images/image_00005084_0.png
ETHZ/eth07/images/image_00005088_0.png
ETHZ/eth07/images/image_00005092_0.png
ETHZ/eth07/images/image_00005096_0.png
ETHZ/eth07/images/image_00005100_0.png
ETHZ/eth07/images/image_00005104_0.png
ETHZ/eth07/images/image_00005108_0.png
ETHZ/eth07/images/image_00005112_0.png
ETHZ/eth07/images/image_00005116_0.png
ETHZ/eth07/images/image_00005120_0.png
ETHZ/eth07/images/image_00005124_0.png
ETHZ/eth07/images/image_00005128_0.png
ETHZ/eth07/images/image_00005132_0.png
ETHZ/eth07/images/image_00005136_0.png
ETHZ/eth07/images/image_00005140_0.png
ETHZ/eth07/images/image_00005144_0.png
ETHZ/eth07/images/image_00005148_0.png
ETHZ/eth07/images/image_00005152_0.png
ETHZ/eth07/images/image_00005156_0.png
ETHZ/eth07/images/image_00005160_0.png
ETHZ/eth07/images/image_00005164_0.png
ETHZ/eth07/images/image_00005168_0.png
ETHZ/eth07/images/image_00005172_0.png
ETHZ/eth07/images/image_00005176_0.png
ETHZ/eth07/images/image_00005180_0.png
ETHZ/eth07/images/image_00005184_0.png
ETHZ/eth07/images/image_00005188_0.png
ETHZ/eth07/images/image_00005192_0.png
ETHZ/eth07/images/image_00005196_0.png
ETHZ/eth07/images/image_00005200_0.png
ETHZ/eth07/images/image_00005204_0.png
ETHZ/eth07/images/image_00005208_0.png
ETHZ/eth07/images/image_00005212_0.png
ETHZ/eth07/images/image_00005216_0.png
ETHZ/eth07/images/image_00005220_0.png
ETHZ/eth07/images/image_00005224_0.png
ETHZ/eth07/images/image_00005228_0.png
ETHZ/eth07/images/image_00005232_0.png
ETHZ/eth07/images/image_00005236_0.png
ETHZ/eth07/images/image_00005240_0.png
ETHZ/eth07/images/image_00005244_0.png
ETHZ/eth07/images/image_00005248_0.png
ETHZ/eth07/images/image_00005252_0.png
ETHZ/eth07/images/image_00005256_0.png
ETHZ/eth07/images/image_00005260_0.png
ETHZ/eth07/images/image_00005264_0.png
ETHZ/eth07/images/image_00005268_0.png
ETHZ/eth07/images/image_00005272_0.png
ETHZ/eth07/images/image_00005276_0.png
ETHZ/eth07/images/image_00005280_0.png
ETHZ/eth07/images/image_00005284_0.png
ETHZ/eth07/images/image_00005288_0.png
ETHZ/eth07/images/image_00005292_0.png
ETHZ/eth07/images/image_00005296_0.png
ETHZ/eth07/images/image_00005300_0.png
ETHZ/eth07/images/image_00005304_0.png
ETHZ/eth07/images/image_00005308_0.png
ETHZ/eth07/images/image_00005312_0.png
ETHZ/eth07/images/image_00005316_0.png
ETHZ/eth07/images/image_00005320_0.png
ETHZ/eth07/images/image_00005324_0.png
ETHZ/eth07/images/image_00005328_0.png
ETHZ/eth07/images/image_00005332_0.png
ETHZ/eth07/images/image_00005336_0.png
ETHZ/eth07/images/image_00005340_0.png
ETHZ/eth07/images/image_00005344_0.png
ETHZ/eth07/images/image_00005348_0.png
ETHZ/eth07/images/image_00005352_0.png
ETHZ/eth07/images/image_00005356_0.png
ETHZ/eth07/images/image_00005360_0.png
ETHZ/eth07/images/image_00005364_0.png
ETHZ/eth07/images/image_00005368_0.png
ETHZ/eth07/images/image_00005372_0.png
ETHZ/eth07/images/image_00005376_0.png
ETHZ/eth07/images/image_00005380_0.png
ETHZ/eth07/images/image_00005384_0.png
ETHZ/eth07/images/image_00005388_0.png
ETHZ/eth07/images/image_00005392_0.png
ETHZ/eth07/images/image_00005396_0.png
ETHZ/eth07/images/image_00005400_0.png
ETHZ/eth07/images/image_00005404_0.png
ETHZ/eth07/images/image_00005408_0.png
ETHZ/eth07/images/image_00005412_0.png
ETHZ/eth07/images/image_00005416_0.png
ETHZ/eth07/images/image_00005420_0.png
ETHZ/eth07/images/image_00005424_0.png
ETHZ/eth07/images/image_00005428_0.png
ETHZ/eth07/images/image_00005432_0.png
ETHZ/eth07/images/image_00005436_0.png
ETHZ/eth07/images/image_00005440_0.png
ETHZ/eth07/images/image_00005444_0.png
ETHZ/eth07/images/image_00005448_0.png
ETHZ/eth07/images/image_00005452_0.png
ETHZ/eth07/images/image_00005456_0.png
ETHZ/eth07/images/image_00005460_0.png
ETHZ/eth07/images/image_00005464_0.png
ETHZ/eth07/images/image_00005468_0.png
ETHZ/eth07/images/image_00005472_0.png
ETHZ/eth07/images/image_00005476_0.png
ETHZ/eth07/images/image_00005480_0.png
ETHZ/eth07/images/image_00005484_0.png
ETHZ/eth07/images/image_00005488_0.png
ETHZ/eth07/images/image_00005492_0.png
ETHZ/eth07/images/image_00005496_0.png
ETHZ/eth07/images/image_00005500_0.png
ETHZ/eth07/images/image_00005504_0.png
ETHZ/eth07/images/image_00005508_0.png
ETHZ/eth07/images/image_00005512_0.png
ETHZ/eth07/images/image_00005516_0.png
ETHZ/eth07/images/image_00005520_0.png
ETHZ/eth07/images/image_00005524_0.png
ETHZ/eth07/images/image_00005528_0.png
ETHZ/eth07/images/image_00005532_0.png
ETHZ/eth07/images/image_00005536_0.png
ETHZ/eth07/images/image_00005540_0.png
ETHZ/eth07/images/image_00005544_0.png
ETHZ/eth07/images/image_00005548_0.png
ETHZ/eth07/images/image_00005552_0.png
ETHZ/eth07/images/image_00005556_0.png
ETHZ/eth07/images/image_00005560_0.png
ETHZ/eth07/images/image_00005564_0.png
ETHZ/eth07/images/image_00005568_0.png
ETHZ/eth07/images/image_00005572_0.png
ETHZ/eth07/images/image_00005576_0.png
ETHZ/eth07/images/image_00005580_0.png
ETHZ/eth07/images/image_00005584_0.png
ETHZ/eth07/images/image_00005588_0.png
ETHZ/eth07/images/image_00005592_0.png
ETHZ/eth07/images/image_00005596_0.png
ETHZ/eth07/images/image_00005600_0.png
ETHZ/eth07/images/image_00005604_0.png
ETHZ/eth07/images/image_00005608_0.png
ETHZ/eth07/images/image_00005612_0.png
ETHZ/eth07/images/image_00005616_0.png
ETHZ/eth07/images/image_00005620_0.png
ETHZ/eth07/images/image_00005624_0.png
ETHZ/eth07/images/image_00005628_0.png
ETHZ/eth07/images/image_00005632_0.png
ETHZ/eth07/images/image_00005636_0.png
ETHZ/eth07/images/image_00005640_0.png
ETHZ/eth07/images/image_00005644_0.png
ETHZ/eth07/images/image_00005648_0.png
ETHZ/eth07/images/image_00005652_0.png
ETHZ/eth07/images/image_00005656_0.png
ETHZ/eth07/images/image_00005660_0.png
ETHZ/eth07/images/image_00005664_0.png
ETHZ/eth07/images/image_00005668_0.png
ETHZ/eth07/images/image_00005672_0.png
ETHZ/eth07/images/image_00005676_0.png
ETHZ/eth07/images/image_00005680_0.png
ETHZ/eth07/images/image_00005684_0.png
ETHZ/eth07/images/image_00005688_0.png
ETHZ/eth07/images/image_00005692_0.png
ETHZ/eth07/images/image_00005696_0.png
ETHZ/eth07/images/image_00005700_0.png

+ 19
- 0
deploy/ONNXRuntime/README.md View File

## ByteTrack-ONNXRuntime in Python

This doc introduces how to convert your pytorch model into onnx, and how to run an onnxruntime demo to verify your convertion.

### Convert Your Model to ONNX

```shell
cd <ByteTrack_HOME>
python3 tools/export_onnx.py --output-name bytetrack_s.onnx -f exps/example/mot/yolox_s_mix_det.py -c pretrained/bytetrack_s_mot17.pth.tar
```

### ONNXRuntime Demo

You can run onnx demo with **16 FPS** (96-core Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz):

```shell
cd <ByteTrack_HOME>/deploy/ONNXRuntime
python3 onnx_inference.py
```

+ 160
- 0
deploy/ONNXRuntime/onnx_inference.py View File

import argparse
import os

import cv2
import numpy as np
from loguru import logger

import onnxruntime

from yolox.data.data_augment import preproc as preprocess
from yolox.utils import mkdir, multiclass_nms, demo_postprocess, vis
from yolox.utils.visualize import plot_tracking
from yolox.tracker.byte_tracker import BYTETracker
from yolox.tracking_utils.timer import Timer


def make_parser():
parser = argparse.ArgumentParser("onnxruntime inference sample")
parser.add_argument(
"-m",
"--model",
type=str,
default="../../bytetrack_s.onnx",
help="Input your onnx model.",
)
parser.add_argument(
"-i",
"--video_path",
type=str,
default='../../videos/palace.mp4',
help="Path to your input image.",
)
parser.add_argument(
"-o",
"--output_dir",
type=str,
default='demo_output',
help="Path to your output directory.",
)
parser.add_argument(
"-s",
"--score_thr",
type=float,
default=0.1,
help="Score threshould to filter the result.",
)
parser.add_argument(
"-n",
"--nms_thr",
type=float,
default=0.7,
help="NMS threshould.",
)
parser.add_argument(
"--input_shape",
type=str,
default="608,1088",
help="Specify an input shape for inference.",
)
parser.add_argument(
"--with_p6",
action="store_true",
help="Whether your model uses p6 in FPN/PAN.",
)
# tracking args
parser.add_argument("--track_thresh", type=float, default=0.5, help="tracking confidence threshold")
parser.add_argument("--track_buffer", type=int, default=30, help="the frames for keep lost tracks")
parser.add_argument("--match_thresh", type=float, default=0.8, help="matching threshold for tracking")
parser.add_argument('--min-box-area', type=float, default=10, help='filter out tiny boxes')
parser.add_argument("--mot20", dest="mot20", default=False, action="store_true", help="test mot20.")
return parser


class Predictor(object):
def __init__(self, args):
self.rgb_means = (0.485, 0.456, 0.406)
self.std = (0.229, 0.224, 0.225)
self.args = args
self.session = onnxruntime.InferenceSession(args.model)
self.input_shape = tuple(map(int, args.input_shape.split(',')))

def inference(self, ori_img, timer):
img_info = {"id": 0}
height, width = ori_img.shape[:2]
img_info["height"] = height
img_info["width"] = width
img_info["raw_img"] = ori_img

img, ratio = preprocess(ori_img, self.input_shape, self.rgb_means, self.std)
img_info["ratio"] = ratio
ort_inputs = {self.session.get_inputs()[0].name: img[None, :, :, :]}
timer.tic()
output = self.session.run(None, ort_inputs)
predictions = demo_postprocess(output[0], self.input_shape, p6=self.args.with_p6)[0]

boxes = predictions[:, :4]
scores = predictions[:, 4:5] * predictions[:, 5:]

boxes_xyxy = np.ones_like(boxes)
boxes_xyxy[:, 0] = boxes[:, 0] - boxes[:, 2]/2.
boxes_xyxy[:, 1] = boxes[:, 1] - boxes[:, 3]/2.
boxes_xyxy[:, 2] = boxes[:, 0] + boxes[:, 2]/2.
boxes_xyxy[:, 3] = boxes[:, 1] + boxes[:, 3]/2.
boxes_xyxy /= ratio
dets = multiclass_nms(boxes_xyxy, scores, nms_thr=self.args.nms_thr, score_thr=self.args.score_thr)
return dets[:, :-1], img_info


def imageflow_demo(predictor, args):
cap = cv2.VideoCapture(args.video_path)
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # float
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # float
fps = cap.get(cv2.CAP_PROP_FPS)
save_folder = args.output_dir
os.makedirs(save_folder, exist_ok=True)
save_path = os.path.join(save_folder, args.video_path.split("/")[-1])
logger.info(f"video save_path is {save_path}")
vid_writer = cv2.VideoWriter(
save_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (int(width), int(height))
)
tracker = BYTETracker(args, frame_rate=30)
timer = Timer()
frame_id = 0
results = []
while True:
if frame_id % 20 == 0:
logger.info('Processing frame {} ({:.2f} fps)'.format(frame_id, 1. / max(1e-5, timer.average_time)))
ret_val, frame = cap.read()
if ret_val:
outputs, img_info = predictor.inference(frame, timer)
online_targets = tracker.update(outputs, [img_info['height'], img_info['width']], [img_info['height'], img_info['width']])
online_tlwhs = []
online_ids = []
online_scores = []
for t in online_targets:
tlwh = t.tlwh
tid = t.track_id
vertical = tlwh[2] / tlwh[3] > 1.6
if tlwh[2] * tlwh[3] > args.min_box_area and not vertical:
online_tlwhs.append(tlwh)
online_ids.append(tid)
online_scores.append(t.score)
timer.toc()
results.append((frame_id + 1, online_tlwhs, online_ids, online_scores))
online_im = plot_tracking(img_info['raw_img'], online_tlwhs, online_ids, frame_id=frame_id + 1,
fps=1. / timer.average_time)
vid_writer.write(online_im)
ch = cv2.waitKey(1)
if ch == 27 or ch == ord("q") or ch == ord("Q"):
break
else:
break
frame_id += 1


if __name__ == '__main__':
args = make_parser().parse_args()

predictor = Predictor(args)
imageflow_demo(predictor, args)

+ 39
- 0
deploy/TensorRT/cpp/CMakeLists.txt View File

cmake_minimum_required(VERSION 2.6)

project(bytetrack)

add_definitions(-std=c++11)

option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)

find_package(CUDA REQUIRED)

include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(/usr/local/include/eigen3)
link_directories(${PROJECT_SOURCE_DIR}/include)
# include and link dirs of cuda and tensorrt, you need adapt them if yours are different
# cuda
include_directories(/usr/local/cuda/include)
link_directories(/usr/local/cuda/lib64)
# cudnn
include_directories(/data/cuda/cuda-10.2/cudnn/v8.0.4/include)
link_directories(/data/cuda/cuda-10.2/cudnn/v8.0.4/lib64)
# tensorrt
include_directories(/opt/tiger/demo/TensorRT-7.2.3.4/include)
link_directories(/opt/tiger/demo/TensorRT-7.2.3.4/lib)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -Wfatal-errors -D_MWAITXINTRIN_H_INCLUDED")

find_package(OpenCV)
include_directories(${OpenCV_INCLUDE_DIRS})

file(GLOB My_Source_Files ${PROJECT_SOURCE_DIR}/src/*.cpp)
add_executable(bytetrack ${My_Source_Files})
target_link_libraries(bytetrack nvinfer)
target_link_libraries(bytetrack cudart)
target_link_libraries(bytetrack ${OpenCV_LIBS})

add_definitions(-O2 -pthread)


+ 58
- 0
deploy/TensorRT/cpp/README.md View File

# ByteTrack-TensorRT in C++

## Installation

Install opencv with ```sudo apt-get install libopencv-dev``` (we don't need a higher version of opencv like v3.3+).

Install eigen-3.3.9 [[google]](https://drive.google.com/file/d/1rqO74CYCNrmRAg8Rra0JP3yZtJ-rfket/view?usp=sharing), [[baidu(code:ueq4)]](https://pan.baidu.com/s/15kEfCxpy-T7tz60msxxExg).

```shell
unzip eigen-3.3.9.zip
cd eigen-3.3.9
mkdir build
cd build
cmake ..
sudo make install
```

## Prepare serialized engine file

Follow the TensorRT Python demo to convert and save the serialized engine file.

Check the 'model_trt.engine' file, which will be automatically saved at the YOLOX_output dir.

## Build the demo

You should set the TensorRT path and CUDA path in CMakeLists.txt.

For bytetrack_s model, we set the input frame size 1088 x 608. For bytetrack_m, bytetrack_l, bytetrack_x models, we set the input frame size 1440 x 800. You can modify the INPUT_W and INPUT_H in src/bytetrack.cpp

```c++
static const int INPUT_W = 1088;
static const int INPUT_H = 608;
```

You can first build the demo:

```shell
cd <ByteTrack_HOME>/demo/TensorRT/cpp
mkdir build
cd build
cmake ..
make
```

Then you can run the demo with **200 FPS**:

```shell
./bytetrack ../../../../YOLOX_outputs/yolox_s_mix_det/model_trt.engine -i ../../../../videos/palace.mp4
```

(If you find the output video lose some frames, you can convert the input video by running:

```shell
cd <ByteTrack_HOME>
python3 tools/convert_video.py
```
to generate an appropriate input video for TensorRT C++ demo. )


+ 49
- 0
deploy/TensorRT/cpp/include/BYTETracker.h View File

#pragma once

#include "STrack.h"

struct Object
{
cv::Rect_<float> rect;
int label;
float prob;
};

class BYTETracker
{
public:
BYTETracker(int frame_rate = 30, int track_buffer = 30);
~BYTETracker();

vector<STrack> update(const vector<Object>& objects);
Scalar get_color(int idx);

private:
vector<STrack*> joint_stracks(vector<STrack*> &tlista, vector<STrack> &tlistb);
vector<STrack> joint_stracks(vector<STrack> &tlista, vector<STrack> &tlistb);

vector<STrack> sub_stracks(vector<STrack> &tlista, vector<STrack> &tlistb);
void remove_duplicate_stracks(vector<STrack> &resa, vector<STrack> &resb, vector<STrack> &stracksa, vector<STrack> &stracksb);

void linear_assignment(vector<vector<float> > &cost_matrix, int cost_matrix_size, int cost_matrix_size_size, float thresh,
vector<vector<int> > &matches, vector<int> &unmatched_a, vector<int> &unmatched_b);
vector<vector<float> > iou_distance(vector<STrack*> &atracks, vector<STrack> &btracks, int &dist_size, int &dist_size_size);
vector<vector<float> > iou_distance(vector<STrack> &atracks, vector<STrack> &btracks);
vector<vector<float> > ious(vector<vector<float> > &atlbrs, vector<vector<float> > &btlbrs);

double lapjv(const vector<vector<float> > &cost, vector<int> &rowsol, vector<int> &colsol,
bool extend_cost = false, float cost_limit = LONG_MAX, bool return_cost = true);

private:

float track_thresh;
float high_thresh;
float match_thresh;
int frame_id;
int max_time_lost;

vector<STrack> tracked_stracks;
vector<STrack> lost_stracks;
vector<STrack> removed_stracks;
byte_kalman::KalmanFilter kalman_filter;
};

+ 50
- 0
deploy/TensorRT/cpp/include/STrack.h View File

#pragma once

#include <opencv2/opencv.hpp>
#include "kalmanFilter.h"

using namespace cv;
using namespace std;

enum TrackState { New = 0, Tracked, Lost, Removed };

class STrack
{
public:
STrack(vector<float> tlwh_, float score);
~STrack();

vector<float> static tlbr_to_tlwh(vector<float> &tlbr);
void static multi_predict(vector<STrack*> &stracks, byte_kalman::KalmanFilter &kalman_filter);
void static_tlwh();
void static_tlbr();
vector<float> tlwh_to_xyah(vector<float> tlwh_tmp);
vector<float> to_xyah();
void mark_lost();
void mark_removed();
int next_id();
int end_frame();
void activate(byte_kalman::KalmanFilter &kalman_filter, int frame_id);
void re_activate(STrack &new_track, int frame_id, bool new_id = false);
void update(STrack &new_track, int frame_id);

public:
bool is_activated;
int track_id;
int state;

vector<float> _tlwh;
vector<float> tlwh;
vector<float> tlbr;
int frame_id;
int tracklet_len;
int start_frame;

KAL_MEAN mean;
KAL_COVA covariance;
float score;

private:
byte_kalman::KalmanFilter kalman_filter;
};

+ 36
- 0
deploy/TensorRT/cpp/include/dataType.h View File

#pragma once

#include <cstddef>
#include <vector>

#include <Eigen/Core>
#include <Eigen/Dense>
typedef Eigen::Matrix<float, 1, 4, Eigen::RowMajor> DETECTBOX;
typedef Eigen::Matrix<float, -1, 4, Eigen::RowMajor> DETECTBOXSS;
typedef Eigen::Matrix<float, 1, 128, Eigen::RowMajor> FEATURE;
typedef Eigen::Matrix<float, Eigen::Dynamic, 128, Eigen::RowMajor> FEATURESS;
//typedef std::vector<FEATURE> FEATURESS;

//Kalmanfilter
//typedef Eigen::Matrix<float, 8, 8, Eigen::RowMajor> KAL_FILTER;
typedef Eigen::Matrix<float, 1, 8, Eigen::RowMajor> KAL_MEAN;
typedef Eigen::Matrix<float, 8, 8, Eigen::RowMajor> KAL_COVA;
typedef Eigen::Matrix<float, 1, 4, Eigen::RowMajor> KAL_HMEAN;
typedef Eigen::Matrix<float, 4, 4, Eigen::RowMajor> KAL_HCOVA;
using KAL_DATA = std::pair<KAL_MEAN, KAL_COVA>;
using KAL_HDATA = std::pair<KAL_HMEAN, KAL_HCOVA>;

//main
using RESULT_DATA = std::pair<int, DETECTBOX>;

//tracker:
using TRACKER_DATA = std::pair<int, FEATURESS>;
using MATCH_DATA = std::pair<int, int>;
typedef struct t {
std::vector<MATCH_DATA> matches;
std::vector<int> unmatched_tracks;
std::vector<int> unmatched_detections;
}TRACHER_MATCHD;

//linear_assignment:
typedef Eigen::Matrix<float, -1, -1, Eigen::RowMajor> DYNAMICM;

+ 31
- 0
deploy/TensorRT/cpp/include/kalmanFilter.h View File

#pragma once

#include "dataType.h"

namespace byte_kalman
{
class KalmanFilter
{
public:
static const double chi2inv95[10];
KalmanFilter();
KAL_DATA initiate(const DETECTBOX& measurement);
void predict(KAL_MEAN& mean, KAL_COVA& covariance);
KAL_HDATA project(const KAL_MEAN& mean, const KAL_COVA& covariance);
KAL_DATA update(const KAL_MEAN& mean,
const KAL_COVA& covariance,
const DETECTBOX& measurement);

Eigen::Matrix<float, 1, -1> gating_distance(
const KAL_MEAN& mean,
const KAL_COVA& covariance,
const std::vector<DETECTBOX>& measurements,
bool only_position = false);

private:
Eigen::Matrix<float, 8, 8, Eigen::RowMajor> _motion_mat;
Eigen::Matrix<float, 4, 8, Eigen::RowMajor> _update_mat;
float _std_weight_position;
float _std_weight_velocity;
};
}

+ 63
- 0
deploy/TensorRT/cpp/include/lapjv.h View File

#ifndef LAPJV_H
#define LAPJV_H

#define LARGE 1000000

#if !defined TRUE
#define TRUE 1
#endif
#if !defined FALSE
#define FALSE 0
#endif

#define NEW(x, t, n) if ((x = (t *)malloc(sizeof(t) * (n))) == 0) { return -1; }
#define FREE(x) if (x != 0) { free(x); x = 0; }
#define SWAP_INDICES(a, b) { int_t _temp_index = a; a = b; b = _temp_index; }

#if 0
#include <assert.h>
#define ASSERT(cond) assert(cond)
#define PRINTF(fmt, ...) printf(fmt, ##__VA_ARGS__)
#define PRINT_COST_ARRAY(a, n) \
while (1) { \
printf(#a" = ["); \
if ((n) > 0) { \
printf("%f", (a)[0]); \
for (uint_t j = 1; j < n; j++) { \
printf(", %f", (a)[j]); \
} \
} \
printf("]\n"); \
break; \
}
#define PRINT_INDEX_ARRAY(a, n) \
while (1) { \
printf(#a" = ["); \
if ((n) > 0) { \
printf("%d", (a)[0]); \
for (uint_t j = 1; j < n; j++) { \
printf(", %d", (a)[j]); \
} \
} \
printf("]\n"); \
break; \
}
#else
#define ASSERT(cond)
#define PRINTF(fmt, ...)
#define PRINT_COST_ARRAY(a, n)
#define PRINT_INDEX_ARRAY(a, n)
#endif


typedef signed int int_t;
typedef unsigned int uint_t;
typedef double cost_t;
typedef char boolean;
typedef enum fp_t { FP_1 = 1, FP_2 = 2, FP_DYNAMIC = 3 } fp_t;

extern int_t lapjv_internal(
const uint_t n, cost_t *cost[],
int_t *x, int_t *y);

#endif // LAPJV_H

+ 503
- 0
deploy/TensorRT/cpp/include/logging.h View File

/*
* Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#ifndef TENSORRT_LOGGING_H
#define TENSORRT_LOGGING_H

#include "NvInferRuntimeCommon.h"
#include <cassert>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <ostream>
#include <sstream>
#include <string>

using Severity = nvinfer1::ILogger::Severity;

class LogStreamConsumerBuffer : public std::stringbuf
{
public:
LogStreamConsumerBuffer(std::ostream& stream, const std::string& prefix, bool shouldLog)
: mOutput(stream)
, mPrefix(prefix)
, mShouldLog(shouldLog)
{
}

LogStreamConsumerBuffer(LogStreamConsumerBuffer&& other)
: mOutput(other.mOutput)
{
}

~LogStreamConsumerBuffer()
{
// std::streambuf::pbase() gives a pointer to the beginning of the buffered part of the output sequence
// std::streambuf::pptr() gives a pointer to the current position of the output sequence
// if the pointer to the beginning is not equal to the pointer to the current position,
// call putOutput() to log the output to the stream
if (pbase() != pptr())
{
putOutput();
}
}

// synchronizes the stream buffer and returns 0 on success
// synchronizing the stream buffer consists of inserting the buffer contents into the stream,
// resetting the buffer and flushing the stream
virtual int sync()
{
putOutput();
return 0;
}

void putOutput()
{
if (mShouldLog)
{
// prepend timestamp
std::time_t timestamp = std::time(nullptr);
tm* tm_local = std::localtime(&timestamp);
std::cout << "[";
std::cout << std::setw(2) << std::setfill('0') << 1 + tm_local->tm_mon << "/";
std::cout << std::setw(2) << std::setfill('0') << tm_local->tm_mday << "/";
std::cout << std::setw(4) << std::setfill('0') << 1900 + tm_local->tm_year << "-";
std::cout << std::setw(2) << std::setfill('0') << tm_local->tm_hour << ":";
std::cout << std::setw(2) << std::setfill('0') << tm_local->tm_min << ":";
std::cout << std::setw(2) << std::setfill('0') << tm_local->tm_sec << "] ";
// std::stringbuf::str() gets the string contents of the buffer
// insert the buffer contents pre-appended by the appropriate prefix into the stream
mOutput << mPrefix << str();
// set the buffer to empty
str("");
// flush the stream
mOutput.flush();
}
}

void setShouldLog(bool shouldLog)
{
mShouldLog = shouldLog;
}

private:
std::ostream& mOutput;
std::string mPrefix;
bool mShouldLog;
};

//!
//! \class LogStreamConsumerBase
//! \brief Convenience object used to initialize LogStreamConsumerBuffer before std::ostream in LogStreamConsumer
//!
class LogStreamConsumerBase
{
public:
LogStreamConsumerBase(std::ostream& stream, const std::string& prefix, bool shouldLog)
: mBuffer(stream, prefix, shouldLog)
{
}

protected:
LogStreamConsumerBuffer mBuffer;
};

//!
//! \class LogStreamConsumer
//! \brief Convenience object used to facilitate use of C++ stream syntax when logging messages.
//! Order of base classes is LogStreamConsumerBase and then std::ostream.
//! This is because the LogStreamConsumerBase class is used to initialize the LogStreamConsumerBuffer member field
//! in LogStreamConsumer and then the address of the buffer is passed to std::ostream.
//! This is necessary to prevent the address of an uninitialized buffer from being passed to std::ostream.
//! Please do not change the order of the parent classes.
//!
class LogStreamConsumer : protected LogStreamConsumerBase, public std::ostream
{
public:
//! \brief Creates a LogStreamConsumer which logs messages with level severity.
//! Reportable severity determines if the messages are severe enough to be logged.
LogStreamConsumer(Severity reportableSeverity, Severity severity)
: LogStreamConsumerBase(severityOstream(severity), severityPrefix(severity), severity <= reportableSeverity)
, std::ostream(&mBuffer) // links the stream buffer with the stream
, mShouldLog(severity <= reportableSeverity)
, mSeverity(severity)
{
}

LogStreamConsumer(LogStreamConsumer&& other)
: LogStreamConsumerBase(severityOstream(other.mSeverity), severityPrefix(other.mSeverity), other.mShouldLog)
, std::ostream(&mBuffer) // links the stream buffer with the stream
, mShouldLog(other.mShouldLog)
, mSeverity(other.mSeverity)
{
}

void setReportableSeverity(Severity reportableSeverity)
{
mShouldLog = mSeverity <= reportableSeverity;
mBuffer.setShouldLog(mShouldLog);
}

private:
static std::ostream& severityOstream(Severity severity)
{
return severity >= Severity::kINFO ? std::cout : std::cerr;
}

static std::string severityPrefix(Severity severity)
{
switch (severity)
{
case Severity::kINTERNAL_ERROR: return "[F] ";
case Severity::kERROR: return "[E] ";
case Severity::kWARNING: return "[W] ";
case Severity::kINFO: return "[I] ";
case Severity::kVERBOSE: return "[V] ";
default: assert(0); return "";
}
}

bool mShouldLog;
Severity mSeverity;
};

//! \class Logger
//!
//! \brief Class which manages logging of TensorRT tools and samples
//!
//! \details This class provides a common interface for TensorRT tools and samples to log information to the console,
//! and supports logging two types of messages:
//!
//! - Debugging messages with an associated severity (info, warning, error, or internal error/fatal)
//! - Test pass/fail messages
//!
//! The advantage of having all samples use this class for logging as opposed to emitting directly to stdout/stderr is
//! that the logic for controlling the verbosity and formatting of sample output is centralized in one location.
//!
//! In the future, this class could be extended to support dumping test results to a file in some standard format
//! (for example, JUnit XML), and providing additional metadata (e.g. timing the duration of a test run).
//!
//! TODO: For backwards compatibility with existing samples, this class inherits directly from the nvinfer1::ILogger
//! interface, which is problematic since there isn't a clean separation between messages coming from the TensorRT
//! library and messages coming from the sample.
//!
//! In the future (once all samples are updated to use Logger::getTRTLogger() to access the ILogger) we can refactor the
//! class to eliminate the inheritance and instead make the nvinfer1::ILogger implementation a member of the Logger
//! object.

class Logger : public nvinfer1::ILogger
{
public:
Logger(Severity severity = Severity::kWARNING)
: mReportableSeverity(severity)
{
}

//!
//! \enum TestResult
//! \brief Represents the state of a given test
//!
enum class TestResult
{
kRUNNING, //!< The test is running
kPASSED, //!< The test passed
kFAILED, //!< The test failed
kWAIVED //!< The test was waived
};

//!
//! \brief Forward-compatible method for retrieving the nvinfer::ILogger associated with this Logger
//! \return The nvinfer1::ILogger associated with this Logger
//!
//! TODO Once all samples are updated to use this method to register the logger with TensorRT,
//! we can eliminate the inheritance of Logger from ILogger
//!
nvinfer1::ILogger& getTRTLogger()
{
return *this;
}

//!
//! \brief Implementation of the nvinfer1::ILogger::log() virtual method
//!
//! Note samples should not be calling this function directly; it will eventually go away once we eliminate the
//! inheritance from nvinfer1::ILogger
//!
void log(Severity severity, const char* msg) override
{
LogStreamConsumer(mReportableSeverity, severity) << "[TRT] " << std::string(msg) << std::endl;
}

//!
//! \brief Method for controlling the verbosity of logging output
//!
//! \param severity The logger will only emit messages that have severity of this level or higher.
//!
void setReportableSeverity(Severity severity)
{
mReportableSeverity = severity;
}

//!
//! \brief Opaque handle that holds logging information for a particular test
//!
//! This object is an opaque handle to information used by the Logger to print test results.
//! The sample must call Logger::defineTest() in order to obtain a TestAtom that can be used
//! with Logger::reportTest{Start,End}().
//!
class TestAtom
{
public:
TestAtom(TestAtom&&) = default;

private:
friend class Logger;

TestAtom(bool started, const std::string& name, const std::string& cmdline)
: mStarted(started)
, mName(name)
, mCmdline(cmdline)
{
}

bool mStarted;
std::string mName;
std::string mCmdline;
};

//!
//! \brief Define a test for logging
//!
//! \param[in] name The name of the test. This should be a string starting with
//! "TensorRT" and containing dot-separated strings containing
//! the characters [A-Za-z0-9_].
//! For example, "TensorRT.sample_googlenet"
//! \param[in] cmdline The command line used to reproduce the test
//
//! \return a TestAtom that can be used in Logger::reportTest{Start,End}().
//!
static TestAtom defineTest(const std::string& name, const std::string& cmdline)
{
return TestAtom(false, name, cmdline);
}

//!
//! \brief A convenience overloaded version of defineTest() that accepts an array of command-line arguments
//! as input
//!
//! \param[in] name The name of the test
//! \param[in] argc The number of command-line arguments
//! \param[in] argv The array of command-line arguments (given as C strings)
//!
//! \return a TestAtom that can be used in Logger::reportTest{Start,End}().
static TestAtom defineTest(const std::string& name, int argc, char const* const* argv)
{
auto cmdline = genCmdlineString(argc, argv);
return defineTest(name, cmdline);
}

//!
//! \brief Report that a test has started.
//!
//! \pre reportTestStart() has not been called yet for the given testAtom
//!
//! \param[in] testAtom The handle to the test that has started
//!
static void reportTestStart(TestAtom& testAtom)
{
reportTestResult(testAtom, TestResult::kRUNNING);
assert(!testAtom.mStarted);
testAtom.mStarted = true;
}

//!
//! \brief Report that a test has ended.
//!
//! \pre reportTestStart() has been called for the given testAtom
//!
//! \param[in] testAtom The handle to the test that has ended
//! \param[in] result The result of the test. Should be one of TestResult::kPASSED,
//! TestResult::kFAILED, TestResult::kWAIVED
//!
static void reportTestEnd(const TestAtom& testAtom, TestResult result)
{
assert(result != TestResult::kRUNNING);
assert(testAtom.mStarted);
reportTestResult(testAtom, result);
}

static int reportPass(const TestAtom& testAtom)
{
reportTestEnd(testAtom, TestResult::kPASSED);
return EXIT_SUCCESS;
}

static int reportFail(const TestAtom& testAtom)
{
reportTestEnd(testAtom, TestResult::kFAILED);
return EXIT_FAILURE;
}

static int reportWaive(const TestAtom& testAtom)
{
reportTestEnd(testAtom, TestResult::kWAIVED);
return EXIT_SUCCESS;
}

static int reportTest(const TestAtom& testAtom, bool pass)
{
return pass ? reportPass(testAtom) : reportFail(testAtom);
}

Severity getReportableSeverity() const
{
return mReportableSeverity;
}

private:
//!
//! \brief returns an appropriate string for prefixing a log message with the given severity
//!
static const char* severityPrefix(Severity severity)
{
switch (severity)
{
case Severity::kINTERNAL_ERROR: return "[F] ";
case Severity::kERROR: return "[E] ";
case Severity::kWARNING: return "[W] ";
case Severity::kINFO: return "[I] ";
case Severity::kVERBOSE: return "[V] ";
default: assert(0); return "";
}
}

//!
//! \brief returns an appropriate string for prefixing a test result message with the given result
//!
static const char* testResultString(TestResult result)
{
switch (result)
{
case TestResult::kRUNNING: return "RUNNING";
case TestResult::kPASSED: return "PASSED";
case TestResult::kFAILED: return "FAILED";
case TestResult::kWAIVED: return "WAIVED";
default: assert(0); return "";
}
}

//!
//! \brief returns an appropriate output stream (cout or cerr) to use with the given severity
//!
static std::ostream& severityOstream(Severity severity)
{
return severity >= Severity::kINFO ? std::cout : std::cerr;
}

//!
//! \brief method that implements logging test results
//!
static void reportTestResult(const TestAtom& testAtom, TestResult result)
{
severityOstream(Severity::kINFO) << "&&&& " << testResultString(result) << " " << testAtom.mName << " # "
<< testAtom.mCmdline << std::endl;
}

//!
//! \brief generate a command line string from the given (argc, argv) values
//!
static std::string genCmdlineString(int argc, char const* const* argv)
{
std::stringstream ss;
for (int i = 0; i < argc; i++)
{
if (i > 0)
ss << " ";
ss << argv[i];
}
return ss.str();
}

Severity mReportableSeverity;
};

namespace
{

//!
//! \brief produces a LogStreamConsumer object that can be used to log messages of severity kVERBOSE
//!
//! Example usage:
//!
//! LOG_VERBOSE(logger) << "hello world" << std::endl;
//!
inline LogStreamConsumer LOG_VERBOSE(const Logger& logger)
{
return LogStreamConsumer(logger.getReportableSeverity(), Severity::kVERBOSE);
}

//!
//! \brief produces a LogStreamConsumer object that can be used to log messages of severity kINFO
//!
//! Example usage:
//!
//! LOG_INFO(logger) << "hello world" << std::endl;
//!
inline LogStreamConsumer LOG_INFO(const Logger& logger)
{
return LogStreamConsumer(logger.getReportableSeverity(), Severity::kINFO);
}

//!
//! \brief produces a LogStreamConsumer object that can be used to log messages of severity kWARNING
//!
//! Example usage:
//!
//! LOG_WARN(logger) << "hello world" << std::endl;
//!
inline LogStreamConsumer LOG_WARN(const Logger& logger)
{
return LogStreamConsumer(logger.getReportableSeverity(), Severity::kWARNING);
}

//!
//! \brief produces a LogStreamConsumer object that can be used to log messages of severity kERROR
//!
//! Example usage:
//!
//! LOG_ERROR(logger) << "hello world" << std::endl;
//!
inline LogStreamConsumer LOG_ERROR(const Logger& logger)
{
return LogStreamConsumer(logger.getReportableSeverity(), Severity::kERROR);
}

//!
//! \brief produces a LogStreamConsumer object that can be used to log messages of severity kINTERNAL_ERROR
// ("fatal" severity)
//!
//! Example usage:
//!
//! LOG_FATAL(logger) << "hello world" << std::endl;
//!
inline LogStreamConsumer LOG_FATAL(const Logger& logger)
{
return LogStreamConsumer(logger.getReportableSeverity(), Severity::kINTERNAL_ERROR);
}

} // anonymous namespace

#endif // TENSORRT_LOGGING_H

+ 241
- 0
deploy/TensorRT/cpp/src/BYTETracker.cpp View File

#include "BYTETracker.h"
#include <fstream>

BYTETracker::BYTETracker(int frame_rate, int track_buffer)
{
track_thresh = 0.5;
high_thresh = 0.6;
match_thresh = 0.8;

frame_id = 0;
max_time_lost = int(frame_rate / 30.0 * track_buffer);
cout << "Init ByteTrack!" << endl;
}

BYTETracker::~BYTETracker()
{
}

vector<STrack> BYTETracker::update(const vector<Object>& objects)
{

////////////////// Step 1: Get detections //////////////////
this->frame_id++;
vector<STrack> activated_stracks;
vector<STrack> refind_stracks;
vector<STrack> removed_stracks;
vector<STrack> lost_stracks;
vector<STrack> detections;
vector<STrack> detections_low;

vector<STrack> detections_cp;
vector<STrack> tracked_stracks_swap;
vector<STrack> resa, resb;
vector<STrack> output_stracks;

vector<STrack*> unconfirmed;
vector<STrack*> tracked_stracks;
vector<STrack*> strack_pool;
vector<STrack*> r_tracked_stracks;

if (objects.size() > 0)
{
for (int i = 0; i < objects.size(); i++)
{
vector<float> tlbr_;
tlbr_.resize(4);
tlbr_[0] = objects[i].rect.x;
tlbr_[1] = objects[i].rect.y;
tlbr_[2] = objects[i].rect.x + objects[i].rect.width;
tlbr_[3] = objects[i].rect.y + objects[i].rect.height;

float score = objects[i].prob;

STrack strack(STrack::tlbr_to_tlwh(tlbr_), score);
if (score >= track_thresh)
{
detections.push_back(strack);
}
else
{
detections_low.push_back(strack);
}
}
}

// Add newly detected tracklets to tracked_stracks
for (int i = 0; i < this->tracked_stracks.size(); i++)
{
if (!this->tracked_stracks[i].is_activated)
unconfirmed.push_back(&this->tracked_stracks[i]);
else
tracked_stracks.push_back(&this->tracked_stracks[i]);
}

////////////////// Step 2: First association, with IoU //////////////////
strack_pool = joint_stracks(tracked_stracks, this->lost_stracks);
STrack::multi_predict(strack_pool, this->kalman_filter);

vector<vector<float> > dists;
int dist_size = 0, dist_size_size = 0;
dists = iou_distance(strack_pool, detections, dist_size, dist_size_size);

vector<vector<int> > matches;
vector<int> u_track, u_detection;
linear_assignment(dists, dist_size, dist_size_size, match_thresh, matches, u_track, u_detection);

for (int i = 0; i < matches.size(); i++)
{
STrack *track = strack_pool[matches[i][0]];
STrack *det = &detections[matches[i][1]];
if (track->state == TrackState::Tracked)
{
track->update(*det, this->frame_id);
activated_stracks.push_back(*track);
}
else
{
track->re_activate(*det, this->frame_id, false);
refind_stracks.push_back(*track);
}
}

////////////////// Step 3: Second association, using low score dets //////////////////
for (int i = 0; i < u_detection.size(); i++)
{
detections_cp.push_back(detections[u_detection[i]]);
}
detections.clear();
detections.assign(detections_low.begin(), detections_low.end());
for (int i = 0; i < u_track.size(); i++)
{
if (strack_pool[u_track[i]]->state == TrackState::Tracked)
{
r_tracked_stracks.push_back(strack_pool[u_track[i]]);
}
}

dists.clear();
dists = iou_distance(r_tracked_stracks, detections, dist_size, dist_size_size);

matches.clear();
u_track.clear();
u_detection.clear();
linear_assignment(dists, dist_size, dist_size_size, 0.5, matches, u_track, u_detection);

for (int i = 0; i < matches.size(); i++)
{
STrack *track = r_tracked_stracks[matches[i][0]];
STrack *det = &detections[matches[i][1]];
if (track->state == TrackState::Tracked)
{
track->update(*det, this->frame_id);
activated_stracks.push_back(*track);
}
else
{
track->re_activate(*det, this->frame_id, false);
refind_stracks.push_back(*track);
}
}

for (int i = 0; i < u_track.size(); i++)
{
STrack *track = r_tracked_stracks[u_track[i]];
if (track->state != TrackState::Lost)
{
track->mark_lost();
lost_stracks.push_back(*track);
}
}

// Deal with unconfirmed tracks, usually tracks with only one beginning frame
detections.clear();
detections.assign(detections_cp.begin(), detections_cp.end());

dists.clear();
dists = iou_distance(unconfirmed, detections, dist_size, dist_size_size);

matches.clear();
vector<int> u_unconfirmed;
u_detection.clear();
linear_assignment(dists, dist_size, dist_size_size, 0.7, matches, u_unconfirmed, u_detection);

for (int i = 0; i < matches.size(); i++)
{
unconfirmed[matches[i][0]]->update(detections[matches[i][1]], this->frame_id);
activated_stracks.push_back(*unconfirmed[matches[i][0]]);
}

for (int i = 0; i < u_unconfirmed.size(); i++)
{
STrack *track = unconfirmed[u_unconfirmed[i]];
track->mark_removed();
removed_stracks.push_back(*track);
}

////////////////// Step 4: Init new stracks //////////////////
for (int i = 0; i < u_detection.size(); i++)
{
STrack *track = &detections[u_detection[i]];
if (track->score < this->high_thresh)
continue;
track->activate(this->kalman_filter, this->frame_id);
activated_stracks.push_back(*track);
}

////////////////// Step 5: Update state //////////////////
for (int i = 0; i < this->lost_stracks.size(); i++)
{
if (this->frame_id - this->lost_stracks[i].end_frame() > this->max_time_lost)
{
this->lost_stracks[i].mark_removed();
removed_stracks.push_back(this->lost_stracks[i]);
}
}
for (int i = 0; i < this->tracked_stracks.size(); i++)
{
if (this->tracked_stracks[i].state == TrackState::Tracked)
{
tracked_stracks_swap.push_back(this->tracked_stracks[i]);
}
}
this->tracked_stracks.clear();
this->tracked_stracks.assign(tracked_stracks_swap.begin(), tracked_stracks_swap.end());

this->tracked_stracks = joint_stracks(this->tracked_stracks, activated_stracks);
this->tracked_stracks = joint_stracks(this->tracked_stracks, refind_stracks);

//std::cout << activated_stracks.size() << std::endl;

this->lost_stracks = sub_stracks(this->lost_stracks, this->tracked_stracks);
for (int i = 0; i < lost_stracks.size(); i++)
{
this->lost_stracks.push_back(lost_stracks[i]);
}

this->lost_stracks = sub_stracks(this->lost_stracks, this->removed_stracks);
for (int i = 0; i < removed_stracks.size(); i++)
{
this->removed_stracks.push_back(removed_stracks[i]);
}
remove_duplicate_stracks(resa, resb, this->tracked_stracks, this->lost_stracks);

this->tracked_stracks.clear();
this->tracked_stracks.assign(resa.begin(), resa.end());
this->lost_stracks.clear();
this->lost_stracks.assign(resb.begin(), resb.end());
for (int i = 0; i < this->tracked_stracks.size(); i++)
{
if (this->tracked_stracks[i].is_activated)
{
output_stracks.push_back(this->tracked_stracks[i]);
}
}
return output_stracks;
}

+ 192
- 0
deploy/TensorRT/cpp/src/STrack.cpp View File

#include "STrack.h"

STrack::STrack(vector<float> tlwh_, float score)
{
_tlwh.resize(4);
_tlwh.assign(tlwh_.begin(), tlwh_.end());

is_activated = false;
track_id = 0;
state = TrackState::New;
tlwh.resize(4);
tlbr.resize(4);

static_tlwh();
static_tlbr();
frame_id = 0;
tracklet_len = 0;
this->score = score;
start_frame = 0;
}

STrack::~STrack()
{
}

void STrack::activate(byte_kalman::KalmanFilter &kalman_filter, int frame_id)
{
this->kalman_filter = kalman_filter;
this->track_id = this->next_id();

vector<float> _tlwh_tmp(4);
_tlwh_tmp[0] = this->_tlwh[0];
_tlwh_tmp[1] = this->_tlwh[1];
_tlwh_tmp[2] = this->_tlwh[2];
_tlwh_tmp[3] = this->_tlwh[3];
vector<float> xyah = tlwh_to_xyah(_tlwh_tmp);
DETECTBOX xyah_box;
xyah_box[0] = xyah[0];
xyah_box[1] = xyah[1];
xyah_box[2] = xyah[2];
xyah_box[3] = xyah[3];
auto mc = this->kalman_filter.initiate(xyah_box);
this->mean = mc.first;
this->covariance = mc.second;

static_tlwh();
static_tlbr();

this->tracklet_len = 0;
this->state = TrackState::Tracked;
if (frame_id == 1)
{
this->is_activated = true;
}
//this->is_activated = true;
this->frame_id = frame_id;
this->start_frame = frame_id;
}

void STrack::re_activate(STrack &new_track, int frame_id, bool new_id)
{
vector<float> xyah = tlwh_to_xyah(new_track.tlwh);
DETECTBOX xyah_box;
xyah_box[0] = xyah[0];
xyah_box[1] = xyah[1];
xyah_box[2] = xyah[2];
xyah_box[3] = xyah[3];
auto mc = this->kalman_filter.update(this->mean, this->covariance, xyah_box);
this->mean = mc.first;
this->covariance = mc.second;

static_tlwh();
static_tlbr();

this->tracklet_len = 0;
this->state = TrackState::Tracked;
this->is_activated = true;
this->frame_id = frame_id;
this->score = new_track.score;
if (new_id)
this->track_id = next_id();
}

void STrack::update(STrack &new_track, int frame_id)
{
this->frame_id = frame_id;
this->tracklet_len++;

vector<float> xyah = tlwh_to_xyah(new_track.tlwh);
DETECTBOX xyah_box;
xyah_box[0] = xyah[0];
xyah_box[1] = xyah[1];
xyah_box[2] = xyah[2];
xyah_box[3] = xyah[3];

auto mc = this->kalman_filter.update(this->mean, this->covariance, xyah_box);
this->mean = mc.first;
this->covariance = mc.second;

static_tlwh();
static_tlbr();

this->state = TrackState::Tracked;
this->is_activated = true;

this->score = new_track.score;
}

void STrack::static_tlwh()
{
if (this->state == TrackState::New)
{
tlwh[0] = _tlwh[0];
tlwh[1] = _tlwh[1];
tlwh[2] = _tlwh[2];
tlwh[3] = _tlwh[3];
return;
}

tlwh[0] = mean[0];
tlwh[1] = mean[1];
tlwh[2] = mean[2];
tlwh[3] = mean[3];

tlwh[2] *= tlwh[3];
tlwh[0] -= tlwh[2] / 2;
tlwh[1] -= tlwh[3] / 2;
}

void STrack::static_tlbr()
{
tlbr.clear();
tlbr.assign(tlwh.begin(), tlwh.end());
tlbr[2] += tlbr[0];
tlbr[3] += tlbr[1];
}

vector<float> STrack::tlwh_to_xyah(vector<float> tlwh_tmp)
{
vector<float> tlwh_output = tlwh_tmp;
tlwh_output[0] += tlwh_output[2] / 2;
tlwh_output[1] += tlwh_output[3] / 2;
tlwh_output[2] /= tlwh_output[3];
return tlwh_output;
}

vector<float> STrack::to_xyah()
{
return tlwh_to_xyah(tlwh);
}

vector<float> STrack::tlbr_to_tlwh(vector<float> &tlbr)
{
tlbr[2] -= tlbr[0];
tlbr[3] -= tlbr[1];
return tlbr;
}

void STrack::mark_lost()
{
state = TrackState::Lost;
}

void STrack::mark_removed()
{
state = TrackState::Removed;
}

int STrack::next_id()
{
static int _count = 0;
_count++;
return _count;
}

int STrack::end_frame()
{
return this->frame_id;
}

void STrack::multi_predict(vector<STrack*> &stracks, byte_kalman::KalmanFilter &kalman_filter)
{
for (int i = 0; i < stracks.size(); i++)
{
if (stracks[i]->state != TrackState::Tracked)
{
stracks[i]->mean[7] = 0;
}
kalman_filter.predict(stracks[i]->mean, stracks[i]->covariance);
}
}

+ 506
- 0
deploy/TensorRT/cpp/src/bytetrack.cpp View File

#include <fstream>
#include <iostream>
#include <sstream>
#include <numeric>
#include <chrono>
#include <vector>
#include <opencv2/opencv.hpp>
#include <dirent.h>
#include "NvInfer.h"
#include "cuda_runtime_api.h"
#include "logging.h"
#include "BYTETracker.h"

#define CHECK(status) \
do\
{\
auto ret = (status);\
if (ret != 0)\
{\
cerr << "Cuda failure: " << ret << endl;\
abort();\
}\
} while (0)

#define DEVICE 0 // GPU id
#define NMS_THRESH 0.7
#define BBOX_CONF_THRESH 0.1

using namespace nvinfer1;

// stuff we know about the network and the input/output blobs
static const int INPUT_W = 1088;
static const int INPUT_H = 608;
const char* INPUT_BLOB_NAME = "input_0";
const char* OUTPUT_BLOB_NAME = "output_0";
static Logger gLogger;

Mat static_resize(Mat& img) {
float r = min(INPUT_W / (img.cols*1.0), INPUT_H / (img.rows*1.0));
// r = std::min(r, 1.0f);
int unpad_w = r * img.cols;
int unpad_h = r * img.rows;
Mat re(unpad_h, unpad_w, CV_8UC3);
resize(img, re, re.size());
Mat out(INPUT_H, INPUT_W, CV_8UC3, Scalar(114, 114, 114));
re.copyTo(out(Rect(0, 0, re.cols, re.rows)));
return out;
}

struct GridAndStride
{
int grid0;
int grid1;
int stride;
};

static void generate_grids_and_stride(const int target_w, const int target_h, vector<int>& strides, vector<GridAndStride>& grid_strides)
{
for (auto stride : strides)
{
int num_grid_w = target_w / stride;
int num_grid_h = target_h / stride;
for (int g1 = 0; g1 < num_grid_h; g1++)
{
for (int g0 = 0; g0 < num_grid_w; g0++)
{
grid_strides.push_back((GridAndStride){g0, g1, stride});
}
}
}
}

static inline float intersection_area(const Object& a, const Object& b)
{
Rect_<float> inter = a.rect & b.rect;
return inter.area();
}

static void qsort_descent_inplace(vector<Object>& faceobjects, int left, int right)
{
int i = left;
int j = right;
float p = faceobjects[(left + right) / 2].prob;

while (i <= j)
{
while (faceobjects[i].prob > p)
i++;

while (faceobjects[j].prob < p)
j--;

if (i <= j)
{
// swap
swap(faceobjects[i], faceobjects[j]);

i++;
j--;
}
}

#pragma omp parallel sections
{
#pragma omp section
{
if (left < j) qsort_descent_inplace(faceobjects, left, j);
}
#pragma omp section
{
if (i < right) qsort_descent_inplace(faceobjects, i, right);
}
}
}

static void qsort_descent_inplace(vector<Object>& objects)
{
if (objects.empty())
return;

qsort_descent_inplace(objects, 0, objects.size() - 1);
}

static void nms_sorted_bboxes(const vector<Object>& faceobjects, vector<int>& picked, float nms_threshold)
{
picked.clear();

const int n = faceobjects.size();

vector<float> areas(n);
for (int i = 0; i < n; i++)
{
areas[i] = faceobjects[i].rect.area();
}

for (int i = 0; i < n; i++)
{
const Object& a = faceobjects[i];

int keep = 1;
for (int j = 0; j < (int)picked.size(); j++)
{
const Object& b = faceobjects[picked[j]];

// intersection over union
float inter_area = intersection_area(a, b);
float union_area = areas[i] + areas[picked[j]] - inter_area;
// float IoU = inter_area / union_area
if (inter_area / union_area > nms_threshold)
keep = 0;
}

if (keep)
picked.push_back(i);
}
}


static void generate_yolox_proposals(vector<GridAndStride> grid_strides, float* feat_blob, float prob_threshold, vector<Object>& objects)
{
const int num_class = 1;

const int num_anchors = grid_strides.size();

for (int anchor_idx = 0; anchor_idx < num_anchors; anchor_idx++)
{
const int grid0 = grid_strides[anchor_idx].grid0;
const int grid1 = grid_strides[anchor_idx].grid1;
const int stride = grid_strides[anchor_idx].stride;

const int basic_pos = anchor_idx * (num_class + 5);

// yolox/models/yolo_head.py decode logic
float x_center = (feat_blob[basic_pos+0] + grid0) * stride;
float y_center = (feat_blob[basic_pos+1] + grid1) * stride;
float w = exp(feat_blob[basic_pos+2]) * stride;
float h = exp(feat_blob[basic_pos+3]) * stride;
float x0 = x_center - w * 0.5f;
float y0 = y_center - h * 0.5f;

float box_objectness = feat_blob[basic_pos+4];
for (int class_idx = 0; class_idx < num_class; class_idx++)
{
float box_cls_score = feat_blob[basic_pos + 5 + class_idx];
float box_prob = box_objectness * box_cls_score;
if (box_prob > prob_threshold)
{
Object obj;
obj.rect.x = x0;
obj.rect.y = y0;
obj.rect.width = w;
obj.rect.height = h;
obj.label = class_idx;
obj.prob = box_prob;

objects.push_back(obj);
}

} // class loop

} // point anchor loop
}

float* blobFromImage(Mat& img){
cvtColor(img, img, COLOR_BGR2RGB);

float* blob = new float[img.total()*3];
int channels = 3;
int img_h = img.rows;
int img_w = img.cols;
vector<float> mean = {0.485, 0.456, 0.406};
vector<float> std = {0.229, 0.224, 0.225};
for (size_t c = 0; c < channels; c++)
{
for (size_t h = 0; h < img_h; h++)
{
for (size_t w = 0; w < img_w; w++)
{
blob[c * img_w * img_h + h * img_w + w] =
(((float)img.at<Vec3b>(h, w)[c]) / 255.0f - mean[c]) / std[c];
}
}
}
return blob;
}


static void decode_outputs(float* prob, vector<Object>& objects, float scale, const int img_w, const int img_h) {
vector<Object> proposals;
vector<int> strides = {8, 16, 32};
vector<GridAndStride> grid_strides;
generate_grids_and_stride(INPUT_W, INPUT_H, strides, grid_strides);
generate_yolox_proposals(grid_strides, prob, BBOX_CONF_THRESH, proposals);
//std::cout << "num of boxes before nms: " << proposals.size() << std::endl;

qsort_descent_inplace(proposals);

vector<int> picked;
nms_sorted_bboxes(proposals, picked, NMS_THRESH);


int count = picked.size();

//std::cout << "num of boxes: " << count << std::endl;

objects.resize(count);
for (int i = 0; i < count; i++)
{
objects[i] = proposals[picked[i]];

// adjust offset to original unpadded
float x0 = (objects[i].rect.x) / scale;
float y0 = (objects[i].rect.y) / scale;
float x1 = (objects[i].rect.x + objects[i].rect.width) / scale;
float y1 = (objects[i].rect.y + objects[i].rect.height) / scale;

// clip
// x0 = std::max(std::min(x0, (float)(img_w - 1)), 0.f);
// y0 = std::max(std::min(y0, (float)(img_h - 1)), 0.f);
// x1 = std::max(std::min(x1, (float)(img_w - 1)), 0.f);
// y1 = std::max(std::min(y1, (float)(img_h - 1)), 0.f);

objects[i].rect.x = x0;
objects[i].rect.y = y0;
objects[i].rect.width = x1 - x0;
objects[i].rect.height = y1 - y0;
}
}

const float color_list[80][3] =
{
{0.000, 0.447, 0.741},
{0.850, 0.325, 0.098},
{0.929, 0.694, 0.125},
{0.494, 0.184, 0.556},
{0.466, 0.674, 0.188},
{0.301, 0.745, 0.933},
{0.635, 0.078, 0.184},
{0.300, 0.300, 0.300},
{0.600, 0.600, 0.600},
{1.000, 0.000, 0.000},
{1.000, 0.500, 0.000},
{0.749, 0.749, 0.000},
{0.000, 1.000, 0.000},
{0.000, 0.000, 1.000},
{0.667, 0.000, 1.000},
{0.333, 0.333, 0.000},
{0.333, 0.667, 0.000},
{0.333, 1.000, 0.000},
{0.667, 0.333, 0.000},
{0.667, 0.667, 0.000},
{0.667, 1.000, 0.000},
{1.000, 0.333, 0.000},
{1.000, 0.667, 0.000},
{1.000, 1.000, 0.000},
{0.000, 0.333, 0.500},
{0.000, 0.667, 0.500},
{0.000, 1.000, 0.500},
{0.333, 0.000, 0.500},
{0.333, 0.333, 0.500},
{0.333, 0.667, 0.500},
{0.333, 1.000, 0.500},
{0.667, 0.000, 0.500},
{0.667, 0.333, 0.500},
{0.667, 0.667, 0.500},
{0.667, 1.000, 0.500},
{1.000, 0.000, 0.500},
{1.000, 0.333, 0.500},
{1.000, 0.667, 0.500},
{1.000, 1.000, 0.500},
{0.000, 0.333, 1.000},
{0.000, 0.667, 1.000},
{0.000, 1.000, 1.000},
{0.333, 0.000, 1.000},
{0.333, 0.333, 1.000},
{0.333, 0.667, 1.000},
{0.333, 1.000, 1.000},
{0.667, 0.000, 1.000},
{0.667, 0.333, 1.000},
{0.667, 0.667, 1.000},
{0.667, 1.000, 1.000},
{1.000, 0.000, 1.000},
{1.000, 0.333, 1.000},
{1.000, 0.667, 1.000},
{0.333, 0.000, 0.000},
{0.500, 0.000, 0.000},
{0.667, 0.000, 0.000},
{0.833, 0.000, 0.000},
{1.000, 0.000, 0.000},
{0.000, 0.167, 0.000},
{0.000, 0.333, 0.000},
{0.000, 0.500, 0.000},
{0.000, 0.667, 0.000},
{0.000, 0.833, 0.000},
{0.000, 1.000, 0.000},
{0.000, 0.000, 0.167},
{0.000, 0.000, 0.333},
{0.000, 0.000, 0.500},
{0.000, 0.000, 0.667},
{0.000, 0.000, 0.833},
{0.000, 0.000, 1.000},
{0.000, 0.000, 0.000},
{0.143, 0.143, 0.143},
{0.286, 0.286, 0.286},
{0.429, 0.429, 0.429},
{0.571, 0.571, 0.571},
{0.714, 0.714, 0.714},
{0.857, 0.857, 0.857},
{0.000, 0.447, 0.741},
{0.314, 0.717, 0.741},
{0.50, 0.5, 0}
};

void doInference(IExecutionContext& context, float* input, float* output, const int output_size, Size input_shape) {
const ICudaEngine& engine = context.getEngine();

// Pointers to input and output device buffers to pass to engine.
// Engine requires exactly IEngine::getNbBindings() number of buffers.
assert(engine.getNbBindings() == 2);
void* buffers[2];

// In order to bind the buffers, we need to know the names of the input and output tensors.
// Note that indices are guaranteed to be less than IEngine::getNbBindings()
const int inputIndex = engine.getBindingIndex(INPUT_BLOB_NAME);

assert(engine.getBindingDataType(inputIndex) == nvinfer1::DataType::kFLOAT);
const int outputIndex = engine.getBindingIndex(OUTPUT_BLOB_NAME);
assert(engine.getBindingDataType(outputIndex) == nvinfer1::DataType::kFLOAT);
int mBatchSize = engine.getMaxBatchSize();

// Create GPU buffers on device
CHECK(cudaMalloc(&buffers[inputIndex], 3 * input_shape.height * input_shape.width * sizeof(float)));
CHECK(cudaMalloc(&buffers[outputIndex], output_size*sizeof(float)));

// Create stream
cudaStream_t stream;
CHECK(cudaStreamCreate(&stream));

// DMA input batch data to device, infer on the batch asynchronously, and DMA output back to host
CHECK(cudaMemcpyAsync(buffers[inputIndex], input, 3 * input_shape.height * input_shape.width * sizeof(float), cudaMemcpyHostToDevice, stream));
context.enqueue(1, buffers, stream, nullptr);
CHECK(cudaMemcpyAsync(output, buffers[outputIndex], output_size * sizeof(float), cudaMemcpyDeviceToHost, stream));
cudaStreamSynchronize(stream);

// Release stream and buffers
cudaStreamDestroy(stream);
CHECK(cudaFree(buffers[inputIndex]));
CHECK(cudaFree(buffers[outputIndex]));
}

int main(int argc, char** argv) {
cudaSetDevice(DEVICE);
// create a model using the API directly and serialize it to a stream
char *trtModelStream{nullptr};
size_t size{0};

if (argc == 4 && string(argv[2]) == "-i") {
const string engine_file_path {argv[1]};
ifstream file(engine_file_path, ios::binary);
if (file.good()) {
file.seekg(0, file.end);
size = file.tellg();
file.seekg(0, file.beg);
trtModelStream = new char[size];
assert(trtModelStream);
file.read(trtModelStream, size);
file.close();
}
} else {
cerr << "arguments not right!" << endl;
cerr << "run 'python3 tools/trt.py -f exps/example/mot/yolox_s_mix_det.py -c pretrained/bytetrack_s_mot17.pth.tar' to serialize model first!" << std::endl;
cerr << "Then use the following command:" << endl;
cerr << "cd demo/TensorRT/cpp/build" << endl;
cerr << "./bytetrack ../../../../YOLOX_outputs/yolox_s_mix_det/model_trt.engine -i ../../../../videos/palace.mp4 // deserialize file and run inference" << std::endl;
return -1;
}
const string input_video_path {argv[3]};

IRuntime* runtime = createInferRuntime(gLogger);
assert(runtime != nullptr);
ICudaEngine* engine = runtime->deserializeCudaEngine(trtModelStream, size);
assert(engine != nullptr);
IExecutionContext* context = engine->createExecutionContext();
assert(context != nullptr);
delete[] trtModelStream;
auto out_dims = engine->getBindingDimensions(1);
auto output_size = 1;
for(int j=0;j<out_dims.nbDims;j++) {
output_size *= out_dims.d[j];
}
static float* prob = new float[output_size];

VideoCapture cap(input_video_path);
if (!cap.isOpened())
return 0;

int img_w = cap.get(CV_CAP_PROP_FRAME_WIDTH);
int img_h = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
int fps = cap.get(CV_CAP_PROP_FPS);
long nFrame = static_cast<long>(cap.get(CV_CAP_PROP_FRAME_COUNT));
cout << "Total frames: " << nFrame << endl;

VideoWriter writer("demo.mp4", CV_FOURCC('m', 'p', '4', 'v'), fps, Size(img_w, img_h));

Mat img;
BYTETracker tracker(fps, 30);
int num_frames = 0;
int total_ms = 0;
while (true)
{
if(!cap.read(img))
break;
num_frames ++;
if (num_frames % 20 == 0)
{
cout << "Processing frame " << num_frames << " (" << num_frames * 1000000 / total_ms << " fps)" << endl;
}
if (img.empty())
break;
Mat pr_img = static_resize(img);
float* blob;
blob = blobFromImage(pr_img);
float scale = min(INPUT_W / (img.cols*1.0), INPUT_H / (img.rows*1.0));
// run inference
auto start = chrono::system_clock::now();
doInference(*context, blob, prob, output_size, pr_img.size());
vector<Object> objects;
decode_outputs(prob, objects, scale, img_w, img_h);
vector<STrack> output_stracks = tracker.update(objects);
auto end = chrono::system_clock::now();
total_ms = total_ms + chrono::duration_cast<chrono::microseconds>(end - start).count();

for (int i = 0; i < output_stracks.size(); i++)
{
vector<float> tlwh = output_stracks[i].tlwh;
bool vertical = tlwh[2] / tlwh[3] > 1.6;
if (tlwh[2] * tlwh[3] > 20 && !vertical)
{
Scalar s = tracker.get_color(output_stracks[i].track_id);
putText(img, format("%d", output_stracks[i].track_id), Point(tlwh[0], tlwh[1] - 5),
0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
rectangle(img, Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), s, 2);
}
}
putText(img, format("frame: %d fps: %d num: %d", num_frames, num_frames * 1000000 / total_ms, output_stracks.size()),
Point(0, 30), 0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
writer.write(img);

delete blob;
char c = waitKey(1);
if (c > 0)
{
break;
}
}
cap.release();
cout << "FPS: " << num_frames * 1000000 / total_ms << endl;
// destroy the engine
context->destroy();
engine->destroy();
runtime->destroy();
return 0;
}

+ 152
- 0
deploy/TensorRT/cpp/src/kalmanFilter.cpp View File

#include "kalmanFilter.h"
#include <Eigen/Cholesky>

namespace byte_kalman
{
const double KalmanFilter::chi2inv95[10] = {
0,
3.8415,
5.9915,
7.8147,
9.4877,
11.070,
12.592,
14.067,
15.507,
16.919
};
KalmanFilter::KalmanFilter()
{
int ndim = 4;
double dt = 1.;

_motion_mat = Eigen::MatrixXf::Identity(8, 8);
for (int i = 0; i < ndim; i++) {
_motion_mat(i, ndim + i) = dt;
}
_update_mat = Eigen::MatrixXf::Identity(4, 8);

this->_std_weight_position = 1. / 20;
this->_std_weight_velocity = 1. / 160;
}

KAL_DATA KalmanFilter::initiate(const DETECTBOX &measurement)
{
DETECTBOX mean_pos = measurement;
DETECTBOX mean_vel;
for (int i = 0; i < 4; i++) mean_vel(i) = 0;

KAL_MEAN mean;
for (int i = 0; i < 8; i++) {
if (i < 4) mean(i) = mean_pos(i);
else mean(i) = mean_vel(i - 4);
}

KAL_MEAN std;
std(0) = 2 * _std_weight_position * measurement[3];
std(1) = 2 * _std_weight_position * measurement[3];
std(2) = 1e-2;
std(3) = 2 * _std_weight_position * measurement[3];
std(4) = 10 * _std_weight_velocity * measurement[3];
std(5) = 10 * _std_weight_velocity * measurement[3];
std(6) = 1e-5;
std(7) = 10 * _std_weight_velocity * measurement[3];

KAL_MEAN tmp = std.array().square();
KAL_COVA var = tmp.asDiagonal();
return std::make_pair(mean, var);
}

void KalmanFilter::predict(KAL_MEAN &mean, KAL_COVA &covariance)
{
//revise the data;
DETECTBOX std_pos;
std_pos << _std_weight_position * mean(3),
_std_weight_position * mean(3),
1e-2,
_std_weight_position * mean(3);
DETECTBOX std_vel;
std_vel << _std_weight_velocity * mean(3),
_std_weight_velocity * mean(3),
1e-5,
_std_weight_velocity * mean(3);
KAL_MEAN tmp;
tmp.block<1, 4>(0, 0) = std_pos;
tmp.block<1, 4>(0, 4) = std_vel;
tmp = tmp.array().square();
KAL_COVA motion_cov = tmp.asDiagonal();
KAL_MEAN mean1 = this->_motion_mat * mean.transpose();
KAL_COVA covariance1 = this->_motion_mat * covariance *(_motion_mat.transpose());
covariance1 += motion_cov;

mean = mean1;
covariance = covariance1;
}

KAL_HDATA KalmanFilter::project(const KAL_MEAN &mean, const KAL_COVA &covariance)
{
DETECTBOX std;
std << _std_weight_position * mean(3), _std_weight_position * mean(3),
1e-1, _std_weight_position * mean(3);
KAL_HMEAN mean1 = _update_mat * mean.transpose();
KAL_HCOVA covariance1 = _update_mat * covariance * (_update_mat.transpose());
Eigen::Matrix<float, 4, 4> diag = std.asDiagonal();
diag = diag.array().square().matrix();
covariance1 += diag;
// covariance1.diagonal() << diag;
return std::make_pair(mean1, covariance1);
}

KAL_DATA
KalmanFilter::update(
const KAL_MEAN &mean,
const KAL_COVA &covariance,
const DETECTBOX &measurement)
{
KAL_HDATA pa = project(mean, covariance);
KAL_HMEAN projected_mean = pa.first;
KAL_HCOVA projected_cov = pa.second;

//chol_factor, lower =
//scipy.linalg.cho_factor(projected_cov, lower=True, check_finite=False)
//kalmain_gain =
//scipy.linalg.cho_solve((cho_factor, lower),
//np.dot(covariance, self._upadte_mat.T).T,
//check_finite=False).T
Eigen::Matrix<float, 4, 8> B = (covariance * (_update_mat.transpose())).transpose();
Eigen::Matrix<float, 8, 4> kalman_gain = (projected_cov.llt().solve(B)).transpose(); // eg.8x4
Eigen::Matrix<float, 1, 4> innovation = measurement - projected_mean; //eg.1x4
auto tmp = innovation * (kalman_gain.transpose());
KAL_MEAN new_mean = (mean.array() + tmp.array()).matrix();
KAL_COVA new_covariance = covariance - kalman_gain * projected_cov*(kalman_gain.transpose());
return std::make_pair(new_mean, new_covariance);
}

Eigen::Matrix<float, 1, -1>
KalmanFilter::gating_distance(
const KAL_MEAN &mean,
const KAL_COVA &covariance,
const std::vector<DETECTBOX> &measurements,
bool only_position)
{
KAL_HDATA pa = this->project(mean, covariance);
if (only_position) {
printf("not implement!");
exit(0);
}
KAL_HMEAN mean1 = pa.first;
KAL_HCOVA covariance1 = pa.second;

// Eigen::Matrix<float, -1, 4, Eigen::RowMajor> d(size, 4);
DETECTBOXSS d(measurements.size(), 4);
int pos = 0;
for (DETECTBOX box : measurements) {
d.row(pos++) = box - mean1;
}
Eigen::Matrix<float, -1, -1, Eigen::RowMajor> factor = covariance1.llt().matrixL();
Eigen::Matrix<float, -1, -1> z = factor.triangularView<Eigen::Lower>().solve<Eigen::OnTheRight>(d).transpose();
auto zz = ((z.array())*(z.array())).matrix();
auto square_maha = zz.colwise().sum();
return square_maha;
}
}

+ 343
- 0
deploy/TensorRT/cpp/src/lapjv.cpp View File

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "lapjv.h"

/** Column-reduction and reduction transfer for a dense cost matrix.
*/
int_t _ccrrt_dense(const uint_t n, cost_t *cost[],
int_t *free_rows, int_t *x, int_t *y, cost_t *v)
{
int_t n_free_rows;
boolean *unique;

for (uint_t i = 0; i < n; i++) {
x[i] = -1;
v[i] = LARGE;
y[i] = 0;
}
for (uint_t i = 0; i < n; i++) {
for (uint_t j = 0; j < n; j++) {
const cost_t c = cost[i][j];
if (c < v[j]) {
v[j] = c;
y[j] = i;
}
PRINTF("i=%d, j=%d, c[i,j]=%f, v[j]=%f y[j]=%d\n", i, j, c, v[j], y[j]);
}
}
PRINT_COST_ARRAY(v, n);
PRINT_INDEX_ARRAY(y, n);
NEW(unique, boolean, n);
memset(unique, TRUE, n);
{
int_t j = n;
do {
j--;
const int_t i = y[j];
if (x[i] < 0) {
x[i] = j;
}
else {
unique[i] = FALSE;
y[j] = -1;
}
} while (j > 0);
}
n_free_rows = 0;
for (uint_t i = 0; i < n; i++) {
if (x[i] < 0) {
free_rows[n_free_rows++] = i;
}
else if (unique[i]) {
const int_t j = x[i];
cost_t min = LARGE;
for (uint_t j2 = 0; j2 < n; j2++) {
if (j2 == (uint_t)j) {
continue;
}
const cost_t c = cost[i][j2] - v[j2];
if (c < min) {
min = c;
}
}
PRINTF("v[%d] = %f - %f\n", j, v[j], min);
v[j] -= min;
}
}
FREE(unique);
return n_free_rows;
}


/** Augmenting row reduction for a dense cost matrix.
*/
int_t _carr_dense(
const uint_t n, cost_t *cost[],
const uint_t n_free_rows,
int_t *free_rows, int_t *x, int_t *y, cost_t *v)
{
uint_t current = 0;
int_t new_free_rows = 0;
uint_t rr_cnt = 0;
PRINT_INDEX_ARRAY(x, n);
PRINT_INDEX_ARRAY(y, n);
PRINT_COST_ARRAY(v, n);
PRINT_INDEX_ARRAY(free_rows, n_free_rows);
while (current < n_free_rows) {
int_t i0;
int_t j1, j2;
cost_t v1, v2, v1_new;
boolean v1_lowers;

rr_cnt++;
PRINTF("current = %d rr_cnt = %d\n", current, rr_cnt);
const int_t free_i = free_rows[current++];
j1 = 0;
v1 = cost[free_i][0] - v[0];
j2 = -1;
v2 = LARGE;
for (uint_t j = 1; j < n; j++) {
PRINTF("%d = %f %d = %f\n", j1, v1, j2, v2);
const cost_t c = cost[free_i][j] - v[j];
if (c < v2) {
if (c >= v1) {
v2 = c;
j2 = j;
}
else {
v2 = v1;
v1 = c;
j2 = j1;
j1 = j;
}
}
}
i0 = y[j1];
v1_new = v[j1] - (v2 - v1);
v1_lowers = v1_new < v[j1];
PRINTF("%d %d 1=%d,%f 2=%d,%f v1'=%f(%d,%g) \n", free_i, i0, j1, v1, j2, v2, v1_new, v1_lowers, v[j1] - v1_new);
if (rr_cnt < current * n) {
if (v1_lowers) {
v[j1] = v1_new;
}
else if (i0 >= 0 && j2 >= 0) {
j1 = j2;
i0 = y[j2];
}
if (i0 >= 0) {
if (v1_lowers) {
free_rows[--current] = i0;
}
else {
free_rows[new_free_rows++] = i0;
}
}
}
else {
PRINTF("rr_cnt=%d >= %d (current=%d * n=%d)\n", rr_cnt, current * n, current, n);
if (i0 >= 0) {
free_rows[new_free_rows++] = i0;
}
}
x[free_i] = j1;
y[j1] = free_i;
}
return new_free_rows;
}


/** Find columns with minimum d[j] and put them on the SCAN list.
*/
uint_t _find_dense(const uint_t n, uint_t lo, cost_t *d, int_t *cols, int_t *y)
{
uint_t hi = lo + 1;
cost_t mind = d[cols[lo]];
for (uint_t k = hi; k < n; k++) {
int_t j = cols[k];
if (d[j] <= mind) {
if (d[j] < mind) {
hi = lo;
mind = d[j];
}
cols[k] = cols[hi];
cols[hi++] = j;
}
}
return hi;
}


// Scan all columns in TODO starting from arbitrary column in SCAN
// and try to decrease d of the TODO columns using the SCAN column.
int_t _scan_dense(const uint_t n, cost_t *cost[],
uint_t *plo, uint_t*phi,
cost_t *d, int_t *cols, int_t *pred,
int_t *y, cost_t *v)
{
uint_t lo = *plo;
uint_t hi = *phi;
cost_t h, cred_ij;

while (lo != hi) {
int_t j = cols[lo++];
const int_t i = y[j];
const cost_t mind = d[j];
h = cost[i][j] - v[j] - mind;
PRINTF("i=%d j=%d h=%f\n", i, j, h);
// For all columns in TODO
for (uint_t k = hi; k < n; k++) {
j = cols[k];
cred_ij = cost[i][j] - v[j] - h;
if (cred_ij < d[j]) {
d[j] = cred_ij;
pred[j] = i;
if (cred_ij == mind) {
if (y[j] < 0) {
return j;
}
cols[k] = cols[hi];
cols[hi++] = j;
}
}
}
}
*plo = lo;
*phi = hi;
return -1;
}


/** Single iteration of modified Dijkstra shortest path algorithm as explained in the JV paper.
*
* This is a dense matrix version.
*
* \return The closest free column index.
*/
int_t find_path_dense(
const uint_t n, cost_t *cost[],
const int_t start_i,
int_t *y, cost_t *v,
int_t *pred)
{
uint_t lo = 0, hi = 0;
int_t final_j = -1;
uint_t n_ready = 0;
int_t *cols;
cost_t *d;

NEW(cols, int_t, n);
NEW(d, cost_t, n);

for (uint_t i = 0; i < n; i++) {
cols[i] = i;
pred[i] = start_i;
d[i] = cost[start_i][i] - v[i];
}
PRINT_COST_ARRAY(d, n);
while (final_j == -1) {
// No columns left on the SCAN list.
if (lo == hi) {
PRINTF("%d..%d -> find\n", lo, hi);
n_ready = lo;
hi = _find_dense(n, lo, d, cols, y);
PRINTF("check %d..%d\n", lo, hi);
PRINT_INDEX_ARRAY(cols, n);
for (uint_t k = lo; k < hi; k++) {
const int_t j = cols[k];
if (y[j] < 0) {
final_j = j;
}
}
}
if (final_j == -1) {
PRINTF("%d..%d -> scan\n", lo, hi);
final_j = _scan_dense(
n, cost, &lo, &hi, d, cols, pred, y, v);
PRINT_COST_ARRAY(d, n);
PRINT_INDEX_ARRAY(cols, n);
PRINT_INDEX_ARRAY(pred, n);
}
}

PRINTF("found final_j=%d\n", final_j);
PRINT_INDEX_ARRAY(cols, n);
{
const cost_t mind = d[cols[lo]];
for (uint_t k = 0; k < n_ready; k++) {
const int_t j = cols[k];
v[j] += d[j] - mind;
}
}

FREE(cols);
FREE(d);

return final_j;
}


/** Augment for a dense cost matrix.
*/
int_t _ca_dense(
const uint_t n, cost_t *cost[],
const uint_t n_free_rows,
int_t *free_rows, int_t *x, int_t *y, cost_t *v)
{
int_t *pred;

NEW(pred, int_t, n);

for (int_t *pfree_i = free_rows; pfree_i < free_rows + n_free_rows; pfree_i++) {
int_t i = -1, j;
uint_t k = 0;

PRINTF("looking at free_i=%d\n", *pfree_i);
j = find_path_dense(n, cost, *pfree_i, y, v, pred);
ASSERT(j >= 0);
ASSERT(j < n);
while (i != *pfree_i) {
PRINTF("augment %d\n", j);
PRINT_INDEX_ARRAY(pred, n);
i = pred[j];
PRINTF("y[%d]=%d -> %d\n", j, y[j], i);
y[j] = i;
PRINT_INDEX_ARRAY(x, n);
SWAP_INDICES(j, x[i]);
k++;
if (k >= n) {
ASSERT(FALSE);
}
}
}
FREE(pred);
return 0;
}


/** Solve dense sparse LAP.
*/
int lapjv_internal(
const uint_t n, cost_t *cost[],
int_t *x, int_t *y)
{
int ret;
int_t *free_rows;
cost_t *v;

NEW(free_rows, int_t, n);
NEW(v, cost_t, n);
ret = _ccrrt_dense(n, cost, free_rows, x, y, v);
int i = 0;
while (ret > 0 && i < 2) {
ret = _carr_dense(n, cost, ret, free_rows, x, y, v);
i++;
}
if (ret > 0) {
ret = _ca_dense(n, cost, ret, free_rows, x, y, v);
}
FREE(v);
FREE(free_rows);
return ret;
}

+ 429
- 0
deploy/TensorRT/cpp/src/utils.cpp View File

#include "BYTETracker.h"
#include "lapjv.h"

vector<STrack*> BYTETracker::joint_stracks(vector<STrack*> &tlista, vector<STrack> &tlistb)
{
map<int, int> exists;
vector<STrack*> res;
for (int i = 0; i < tlista.size(); i++)
{
exists.insert(pair<int, int>(tlista[i]->track_id, 1));
res.push_back(tlista[i]);
}
for (int i = 0; i < tlistb.size(); i++)
{
int tid = tlistb[i].track_id;
if (!exists[tid] || exists.count(tid) == 0)
{
exists[tid] = 1;
res.push_back(&tlistb[i]);
}
}
return res;
}

vector<STrack> BYTETracker::joint_stracks(vector<STrack> &tlista, vector<STrack> &tlistb)
{
map<int, int> exists;
vector<STrack> res;
for (int i = 0; i < tlista.size(); i++)
{
exists.insert(pair<int, int>(tlista[i].track_id, 1));
res.push_back(tlista[i]);
}
for (int i = 0; i < tlistb.size(); i++)
{
int tid = tlistb[i].track_id;
if (!exists[tid] || exists.count(tid) == 0)
{
exists[tid] = 1;
res.push_back(tlistb[i]);
}
}
return res;
}

vector<STrack> BYTETracker::sub_stracks(vector<STrack> &tlista, vector<STrack> &tlistb)
{
map<int, STrack> stracks;
for (int i = 0; i < tlista.size(); i++)
{
stracks.insert(pair<int, STrack>(tlista[i].track_id, tlista[i]));
}
for (int i = 0; i < tlistb.size(); i++)
{
int tid = tlistb[i].track_id;
if (stracks.count(tid) != 0)
{
stracks.erase(tid);
}
}

vector<STrack> res;
std::map<int, STrack>::iterator it;
for (it = stracks.begin(); it != stracks.end(); ++it)
{
res.push_back(it->second);
}

return res;
}

void BYTETracker::remove_duplicate_stracks(vector<STrack> &resa, vector<STrack> &resb, vector<STrack> &stracksa, vector<STrack> &stracksb)
{
vector<vector<float> > pdist = iou_distance(stracksa, stracksb);
vector<pair<int, int> > pairs;
for (int i = 0; i < pdist.size(); i++)
{
for (int j = 0; j < pdist[i].size(); j++)
{
if (pdist[i][j] < 0.15)
{
pairs.push_back(pair<int, int>(i, j));
}
}
}

vector<int> dupa, dupb;
for (int i = 0; i < pairs.size(); i++)
{
int timep = stracksa[pairs[i].first].frame_id - stracksa[pairs[i].first].start_frame;
int timeq = stracksb[pairs[i].second].frame_id - stracksb[pairs[i].second].start_frame;
if (timep > timeq)
dupb.push_back(pairs[i].second);
else
dupa.push_back(pairs[i].first);
}

for (int i = 0; i < stracksa.size(); i++)
{
vector<int>::iterator iter = find(dupa.begin(), dupa.end(), i);
if (iter == dupa.end())
{
resa.push_back(stracksa[i]);
}
}

for (int i = 0; i < stracksb.size(); i++)
{
vector<int>::iterator iter = find(dupb.begin(), dupb.end(), i);
if (iter == dupb.end())
{
resb.push_back(stracksb[i]);
}
}
}

void BYTETracker::linear_assignment(vector<vector<float> > &cost_matrix, int cost_matrix_size, int cost_matrix_size_size, float thresh,
vector<vector<int> > &matches, vector<int> &unmatched_a, vector<int> &unmatched_b)
{
if (cost_matrix.size() == 0)
{
for (int i = 0; i < cost_matrix_size; i++)
{
unmatched_a.push_back(i);
}
for (int i = 0; i < cost_matrix_size_size; i++)
{
unmatched_b.push_back(i);
}
return;
}

vector<int> rowsol; vector<int> colsol;
float c = lapjv(cost_matrix, rowsol, colsol, true, thresh);
for (int i = 0; i < rowsol.size(); i++)
{
if (rowsol[i] >= 0)
{
vector<int> match;
match.push_back(i);
match.push_back(rowsol[i]);
matches.push_back(match);
}
else
{
unmatched_a.push_back(i);
}
}

for (int i = 0; i < colsol.size(); i++)
{
if (colsol[i] < 0)
{
unmatched_b.push_back(i);
}
}
}

vector<vector<float> > BYTETracker::ious(vector<vector<float> > &atlbrs, vector<vector<float> > &btlbrs)
{
vector<vector<float> > ious;
if (atlbrs.size()*btlbrs.size() == 0)
return ious;

ious.resize(atlbrs.size());
for (int i = 0; i < ious.size(); i++)
{
ious[i].resize(btlbrs.size());
}

//bbox_ious
for (int k = 0; k < btlbrs.size(); k++)
{
vector<float> ious_tmp;
float box_area = (btlbrs[k][2] - btlbrs[k][0] + 1)*(btlbrs[k][3] - btlbrs[k][1] + 1);
for (int n = 0; n < atlbrs.size(); n++)
{
float iw = min(atlbrs[n][2], btlbrs[k][2]) - max(atlbrs[n][0], btlbrs[k][0]) + 1;
if (iw > 0)
{
float ih = min(atlbrs[n][3], btlbrs[k][3]) - max(atlbrs[n][1], btlbrs[k][1]) + 1;
if(ih > 0)
{
float ua = (atlbrs[n][2] - atlbrs[n][0] + 1)*(atlbrs[n][3] - atlbrs[n][1] + 1) + box_area - iw * ih;
ious[n][k] = iw * ih / ua;
}
else
{
ious[n][k] = 0.0;
}
}
else
{
ious[n][k] = 0.0;
}
}
}

return ious;
}

vector<vector<float> > BYTETracker::iou_distance(vector<STrack*> &atracks, vector<STrack> &btracks, int &dist_size, int &dist_size_size)
{
vector<vector<float> > cost_matrix;
if (atracks.size() * btracks.size() == 0)
{
dist_size = atracks.size();
dist_size_size = btracks.size();
return cost_matrix;
}
vector<vector<float> > atlbrs, btlbrs;
for (int i = 0; i < atracks.size(); i++)
{
atlbrs.push_back(atracks[i]->tlbr);
}
for (int i = 0; i < btracks.size(); i++)
{
btlbrs.push_back(btracks[i].tlbr);
}

dist_size = atracks.size();
dist_size_size = btracks.size();

vector<vector<float> > _ious = ious(atlbrs, btlbrs);
for (int i = 0; i < _ious.size();i++)
{
vector<float> _iou;
for (int j = 0; j < _ious[i].size(); j++)
{
_iou.push_back(1 - _ious[i][j]);
}
cost_matrix.push_back(_iou);
}

return cost_matrix;
}

vector<vector<float> > BYTETracker::iou_distance(vector<STrack> &atracks, vector<STrack> &btracks)
{
vector<vector<float> > atlbrs, btlbrs;
for (int i = 0; i < atracks.size(); i++)
{
atlbrs.push_back(atracks[i].tlbr);
}
for (int i = 0; i < btracks.size(); i++)
{
btlbrs.push_back(btracks[i].tlbr);
}

vector<vector<float> > _ious = ious(atlbrs, btlbrs);
vector<vector<float> > cost_matrix;
for (int i = 0; i < _ious.size(); i++)
{
vector<float> _iou;
for (int j = 0; j < _ious[i].size(); j++)
{
_iou.push_back(1 - _ious[i][j]);
}
cost_matrix.push_back(_iou);
}

return cost_matrix;
}

double BYTETracker::lapjv(const vector<vector<float> > &cost, vector<int> &rowsol, vector<int> &colsol,
bool extend_cost, float cost_limit, bool return_cost)
{
vector<vector<float> > cost_c;
cost_c.assign(cost.begin(), cost.end());

vector<vector<float> > cost_c_extended;

int n_rows = cost.size();
int n_cols = cost[0].size();
rowsol.resize(n_rows);
colsol.resize(n_cols);

int n = 0;
if (n_rows == n_cols)
{
n = n_rows;
}
else
{
if (!extend_cost)
{
cout << "set extend_cost=True" << endl;
system("pause");
exit(0);
}
}
if (extend_cost || cost_limit < LONG_MAX)
{
n = n_rows + n_cols;
cost_c_extended.resize(n);
for (int i = 0; i < cost_c_extended.size(); i++)
cost_c_extended[i].resize(n);

if (cost_limit < LONG_MAX)
{
for (int i = 0; i < cost_c_extended.size(); i++)
{
for (int j = 0; j < cost_c_extended[i].size(); j++)
{
cost_c_extended[i][j] = cost_limit / 2.0;
}
}
}
else
{
float cost_max = -1;
for (int i = 0; i < cost_c.size(); i++)
{
for (int j = 0; j < cost_c[i].size(); j++)
{
if (cost_c[i][j] > cost_max)
cost_max = cost_c[i][j];
}
}
for (int i = 0; i < cost_c_extended.size(); i++)
{
for (int j = 0; j < cost_c_extended[i].size(); j++)
{
cost_c_extended[i][j] = cost_max + 1;
}
}
}

for (int i = n_rows; i < cost_c_extended.size(); i++)
{
for (int j = n_cols; j < cost_c_extended[i].size(); j++)
{
cost_c_extended[i][j] = 0;
}
}
for (int i = 0; i < n_rows; i++)
{
for (int j = 0; j < n_cols; j++)
{
cost_c_extended[i][j] = cost_c[i][j];
}
}

cost_c.clear();
cost_c.assign(cost_c_extended.begin(), cost_c_extended.end());
}

double **cost_ptr;
cost_ptr = new double *[sizeof(double *) * n];
for (int i = 0; i < n; i++)
cost_ptr[i] = new double[sizeof(double) * n];

for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cost_ptr[i][j] = cost_c[i][j];
}
}

int* x_c = new int[sizeof(int) * n];
int *y_c = new int[sizeof(int) * n];

int ret = lapjv_internal(n, cost_ptr, x_c, y_c);
if (ret != 0)
{
cout << "Calculate Wrong!" << endl;
system("pause");
exit(0);
}

double opt = 0.0;

if (n != n_rows)
{
for (int i = 0; i < n; i++)
{
if (x_c[i] >= n_cols)
x_c[i] = -1;
if (y_c[i] >= n_rows)
y_c[i] = -1;
}
for (int i = 0; i < n_rows; i++)
{
rowsol[i] = x_c[i];
}
for (int i = 0; i < n_cols; i++)
{
colsol[i] = y_c[i];
}

if (return_cost)
{
for (int i = 0; i < rowsol.size(); i++)
{
if (rowsol[i] != -1)
{
//cout << i << "\t" << rowsol[i] << "\t" << cost_ptr[i][rowsol[i]] << endl;
opt += cost_ptr[i][rowsol[i]];
}
}
}
}
else if (return_cost)
{
for (int i = 0; i < rowsol.size(); i++)
{
opt += cost_ptr[i][rowsol[i]];
}
}

for (int i = 0; i < n; i++)
{
delete[]cost_ptr[i];
}
delete[]cost_ptr;
delete[]x_c;
delete[]y_c;

return opt;
}

Scalar BYTETracker::get_color(int idx)
{
idx += 3;
return Scalar(37 * idx % 255, 17 * idx % 255, 29 * idx % 255);
}

+ 22
- 0
deploy/TensorRT/python/README.md View File

# ByteTrack-TensorRT in Python

## Install TensorRT Toolkit
Please follow the [TensorRT Installation Guide](https://docs.nvidia.com/deeplearning/tensorrt/install-guide/index.html) and [torch2trt gitrepo](https://github.com/NVIDIA-AI-IOT/torch2trt) to install TensorRT (Version 7 recommended) and torch2trt.

## Convert model

You can convert the Pytorch model “bytetrack_s_mot17” to TensorRT model by running:

```shell
cd <ByteTrack_HOME>
python3 tools/trt.py -f exps/example/mot/yolox_s_mix_det.py -c pretrained/bytetrack_s_mot17.pth.tar
```

## Run TensorRT demo

You can use the converted model_trt.pth to run TensorRT demo with **130 FPS**:

```shell
cd <ByteTrack_HOME>
python3 tools/demo_track.py video -f exps/example/mot/yolox_s_mix_det.py --trt --save_result
```

+ 84
- 0
deploy/ncnn/cpp/CMakeLists.txt View File

macro(ncnn_add_example name)
add_executable(${name} ${name}.cpp)
if(OpenCV_FOUND)
target_include_directories(${name} PRIVATE ${OpenCV_INCLUDE_DIRS})
target_link_libraries(${name} PRIVATE ncnn ${OpenCV_LIBS})
elseif(NCNN_SIMPLEOCV)
target_compile_definitions(${name} PUBLIC USE_NCNN_SIMPLEOCV)
target_link_libraries(${name} PRIVATE ncnn)
endif()

# add test to a virtual project group
set_property(TARGET ${name} PROPERTY FOLDER "examples")
endmacro()

if(NCNN_PIXEL)
find_package(OpenCV QUIET COMPONENTS opencv_world)
# for opencv 2.4 on ubuntu 16.04, there is no opencv_world but OpenCV_FOUND will be TRUE
if("${OpenCV_LIBS}" STREQUAL "")
set(OpenCV_FOUND FALSE)
endif()
if(NOT OpenCV_FOUND)
find_package(OpenCV QUIET COMPONENTS core highgui imgproc imgcodecs videoio)
endif()
if(NOT OpenCV_FOUND)
find_package(OpenCV QUIET COMPONENTS core highgui imgproc)
endif()

if(OpenCV_FOUND OR NCNN_SIMPLEOCV)
if(OpenCV_FOUND)
message(STATUS "OpenCV library: ${OpenCV_INSTALL_PATH}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")

if(${OpenCV_VERSION_MAJOR} GREATER 3)
set(CMAKE_CXX_STANDARD 11)
endif()
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/../src)
include_directories(include)
include_directories(/usr/local/include/eigen3)

ncnn_add_example(squeezenet)
ncnn_add_example(squeezenet_c_api)
ncnn_add_example(fasterrcnn)
ncnn_add_example(rfcn)
ncnn_add_example(yolov2)
ncnn_add_example(yolov3)
if(OpenCV_FOUND)
ncnn_add_example(yolov4)
endif()
ncnn_add_example(yolov5)
ncnn_add_example(yolox)
ncnn_add_example(mobilenetv2ssdlite)
ncnn_add_example(mobilenetssd)
ncnn_add_example(squeezenetssd)
ncnn_add_example(shufflenetv2)
ncnn_add_example(peleenetssd_seg)
ncnn_add_example(simplepose)
ncnn_add_example(retinaface)
ncnn_add_example(yolact)
ncnn_add_example(nanodet)
ncnn_add_example(scrfd)
ncnn_add_example(scrfd_crowdhuman)
ncnn_add_example(rvm)
file(GLOB My_Source_Files src/*.cpp)
add_executable(bytetrack ${My_Source_Files})
if(OpenCV_FOUND)
target_include_directories(bytetrack PRIVATE ${OpenCV_INCLUDE_DIRS})
target_link_libraries(bytetrack PRIVATE ncnn ${OpenCV_LIBS})
elseif(NCNN_SIMPLEOCV)
target_compile_definitions(bytetrack PUBLIC USE_NCNN_SIMPLEOCV)
target_link_libraries(bytetrack PRIVATE ncnn)
endif()
# add test to a virtual project group
set_property(TARGET bytetrack PROPERTY FOLDER "examples")
else()
message(WARNING "OpenCV not found and NCNN_SIMPLEOCV disabled, examples won't be built")
endif()
else()
message(WARNING "NCNN_PIXEL not enabled, examples won't be built")
endif()

+ 103
- 0
deploy/ncnn/cpp/README.md View File

# ByteTrack-CPP-ncnn

## Installation

Clone [ncnn](https://github.com/Tencent/ncnn) first, then please following [build tutorial of ncnn](https://github.com/Tencent/ncnn/wiki/how-to-build) to build on your own device.

Install eigen-3.3.9 [[google]](https://drive.google.com/file/d/1rqO74CYCNrmRAg8Rra0JP3yZtJ-rfket/view?usp=sharing), [[baidu(code:ueq4)]](https://pan.baidu.com/s/15kEfCxpy-T7tz60msxxExg).

```shell
unzip eigen-3.3.9.zip
cd eigen-3.3.9
mkdir build
cd build
cmake ..
sudo make install
```

## Generate onnx file
Use provided tools to generate onnx file.
For example, if you want to generate onnx file of bytetrack_s_mot17.pth, please run the following command:
```shell
cd <ByteTrack_HOME>
python3 tools/export_onnx.py -f exps/example/mot/yolox_s_mix_det.py -c pretrained/bytetrack_s_mot17.pth.tar
```
Then, a bytetrack_s.onnx file is generated under <ByteTrack_HOME>.

## Generate ncnn param and bin file
Put bytetrack_s.onnx under ncnn/build/tools/onnx and then run:

```shell
cd ncnn/build/tools/onnx
./onnx2ncnn bytetrack_s.onnx bytetrack_s.param bytetrack_s.bin
```

Since Focus module is not supported in ncnn. Warnings like:
```shell
Unsupported slice step !
```
will be printed. However, don't worry! C++ version of Focus layer is already implemented in src/bytetrack.cpp.
## Modify param file
Open **bytetrack_s.param**, and modify it.
Before (just an example):
```
235 268
Input images 0 1 images
Split splitncnn_input0 1 4 images images_splitncnn_0 images_splitncnn_1 images_splitncnn_2 images_splitncnn_3
Crop Slice_4 1 1 images_splitncnn_3 467 -23309=1,0 -23310=1,2147483647 -23311=1,1
Crop Slice_9 1 1 467 472 -23309=1,0 -23310=1,2147483647 -23311=1,2
Crop Slice_14 1 1 images_splitncnn_2 477 -23309=1,0 -23310=1,2147483647 -23311=1,1
Crop Slice_19 1 1 477 482 -23309=1,1 -23310=1,2147483647 -23311=1,2
Crop Slice_24 1 1 images_splitncnn_1 487 -23309=1,1 -23310=1,2147483647 -23311=1,1
Crop Slice_29 1 1 487 492 -23309=1,0 -23310=1,2147483647 -23311=1,2
Crop Slice_34 1 1 images_splitncnn_0 497 -23309=1,1 -23310=1,2147483647 -23311=1,1
Crop Slice_39 1 1 497 502 -23309=1,1 -23310=1,2147483647 -23311=1,2
Concat Concat_40 4 1 472 492 482 502 503 0=0
...
```
* Change first number for 235 to 235 - 9 = 226(since we will remove 10 layers and add 1 layers, total layers number should minus 9).
* Then remove 10 lines of code from Split to Concat, but remember the last but 2nd number: 503.
* Add YoloV5Focus layer After Input (using previous number 503):
```
YoloV5Focus focus 1 1 images 503
```
After(just an exmaple):
```
226 328
Input images 0 1 images
YoloV5Focus focus 1 1 images 503
...
```

## Use ncnn_optimize to generate new param and bin
```shell
# suppose you are still under ncnn/build/tools/onnx dir.
../ncnnoptimize bytetrack_s.param bytetrack_s.bin bytetrack_s_op.param bytetrack_s_op.bin 65536
```

## Copy files and build ByteTrack
Copy or move 'src', 'include' folders and 'CMakeLists.txt' file into ncnn/examples. Copy bytetrack_s_op.param, bytetrack_s_op.bin and <ByteTrack_HOME>/videos/palace.mp4 into ncnn/build/examples. Then, build ByteTrack:

```shell
cd ncnn/build/examples
cmake ..
make
```

## Run the demo
You can run the ncnn demo with **5 FPS** (96-core Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz):
```shell
./bytetrack palace.mp4
```

You can modify 'num_threads' to optimize the running speed in [bytetrack.cpp](https://github.com/ifzhang/ByteTrack/blob/2e9a67895da6b47b948015f6861bba0bacd4e72f/deploy/ncnn/cpp/src/bytetrack.cpp#L309) according to the number of your CPU cores:

```
yolox.opt.num_threads = 20;
```


## Acknowledgement

* [ncnn](https://github.com/Tencent/ncnn)

+ 49
- 0
deploy/ncnn/cpp/include/BYTETracker.h View File

#pragma once

#include "STrack.h"

struct Object
{
cv::Rect_<float> rect;
int label;
float prob;
};

class BYTETracker
{
public:
BYTETracker(int frame_rate = 30, int track_buffer = 30);
~BYTETracker();

vector<STrack> update(const vector<Object>& objects);
Scalar get_color(int idx);

private:
vector<STrack*> joint_stracks(vector<STrack*> &tlista, vector<STrack> &tlistb);
vector<STrack> joint_stracks(vector<STrack> &tlista, vector<STrack> &tlistb);

vector<STrack> sub_stracks(vector<STrack> &tlista, vector<STrack> &tlistb);
void remove_duplicate_stracks(vector<STrack> &resa, vector<STrack> &resb, vector<STrack> &stracksa, vector<STrack> &stracksb);

void linear_assignment(vector<vector<float> > &cost_matrix, int cost_matrix_size, int cost_matrix_size_size, float thresh,
vector<vector<int> > &matches, vector<int> &unmatched_a, vector<int> &unmatched_b);
vector<vector<float> > iou_distance(vector<STrack*> &atracks, vector<STrack> &btracks, int &dist_size, int &dist_size_size);
vector<vector<float> > iou_distance(vector<STrack> &atracks, vector<STrack> &btracks);
vector<vector<float> > ious(vector<vector<float> > &atlbrs, vector<vector<float> > &btlbrs);

double lapjv(const vector<vector<float> > &cost, vector<int> &rowsol, vector<int> &colsol,
bool extend_cost = false, float cost_limit = LONG_MAX, bool return_cost = true);

private:

float track_thresh;
float high_thresh;
float match_thresh;
int frame_id;
int max_time_lost;

vector<STrack> tracked_stracks;
vector<STrack> lost_stracks;
vector<STrack> removed_stracks;
byte_kalman::KalmanFilter kalman_filter;
};

+ 50
- 0
deploy/ncnn/cpp/include/STrack.h View File

#pragma once

#include <opencv2/opencv.hpp>
#include "kalmanFilter.h"

using namespace cv;
using namespace std;

enum TrackState { New = 0, Tracked, Lost, Removed };

class STrack
{
public:
STrack(vector<float> tlwh_, float score);
~STrack();

vector<float> static tlbr_to_tlwh(vector<float> &tlbr);
void static multi_predict(vector<STrack*> &stracks, byte_kalman::KalmanFilter &kalman_filter);
void static_tlwh();
void static_tlbr();
vector<float> tlwh_to_xyah(vector<float> tlwh_tmp);
vector<float> to_xyah();
void mark_lost();
void mark_removed();
int next_id();
int end_frame();
void activate(byte_kalman::KalmanFilter &kalman_filter, int frame_id);
void re_activate(STrack &new_track, int frame_id, bool new_id = false);
void update(STrack &new_track, int frame_id);

public:
bool is_activated;
int track_id;
int state;

vector<float> _tlwh;
vector<float> tlwh;
vector<float> tlbr;
int frame_id;
int tracklet_len;
int start_frame;

KAL_MEAN mean;
KAL_COVA covariance;
float score;

private:
byte_kalman::KalmanFilter kalman_filter;
};

+ 36
- 0
deploy/ncnn/cpp/include/dataType.h View File

#pragma once

#include <cstddef>
#include <vector>

#include <Eigen/Core>
#include <Eigen/Dense>
typedef Eigen::Matrix<float, 1, 4, Eigen::RowMajor> DETECTBOX;
typedef Eigen::Matrix<float, -1, 4, Eigen::RowMajor> DETECTBOXSS;
typedef Eigen::Matrix<float, 1, 128, Eigen::RowMajor> FEATURE;
typedef Eigen::Matrix<float, Eigen::Dynamic, 128, Eigen::RowMajor> FEATURESS;
//typedef std::vector<FEATURE> FEATURESS;

//Kalmanfilter
//typedef Eigen::Matrix<float, 8, 8, Eigen::RowMajor> KAL_FILTER;
typedef Eigen::Matrix<float, 1, 8, Eigen::RowMajor> KAL_MEAN;
typedef Eigen::Matrix<float, 8, 8, Eigen::RowMajor> KAL_COVA;
typedef Eigen::Matrix<float, 1, 4, Eigen::RowMajor> KAL_HMEAN;
typedef Eigen::Matrix<float, 4, 4, Eigen::RowMajor> KAL_HCOVA;
using KAL_DATA = std::pair<KAL_MEAN, KAL_COVA>;
using KAL_HDATA = std::pair<KAL_HMEAN, KAL_HCOVA>;

//main
using RESULT_DATA = std::pair<int, DETECTBOX>;

//tracker:
using TRACKER_DATA = std::pair<int, FEATURESS>;
using MATCH_DATA = std::pair<int, int>;
typedef struct t {
std::vector<MATCH_DATA> matches;
std::vector<int> unmatched_tracks;
std::vector<int> unmatched_detections;
}TRACHER_MATCHD;

//linear_assignment:
typedef Eigen::Matrix<float, -1, -1, Eigen::RowMajor> DYNAMICM;

+ 31
- 0
deploy/ncnn/cpp/include/kalmanFilter.h View File

#pragma once

#include "dataType.h"

namespace byte_kalman
{
class KalmanFilter
{
public:
static const double chi2inv95[10];
KalmanFilter();
KAL_DATA initiate(const DETECTBOX& measurement);
void predict(KAL_MEAN& mean, KAL_COVA& covariance);
KAL_HDATA project(const KAL_MEAN& mean, const KAL_COVA& covariance);
KAL_DATA update(const KAL_MEAN& mean,
const KAL_COVA& covariance,
const DETECTBOX& measurement);

Eigen::Matrix<float, 1, -1> gating_distance(
const KAL_MEAN& mean,
const KAL_COVA& covariance,
const std::vector<DETECTBOX>& measurements,
bool only_position = false);

private:
Eigen::Matrix<float, 8, 8, Eigen::RowMajor> _motion_mat;
Eigen::Matrix<float, 4, 8, Eigen::RowMajor> _update_mat;
float _std_weight_position;
float _std_weight_velocity;
};
}

+ 63
- 0
deploy/ncnn/cpp/include/lapjv.h View File

#ifndef LAPJV_H
#define LAPJV_H

#define LARGE 1000000

#if !defined TRUE
#define TRUE 1
#endif
#if !defined FALSE
#define FALSE 0
#endif

#define NEW(x, t, n) if ((x = (t *)malloc(sizeof(t) * (n))) == 0) { return -1; }
#define FREE(x) if (x != 0) { free(x); x = 0; }
#define SWAP_INDICES(a, b) { int_t _temp_index = a; a = b; b = _temp_index; }

#if 0
#include <assert.h>
#define ASSERT(cond) assert(cond)
#define PRINTF(fmt, ...) printf(fmt, ##__VA_ARGS__)
#define PRINT_COST_ARRAY(a, n) \
while (1) { \
printf(#a" = ["); \
if ((n) > 0) { \
printf("%f", (a)[0]); \
for (uint_t j = 1; j < n; j++) { \
printf(", %f", (a)[j]); \
} \
} \
printf("]\n"); \
break; \
}
#define PRINT_INDEX_ARRAY(a, n) \
while (1) { \
printf(#a" = ["); \
if ((n) > 0) { \
printf("%d", (a)[0]); \
for (uint_t j = 1; j < n; j++) { \
printf(", %d", (a)[j]); \
} \
} \
printf("]\n"); \
break; \
}
#else
#define ASSERT(cond)
#define PRINTF(fmt, ...)
#define PRINT_COST_ARRAY(a, n)
#define PRINT_INDEX_ARRAY(a, n)
#endif


typedef signed int int_t;
typedef unsigned int uint_t;
typedef double cost_t;
typedef char boolean;
typedef enum fp_t { FP_1 = 1, FP_2 = 2, FP_DYNAMIC = 3 } fp_t;

extern int_t lapjv_internal(
const uint_t n, cost_t *cost[],
int_t *x, int_t *y);

#endif // LAPJV_H

+ 241
- 0
deploy/ncnn/cpp/src/BYTETracker.cpp View File

#include "BYTETracker.h"
#include <fstream>

BYTETracker::BYTETracker(int frame_rate, int track_buffer)
{
track_thresh = 0.5;
high_thresh = 0.6;
match_thresh = 0.8;

frame_id = 0;
max_time_lost = int(frame_rate / 30.0 * track_buffer);
cout << "Init ByteTrack!" << endl;
}

BYTETracker::~BYTETracker()
{
}

vector<STrack> BYTETracker::update(const vector<Object>& objects)
{

////////////////// Step 1: Get detections //////////////////
this->frame_id++;
vector<STrack> activated_stracks;
vector<STrack> refind_stracks;
vector<STrack> removed_stracks;
vector<STrack> lost_stracks;
vector<STrack> detections;
vector<STrack> detections_low;

vector<STrack> detections_cp;
vector<STrack> tracked_stracks_swap;
vector<STrack> resa, resb;
vector<STrack> output_stracks;

vector<STrack*> unconfirmed;
vector<STrack*> tracked_stracks;
vector<STrack*> strack_pool;
vector<STrack*> r_tracked_stracks;

if (objects.size() > 0)
{
for (int i = 0; i < objects.size(); i++)
{
vector<float> tlbr_;
tlbr_.resize(4);
tlbr_[0] = objects[i].rect.x;
tlbr_[1] = objects[i].rect.y;
tlbr_[2] = objects[i].rect.x + objects[i].rect.width;
tlbr_[3] = objects[i].rect.y + objects[i].rect.height;

float score = objects[i].prob;

STrack strack(STrack::tlbr_to_tlwh(tlbr_), score);
if (score >= track_thresh)
{
detections.push_back(strack);
}
else
{
detections_low.push_back(strack);
}
}
}

// Add newly detected tracklets to tracked_stracks
for (int i = 0; i < this->tracked_stracks.size(); i++)
{
if (!this->tracked_stracks[i].is_activated)
unconfirmed.push_back(&this->tracked_stracks[i]);
else
tracked_stracks.push_back(&this->tracked_stracks[i]);
}

////////////////// Step 2: First association, with IoU //////////////////
strack_pool = joint_stracks(tracked_stracks, this->lost_stracks);
STrack::multi_predict(strack_pool, this->kalman_filter);

vector<vector<float> > dists;
int dist_size = 0, dist_size_size = 0;
dists = iou_distance(strack_pool, detections, dist_size, dist_size_size);

vector<vector<int> > matches;
vector<int> u_track, u_detection;
linear_assignment(dists, dist_size, dist_size_size, match_thresh, matches, u_track, u_detection);

for (int i = 0; i < matches.size(); i++)
{
STrack *track = strack_pool[matches[i][0]];
STrack *det = &detections[matches[i][1]];
if (track->state == TrackState::Tracked)
{
track->update(*det, this->frame_id);
activated_stracks.push_back(*track);
}
else
{
track->re_activate(*det, this->frame_id, false);
refind_stracks.push_back(*track);
}
}

////////////////// Step 3: Second association, using low score dets //////////////////
for (int i = 0; i < u_detection.size(); i++)
{
detections_cp.push_back(detections[u_detection[i]]);
}
detections.clear();
detections.assign(detections_low.begin(), detections_low.end());
for (int i = 0; i < u_track.size(); i++)
{
if (strack_pool[u_track[i]]->state == TrackState::Tracked)
{
r_tracked_stracks.push_back(strack_pool[u_track[i]]);
}
}

dists.clear();
dists = iou_distance(r_tracked_stracks, detections, dist_size, dist_size_size);

matches.clear();
u_track.clear();
u_detection.clear();
linear_assignment(dists, dist_size, dist_size_size, 0.5, matches, u_track, u_detection);

for (int i = 0; i < matches.size(); i++)
{
STrack *track = r_tracked_stracks[matches[i][0]];
STrack *det = &detections[matches[i][1]];
if (track->state == TrackState::Tracked)
{
track->update(*det, this->frame_id);
activated_stracks.push_back(*track);
}
else
{
track->re_activate(*det, this->frame_id, false);
refind_stracks.push_back(*track);
}
}

for (int i = 0; i < u_track.size(); i++)
{
STrack *track = r_tracked_stracks[u_track[i]];
if (track->state != TrackState::Lost)
{
track->mark_lost();
lost_stracks.push_back(*track);
}
}

// Deal with unconfirmed tracks, usually tracks with only one beginning frame
detections.clear();
detections.assign(detections_cp.begin(), detections_cp.end());

dists.clear();
dists = iou_distance(unconfirmed, detections, dist_size, dist_size_size);

matches.clear();
vector<int> u_unconfirmed;
u_detection.clear();
linear_assignment(dists, dist_size, dist_size_size, 0.7, matches, u_unconfirmed, u_detection);

for (int i = 0; i < matches.size(); i++)
{
unconfirmed[matches[i][0]]->update(detections[matches[i][1]], this->frame_id);
activated_stracks.push_back(*unconfirmed[matches[i][0]]);
}

for (int i = 0; i < u_unconfirmed.size(); i++)
{
STrack *track = unconfirmed[u_unconfirmed[i]];
track->mark_removed();
removed_stracks.push_back(*track);
}

////////////////// Step 4: Init new stracks //////////////////
for (int i = 0; i < u_detection.size(); i++)
{
STrack *track = &detections[u_detection[i]];
if (track->score < this->high_thresh)
continue;
track->activate(this->kalman_filter, this->frame_id);
activated_stracks.push_back(*track);
}

////////////////// Step 5: Update state //////////////////
for (int i = 0; i < this->lost_stracks.size(); i++)
{
if (this->frame_id - this->lost_stracks[i].end_frame() > this->max_time_lost)
{
this->lost_stracks[i].mark_removed();
removed_stracks.push_back(this->lost_stracks[i]);
}
}
for (int i = 0; i < this->tracked_stracks.size(); i++)
{
if (this->tracked_stracks[i].state == TrackState::Tracked)
{
tracked_stracks_swap.push_back(this->tracked_stracks[i]);
}
}
this->tracked_stracks.clear();
this->tracked_stracks.assign(tracked_stracks_swap.begin(), tracked_stracks_swap.end());

this->tracked_stracks = joint_stracks(this->tracked_stracks, activated_stracks);
this->tracked_stracks = joint_stracks(this->tracked_stracks, refind_stracks);

//std::cout << activated_stracks.size() << std::endl;

this->lost_stracks = sub_stracks(this->lost_stracks, this->tracked_stracks);
for (int i = 0; i < lost_stracks.size(); i++)
{
this->lost_stracks.push_back(lost_stracks[i]);
}

this->lost_stracks = sub_stracks(this->lost_stracks, this->removed_stracks);
for (int i = 0; i < removed_stracks.size(); i++)
{
this->removed_stracks.push_back(removed_stracks[i]);
}
remove_duplicate_stracks(resa, resb, this->tracked_stracks, this->lost_stracks);

this->tracked_stracks.clear();
this->tracked_stracks.assign(resa.begin(), resa.end());
this->lost_stracks.clear();
this->lost_stracks.assign(resb.begin(), resb.end());
for (int i = 0; i < this->tracked_stracks.size(); i++)
{
if (this->tracked_stracks[i].is_activated)
{
output_stracks.push_back(this->tracked_stracks[i]);
}
}
return output_stracks;
}

+ 192
- 0
deploy/ncnn/cpp/src/STrack.cpp View File

#include "STrack.h"

STrack::STrack(vector<float> tlwh_, float score)
{
_tlwh.resize(4);
_tlwh.assign(tlwh_.begin(), tlwh_.end());

is_activated = false;
track_id = 0;
state = TrackState::New;
tlwh.resize(4);
tlbr.resize(4);

static_tlwh();
static_tlbr();
frame_id = 0;
tracklet_len = 0;
this->score = score;
start_frame = 0;
}

STrack::~STrack()
{
}

void STrack::activate(byte_kalman::KalmanFilter &kalman_filter, int frame_id)
{
this->kalman_filter = kalman_filter;
this->track_id = this->next_id();

vector<float> _tlwh_tmp(4);
_tlwh_tmp[0] = this->_tlwh[0];
_tlwh_tmp[1] = this->_tlwh[1];
_tlwh_tmp[2] = this->_tlwh[2];
_tlwh_tmp[3] = this->_tlwh[3];
vector<float> xyah = tlwh_to_xyah(_tlwh_tmp);
DETECTBOX xyah_box;
xyah_box[0] = xyah[0];
xyah_box[1] = xyah[1];
xyah_box[2] = xyah[2];
xyah_box[3] = xyah[3];
auto mc = this->kalman_filter.initiate(xyah_box);
this->mean = mc.first;
this->covariance = mc.second;

static_tlwh();
static_tlbr();

this->tracklet_len = 0;
this->state = TrackState::Tracked;
if (frame_id == 1)
{
this->is_activated = true;
}
//this->is_activated = true;
this->frame_id = frame_id;
this->start_frame = frame_id;
}

void STrack::re_activate(STrack &new_track, int frame_id, bool new_id)
{
vector<float> xyah = tlwh_to_xyah(new_track.tlwh);
DETECTBOX xyah_box;
xyah_box[0] = xyah[0];
xyah_box[1] = xyah[1];
xyah_box[2] = xyah[2];
xyah_box[3] = xyah[3];
auto mc = this->kalman_filter.update(this->mean, this->covariance, xyah_box);
this->mean = mc.first;
this->covariance = mc.second;

static_tlwh();
static_tlbr();

this->tracklet_len = 0;
this->state = TrackState::Tracked;
this->is_activated = true;
this->frame_id = frame_id;
this->score = new_track.score;
if (new_id)
this->track_id = next_id();
}

void STrack::update(STrack &new_track, int frame_id)
{
this->frame_id = frame_id;
this->tracklet_len++;

vector<float> xyah = tlwh_to_xyah(new_track.tlwh);
DETECTBOX xyah_box;
xyah_box[0] = xyah[0];
xyah_box[1] = xyah[1];
xyah_box[2] = xyah[2];
xyah_box[3] = xyah[3];

auto mc = this->kalman_filter.update(this->mean, this->covariance, xyah_box);
this->mean = mc.first;
this->covariance = mc.second;

static_tlwh();
static_tlbr();

this->state = TrackState::Tracked;
this->is_activated = true;

this->score = new_track.score;
}

void STrack::static_tlwh()
{
if (this->state == TrackState::New)
{
tlwh[0] = _tlwh[0];
tlwh[1] = _tlwh[1];
tlwh[2] = _tlwh[2];
tlwh[3] = _tlwh[3];
return;
}

tlwh[0] = mean[0];
tlwh[1] = mean[1];
tlwh[2] = mean[2];
tlwh[3] = mean[3];

tlwh[2] *= tlwh[3];
tlwh[0] -= tlwh[2] / 2;
tlwh[1] -= tlwh[3] / 2;
}

void STrack::static_tlbr()
{
tlbr.clear();
tlbr.assign(tlwh.begin(), tlwh.end());
tlbr[2] += tlbr[0];
tlbr[3] += tlbr[1];
}

vector<float> STrack::tlwh_to_xyah(vector<float> tlwh_tmp)
{
vector<float> tlwh_output = tlwh_tmp;
tlwh_output[0] += tlwh_output[2] / 2;
tlwh_output[1] += tlwh_output[3] / 2;
tlwh_output[2] /= tlwh_output[3];
return tlwh_output;
}

vector<float> STrack::to_xyah()
{
return tlwh_to_xyah(tlwh);
}

vector<float> STrack::tlbr_to_tlwh(vector<float> &tlbr)
{
tlbr[2] -= tlbr[0];
tlbr[3] -= tlbr[1];
return tlbr;
}

void STrack::mark_lost()
{
state = TrackState::Lost;
}

void STrack::mark_removed()
{
state = TrackState::Removed;
}

int STrack::next_id()
{
static int _count = 0;
_count++;
return _count;
}

int STrack::end_frame()
{
return this->frame_id;
}

void STrack::multi_predict(vector<STrack*> &stracks, byte_kalman::KalmanFilter &kalman_filter)
{
for (int i = 0; i < stracks.size(); i++)
{
if (stracks[i]->state != TrackState::Tracked)
{
stracks[i]->mean[7] = 0;
}
kalman_filter.predict(stracks[i]->mean, stracks[i]->covariance);
}
}

+ 396
- 0
deploy/ncnn/cpp/src/bytetrack.cpp View File

#include "layer.h"
#include "net.h"

#if defined(USE_NCNN_SIMPLEOCV)
#include "simpleocv.h"
#include <opencv2/opencv.hpp>
#else
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#endif
#include <float.h>
#include <stdio.h>
#include <vector>
#include <chrono>
#include "BYTETracker.h"

#define YOLOX_NMS_THRESH 0.7 // nms threshold
#define YOLOX_CONF_THRESH 0.1 // threshold of bounding box prob
#define INPUT_W 1088 // target image size w after resize
#define INPUT_H 608 // target image size h after resize

Mat static_resize(Mat& img) {
float r = min(INPUT_W / (img.cols*1.0), INPUT_H / (img.rows*1.0));
// r = std::min(r, 1.0f);
int unpad_w = r * img.cols;
int unpad_h = r * img.rows;
Mat re(unpad_h, unpad_w, CV_8UC3);
resize(img, re, re.size());
Mat out(INPUT_H, INPUT_W, CV_8UC3, Scalar(114, 114, 114));
re.copyTo(out(Rect(0, 0, re.cols, re.rows)));
return out;
}

// YOLOX use the same focus in yolov5
class YoloV5Focus : public ncnn::Layer
{
public:
YoloV5Focus()
{
one_blob_only = true;
}

virtual int forward(const ncnn::Mat& bottom_blob, ncnn::Mat& top_blob, const ncnn::Option& opt) const
{
int w = bottom_blob.w;
int h = bottom_blob.h;
int channels = bottom_blob.c;

int outw = w / 2;
int outh = h / 2;
int outc = channels * 4;

top_blob.create(outw, outh, outc, 4u, 1, opt.blob_allocator);
if (top_blob.empty())
return -100;

#pragma omp parallel for num_threads(opt.num_threads)
for (int p = 0; p < outc; p++)
{
const float* ptr = bottom_blob.channel(p % channels).row((p / channels) % 2) + ((p / channels) / 2);
float* outptr = top_blob.channel(p);

for (int i = 0; i < outh; i++)
{
for (int j = 0; j < outw; j++)
{
*outptr = *ptr;

outptr += 1;
ptr += 2;
}

ptr += w;
}
}

return 0;
}
};

DEFINE_LAYER_CREATOR(YoloV5Focus)

struct GridAndStride
{
int grid0;
int grid1;
int stride;
};

static inline float intersection_area(const Object& a, const Object& b)
{
cv::Rect_<float> inter = a.rect & b.rect;
return inter.area();
}

static void qsort_descent_inplace(std::vector<Object>& faceobjects, int left, int right)
{
int i = left;
int j = right;
float p = faceobjects[(left + right) / 2].prob;

while (i <= j)
{
while (faceobjects[i].prob > p)
i++;

while (faceobjects[j].prob < p)
j--;

if (i <= j)
{
// swap
std::swap(faceobjects[i], faceobjects[j]);

i++;
j--;
}
}

#pragma omp parallel sections
{
#pragma omp section
{
if (left < j) qsort_descent_inplace(faceobjects, left, j);
}
#pragma omp section
{
if (i < right) qsort_descent_inplace(faceobjects, i, right);
}
}
}

static void qsort_descent_inplace(std::vector<Object>& objects)
{
if (objects.empty())
return;

qsort_descent_inplace(objects, 0, objects.size() - 1);
}

static void nms_sorted_bboxes(const std::vector<Object>& faceobjects, std::vector<int>& picked, float nms_threshold)
{
picked.clear();

const int n = faceobjects.size();

std::vector<float> areas(n);
for (int i = 0; i < n; i++)
{
areas[i] = faceobjects[i].rect.area();
}

for (int i = 0; i < n; i++)
{
const Object& a = faceobjects[i];

int keep = 1;
for (int j = 0; j < (int)picked.size(); j++)
{
const Object& b = faceobjects[picked[j]];

// intersection over union
float inter_area = intersection_area(a, b);
float union_area = areas[i] + areas[picked[j]] - inter_area;
// float IoU = inter_area / union_area
if (inter_area / union_area > nms_threshold)
keep = 0;
}

if (keep)
picked.push_back(i);
}
}

static void generate_grids_and_stride(const int target_w, const int target_h, std::vector<int>& strides, std::vector<GridAndStride>& grid_strides)
{
for (int i = 0; i < (int)strides.size(); i++)
{
int stride = strides[i];
int num_grid_w = target_w / stride;
int num_grid_h = target_h / stride;
for (int g1 = 0; g1 < num_grid_h; g1++)
{
for (int g0 = 0; g0 < num_grid_w; g0++)
{
GridAndStride gs;
gs.grid0 = g0;
gs.grid1 = g1;
gs.stride = stride;
grid_strides.push_back(gs);
}
}
}
}

static void generate_yolox_proposals(std::vector<GridAndStride> grid_strides, const ncnn::Mat& feat_blob, float prob_threshold, std::vector<Object>& objects)
{
const int num_grid = feat_blob.h;
const int num_class = feat_blob.w - 5;
const int num_anchors = grid_strides.size();

const float* feat_ptr = feat_blob.channel(0);
for (int anchor_idx = 0; anchor_idx < num_anchors; anchor_idx++)
{
const int grid0 = grid_strides[anchor_idx].grid0;
const int grid1 = grid_strides[anchor_idx].grid1;
const int stride = grid_strides[anchor_idx].stride;

// yolox/models/yolo_head.py decode logic
// outputs[..., :2] = (outputs[..., :2] + grids) * strides
// outputs[..., 2:4] = torch.exp(outputs[..., 2:4]) * strides
float x_center = (feat_ptr[0] + grid0) * stride;
float y_center = (feat_ptr[1] + grid1) * stride;
float w = exp(feat_ptr[2]) * stride;
float h = exp(feat_ptr[3]) * stride;
float x0 = x_center - w * 0.5f;
float y0 = y_center - h * 0.5f;

float box_objectness = feat_ptr[4];
for (int class_idx = 0; class_idx < num_class; class_idx++)
{
float box_cls_score = feat_ptr[5 + class_idx];
float box_prob = box_objectness * box_cls_score;
if (box_prob > prob_threshold)
{
Object obj;
obj.rect.x = x0;
obj.rect.y = y0;
obj.rect.width = w;
obj.rect.height = h;
obj.label = class_idx;
obj.prob = box_prob;

objects.push_back(obj);
}

} // class loop
feat_ptr += feat_blob.w;

} // point anchor loop
}

static int detect_yolox(ncnn::Mat& in_pad, std::vector<Object>& objects, ncnn::Extractor ex, float scale)
{

ex.input("images", in_pad);
std::vector<Object> proposals;

{
ncnn::Mat out;
ex.extract("output", out);

static const int stride_arr[] = {8, 16, 32}; // might have stride=64 in YOLOX
std::vector<int> strides(stride_arr, stride_arr + sizeof(stride_arr) / sizeof(stride_arr[0]));
std::vector<GridAndStride> grid_strides;
generate_grids_and_stride(INPUT_W, INPUT_H, strides, grid_strides);
generate_yolox_proposals(grid_strides, out, YOLOX_CONF_THRESH, proposals);
}
// sort all proposals by score from highest to lowest
qsort_descent_inplace(proposals);

// apply nms with nms_threshold
std::vector<int> picked;
nms_sorted_bboxes(proposals, picked, YOLOX_NMS_THRESH);

int count = picked.size();

objects.resize(count);
for (int i = 0; i < count; i++)
{
objects[i] = proposals[picked[i]];

// adjust offset to original unpadded
float x0 = (objects[i].rect.x) / scale;
float y0 = (objects[i].rect.y) / scale;
float x1 = (objects[i].rect.x + objects[i].rect.width) / scale;
float y1 = (objects[i].rect.y + objects[i].rect.height) / scale;

// clip
// x0 = std::max(std::min(x0, (float)(img_w - 1)), 0.f);
// y0 = std::max(std::min(y0, (float)(img_h - 1)), 0.f);
// x1 = std::max(std::min(x1, (float)(img_w - 1)), 0.f);
// y1 = std::max(std::min(y1, (float)(img_h - 1)), 0.f);

objects[i].rect.x = x0;
objects[i].rect.y = y0;
objects[i].rect.width = x1 - x0;
objects[i].rect.height = y1 - y0;
}

return 0;
}

int main(int argc, char** argv)
{
if (argc != 2)
{
fprintf(stderr, "Usage: %s [videopath]\n", argv[0]);
return -1;
}

ncnn::Net yolox;

//yolox.opt.use_vulkan_compute = true;
//yolox.opt.use_bf16_storage = true;
yolox.opt.num_threads = 20;
//ncnn::set_cpu_powersave(0);

//ncnn::set_omp_dynamic(0);
//ncnn::set_omp_num_threads(20);

// Focus in yolov5
yolox.register_custom_layer("YoloV5Focus", YoloV5Focus_layer_creator);

yolox.load_param("bytetrack_s_op.param");
yolox.load_model("bytetrack_s_op.bin");
ncnn::Extractor ex = yolox.create_extractor();

const char* videopath = argv[1];

VideoCapture cap(videopath);
if (!cap.isOpened())
return 0;

int img_w = cap.get(CV_CAP_PROP_FRAME_WIDTH);
int img_h = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
int fps = cap.get(CV_CAP_PROP_FPS);
long nFrame = static_cast<long>(cap.get(CV_CAP_PROP_FRAME_COUNT));
cout << "Total frames: " << nFrame << endl;

VideoWriter writer("demo.mp4", CV_FOURCC('m', 'p', '4', 'v'), fps, Size(img_w, img_h));

Mat img;
BYTETracker tracker(fps, 30);
int num_frames = 0;
int total_ms = 1;
for (;;)
{
if(!cap.read(img))
break;
num_frames ++;
if (num_frames % 20 == 0)
{
cout << "Processing frame " << num_frames << " (" << num_frames * 1000000 / total_ms << " fps)" << endl;
}
if (img.empty())
break;

float scale = min(INPUT_W / (img.cols*1.0), INPUT_H / (img.rows*1.0));
Mat pr_img = static_resize(img);
ncnn::Mat in_pad = ncnn::Mat::from_pixels_resize(pr_img.data, ncnn::Mat::PIXEL_BGR2RGB, INPUT_W, INPUT_H, INPUT_W, INPUT_H);
// python 0-1 input tensor with rgb_means = (0.485, 0.456, 0.406), std = (0.229, 0.224, 0.225)
// so for 0-255 input image, rgb_mean should multiply 255 and norm should div by std.
const float mean_vals[3] = {255.f * 0.485f, 255.f * 0.456, 255.f * 0.406f};
const float norm_vals[3] = {1 / (255.f * 0.229f), 1 / (255.f * 0.224f), 1 / (255.f * 0.225f)};

in_pad.substract_mean_normalize(mean_vals, norm_vals);

std::vector<Object> objects;
auto start = chrono::system_clock::now();
//detect_yolox(img, objects);
detect_yolox(in_pad, objects, ex, scale);
vector<STrack> output_stracks = tracker.update(objects);
auto end = chrono::system_clock::now();
total_ms = total_ms + chrono::duration_cast<chrono::microseconds>(end - start).count();
for (int i = 0; i < output_stracks.size(); i++)
{
vector<float> tlwh = output_stracks[i].tlwh;
bool vertical = tlwh[2] / tlwh[3] > 1.6;
if (tlwh[2] * tlwh[3] > 20 && !vertical)
{
Scalar s = tracker.get_color(output_stracks[i].track_id);
putText(img, format("%d", output_stracks[i].track_id), Point(tlwh[0], tlwh[1] - 5),
0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
rectangle(img, Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), s, 2);
}
}
putText(img, format("frame: %d fps: %d num: %d", num_frames, num_frames * 1000000 / total_ms, output_stracks.size()),
Point(0, 30), 0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
writer.write(img);
char c = waitKey(1);
if (c > 0)
{
break;
}
}
cap.release();
cout << "FPS: " << num_frames * 1000000 / total_ms << endl;

return 0;
}

+ 152
- 0
deploy/ncnn/cpp/src/kalmanFilter.cpp View File

#include "kalmanFilter.h"
#include <Eigen/Cholesky>

namespace byte_kalman
{
const double KalmanFilter::chi2inv95[10] = {
0,
3.8415,
5.9915,
7.8147,
9.4877,
11.070,
12.592,
14.067,
15.507,
16.919
};
KalmanFilter::KalmanFilter()
{
int ndim = 4;
double dt = 1.;

_motion_mat = Eigen::MatrixXf::Identity(8, 8);
for (int i = 0; i < ndim; i++) {
_motion_mat(i, ndim + i) = dt;
}
_update_mat = Eigen::MatrixXf::Identity(4, 8);

this->_std_weight_position = 1. / 20;
this->_std_weight_velocity = 1. / 160;
}

KAL_DATA KalmanFilter::initiate(const DETECTBOX &measurement)
{
DETECTBOX mean_pos = measurement;
DETECTBOX mean_vel;
for (int i = 0; i < 4; i++) mean_vel(i) = 0;

KAL_MEAN mean;
for (int i = 0; i < 8; i++) {
if (i < 4) mean(i) = mean_pos(i);
else mean(i) = mean_vel(i - 4);
}

KAL_MEAN std;
std(0) = 2 * _std_weight_position * measurement[3];
std(1) = 2 * _std_weight_position * measurement[3];
std(2) = 1e-2;
std(3) = 2 * _std_weight_position * measurement[3];
std(4) = 10 * _std_weight_velocity * measurement[3];
std(5) = 10 * _std_weight_velocity * measurement[3];
std(6) = 1e-5;
std(7) = 10 * _std_weight_velocity * measurement[3];

KAL_MEAN tmp = std.array().square();
KAL_COVA var = tmp.asDiagonal();
return std::make_pair(mean, var);
}

void KalmanFilter::predict(KAL_MEAN &mean, KAL_COVA &covariance)
{
//revise the data;
DETECTBOX std_pos;
std_pos << _std_weight_position * mean(3),
_std_weight_position * mean(3),
1e-2,
_std_weight_position * mean(3);
DETECTBOX std_vel;
std_vel << _std_weight_velocity * mean(3),
_std_weight_velocity * mean(3),
1e-5,
_std_weight_velocity * mean(3);
KAL_MEAN tmp;
tmp.block<1, 4>(0, 0) = std_pos;
tmp.block<1, 4>(0, 4) = std_vel;
tmp = tmp.array().square();
KAL_COVA motion_cov = tmp.asDiagonal();
KAL_MEAN mean1 = this->_motion_mat * mean.transpose();
KAL_COVA covariance1 = this->_motion_mat * covariance *(_motion_mat.transpose());
covariance1 += motion_cov;

mean = mean1;
covariance = covariance1;
}

KAL_HDATA KalmanFilter::project(const KAL_MEAN &mean, const KAL_COVA &covariance)
{
DETECTBOX std;
std << _std_weight_position * mean(3), _std_weight_position * mean(3),
1e-1, _std_weight_position * mean(3);
KAL_HMEAN mean1 = _update_mat * mean.transpose();
KAL_HCOVA covariance1 = _update_mat * covariance * (_update_mat.transpose());
Eigen::Matrix<float, 4, 4> diag = std.asDiagonal();
diag = diag.array().square().matrix();
covariance1 += diag;
// covariance1.diagonal() << diag;
return std::make_pair(mean1, covariance1);
}

KAL_DATA
KalmanFilter::update(
const KAL_MEAN &mean,
const KAL_COVA &covariance,
const DETECTBOX &measurement)
{
KAL_HDATA pa = project(mean, covariance);
KAL_HMEAN projected_mean = pa.first;
KAL_HCOVA projected_cov = pa.second;

//chol_factor, lower =
//scipy.linalg.cho_factor(projected_cov, lower=True, check_finite=False)
//kalmain_gain =
//scipy.linalg.cho_solve((cho_factor, lower),
//np.dot(covariance, self._upadte_mat.T).T,
//check_finite=False).T
Eigen::Matrix<float, 4, 8> B = (covariance * (_update_mat.transpose())).transpose();
Eigen::Matrix<float, 8, 4> kalman_gain = (projected_cov.llt().solve(B)).transpose(); // eg.8x4
Eigen::Matrix<float, 1, 4> innovation = measurement - projected_mean; //eg.1x4
auto tmp = innovation * (kalman_gain.transpose());
KAL_MEAN new_mean = (mean.array() + tmp.array()).matrix();
KAL_COVA new_covariance = covariance - kalman_gain * projected_cov*(kalman_gain.transpose());
return std::make_pair(new_mean, new_covariance);
}

Eigen::Matrix<float, 1, -1>
KalmanFilter::gating_distance(
const KAL_MEAN &mean,
const KAL_COVA &covariance,
const std::vector<DETECTBOX> &measurements,
bool only_position)
{
KAL_HDATA pa = this->project(mean, covariance);
if (only_position) {
printf("not implement!");
exit(0);
}
KAL_HMEAN mean1 = pa.first;
KAL_HCOVA covariance1 = pa.second;

// Eigen::Matrix<float, -1, 4, Eigen::RowMajor> d(size, 4);
DETECTBOXSS d(measurements.size(), 4);
int pos = 0;
for (DETECTBOX box : measurements) {
d.row(pos++) = box - mean1;
}
Eigen::Matrix<float, -1, -1, Eigen::RowMajor> factor = covariance1.llt().matrixL();
Eigen::Matrix<float, -1, -1> z = factor.triangularView<Eigen::Lower>().solve<Eigen::OnTheRight>(d).transpose();
auto zz = ((z.array())*(z.array())).matrix();
auto square_maha = zz.colwise().sum();
return square_maha;
}
}

+ 343
- 0
deploy/ncnn/cpp/src/lapjv.cpp View File

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "lapjv.h"

/** Column-reduction and reduction transfer for a dense cost matrix.
*/
int_t _ccrrt_dense(const uint_t n, cost_t *cost[],
int_t *free_rows, int_t *x, int_t *y, cost_t *v)
{
int_t n_free_rows;
boolean *unique;

for (uint_t i = 0; i < n; i++) {
x[i] = -1;
v[i] = LARGE;
y[i] = 0;
}
for (uint_t i = 0; i < n; i++) {
for (uint_t j = 0; j < n; j++) {
const cost_t c = cost[i][j];
if (c < v[j]) {
v[j] = c;
y[j] = i;
}
PRINTF("i=%d, j=%d, c[i,j]=%f, v[j]=%f y[j]=%d\n", i, j, c, v[j], y[j]);
}
}
PRINT_COST_ARRAY(v, n);
PRINT_INDEX_ARRAY(y, n);
NEW(unique, boolean, n);
memset(unique, TRUE, n);
{
int_t j = n;
do {
j--;
const int_t i = y[j];
if (x[i] < 0) {
x[i] = j;
}
else {
unique[i] = FALSE;
y[j] = -1;
}
} while (j > 0);
}
n_free_rows = 0;
for (uint_t i = 0; i < n; i++) {
if (x[i] < 0) {
free_rows[n_free_rows++] = i;
}
else if (unique[i]) {
const int_t j = x[i];
cost_t min = LARGE;
for (uint_t j2 = 0; j2 < n; j2++) {
if (j2 == (uint_t)j) {
continue;
}
const cost_t c = cost[i][j2] - v[j2];
if (c < min) {
min = c;
}
}
PRINTF("v[%d] = %f - %f\n", j, v[j], min);
v[j] -= min;
}
}
FREE(unique);
return n_free_rows;
}


/** Augmenting row reduction for a dense cost matrix.
*/
int_t _carr_dense(
const uint_t n, cost_t *cost[],
const uint_t n_free_rows,
int_t *free_rows, int_t *x, int_t *y, cost_t *v)
{
uint_t current = 0;
int_t new_free_rows = 0;
uint_t rr_cnt = 0;
PRINT_INDEX_ARRAY(x, n);
PRINT_INDEX_ARRAY(y, n);
PRINT_COST_ARRAY(v, n);
PRINT_INDEX_ARRAY(free_rows, n_free_rows);
while (current < n_free_rows) {
int_t i0;
int_t j1, j2;
cost_t v1, v2, v1_new;
boolean v1_lowers;

rr_cnt++;
PRINTF("current = %d rr_cnt = %d\n", current, rr_cnt);
const int_t free_i = free_rows[current++];
j1 = 0;
v1 = cost[free_i][0] - v[0];
j2 = -1;
v2 = LARGE;
for (uint_t j = 1; j < n; j++) {
PRINTF("%d = %f %d = %f\n", j1, v1, j2, v2);
const cost_t c = cost[free_i][j] - v[j];
if (c < v2) {
if (c >= v1) {
v2 = c;
j2 = j;
}
else {
v2 = v1;
v1 = c;
j2 = j1;
j1 = j;
}
}
}
i0 = y[j1];
v1_new = v[j1] - (v2 - v1);
v1_lowers = v1_new < v[j1];
PRINTF("%d %d 1=%d,%f 2=%d,%f v1'=%f(%d,%g) \n", free_i, i0, j1, v1, j2, v2, v1_new, v1_lowers, v[j1] - v1_new);
if (rr_cnt < current * n) {
if (v1_lowers) {
v[j1] = v1_new;
}
else if (i0 >= 0 && j2 >= 0) {
j1 = j2;
i0 = y[j2];
}
if (i0 >= 0) {
if (v1_lowers) {
free_rows[--current] = i0;
}
else {
free_rows[new_free_rows++] = i0;
}
}
}
else {
PRINTF("rr_cnt=%d >= %d (current=%d * n=%d)\n", rr_cnt, current * n, current, n);
if (i0 >= 0) {
free_rows[new_free_rows++] = i0;
}
}
x[free_i] = j1;
y[j1] = free_i;
}
return new_free_rows;
}


/** Find columns with minimum d[j] and put them on the SCAN list.
*/
uint_t _find_dense(const uint_t n, uint_t lo, cost_t *d, int_t *cols, int_t *y)
{
uint_t hi = lo + 1;
cost_t mind = d[cols[lo]];
for (uint_t k = hi; k < n; k++) {
int_t j = cols[k];
if (d[j] <= mind) {
if (d[j] < mind) {
hi = lo;
mind = d[j];
}
cols[k] = cols[hi];
cols[hi++] = j;
}
}
return hi;
}


// Scan all columns in TODO starting from arbitrary column in SCAN
// and try to decrease d of the TODO columns using the SCAN column.
int_t _scan_dense(const uint_t n, cost_t *cost[],
uint_t *plo, uint_t*phi,
cost_t *d, int_t *cols, int_t *pred,
int_t *y, cost_t *v)
{
uint_t lo = *plo;
uint_t hi = *phi;
cost_t h, cred_ij;

while (lo != hi) {
int_t j = cols[lo++];
const int_t i = y[j];
const cost_t mind = d[j];
h = cost[i][j] - v[j] - mind;
PRINTF("i=%d j=%d h=%f\n", i, j, h);
// For all columns in TODO
for (uint_t k = hi; k < n; k++) {
j = cols[k];
cred_ij = cost[i][j] - v[j] - h;
if (cred_ij < d[j]) {
d[j] = cred_ij;
pred[j] = i;
if (cred_ij == mind) {
if (y[j] < 0) {
return j;
}
cols[k] = cols[hi];
cols[hi++] = j;
}
}
}
}
*plo = lo;
*phi = hi;
return -1;
}


/** Single iteration of modified Dijkstra shortest path algorithm as explained in the JV paper.
*
* This is a dense matrix version.
*
* \return The closest free column index.
*/
int_t find_path_dense(
const uint_t n, cost_t *cost[],
const int_t start_i,
int_t *y, cost_t *v,
int_t *pred)
{
uint_t lo = 0, hi = 0;
int_t final_j = -1;
uint_t n_ready = 0;
int_t *cols;
cost_t *d;

NEW(cols, int_t, n);
NEW(d, cost_t, n);

for (uint_t i = 0; i < n; i++) {
cols[i] = i;
pred[i] = start_i;
d[i] = cost[start_i][i] - v[i];
}
PRINT_COST_ARRAY(d, n);
while (final_j == -1) {
// No columns left on the SCAN list.
if (lo == hi) {
PRINTF("%d..%d -> find\n", lo, hi);
n_ready = lo;
hi = _find_dense(n, lo, d, cols, y);
PRINTF("check %d..%d\n", lo, hi);
PRINT_INDEX_ARRAY(cols, n);
for (uint_t k = lo; k < hi; k++) {
const int_t j = cols[k];
if (y[j] < 0) {
final_j = j;
}
}
}
if (final_j == -1) {
PRINTF("%d..%d -> scan\n", lo, hi);
final_j = _scan_dense(
n, cost, &lo, &hi, d, cols, pred, y, v);
PRINT_COST_ARRAY(d, n);
PRINT_INDEX_ARRAY(cols, n);
PRINT_INDEX_ARRAY(pred, n);
}
}

PRINTF("found final_j=%d\n", final_j);
PRINT_INDEX_ARRAY(cols, n);
{
const cost_t mind = d[cols[lo]];
for (uint_t k = 0; k < n_ready; k++) {
const int_t j = cols[k];
v[j] += d[j] - mind;
}
}

FREE(cols);
FREE(d);

return final_j;
}


/** Augment for a dense cost matrix.
*/
int_t _ca_dense(
const uint_t n, cost_t *cost[],
const uint_t n_free_rows,
int_t *free_rows, int_t *x, int_t *y, cost_t *v)
{
int_t *pred;

NEW(pred, int_t, n);

for (int_t *pfree_i = free_rows; pfree_i < free_rows + n_free_rows; pfree_i++) {
int_t i = -1, j;
uint_t k = 0;

PRINTF("looking at free_i=%d\n", *pfree_i);
j = find_path_dense(n, cost, *pfree_i, y, v, pred);
ASSERT(j >= 0);
ASSERT(j < n);
while (i != *pfree_i) {
PRINTF("augment %d\n", j);
PRINT_INDEX_ARRAY(pred, n);
i = pred[j];
PRINTF("y[%d]=%d -> %d\n", j, y[j], i);
y[j] = i;
PRINT_INDEX_ARRAY(x, n);
SWAP_INDICES(j, x[i]);
k++;
if (k >= n) {
ASSERT(FALSE);
}
}
}
FREE(pred);
return 0;
}


/** Solve dense sparse LAP.
*/
int lapjv_internal(
const uint_t n, cost_t *cost[],
int_t *x, int_t *y)
{
int ret;
int_t *free_rows;
cost_t *v;

NEW(free_rows, int_t, n);
NEW(v, cost_t, n);
ret = _ccrrt_dense(n, cost, free_rows, x, y, v);
int i = 0;
while (ret > 0 && i < 2) {
ret = _carr_dense(n, cost, ret, free_rows, x, y, v);
i++;
}
if (ret > 0) {
ret = _ca_dense(n, cost, ret, free_rows, x, y, v);
}
FREE(v);
FREE(free_rows);
return ret;
}

+ 429
- 0
deploy/ncnn/cpp/src/utils.cpp View File

#include "BYTETracker.h"
#include "lapjv.h"

vector<STrack*> BYTETracker::joint_stracks(vector<STrack*> &tlista, vector<STrack> &tlistb)
{
map<int, int> exists;
vector<STrack*> res;
for (int i = 0; i < tlista.size(); i++)
{
exists.insert(pair<int, int>(tlista[i]->track_id, 1));
res.push_back(tlista[i]);
}
for (int i = 0; i < tlistb.size(); i++)
{
int tid = tlistb[i].track_id;
if (!exists[tid] || exists.count(tid) == 0)
{
exists[tid] = 1;
res.push_back(&tlistb[i]);
}
}
return res;
}

vector<STrack> BYTETracker::joint_stracks(vector<STrack> &tlista, vector<STrack> &tlistb)
{
map<int, int> exists;
vector<STrack> res;
for (int i = 0; i < tlista.size(); i++)
{
exists.insert(pair<int, int>(tlista[i].track_id, 1));
res.push_back(tlista[i]);
}
for (int i = 0; i < tlistb.size(); i++)
{
int tid = tlistb[i].track_id;
if (!exists[tid] || exists.count(tid) == 0)
{
exists[tid] = 1;
res.push_back(tlistb[i]);
}
}
return res;
}

vector<STrack> BYTETracker::sub_stracks(vector<STrack> &tlista, vector<STrack> &tlistb)
{
map<int, STrack> stracks;
for (int i = 0; i < tlista.size(); i++)
{
stracks.insert(pair<int, STrack>(tlista[i].track_id, tlista[i]));
}
for (int i = 0; i < tlistb.size(); i++)
{
int tid = tlistb[i].track_id;
if (stracks.count(tid) != 0)
{
stracks.erase(tid);
}
}

vector<STrack> res;
std::map<int, STrack>::iterator it;
for (it = stracks.begin(); it != stracks.end(); ++it)
{
res.push_back(it->second);
}

return res;
}

void BYTETracker::remove_duplicate_stracks(vector<STrack> &resa, vector<STrack> &resb, vector<STrack> &stracksa, vector<STrack> &stracksb)
{
vector<vector<float> > pdist = iou_distance(stracksa, stracksb);
vector<pair<int, int> > pairs;
for (int i = 0; i < pdist.size(); i++)
{
for (int j = 0; j < pdist[i].size(); j++)
{
if (pdist[i][j] < 0.15)
{
pairs.push_back(pair<int, int>(i, j));
}
}
}

vector<int> dupa, dupb;
for (int i = 0; i < pairs.size(); i++)
{
int timep = stracksa[pairs[i].first].frame_id - stracksa[pairs[i].first].start_frame;
int timeq = stracksb[pairs[i].second].frame_id - stracksb[pairs[i].second].start_frame;
if (timep > timeq)
dupb.push_back(pairs[i].second);
else
dupa.push_back(pairs[i].first);
}

for (int i = 0; i < stracksa.size(); i++)
{
vector<int>::iterator iter = find(dupa.begin(), dupa.end(), i);
if (iter == dupa.end())
{
resa.push_back(stracksa[i]);
}
}

for (int i = 0; i < stracksb.size(); i++)
{
vector<int>::iterator iter = find(dupb.begin(), dupb.end(), i);
if (iter == dupb.end())
{
resb.push_back(stracksb[i]);
}
}
}

void BYTETracker::linear_assignment(vector<vector<float> > &cost_matrix, int cost_matrix_size, int cost_matrix_size_size, float thresh,
vector<vector<int> > &matches, vector<int> &unmatched_a, vector<int> &unmatched_b)
{
if (cost_matrix.size() == 0)
{
for (int i = 0; i < cost_matrix_size; i++)
{
unmatched_a.push_back(i);
}
for (int i = 0; i < cost_matrix_size_size; i++)
{
unmatched_b.push_back(i);
}
return;
}

vector<int> rowsol; vector<int> colsol;
float c = lapjv(cost_matrix, rowsol, colsol, true, thresh);
for (int i = 0; i < rowsol.size(); i++)
{
if (rowsol[i] >= 0)
{
vector<int> match;
match.push_back(i);
match.push_back(rowsol[i]);
matches.push_back(match);
}
else
{
unmatched_a.push_back(i);
}
}

for (int i = 0; i < colsol.size(); i++)
{
if (colsol[i] < 0)
{
unmatched_b.push_back(i);
}
}
}

vector<vector<float> > BYTETracker::ious(vector<vector<float> > &atlbrs, vector<vector<float> > &btlbrs)
{
vector<vector<float> > ious;
if (atlbrs.size()*btlbrs.size() == 0)
return ious;

ious.resize(atlbrs.size());
for (int i = 0; i < ious.size(); i++)
{
ious[i].resize(btlbrs.size());
}

//bbox_ious
for (int k = 0; k < btlbrs.size(); k++)
{
vector<float> ious_tmp;
float box_area = (btlbrs[k][2] - btlbrs[k][0] + 1)*(btlbrs[k][3] - btlbrs[k][1] + 1);
for (int n = 0; n < atlbrs.size(); n++)
{
float iw = min(atlbrs[n][2], btlbrs[k][2]) - max(atlbrs[n][0], btlbrs[k][0]) + 1;
if (iw > 0)
{
float ih = min(atlbrs[n][3], btlbrs[k][3]) - max(atlbrs[n][1], btlbrs[k][1]) + 1;
if(ih > 0)
{
float ua = (atlbrs[n][2] - atlbrs[n][0] + 1)*(atlbrs[n][3] - atlbrs[n][1] + 1) + box_area - iw * ih;
ious[n][k] = iw * ih / ua;
}
else
{
ious[n][k] = 0.0;
}
}
else
{
ious[n][k] = 0.0;
}
}
}

return ious;
}

vector<vector<float> > BYTETracker::iou_distance(vector<STrack*> &atracks, vector<STrack> &btracks, int &dist_size, int &dist_size_size)
{
vector<vector<float> > cost_matrix;
if (atracks.size() * btracks.size() == 0)
{
dist_size = atracks.size();
dist_size_size = btracks.size();
return cost_matrix;
}
vector<vector<float> > atlbrs, btlbrs;
for (int i = 0; i < atracks.size(); i++)
{
atlbrs.push_back(atracks[i]->tlbr);
}
for (int i = 0; i < btracks.size(); i++)
{
btlbrs.push_back(btracks[i].tlbr);
}

dist_size = atracks.size();
dist_size_size = btracks.size();

vector<vector<float> > _ious = ious(atlbrs, btlbrs);
for (int i = 0; i < _ious.size();i++)
{
vector<float> _iou;
for (int j = 0; j < _ious[i].size(); j++)
{
_iou.push_back(1 - _ious[i][j]);
}
cost_matrix.push_back(_iou);
}

return cost_matrix;
}

vector<vector<float> > BYTETracker::iou_distance(vector<STrack> &atracks, vector<STrack> &btracks)
{
vector<vector<float> > atlbrs, btlbrs;
for (int i = 0; i < atracks.size(); i++)
{
atlbrs.push_back(atracks[i].tlbr);
}
for (int i = 0; i < btracks.size(); i++)
{
btlbrs.push_back(btracks[i].tlbr);
}

vector<vector<float> > _ious = ious(atlbrs, btlbrs);
vector<vector<float> > cost_matrix;
for (int i = 0; i < _ious.size(); i++)
{
vector<float> _iou;
for (int j = 0; j < _ious[i].size(); j++)
{
_iou.push_back(1 - _ious[i][j]);
}
cost_matrix.push_back(_iou);
}

return cost_matrix;
}

double BYTETracker::lapjv(const vector<vector<float> > &cost, vector<int> &rowsol, vector<int> &colsol,
bool extend_cost, float cost_limit, bool return_cost)
{
vector<vector<float> > cost_c;
cost_c.assign(cost.begin(), cost.end());

vector<vector<float> > cost_c_extended;

int n_rows = cost.size();
int n_cols = cost[0].size();
rowsol.resize(n_rows);
colsol.resize(n_cols);

int n = 0;
if (n_rows == n_cols)
{
n = n_rows;
}
else
{
if (!extend_cost)
{
cout << "set extend_cost=True" << endl;
system("pause");
exit(0);
}
}
if (extend_cost || cost_limit < LONG_MAX)
{
n = n_rows + n_cols;
cost_c_extended.resize(n);
for (int i = 0; i < cost_c_extended.size(); i++)
cost_c_extended[i].resize(n);

if (cost_limit < LONG_MAX)
{
for (int i = 0; i < cost_c_extended.size(); i++)
{
for (int j = 0; j < cost_c_extended[i].size(); j++)
{
cost_c_extended[i][j] = cost_limit / 2.0;
}
}
}
else
{
float cost_max = -1;
for (int i = 0; i < cost_c.size(); i++)
{
for (int j = 0; j < cost_c[i].size(); j++)
{
if (cost_c[i][j] > cost_max)
cost_max = cost_c[i][j];
}
}
for (int i = 0; i < cost_c_extended.size(); i++)
{
for (int j = 0; j < cost_c_extended[i].size(); j++)
{
cost_c_extended[i][j] = cost_max + 1;
}
}
}

for (int i = n_rows; i < cost_c_extended.size(); i++)
{
for (int j = n_cols; j < cost_c_extended[i].size(); j++)
{
cost_c_extended[i][j] = 0;
}
}
for (int i = 0; i < n_rows; i++)
{
for (int j = 0; j < n_cols; j++)
{
cost_c_extended[i][j] = cost_c[i][j];
}
}

cost_c.clear();
cost_c.assign(cost_c_extended.begin(), cost_c_extended.end());
}

double **cost_ptr;
cost_ptr = new double *[sizeof(double *) * n];
for (int i = 0; i < n; i++)
cost_ptr[i] = new double[sizeof(double) * n];

for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cost_ptr[i][j] = cost_c[i][j];
}
}

int* x_c = new int[sizeof(int) * n];
int *y_c = new int[sizeof(int) * n];

int ret = lapjv_internal(n, cost_ptr, x_c, y_c);
if (ret != 0)
{
cout << "Calculate Wrong!" << endl;
system("pause");
exit(0);
}

double opt = 0.0;

if (n != n_rows)
{
for (int i = 0; i < n; i++)
{
if (x_c[i] >= n_cols)
x_c[i] = -1;
if (y_c[i] >= n_rows)
y_c[i] = -1;
}
for (int i = 0; i < n_rows; i++)
{
rowsol[i] = x_c[i];
}
for (int i = 0; i < n_cols; i++)
{
colsol[i] = y_c[i];
}

if (return_cost)
{
for (int i = 0; i < rowsol.size(); i++)
{
if (rowsol[i] != -1)
{
//cout << i << "\t" << rowsol[i] << "\t" << cost_ptr[i][rowsol[i]] << endl;
opt += cost_ptr[i][rowsol[i]];
}
}
}
}
else if (return_cost)
{
for (int i = 0; i < rowsol.size(); i++)
{
opt += cost_ptr[i][rowsol[i]];
}
}

for (int i = 0; i < n; i++)
{
delete[]cost_ptr[i];
}
delete[]cost_ptr;
delete[]x_c;
delete[]y_c;

return opt;
}

Scalar BYTETracker::get_color(int idx)
{
idx += 3;
return Scalar(37 * idx % 255, 17 * idx % 255, 29 * idx % 255);
}

+ 1
- 0
experiments/track_mot20.sh View File

python tools/track.py -f exps/example/mot/yolox_x_mot20.py -c /media/external_10TB/10TB/vision/ByteTrackModels/bytetrack_x_mot20.tar -b 1 -d 0 --fp16 --fuse -t mot --local_rank 1

+ 1
- 0
experiments/train_mot17_on_mot20.sh View File

python3 tools/train.py -t metamot -f exps/example/metamot/yolox_x_mot17_on_mot20.py -d 1 -b 8 --fp16 -o -c /home/abdollahpoor/yolox_x.pth --local_rank 1

+ 39
- 0
exps/default/nano.py View File

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright (c) Megvii, Inc. and its affiliates.

import os
import torch.nn as nn

from yolox.exp import Exp as MyExp


class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.depth = 0.33
self.width = 0.25
self.scale = (0.5, 1.5)
self.random_size = (10, 20)
self.test_size = (416, 416)
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.enable_mixup = False

def get_model(self, sublinear=False):

def init_yolo(M):
for m in M.modules():
if isinstance(m, nn.BatchNorm2d):
m.eps = 1e-3
m.momentum = 0.03
if "model" not in self.__dict__:
from yolox.models import YOLOX, YOLOPAFPN, YOLOXHead
in_channels = [256, 512, 1024]
# NANO model use depthwise = True, which is main difference.
backbone = YOLOPAFPN(self.depth, self.width, in_channels=in_channels, depthwise=True)
head = YOLOXHead(self.num_classes, self.width, in_channels=in_channels, depthwise=True)
self.model = YOLOX(backbone, head)

self.model.apply(init_yolo)
self.model.head.initialize_biases(1e-2)
return self.model

+ 89
- 0
exps/default/yolov3.py View File

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright (c) Megvii, Inc. and its affiliates.

import os
import torch
import torch.nn as nn

from yolox.exp import Exp as MyExp


class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.depth = 1.0
self.width = 1.0
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

def get_model(self, sublinear=False):
def init_yolo(M):
for m in M.modules():
if isinstance(m, nn.BatchNorm2d):
m.eps = 1e-3
m.momentum = 0.03
if "model" not in self.__dict__:
from yolox.models import YOLOX, YOLOFPN, YOLOXHead
backbone = YOLOFPN()
head = YOLOXHead(self.num_classes, self.width, in_channels=[128, 256, 512], act="lrelu")
self.model = YOLOX(backbone, head)
self.model.apply(init_yolo)
self.model.head.initialize_biases(1e-2)

return self.model

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from data.datasets.cocodataset import COCODataset
from data.datasets.mosaicdetection import MosaicDetection
from data.datasets.data_augment import TrainTransform
from data.datasets.dataloading import YoloBatchSampler, DataLoader, InfiniteSampler
import torch.distributed as dist

dataset = COCODataset(
data_dir='data/COCO/',
json_file=self.train_ann,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=50
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=120
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = InfiniteSampler(len(self.dataset), seed=self.seed if self.seed else 0)
else:
sampler = torch.utils.data.RandomSampler(self.dataset)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

+ 15
- 0
exps/default/yolox_l.py View File

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright (c) Megvii, Inc. and its affiliates.

import os

from yolox.exp import Exp as MyExp


class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.depth = 1.0
self.width = 1.0
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

+ 15
- 0
exps/default/yolox_m.py View File

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright (c) Megvii, Inc. and its affiliates.

import os

from yolox.exp import Exp as MyExp


class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.depth = 0.67
self.width = 0.75
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

+ 15
- 0
exps/default/yolox_s.py View File

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright (c) Megvii, Inc. and its affiliates.

import os

from yolox.exp import Exp as MyExp


class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.depth = 0.33
self.width = 0.50
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

+ 19
- 0
exps/default/yolox_tiny.py View File

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright (c) Megvii, Inc. and its affiliates.

import os

from yolox.exp import Exp as MyExp


class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.depth = 0.33
self.width = 0.375
self.scale = (0.5, 1.5)
self.random_size = (10, 20)
self.test_size = (416, 416)
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.enable_mixup = False

+ 15
- 0
exps/default/yolox_x.py View File

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
# Copyright (c) Megvii, Inc. and its affiliates.

import os

from yolox.exp import Exp as MyExp


class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.depth = 1.33
self.width = 1.25
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]

+ 151
- 0
exps/example/metamot/yolox_x_mot17_on_mot20.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import MetaExp as MyMetaExp
from yolox.data import get_yolox_datadir
from os import listdir
from os.path import isfile, join


class Exp(MyMetaExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 1.33
self.width = 1.25
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_dir = '/media/external_10TB/10TB/vision/ByteTrackData/MOT17/annotations'
onlyfiles = [f for f in listdir(self.train_dir) if isfile(join(self.train_dir, f))]
self.train_anns = [file for file in onlyfiles if file.__contains__('train') and file.__contains__('FRCNN')]
self.val_dir = '/media/external_10TB/10TB/vision/ByteTrackData/MOT20/annotations'
onlyfiles = [f for f in listdir(self.val_dir) if isfile(join(self.val_dir, f))]
self.val_anns = [file for file in onlyfiles if file.__contains__('train') and file.__contains__(
'MOT20')]
print('train_anns', self.train_anns)
print('val_anns', self.val_anns)
self.input_size = (800, 1440)
self.test_size = (896, 1600)
# self.test_size = (736, 1920)
self.random_size = (20, 36)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.001
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loaders(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)
train_loaders = []
for train_ann in self.train_anns:
dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "MOT17"),
json_file=train_ann,
name='train',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)
dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)
train_loaders.append(train_loader)

return train_loaders

def get_eval_loaders(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform
val_loaders = []
for val_ann in self.val_anns:
valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "MOT20"),
json_file=val_ann,
img_size=self.test_size,
name='train', # change to train when running on training set
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)
val_loaders.append(val_loader)
return val_loaders

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loaders(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 138
- 0
exps/example/mot/yolox_l_mix_det.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 1.0
self.width = 1.0
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "train.json"
self.input_size = (800, 1440)
self.test_size = (800, 1440)
self.random_size = (18, 32)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.001
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mix_det"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.val_ann,
img_size=self.test_size,
name='train',
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 138
- 0
exps/example/mot/yolox_m_mix_det.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 0.67
self.width = 0.75
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "train.json"
self.input_size = (800, 1440)
self.test_size = (800, 1440)
self.random_size = (18, 32)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.001
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mix_det"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.val_ann,
img_size=self.test_size,
name='train',
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 158
- 0
exps/example/mot/yolox_nano_mix_det.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 0.33
self.width = 0.25
self.scale = (0.5, 1.5)
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "train.json"
self.input_size = (608, 1088)
self.test_size = (608, 1088)
self.random_size = (12, 26)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.001
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_model(self, sublinear=False):

def init_yolo(M):
for m in M.modules():
if isinstance(m, nn.BatchNorm2d):
m.eps = 1e-3
m.momentum = 0.03
if "model" not in self.__dict__:
from yolox.models import YOLOX, YOLOPAFPN, YOLOXHead
in_channels = [256, 512, 1024]
# NANO model use depthwise = True, which is main difference.
backbone = YOLOPAFPN(self.depth, self.width, in_channels=in_channels, depthwise=True)
head = YOLOXHead(self.num_classes, self.width, in_channels=in_channels, depthwise=True)
self.model = YOLOX(backbone, head)

self.model.apply(init_yolo)
self.model.head.initialize_biases(1e-2)
return self.model

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mix_det"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.val_ann,
img_size=self.test_size,
name='train',
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 138
- 0
exps/example/mot/yolox_s_mix_det.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 0.33
self.width = 0.50
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "train.json"
self.input_size = (608, 1088)
self.test_size = (608, 1088)
self.random_size = (12, 26)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.001
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mix_det"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.val_ann,
img_size=self.test_size,
name='train',
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 139
- 0
exps/example/mot/yolox_tiny_mix_det.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 0.33
self.width = 0.375
self.scale = (0.5, 1.5)
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "train.json"
self.input_size = (608, 1088)
self.test_size = (608, 1088)
self.random_size = (12, 26)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.001
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mix_det"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.val_ann,
img_size=self.test_size,
name='train',
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 138
- 0
exps/example/mot/yolox_x_ablation.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 1.33
self.width = 1.25
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "val_half.json"
self.input_size = (800, 1440)
self.test_size = (800, 1440)
self.random_size = (18, 32)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.1
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mix_mot_ch"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.val_ann,
img_size=self.test_size,
name='train',
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 138
- 0
exps/example/mot/yolox_x_ch.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 1.33
self.width = 1.25
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "val_half.json"
self.input_size = (800, 1440)
self.test_size = (800, 1440)
self.random_size = (18, 32)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.1
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "ch_all"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.val_ann,
img_size=self.test_size,
name='train',
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 138
- 0
exps/example/mot/yolox_x_mix_det.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 1.33
self.width = 1.25
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "test.json" # change to train.json when running on training set
self.input_size = (800, 1440)
self.test_size = (800, 1440)
self.random_size = (18, 32)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.001
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mix_det"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.val_ann,
img_size=self.test_size,
name='test', # change to train when running on training set
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 139
- 0
exps/example/mot/yolox_x_mix_mot20_ch.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 1.33
self.width = 1.25
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "test.json" # change to train.json when running on training set
self.input_size = (896, 1600)
self.test_size = (896, 1600)
#self.test_size = (736, 1920)
self.random_size = (20, 36)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.001
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mix_mot20_ch"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=600,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1200,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "MOT20"),
json_file=self.val_ann,
img_size=self.test_size,
name='test', # change to train when running on training set
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 138
- 0
exps/example/mot/yolox_x_mot17_half.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 1.33
self.width = 1.25
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "val_half.json"
self.input_size = (800, 1440)
self.test_size = (800, 1440)
self.random_size = (18, 32)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.1
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.train_ann,
name='train',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=500,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1000,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "mot"),
json_file=self.val_ann,
img_size=self.test_size,
name='train',
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 139
- 0
exps/example/mot/yolox_x_mot20.py View File

# encoding: utf-8
import os
import random
import torch
import torch.nn as nn
import torch.distributed as dist

from yolox.exp import Exp as MyExp
from yolox.data import get_yolox_datadir

class Exp(MyExp):
def __init__(self):
super(Exp, self).__init__()
self.num_classes = 1
self.depth = 1.33
self.width = 1.25
self.exp_name = os.path.split(os.path.realpath(__file__))[1].split(".")[0]
self.train_ann = "train.json"
self.val_ann = "test.json" # change to train.json when running on training set
self.input_size = (896, 1600)
self.test_size = (896, 1600)
#self.test_size = (736, 1920)
self.random_size = (20, 36)
self.max_epoch = 80
self.print_interval = 20
self.eval_interval = 5
self.test_conf = 0.001
self.nmsthre = 0.7
self.no_aug_epochs = 10
self.basic_lr_per_img = 0.001 / 64.0
self.warmup_epochs = 1

def get_data_loader(self, batch_size, is_distributed, no_aug=False):
from yolox.data import (
MOTDataset,
TrainTransform,
YoloBatchSampler,
DataLoader,
InfiniteSampler,
MosaicDetection,
)

dataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "MOT20"),
json_file=self.train_ann,
name='',
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=600,
),
)

dataset = MosaicDetection(
dataset,
mosaic=not no_aug,
img_size=self.input_size,
preproc=TrainTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
max_labels=1200,
),
degrees=self.degrees,
translate=self.translate,
scale=self.scale,
shear=self.shear,
perspective=self.perspective,
enable_mixup=self.enable_mixup,
)

self.dataset = dataset

if is_distributed:
batch_size = batch_size // dist.get_world_size()

sampler = InfiniteSampler(
len(self.dataset), seed=self.seed if self.seed else 0
)

batch_sampler = YoloBatchSampler(
sampler=sampler,
batch_size=batch_size,
drop_last=False,
input_dimension=self.input_size,
mosaic=not no_aug,
)

dataloader_kwargs = {"num_workers": self.data_num_workers, "pin_memory": True}
dataloader_kwargs["batch_sampler"] = batch_sampler
train_loader = DataLoader(self.dataset, **dataloader_kwargs)

return train_loader

def get_eval_loader(self, batch_size, is_distributed, testdev=False):
from yolox.data import MOTDataset, ValTransform

valdataset = MOTDataset(
data_dir=os.path.join(get_yolox_datadir(), "MOT20"),
json_file=self.val_ann,
img_size=self.test_size,
name='test', # change to train when running on training set
preproc=ValTransform(
rgb_means=(0.485, 0.456, 0.406),
std=(0.229, 0.224, 0.225),
),
)

if is_distributed:
batch_size = batch_size // dist.get_world_size()
sampler = torch.utils.data.distributed.DistributedSampler(
valdataset, shuffle=False
)
else:
sampler = torch.utils.data.SequentialSampler(valdataset)

dataloader_kwargs = {
"num_workers": self.data_num_workers,
"pin_memory": True,
"sampler": sampler,
}
dataloader_kwargs["batch_size"] = batch_size
val_loader = torch.utils.data.DataLoader(valdataset, **dataloader_kwargs)

return val_loader

def get_evaluator(self, batch_size, is_distributed, testdev=False):
from yolox.evaluators import COCOEvaluator

val_loader = self.get_eval_loader(batch_size, is_distributed, testdev=testdev)
evaluator = COCOEvaluator(
dataloader=val_loader,
img_size=self.test_size,
confthre=self.test_conf,
nmsthre=self.nmsthre,
num_classes=self.num_classes,
testdev=testdev,
)
return evaluator

+ 22
- 0
requirements.txt View File

# TODO: Update with exact module version
numpy
torch>=1.7
opencv_python
loguru
scikit-image
tqdm
torchvision>=0.10.0
Pillow
thop
ninja
tabulate
tensorboard
lap
motmetrics
filterpy
h5py

# verified versions
onnx==1.8.1
onnxruntime==1.8.0
onnx-simplifier==0.3.5

+ 18
- 0
setup.cfg View File

[isort]
line_length = 100
multi_line_output = 3
balanced_wrapping = True
known_standard_library = setuptools
known_third_party = tqdm,loguru
known_data_processing = cv2,numpy,scipy,PIL,matplotlib,scikit_image
known_datasets = pycocotools
known_deeplearning = torch,torchvision,caffe2,onnx,apex,timm,thop,torch2trt,tensorrt,openvino,onnxruntime
known_myself = yolox
sections = FUTURE,STDLIB,THIRDPARTY,data_processing,datasets,deeplearning,myself,FIRSTPARTY,LOCALFOLDER
no_lines_before=STDLIB,THIRDPARTY,datasets
default_section = FIRSTPARTY

[flake8]
max-line-length = 100
max-complexity = 18
exclude = __init__.py

+ 64
- 0
setup.py View File

#!/usr/bin/env python
# Copyright (c) Megvii, Inc. and its affiliates. All Rights Reserved

import re
import setuptools
import glob
from os import path
import torch
from torch.utils.cpp_extension import CppExtension

torch_ver = [int(x) for x in torch.__version__.split(".")[:2]]
assert torch_ver >= [1, 3], "Requires PyTorch >= 1.3"


def get_extensions():
this_dir = path.dirname(path.abspath(__file__))
extensions_dir = path.join(this_dir, "yolox", "layers", "csrc")

main_source = path.join(extensions_dir, "vision.cpp")
sources = glob.glob(path.join(extensions_dir, "**", "*.cpp"))

sources = [main_source] + sources
extension = CppExtension

extra_compile_args = {"cxx": ["-O3"]}
define_macros = []

include_dirs = [extensions_dir]

ext_modules = [
extension(
"yolox._C",
sources,
include_dirs=include_dirs,
define_macros=define_macros,
extra_compile_args=extra_compile_args,
)
]

return ext_modules


with open("yolox/__init__.py", "r") as f:
version = re.search(
r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]',
f.read(), re.MULTILINE
).group(1)


with open("README.md", "r") as f:
long_description = f.read()


setuptools.setup(
name="yolox",
version=version,
author="basedet team",
python_requires=">=3.6",
long_description=long_description,
ext_modules=get_extensions(),
classifiers=["Programming Language :: Python :: 3", "Operating System :: OS Independent"],
cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension},
packages=setuptools.find_namespace_packages(),
)

+ 60
- 0
tools/convert_cityperson_to_coco.py View File

import os
import numpy as np
import json
from PIL import Image

DATA_PATH = '/media/external_10TB/10TB/vision/ByteTrackData/Citypersons/'
DATA_FILE_PATH = 'datasets/data_path/citypersons.train'
OUT_PATH = DATA_PATH + 'annotations/'
DATA_ROOT = '/media/external_10TB/10TB/vision/ByteTrackData'

def load_paths(data_path):
with open(data_path, 'r') as file:
img_files = file.readlines()
img_files = [x.replace('\n', '') for x in img_files]
img_files = list(filter(lambda x: len(x) > 0, img_files))
label_files = [x.replace('images', 'labels_with_ids').replace('.png', '.txt').replace('.jpg', '.txt') for x in img_files]
return img_files, label_files

if __name__ == '__main__':
if not os.path.exists(OUT_PATH):
os.mkdir(OUT_PATH)

out_path = OUT_PATH + 'train.json'
out = {'images': [], 'annotations': [], 'categories': [{'id': 1, 'name': 'person'}]}
img_paths, label_paths = load_paths(DATA_FILE_PATH)
image_cnt = 0
ann_cnt = 0
video_cnt = 0
for img_path, label_path in zip(img_paths, label_paths):
image_cnt += 1
im = Image.open(os.path.join(DATA_ROOT, img_path))
image_info = {'file_name': img_path,
'id': image_cnt,
'height': im.size[1],
'width': im.size[0]}
out['images'].append(image_info)
# Load labels
if os.path.isfile(os.path.join(DATA_ROOT, label_path)):
labels0 = np.loadtxt(os.path.join(DATA_ROOT, label_path), dtype=np.float32).reshape(-1, 6)
# Normalized xywh to pixel xyxy format
labels = labels0.copy()
labels[:, 2] = image_info['width'] * (labels0[:, 2] - labels0[:, 4] / 2)
labels[:, 3] = image_info['height'] * (labels0[:, 3] - labels0[:, 5] / 2)
labels[:, 4] = image_info['width'] * labels0[:, 4]
labels[:, 5] = image_info['height'] * labels0[:, 5]
else:
labels = np.array([])
for i in range(len(labels)):
ann_cnt += 1
fbox = labels[i, 2:6].tolist()
ann = {'id': ann_cnt,
'category_id': 1,
'image_id': image_cnt,
'track_id': -1,
'bbox': fbox,
'area': fbox[2] * fbox[3],
'iscrowd': 0}
out['annotations'].append(ann)
print('loaded train for {} images and {} samples'.format(len(out['images']), len(out['annotations'])))
json.dump(out, open(out_path, 'w'))

+ 62
- 0
tools/convert_cityperson_to_coco_metaway.py View File

import os
import numpy as np
import json
from PIL import Image

DATA_PATH = '/media/external_10TB/10TB/vision/ByteTrackData/Citypersons/'
DATA_FILE_PATH = 'datasets/data_path/citypersons'
OUT_PATH = DATA_PATH + 'annotations/'
DATA_ROOT = '/media/external_10TB/10TB/vision/ByteTrackData'

def load_paths(data_path):
with open(data_path, 'r') as file:
img_files = file.readlines()
img_files = [x.replace('\n', '') for x in img_files]
img_files = list(filter(lambda x: len(x) > 0, img_files))
label_files = [x.replace('images', 'labels_with_ids').replace('.png', '.txt').replace('.jpg', '.txt') for x in img_files]
return img_files, label_files

if __name__ == '__main__':
if not os.path.exists(OUT_PATH):
os.mkdir(OUT_PATH)

files = os.listdir(DATA_FILE_PATH)
for file in files:
out_path = OUT_PATH + 'train_{}.json'.format(file.replace('.train', ''))
out = {'images': [], 'annotations': [], 'categories': [{'id': 1, 'name': 'person'}]}
img_paths, label_paths = load_paths(os.path.join(DATA_FILE_PATH, file))
image_cnt = 0
ann_cnt = 0
video_cnt = 0
for img_path, label_path in zip(img_paths, label_paths):
image_cnt += 1
im = Image.open(os.path.join(DATA_ROOT, img_path))
image_info = {'file_name': img_path,
'id': image_cnt,
'height': im.size[1],
'width': im.size[0]}
out['images'].append(image_info)
# Load labels
if os.path.isfile(os.path.join(DATA_ROOT, label_path)):
labels0 = np.loadtxt(os.path.join(DATA_ROOT, label_path), dtype=np.float32).reshape(-1, 6)
# Normalized xywh to pixel xyxy format
labels = labels0.copy()
labels[:, 2] = image_info['width'] * (labels0[:, 2] - labels0[:, 4] / 2)
labels[:, 3] = image_info['height'] * (labels0[:, 3] - labels0[:, 5] / 2)
labels[:, 4] = image_info['width'] * labels0[:, 4]
labels[:, 5] = image_info['height'] * labels0[:, 5]
else:
labels = np.array([])
for i in range(len(labels)):
ann_cnt += 1
fbox = labels[i, 2:6].tolist()
ann = {'id': ann_cnt,
'category_id': 1,
'image_id': image_cnt,
'track_id': -1,
'bbox': fbox,
'area': fbox[2] * fbox[3],
'iscrowd': 0}
out['annotations'].append(ann)
print('loaded train for {} images and {} samples'.format(len(out['images']), len(out['annotations'])))
json.dump(out, open(out_path, 'w'))

+ 0
- 0
tools/convert_crowdhuman_to_coco.py View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save