# 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 | |||||
<?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> |
<?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> |
<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> |
<?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> |
<?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> |
<?xml version="1.0" encoding="UTF-8"?> | |||||
<project version="4"> | |||||
<component name="VcsDirectoryMappings"> | |||||
<mapping directory="$PROJECT_DIR$" vcs="Git" /> | |||||
</component> | |||||
</project> |
<?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> |
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} |
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. |
# 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. |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
## 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 | |||||
``` |
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) |
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) | |||||
# 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. ) | |||||
#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; | |||||
}; |
#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; | |||||
}; |
#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; |
#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; | |||||
}; | |||||
} |
#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 |
/* | |||||
* 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(×tamp); | |||||
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 |
#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; | |||||
} |
#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); | |||||
} | |||||
} |
#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; | |||||
} |
#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; | |||||
} | |||||
} |
#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; | |||||
} |
#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); | |||||
} |
# 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 | |||||
``` |
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() |
# 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) |
#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; | |||||
}; |
#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; | |||||
}; |
#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; |
#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; | |||||
}; | |||||
} |
#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 |
#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; | |||||
} |
#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); | |||||
} | |||||
} |
#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; | |||||
} |
#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; | |||||
} | |||||
} |
#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; | |||||
} |
#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); | |||||
} |
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 |
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 |
#!/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 |
#!/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 |
#!/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] |
#!/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] |
#!/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] |
#!/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 |
#!/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] |
# 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 |
# 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 |
# 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 |
# 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 |
# 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 |
# 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 |
# 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 |
# 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 |
# 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 |
# 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 |
# 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 |
# 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 |
# 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 |
[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 |
#!/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(), | |||||
) |
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')) |
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')) |