| @@ -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 | |||
| [](https://paperswithcode.com/sota/multi-object-tracking-on-mot17?p=bytetrack-multi-object-tracking-by-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 | | |||
| |:-:|:-:|:-:| | |||
| |[](https://colab.research.google.com/drive/1bDilg4cmXFa8HCKHbsZ_p16p0vrhLyu0?usp=sharing)|[](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')) | |||