hysts HF staff commited on
Commit
66dc3fa
1 Parent(s): 053917a
.gitattributes CHANGED
@@ -1,3 +1,5 @@
 
 
1
  *.7z filter=lfs diff=lfs merge=lfs -text
2
  *.arrow filter=lfs diff=lfs merge=lfs -text
3
  *.bin filter=lfs diff=lfs merge=lfs -text
 
1
+ *.jpg filter=lfs diff=lfs merge=lfs -text
2
+ *.tar filter=lfs diff=lfs merge=lfs -text
3
  *.7z filter=lfs diff=lfs merge=lfs -text
4
  *.arrow filter=lfs diff=lfs merge=lfs -text
5
  *.bin filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ mmdet_configs/configs
.pre-commit-config.yaml ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ exclude: ^mmdet_configs/configs/
2
+ repos:
3
+ - repo: https://github.com/pre-commit/pre-commit-hooks
4
+ rev: v4.2.0
5
+ hooks:
6
+ - id: check-executables-have-shebangs
7
+ - id: check-json
8
+ - id: check-merge-conflict
9
+ - id: check-shebang-scripts-are-executable
10
+ - id: check-toml
11
+ - id: check-yaml
12
+ - id: double-quote-string-fixer
13
+ - id: end-of-file-fixer
14
+ - id: mixed-line-ending
15
+ args: ['--fix=lf']
16
+ - id: requirements-txt-fixer
17
+ - id: trailing-whitespace
18
+ - repo: https://github.com/myint/docformatter
19
+ rev: v1.4
20
+ hooks:
21
+ - id: docformatter
22
+ args: ['--in-place']
23
+ - repo: https://github.com/pycqa/isort
24
+ rev: 5.10.1
25
+ hooks:
26
+ - id: isort
27
+ - repo: https://github.com/pre-commit/mirrors-mypy
28
+ rev: v0.812
29
+ hooks:
30
+ - id: mypy
31
+ args: ['--ignore-missing-imports']
32
+ - repo: https://github.com/google/yapf
33
+ rev: v0.32.0
34
+ hooks:
35
+ - id: yapf
36
+ args: ['--parallel', '--in-place']
37
+ - repo: https://github.com/kynan/nbstripout
38
+ rev: 0.5.0
39
+ hooks:
40
+ - id: nbstripout
41
+ args: ['--extra-keys', 'metadata.interpreter metadata.kernelspec cell.metadata.pycharm']
42
+ - repo: https://github.com/nbQA-dev/nbQA
43
+ rev: 1.3.1
44
+ hooks:
45
+ - id: nbqa-isort
46
+ - id: nbqa-yapf
.style.yapf ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ [style]
2
+ based_on_style = pep8
3
+ blank_line_before_nested_class_or_def = false
4
+ spaces_before_comment = 2
5
+ split_before_logical_operator = true
README.md CHANGED
@@ -1,10 +1,11 @@
1
  ---
2
- title: Mmdetection Detection
3
  emoji: 🔥
4
  colorFrom: pink
5
  colorTo: purple
6
  sdk: gradio
7
- sdk_version: 3.0.6
 
8
  app_file: app.py
9
  pinned: false
10
  ---
 
1
  ---
2
+ title: MMDetection
3
  emoji: 🔥
4
  colorFrom: pink
5
  colorTo: purple
6
  sdk: gradio
7
+ python_version: 3.9.13
8
+ sdk_version: 3.0.9
9
  app_file: app.py
10
  pinned: false
11
  ---
app.py ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import os
7
+ import pathlib
8
+ import subprocess
9
+ import tarfile
10
+
11
+ if os.getenv('SYSTEM') == 'spaces':
12
+ import mim
13
+
14
+ mim.uninstall('mmcv-full', confirm_yes=True)
15
+ mim.install('mmcv-full==1.5.2', is_yes=True)
16
+
17
+ subprocess.call('pip uninstall -y opencv-python'.split())
18
+ subprocess.call('pip uninstall -y opencv-python-headless'.split())
19
+ subprocess.call('pip install opencv-python-headless'.split())
20
+
21
+ import gradio as gr
22
+
23
+ from model import Model
24
+
25
+ DEFAULT_MODEL_TYPE = 'detection'
26
+ DEFAULT_MODEL_NAMES = {
27
+ 'detection': 'YOLOX-l',
28
+ 'instance_segmentation': 'QueryInst (R-50-FPN)',
29
+ 'panoptic_segmentation': 'MaskFormer (R-50)',
30
+ }
31
+ DEFAULT_MODEL_NAME = DEFAULT_MODEL_NAMES[DEFAULT_MODEL_TYPE]
32
+
33
+
34
+ def parse_args() -> argparse.Namespace:
35
+ parser = argparse.ArgumentParser()
36
+ parser.add_argument('--device', type=str, default='cpu')
37
+ parser.add_argument('--theme', type=str)
38
+ parser.add_argument('--share', action='store_true')
39
+ parser.add_argument('--port', type=int)
40
+ parser.add_argument('--disable-queue',
41
+ dest='enable_queue',
42
+ action='store_false')
43
+ return parser.parse_args()
44
+
45
+
46
+ def extract_tar() -> None:
47
+ if pathlib.Path('mmdet_configs/configs').exists():
48
+ return
49
+ with tarfile.open('mmdet_configs/configs.tar') as f:
50
+ f.extractall('mmdet_configs')
51
+
52
+
53
+ def update_model_name(model_type: str) -> dict:
54
+ model_dict = getattr(Model, f'{model_type.upper()}_MODEL_DICT')
55
+ model_names = list(model_dict.keys())
56
+ model_name = DEFAULT_MODEL_NAMES[model_type]
57
+ return gr.Dropdown.update(choices=model_names, value=model_name)
58
+
59
+
60
+ def update_visualization_score_threshold(model_type: str) -> dict:
61
+ return gr.Slider.update(visible=model_type != 'panoptic_segmentation')
62
+
63
+
64
+ def update_redraw_button(model_type: str) -> dict:
65
+ return gr.Button.update(visible=model_type != 'panoptic_segmentation')
66
+
67
+
68
+ def set_example_image(example: list) -> dict:
69
+ return gr.Image.update(value=example[0])
70
+
71
+
72
+ def main():
73
+ args = parse_args()
74
+
75
+ extract_tar()
76
+ model = Model(DEFAULT_MODEL_NAME, args.device)
77
+
78
+ css = '''
79
+ h1#title {
80
+ text-align: center;
81
+ }
82
+ img#overview {
83
+ max-width: 1000px;
84
+ max-height: 600px;
85
+ }
86
+ '''
87
+
88
+ with gr.Blocks(theme=args.theme, css=css) as demo:
89
+ gr.Markdown('''<h1 id="title">MMDetection</h1>
90
+
91
+ This is an unofficial demo for [https://github.com/open-mmlab/mmdetection](https://github.com/open-mmlab/mmdetection).
92
+ <center><img id="overview" alt="overview" src="https://user-images.githubusercontent.com/12907710/137271636-56ba1cd2-b110-4812-8221-b4c120320aa9.png" /></center>
93
+ ''')
94
+
95
+ with gr.Row():
96
+ with gr.Column():
97
+ with gr.Row():
98
+ input_image = gr.Image(label='Input Image', type='numpy')
99
+ with gr.Group():
100
+ with gr.Row():
101
+ model_type = gr.Radio(list(DEFAULT_MODEL_NAMES.keys()),
102
+ value=DEFAULT_MODEL_TYPE,
103
+ label='Model Type')
104
+ with gr.Row():
105
+ model_name = gr.Dropdown(list(
106
+ model.DETECTION_MODEL_DICT.keys()),
107
+ value=DEFAULT_MODEL_NAME,
108
+ label='Model')
109
+ with gr.Row():
110
+ run_button = gr.Button(value='Run')
111
+ prediction_results = gr.Variable()
112
+ with gr.Column():
113
+ with gr.Row():
114
+ visualization = gr.Image(label='Result', type='numpy')
115
+ with gr.Row():
116
+ visualization_score_threshold = gr.Slider(
117
+ 0,
118
+ 1,
119
+ step=0.05,
120
+ value=0.3,
121
+ label='Visualization Score Threshold')
122
+ with gr.Row():
123
+ redraw_button = gr.Button(value='Redraw')
124
+
125
+ with gr.Row():
126
+ paths = sorted(pathlib.Path('images').rglob('*.jpg'))
127
+ example_images = gr.Dataset(components=[input_image],
128
+ samples=[[path.as_posix()]
129
+ for path in paths])
130
+
131
+ gr.Markdown(
132
+ '<center><img src="https://visitor-badge.glitch.me/badge?page_id=hysts.mmdetection" alt="visitor badge"/></center>'
133
+ )
134
+
135
+ model_type.change(fn=update_model_name,
136
+ inputs=[model_type],
137
+ outputs=[model_name])
138
+ model_type.change(fn=update_visualization_score_threshold,
139
+ inputs=[model_type],
140
+ outputs=[visualization_score_threshold])
141
+ model_type.change(fn=update_redraw_button,
142
+ inputs=[model_type],
143
+ outputs=[redraw_button])
144
+
145
+ model_name.change(fn=model.set_model,
146
+ inputs=[model_name],
147
+ outputs=None)
148
+ run_button.click(fn=model.detect_and_visualize,
149
+ inputs=[
150
+ input_image,
151
+ visualization_score_threshold,
152
+ ],
153
+ outputs=[
154
+ prediction_results,
155
+ visualization,
156
+ ])
157
+ redraw_button.click(fn=model.visualize_detection_results,
158
+ inputs=[
159
+ input_image,
160
+ prediction_results,
161
+ visualization_score_threshold,
162
+ ],
163
+ outputs=[visualization])
164
+ example_images.click(fn=set_example_image,
165
+ inputs=[example_images],
166
+ outputs=[input_image])
167
+
168
+ demo.launch(
169
+ enable_queue=args.enable_queue,
170
+ server_port=args.port,
171
+ share=args.share,
172
+ )
173
+
174
+
175
+ if __name__ == '__main__':
176
+ main()
images/README.md ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ These images are freely-usable ones from https://www.pexels.com/.
2
+
3
+ - https://www.pexels.com/photo/assorted-color-kittens-45170/
4
+ - https://www.pexels.com/photo/white-wooden-kitchen-cabinet-1599791/
5
+ - https://www.pexels.com/photo/assorted-books-on-book-shelves-1370295/
6
+ - https://www.pexels.com/photo/pile-of-assorted-varieties-of-vegetables-2255935/
7
+ - https://www.pexels.com/photo/sliced-fruits-on-tray-1132047/
8
+ - https://www.pexels.com/photo/group-of-people-carrying-surfboards-1549196/
9
+ - https://www.pexels.com/photo/aerial-photo-of-vehicles-in-the-city-1031698/
images/pexels-element-digital-1370295.jpg ADDED

Git LFS Details

  • SHA256: 5b2885e968ebf6b8e84ecab708d953a5feede203f488038ce3c9cb5bcfc52562
  • Pointer size: 131 Bytes
  • Size of remote file: 738 kB
images/pexels-elle-hughes-1549196.jpg ADDED

Git LFS Details

  • SHA256: 6d3854839113cc0570044ac87be9d7116b1d1ffe0ba6c81eff60923fa9030b25
  • Pointer size: 131 Bytes
  • Size of remote file: 609 kB
images/pexels-jean-van-der-meulen-1599791.jpg ADDED

Git LFS Details

  • SHA256: 0f34538e583afda98666158a40154b09316757d89b465b318e182a1758859a88
  • Pointer size: 131 Bytes
  • Size of remote file: 333 kB
images/pexels-mark-stebnicki-2255935.jpg ADDED

Git LFS Details

  • SHA256: 778b11664deb3c332345a327444898d776b50b4038e39c8ef79e416dc183f752
  • Pointer size: 131 Bytes
  • Size of remote file: 417 kB
images/pexels-oleksandr-pidvalnyi-1031698.jpg ADDED

Git LFS Details

  • SHA256: 2de03892c6f6624a45fc67a283aeb33d4534fecc76e51d83e43fe40b58ce2351
  • Pointer size: 131 Bytes
  • Size of remote file: 670 kB
images/pexels-pixabay-45170.jpg ADDED

Git LFS Details

  • SHA256: 114e83cc896e9df6476fd682c8d0dc8fafb76e8cf1da5f6396280040081ee1ca
  • Pointer size: 131 Bytes
  • Size of remote file: 681 kB
images/pexels-trang-doan-1132047.jpg ADDED

Git LFS Details

  • SHA256: e0eaec57002e3fbb1199d5ddc09df277fd168fc88b36359c2a9d8ef20ea18c28
  • Pointer size: 131 Bytes
  • Size of remote file: 519 kB
mmdet_configs/LICENSE ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright 2018-2023 OpenMMLab. All rights reserved.
2
+
3
+ Apache License
4
+ Version 2.0, January 2004
5
+ http://www.apache.org/licenses/
6
+
7
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
8
+
9
+ 1. Definitions.
10
+
11
+ "License" shall mean the terms and conditions for use, reproduction,
12
+ and distribution as defined by Sections 1 through 9 of this document.
13
+
14
+ "Licensor" shall mean the copyright owner or entity authorized by
15
+ the copyright owner that is granting the License.
16
+
17
+ "Legal Entity" shall mean the union of the acting entity and all
18
+ other entities that control, are controlled by, or are under common
19
+ control with that entity. For the purposes of this definition,
20
+ "control" means (i) the power, direct or indirect, to cause the
21
+ direction or management of such entity, whether by contract or
22
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
23
+ outstanding shares, or (iii) beneficial ownership of such entity.
24
+
25
+ "You" (or "Your") shall mean an individual or Legal Entity
26
+ exercising permissions granted by this License.
27
+
28
+ "Source" form shall mean the preferred form for making modifications,
29
+ including but not limited to software source code, documentation
30
+ source, and configuration files.
31
+
32
+ "Object" form shall mean any form resulting from mechanical
33
+ transformation or translation of a Source form, including but
34
+ not limited to compiled object code, generated documentation,
35
+ and conversions to other media types.
36
+
37
+ "Work" shall mean the work of authorship, whether in Source or
38
+ Object form, made available under the License, as indicated by a
39
+ copyright notice that is included in or attached to the work
40
+ (an example is provided in the Appendix below).
41
+
42
+ "Derivative Works" shall mean any work, whether in Source or Object
43
+ form, that is based on (or derived from) the Work and for which the
44
+ editorial revisions, annotations, elaborations, or other modifications
45
+ represent, as a whole, an original work of authorship. For the purposes
46
+ of this License, Derivative Works shall not include works that remain
47
+ separable from, or merely link (or bind by name) to the interfaces of,
48
+ the Work and Derivative Works thereof.
49
+
50
+ "Contribution" shall mean any work of authorship, including
51
+ the original version of the Work and any modifications or additions
52
+ to that Work or Derivative Works thereof, that is intentionally
53
+ submitted to Licensor for inclusion in the Work by the copyright owner
54
+ or by an individual or Legal Entity authorized to submit on behalf of
55
+ the copyright owner. For the purposes of this definition, "submitted"
56
+ means any form of electronic, verbal, or written communication sent
57
+ to the Licensor or its representatives, including but not limited to
58
+ communication on electronic mailing lists, source code control systems,
59
+ and issue tracking systems that are managed by, or on behalf of, the
60
+ Licensor for the purpose of discussing and improving the Work, but
61
+ excluding communication that is conspicuously marked or otherwise
62
+ designated in writing by the copyright owner as "Not a Contribution."
63
+
64
+ "Contributor" shall mean Licensor and any individual or Legal Entity
65
+ on behalf of whom a Contribution has been received by Licensor and
66
+ subsequently incorporated within the Work.
67
+
68
+ 2. Grant of Copyright License. Subject to the terms and conditions of
69
+ this License, each Contributor hereby grants to You a perpetual,
70
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
71
+ copyright license to reproduce, prepare Derivative Works of,
72
+ publicly display, publicly perform, sublicense, and distribute the
73
+ Work and such Derivative Works in Source or Object form.
74
+
75
+ 3. Grant of Patent License. Subject to the terms and conditions of
76
+ this License, each Contributor hereby grants to You a perpetual,
77
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
78
+ (except as stated in this section) patent license to make, have made,
79
+ use, offer to sell, sell, import, and otherwise transfer the Work,
80
+ where such license applies only to those patent claims licensable
81
+ by such Contributor that are necessarily infringed by their
82
+ Contribution(s) alone or by combination of their Contribution(s)
83
+ with the Work to which such Contribution(s) was submitted. If You
84
+ institute patent litigation against any entity (including a
85
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
86
+ or a Contribution incorporated within the Work constitutes direct
87
+ or contributory patent infringement, then any patent licenses
88
+ granted to You under this License for that Work shall terminate
89
+ as of the date such litigation is filed.
90
+
91
+ 4. Redistribution. You may reproduce and distribute copies of the
92
+ Work or Derivative Works thereof in any medium, with or without
93
+ modifications, and in Source or Object form, provided that You
94
+ meet the following conditions:
95
+
96
+ (a) You must give any other recipients of the Work or
97
+ Derivative Works a copy of this License; and
98
+
99
+ (b) You must cause any modified files to carry prominent notices
100
+ stating that You changed the files; and
101
+
102
+ (c) You must retain, in the Source form of any Derivative Works
103
+ that You distribute, all copyright, patent, trademark, and
104
+ attribution notices from the Source form of the Work,
105
+ excluding those notices that do not pertain to any part of
106
+ the Derivative Works; and
107
+
108
+ (d) If the Work includes a "NOTICE" text file as part of its
109
+ distribution, then any Derivative Works that You distribute must
110
+ include a readable copy of the attribution notices contained
111
+ within such NOTICE file, excluding those notices that do not
112
+ pertain to any part of the Derivative Works, in at least one
113
+ of the following places: within a NOTICE text file distributed
114
+ as part of the Derivative Works; within the Source form or
115
+ documentation, if provided along with the Derivative Works; or,
116
+ within a display generated by the Derivative Works, if and
117
+ wherever such third-party notices normally appear. The contents
118
+ of the NOTICE file are for informational purposes only and
119
+ do not modify the License. You may add Your own attribution
120
+ notices within Derivative Works that You distribute, alongside
121
+ or as an addendum to the NOTICE text from the Work, provided
122
+ that such additional attribution notices cannot be construed
123
+ as modifying the License.
124
+
125
+ You may add Your own copyright statement to Your modifications and
126
+ may provide additional or different license terms and conditions
127
+ for use, reproduction, or distribution of Your modifications, or
128
+ for any such Derivative Works as a whole, provided Your use,
129
+ reproduction, and distribution of the Work otherwise complies with
130
+ the conditions stated in this License.
131
+
132
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
133
+ any Contribution intentionally submitted for inclusion in the Work
134
+ by You to the Licensor shall be under the terms and conditions of
135
+ this License, without any additional terms or conditions.
136
+ Notwithstanding the above, nothing herein shall supersede or modify
137
+ the terms of any separate license agreement you may have executed
138
+ with Licensor regarding such Contributions.
139
+
140
+ 6. Trademarks. This License does not grant permission to use the trade
141
+ names, trademarks, service marks, or product names of the Licensor,
142
+ except as required for reasonable and customary use in describing the
143
+ origin of the Work and reproducing the content of the NOTICE file.
144
+
145
+ 7. Disclaimer of Warranty. Unless required by applicable law or
146
+ agreed to in writing, Licensor provides the Work (and each
147
+ Contributor provides its Contributions) on an "AS IS" BASIS,
148
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
149
+ implied, including, without limitation, any warranties or conditions
150
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
151
+ PARTICULAR PURPOSE. You are solely responsible for determining the
152
+ appropriateness of using or redistributing the Work and assume any
153
+ risks associated with Your exercise of permissions under this License.
154
+
155
+ 8. Limitation of Liability. In no event and under no legal theory,
156
+ whether in tort (including negligence), contract, or otherwise,
157
+ unless required by applicable law (such as deliberate and grossly
158
+ negligent acts) or agreed to in writing, shall any Contributor be
159
+ liable to You for damages, including any direct, indirect, special,
160
+ incidental, or consequential damages of any character arising as a
161
+ result of this License or out of the use or inability to use the
162
+ Work (including but not limited to damages for loss of goodwill,
163
+ work stoppage, computer failure or malfunction, or any and all
164
+ other commercial damages or losses), even if such Contributor
165
+ has been advised of the possibility of such damages.
166
+
167
+ 9. Accepting Warranty or Additional Liability. While redistributing
168
+ the Work or Derivative Works thereof, You may choose to offer,
169
+ and charge a fee for, acceptance of support, warranty, indemnity,
170
+ or other liability obligations and/or rights consistent with this
171
+ License. However, in accepting such obligations, You may act only
172
+ on Your own behalf and on Your sole responsibility, not on behalf
173
+ of any other Contributor, and only if You agree to indemnify,
174
+ defend, and hold each Contributor harmless for any liability
175
+ incurred by, or claims asserted against, such Contributor by reason
176
+ of your accepting any such warranty or additional liability.
177
+
178
+ END OF TERMS AND CONDITIONS
179
+
180
+ APPENDIX: How to apply the Apache License to your work.
181
+
182
+ To apply the Apache License to your work, attach the following
183
+ boilerplate notice, with the fields enclosed by brackets "[]"
184
+ replaced with your own identifying information. (Don't include
185
+ the brackets!) The text should be enclosed in the appropriate
186
+ comment syntax for the file format. We also recommend that a
187
+ file or class name and description of purpose be included on the
188
+ same "printed page" as the copyright notice for easier
189
+ identification within third-party archives.
190
+
191
+ Copyright 2018-2023 OpenMMLab.
192
+
193
+ Licensed under the Apache License, Version 2.0 (the "License");
194
+ you may not use this file except in compliance with the License.
195
+ You may obtain a copy of the License at
196
+
197
+ http://www.apache.org/licenses/LICENSE-2.0
198
+
199
+ Unless required by applicable law or agreed to in writing, software
200
+ distributed under the License is distributed on an "AS IS" BASIS,
201
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
202
+ See the License for the specific language governing permissions and
203
+ limitations under the License.
mmdet_configs/README.md ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ `configs.tar` is a tarball of https://github.com/open-mmlab/mmdetection/tree/v2.24.1/configs.
2
+ The license file of the mmdetection is also included in this directory.
mmdet_configs/configs.tar ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5d2091e07da6b74a6cd694e895b653485f7ce9d5d17738a415ca77a56940b989
3
+ size 3389440
model.py ADDED
@@ -0,0 +1,98 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import os
4
+
5
+ import huggingface_hub
6
+ import numpy as np
7
+ import torch
8
+ import torch.nn as nn
9
+ import yaml
10
+ from mmdet.apis import inference_detector, init_detector
11
+
12
+
13
+ def _load_model_dict(path: str) -> dict[str, dict[str, str]]:
14
+ with open(path) as f:
15
+ dic = yaml.safe_load(f)
16
+ _update_config_path(dic)
17
+ _update_model_dict_if_hf_token_is_given(dic)
18
+ return dic
19
+
20
+
21
+ def _update_config_path(model_dict: dict[str, dict[str, str]]) -> None:
22
+ for dic in model_dict.values():
23
+ dic['config'] = dic['config'].replace(
24
+ 'https://github.com/open-mmlab/mmdetection/tree/master',
25
+ 'mmdet_configs')
26
+
27
+
28
+ def _update_model_dict_if_hf_token_is_given(
29
+ model_dict: dict[str, dict[str, str]]) -> None:
30
+ token = os.getenv('HF_TOKEN')
31
+ if token is None:
32
+ return
33
+
34
+ for dic in model_dict.values():
35
+ ckpt_path = dic['model']
36
+ name = ckpt_path.split('/')[-1]
37
+ ckpt_path = huggingface_hub.hf_hub_download('hysts/mmdetection',
38
+ f'models/{name}',
39
+ use_auth_token=token)
40
+ dic['model'] = ckpt_path
41
+
42
+
43
+ class Model:
44
+ DETECTION_MODEL_DICT = _load_model_dict('model_dict/detection.yaml')
45
+ INSTANCE_SEGMENTATION_MODEL_DICT = _load_model_dict(
46
+ 'model_dict/instance_segmentation.yaml')
47
+ PANOPTIC_SEGMENTATION_MODEL_DICT = _load_model_dict(
48
+ 'model_dict/panoptic_segmentation.yaml')
49
+ MODEL_DICT = DETECTION_MODEL_DICT | INSTANCE_SEGMENTATION_MODEL_DICT | PANOPTIC_SEGMENTATION_MODEL_DICT
50
+
51
+ def __init__(self, model_name: str, device: str | torch.device):
52
+ self.device = torch.device(device)
53
+ self._load_all_models_once()
54
+ self.model = self._load_model(model_name)
55
+
56
+ def _load_all_models_once(self) -> None:
57
+ for name in self.MODEL_DICT:
58
+ self._load_model(name)
59
+
60
+ def _load_model(self, name: str) -> nn.Module:
61
+ dic = self.MODEL_DICT[name]
62
+ return init_detector(dic['config'], dic['model'], device=self.device)
63
+
64
+ def set_model(self, name: str) -> None:
65
+ self.model = self._load_model(name)
66
+
67
+ def detect_and_visualize(
68
+ self, image: np.ndarray, score_threshold: float
69
+ ) -> tuple[list[np.ndarray] | tuple[list[np.ndarray],
70
+ list[list[np.ndarray]]]
71
+ | dict[str, np.ndarray], np.ndarray]:
72
+ out = self.detect(image)
73
+ vis = self.visualize_detection_results(image, out, score_threshold)
74
+ return out, vis
75
+
76
+ def detect(
77
+ self, image: np.ndarray
78
+ ) -> list[np.ndarray] | tuple[
79
+ list[np.ndarray], list[list[np.ndarray]]] | dict[str, np.ndarray]:
80
+ image = image[:, :, ::-1] # RGB -> BGR
81
+ out = inference_detector(self.model, image)
82
+ return out
83
+
84
+ def visualize_detection_results(
85
+ self,
86
+ image: np.ndarray,
87
+ detection_results: list[np.ndarray]
88
+ | tuple[list[np.ndarray], list[list[np.ndarray]]]
89
+ | dict[str, np.ndarray],
90
+ score_threshold: float = 0.3) -> np.ndarray:
91
+ image = image[:, :, ::-1] # RGB -> BGR
92
+ vis = self.model.show_result(image,
93
+ detection_results,
94
+ score_thr=score_threshold,
95
+ bbox_color=None,
96
+ text_color=(200, 200, 200),
97
+ mask_color=None)
98
+ return vis[:, :, ::-1] # BGR -> RGB
model_dict/detection.yaml ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Faster R-CNN (R-50-FPN):
2
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py
3
+ model: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_2x_coco/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth
4
+ Faster R-CNN (X-101-64x4d-FPN):
5
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py
6
+ model: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco/faster_rcnn_x101_64x4d_fpn_1x_coco_20200204-833ee192.pth
7
+ SSD (VGG16):
8
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd/ssd512_coco.py
9
+ model: https://download.openmmlab.com/mmdetection/v2.0/ssd/ssd512_coco/ssd512_coco_20210803_022849-0a47a1ca.pth
10
+ RetinaNet (X-101-64x4d-FPN):
11
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_x101_64x4d_fpn_mstrain_640-800_3x_coco.py
12
+ model: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_mstrain_3x_coco/retinanet_x101_64x4d_fpn_mstrain_3x_coco_20210719_051838-022c2187.pth
13
+ YOLOv3 (DarkNet-53 608):
14
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo/yolov3_d53_mstrain-608_273e_coco.py
15
+ model: https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_mstrain-608_273e_coco/yolov3_d53_mstrain-608_273e_coco_20210518_115020-a2c3acb8.pth
16
+ CornerNet (HourglassNet-104):
17
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py
18
+ model: https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco/cornernet_hourglass104_mstest_10x5_210e_coco_20200824_185720-5fefbf1c.pth
19
+ FCOS (X-101):
20
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py
21
+ model: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco-ede514a8.pth
22
+ DETR:
23
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/detr/detr_r50_8x2_150e_coco.py
24
+ model: https://download.openmmlab.com/mmdetection/v2.0/detr/detr_r50_8x2_150e_coco/detr_r50_8x2_150e_coco_20201130_194835-2c4b8974.pth
25
+ YOLOX-tiny:
26
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox/yolox_tiny_8x8_300e_coco.py
27
+ model: https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_tiny_8x8_300e_coco/yolox_tiny_8x8_300e_coco_20211124_171234-b4047906.pth
28
+ YOLOX-s:
29
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox/yolox_s_8x8_300e_coco.py
30
+ model: https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_s_8x8_300e_coco/yolox_s_8x8_300e_coco_20211121_095711-4592a793.pth
31
+ YOLOX-l:
32
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox/yolox_l_8x8_300e_coco.py
33
+ model: https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_l_8x8_300e_coco/yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth
34
+ YOLOX-x:
35
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox/yolox_x_8x8_300e_coco.py
36
+ model: https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_x_8x8_300e_coco/yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth
37
+ Deformable DETR (R-50 two-stage Deformable DETR):
38
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py
39
+ model: https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco/deformable_detr_twostage_refine_r50_16x2_50e_coco_20210419_220613-9d28ab72.pth
40
+ TOOD (R-101-dcnv2):
41
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py
42
+ model: https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20211210_213728-4a824142.pth
model_dict/instance_segmentation.yaml ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Mask R-CNN (R-50-FPN):
2
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py
3
+ model: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_fpn_mstrain-poly_3x_coco_20210524_201154-21b550bb.pth
4
+ Mask R-CNN (X-101-64x4d-FPN):
5
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py
6
+ model: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco_20210526_120447-c376f129.pth
7
+ Cascade Mask R-CNN (X-101-64x4d-FPN):
8
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py
9
+ model: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210719_210311-d3e64ba0.pth
10
+ Mask Scoring R-CNN (R-X101-64x4d):
11
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py
12
+ model: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco/ms_rcnn_x101_64x4d_fpn_1x_coco_20200206-86ba88d2.pth
13
+ HTC (X-101-64x4d-FPN):
14
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py
15
+ model: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_16x1_20e_coco/htc_x101_64x4d_fpn_16x1_20e_coco_20200318-b181fd7a.pth
16
+ YOLACT:
17
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/yolact/yolact_r50_1x8_coco.py
18
+ model: https://download.openmmlab.com/mmdetection/v2.0/yolact/yolact_r50_1x8_coco/yolact_r50_1x8_coco_20200908-f38d58df.pth
19
+ Instaboost (Mask R-CNN (X-101-64x4d-FPN)):
20
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py
21
+ model: https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco_20200515_080947-8ed58c1b.pth
22
+ SOLO:
23
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/solo/solo_r50_fpn_3x_coco.py
24
+ model: https://download.openmmlab.com/mmdetection/v2.0/solo/solo_r50_fpn_3x_coco/solo_r50_fpn_3x_coco_20210901_012353-11d224d7.pth
25
+ PointRend (R-50-FPN):
26
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py
27
+ model: https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco/point_rend_r50_caffe_fpn_mstrain_3x_coco-e0ebb6b7.pth
28
+ DetectoRS (HTC + ResNet-101):
29
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/detectors_htc_r101_20e_coco.py
30
+ model: https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r101_20e_coco/detectors_htc_r101_20e_coco_20210419_203638-348d533b.pth
31
+ SCNet (X-101-64x4d-FPN):
32
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/scnet/scnet_x101_64x4d_fpn_20e_coco.py
33
+ model: https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_x101_64x4d_fpn_20e_coco/scnet_x101_64x4d_fpn_20e_coco-fb09dec9.pth
34
+ QueryInst (R-50-FPN):
35
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py
36
+ model: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_101802-85cffbd8.pth
37
+ QueryInst (R-101-FPN):
38
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py
39
+ model: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_153621-76cce59f.pth
model_dict/panoptic_segmentation.yaml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ Panoptic FPN (R-50-FPN):
2
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py
3
+ model: https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco/panoptic_fpn_r50_fpn_mstrain_3x_coco_20210824_171155-5650f98b.pth
4
+ MaskFormer (R-50):
5
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py
6
+ model: https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_r50_mstrain_16x1_75e_coco/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956-bc2699cb.pth
7
+ MaskFormer (Swin-L):
8
+ config: https://github.com/open-mmlab/mmdetection/tree/master/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py
9
+ model: https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco_20220326_221612-061b4eb8.pth
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ mmcv-full==1.5.2
2
+ mmdet==2.24.1
3
+ numpy==1.22.4
4
+ opencv-python-headless==4.5.5.64
5
+ openmim==0.1.5
6
+ torch==1.11.0
7
+ torchvision==0.12.0