@@ -0,0 +1,142 @@ | |||
# 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 | |||
@@ -0,0 +1,12 @@ | |||
<?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> |
@@ -0,0 +1,22 @@ | |||
<?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> |
@@ -0,0 +1,15 @@ | |||
<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> |
@@ -0,0 +1,7 @@ | |||
<?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> |
@@ -0,0 +1,8 @@ | |||
<?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> |
@@ -0,0 +1,6 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project version="4"> | |||
<component name="VcsDirectoryMappings"> | |||
<mapping directory="$PROJECT_DIR$" vcs="Git" /> | |||
</component> | |||
</project> |
@@ -0,0 +1,719 @@ | |||
<?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> |
@@ -0,0 +1,53 @@ | |||
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} |
@@ -0,0 +1,21 @@ | |||
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. |
@@ -0,0 +1,297 @@ | |||
# 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. |
@@ -0,0 +1,152 @@ | |||
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 |
@@ -0,0 +1,58 @@ | |||
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 |
@@ -0,0 +1,251 @@ | |||
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 |
@@ -0,0 +1,141 @@ | |||
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 |
@@ -0,0 +1,72 @@ | |||
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 |
@@ -0,0 +1,151 @@ | |||
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 |
@@ -0,0 +1,88 @@ | |||
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 |
@@ -0,0 +1,243 @@ | |||
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 |
@@ -0,0 +1,188 @@ | |||
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 |
@@ -0,0 +1,101 @@ | |||
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 |
@@ -0,0 +1,91 @@ | |||
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 |
@@ -0,0 +1,73 @@ | |||
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 |
@@ -0,0 +1,324 @@ | |||
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 |
@@ -0,0 +1,165 @@ | |||
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 |
@@ -0,0 +1,112 @@ | |||
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 |
@@ -0,0 +1,70 @@ | |||
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 |
@@ -0,0 +1,113 @@ | |||
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 |
@@ -0,0 +1,107 @@ | |||
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 |
@@ -0,0 +1,446 @@ | |||
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 |
@@ -0,0 +1,354 @@ | |||
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 |
@@ -0,0 +1,56 @@ | |||
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 |
@@ -0,0 +1,201 @@ | |||
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 |
@@ -0,0 +1,19 @@ | |||
## 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 | |||
``` |
@@ -0,0 +1,160 @@ | |||
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) |
@@ -0,0 +1,39 @@ | |||
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) | |||
@@ -0,0 +1,58 @@ | |||
# 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. ) | |||
@@ -0,0 +1,49 @@ | |||
#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; | |||
}; |
@@ -0,0 +1,50 @@ | |||
#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; | |||
}; |
@@ -0,0 +1,36 @@ | |||
#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; |
@@ -0,0 +1,31 @@ | |||
#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; | |||
}; | |||
} |
@@ -0,0 +1,63 @@ | |||
#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 |
@@ -0,0 +1,503 @@ | |||
/* | |||
* 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 |
@@ -0,0 +1,241 @@ | |||
#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; | |||
} |
@@ -0,0 +1,192 @@ | |||
#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); | |||
} | |||
} |
@@ -0,0 +1,506 @@ | |||
#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; | |||
} |
@@ -0,0 +1,152 @@ | |||
#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; | |||
} | |||
} |
@@ -0,0 +1,343 @@ | |||
#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; | |||
} |
@@ -0,0 +1,429 @@ | |||
#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); | |||
} |
@@ -0,0 +1,22 @@ | |||
# 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 | |||
``` |
@@ -0,0 +1,84 @@ | |||
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() |
@@ -0,0 +1,103 @@ | |||
# 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) |
@@ -0,0 +1,49 @@ | |||
#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; | |||
}; |
@@ -0,0 +1,50 @@ | |||
#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; | |||
}; |
@@ -0,0 +1,36 @@ | |||
#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; |
@@ -0,0 +1,31 @@ | |||
#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; | |||
}; | |||
} |
@@ -0,0 +1,63 @@ | |||
#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 |
@@ -0,0 +1,241 @@ | |||
#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; | |||
} |
@@ -0,0 +1,192 @@ | |||
#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); | |||
} | |||
} |
@@ -0,0 +1,396 @@ | |||
#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; | |||
} |
@@ -0,0 +1,152 @@ | |||
#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; | |||
} | |||
} |
@@ -0,0 +1,343 @@ | |||
#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; | |||
} |
@@ -0,0 +1,429 @@ | |||
#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); | |||
} |
@@ -0,0 +1 @@ | |||
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 |
@@ -0,0 +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 |
@@ -0,0 +1,39 @@ | |||
#!/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 |
@@ -0,0 +1,89 @@ | |||
#!/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 |
@@ -0,0 +1,15 @@ | |||
#!/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] |
@@ -0,0 +1,15 @@ | |||
#!/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] |
@@ -0,0 +1,15 @@ | |||
#!/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] |
@@ -0,0 +1,19 @@ | |||
#!/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 |
@@ -0,0 +1,15 @@ | |||
#!/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] |
@@ -0,0 +1,151 @@ | |||
# 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 |
@@ -0,0 +1,138 @@ | |||
# 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 |
@@ -0,0 +1,138 @@ | |||
# 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 |
@@ -0,0 +1,158 @@ | |||
# 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 |
@@ -0,0 +1,138 @@ | |||
# 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 |
@@ -0,0 +1,139 @@ | |||
# 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 |
@@ -0,0 +1,138 @@ | |||
# 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 |
@@ -0,0 +1,138 @@ | |||
# 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 |
@@ -0,0 +1,138 @@ | |||
# 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 |
@@ -0,0 +1,139 @@ | |||
# 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 |
@@ -0,0 +1,138 @@ | |||
# 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 |
@@ -0,0 +1,139 @@ | |||
# 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 |
@@ -0,0 +1,22 @@ | |||
# 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 |
@@ -0,0 +1,18 @@ | |||
[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 |
@@ -0,0 +1,64 @@ | |||
#!/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(), | |||
) |
@@ -0,0 +1,60 @@ | |||
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')) |
@@ -0,0 +1,62 @@ | |||
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')) |