ssd_mobilenet_v2_coco_2018_03_29

#9
by SavyaSanchi - opened
This view is limited to 50 files because it contains too many changes. See the raw diff here.
Files changed (50) hide show
  1. .gitignore +0 -3
  2. east_text_detection/LICENSE +0 -674
  3. east_text_detection/README.md +0 -67
  4. east_text_detection/convert_to_onnx.py +0 -44
  5. east_text_detection/demo.cpp +0 -49
  6. east_text_detection/demo.py +0 -39
  7. east_text_detection/east_text_detection_2026jul.onnx +0 -3
  8. east_text_detection/example_outputs/input_image.png +0 -3
  9. east_text_detection/example_outputs/output_image.png +0 -3
  10. efficientdet-d0/LICENSE +0 -203
  11. efficientdet-d0/README.md +0 -62
  12. efficientdet-d0/convert_to_onnx.py +0 -41
  13. efficientdet-d0/demo.cpp +0 -127
  14. efficientdet-d0/demo.py +0 -105
  15. efficientdet-d0/efficientdet-d0_2026jul.onnx +0 -3
  16. efficientdet-d0/example_outputs/input_image.png +0 -3
  17. efficientdet-d0/example_outputs/output_image.png +0 -3
  18. faster_rcnn_inception_v2_coco_2018_01_28/LICENSE +0 -203
  19. faster_rcnn_inception_v2_coco_2018_01_28/README.md +0 -49
  20. faster_rcnn_inception_v2_coco_2018_01_28/convert_to_onnx.py +0 -40
  21. faster_rcnn_inception_v2_coco_2018_01_28/demo.cpp +0 -83
  22. faster_rcnn_inception_v2_coco_2018_01_28/demo.py +0 -51
  23. faster_rcnn_inception_v2_coco_2018_01_28/example_outputs/input_image.png +0 -3
  24. faster_rcnn_inception_v2_coco_2018_01_28/example_outputs/output_image.png +0 -3
  25. faster_rcnn_inception_v2_coco_2018_01_28/faster_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx +0 -3
  26. faster_rcnn_resnet50_coco_2018_01_28/LICENSE +0 -203
  27. faster_rcnn_resnet50_coco_2018_01_28/README.md +0 -49
  28. faster_rcnn_resnet50_coco_2018_01_28/convert_to_onnx.py +0 -40
  29. faster_rcnn_resnet50_coco_2018_01_28/demo.cpp +0 -83
  30. faster_rcnn_resnet50_coco_2018_01_28/demo.py +0 -51
  31. faster_rcnn_resnet50_coco_2018_01_28/example_outputs/input_image.png +0 -3
  32. faster_rcnn_resnet50_coco_2018_01_28/example_outputs/output_image.png +0 -3
  33. faster_rcnn_resnet50_coco_2018_01_28/faster_rcnn_resnet50_coco_2018_01_28_2026jul.onnx +0 -3
  34. mask_rcnn_inception_v2_coco_2018_01_28/LICENSE +0 -203
  35. mask_rcnn_inception_v2_coco_2018_01_28/README.md +0 -51
  36. mask_rcnn_inception_v2_coco_2018_01_28/convert_to_onnx.py +0 -46
  37. mask_rcnn_inception_v2_coco_2018_01_28/demo.cpp +0 -109
  38. mask_rcnn_inception_v2_coco_2018_01_28/demo.py +0 -59
  39. mask_rcnn_inception_v2_coco_2018_01_28/example_outputs/input_image.png +0 -3
  40. mask_rcnn_inception_v2_coco_2018_01_28/example_outputs/output_image.png +0 -3
  41. mask_rcnn_inception_v2_coco_2018_01_28/mask_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx +0 -3
  42. opencv_face_detector_uint8/LICENSE +0 -203
  43. opencv_face_detector_uint8/README.md +0 -67
  44. opencv_face_detector_uint8/convert_to_onnx.py +0 -73
  45. opencv_face_detector_uint8/demo.cpp +0 -146
  46. opencv_face_detector_uint8/demo.py +0 -109
  47. opencv_face_detector_uint8/example_outputs/input_image.png +0 -3
  48. opencv_face_detector_uint8/example_outputs/output_image.png +0 -3
  49. opencv_face_detector_uint8/opencv_face_detector_uint8_2026jul.onnx +0 -3
  50. ssd_inception_v2_coco_2017_11_17/LICENSE +0 -212
.gitignore DELETED
@@ -1,3 +0,0 @@
1
- ssd_mobilenet_v2_coco_2018_03_29/demo
2
-
3
- **/demo
 
 
 
 
east_text_detection/LICENSE DELETED
@@ -1,674 +0,0 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
- Preamble
9
-
10
- The GNU General Public License is a free, copyleft license for
11
- software and other kinds of works.
12
-
13
- The licenses for most software and other practical works are designed
14
- to take away your freedom to share and change the works. By contrast,
15
- the GNU General Public License is intended to guarantee your freedom to
16
- share and change all versions of a program--to make sure it remains free
17
- software for all its users. We, the Free Software Foundation, use the
18
- GNU General Public License for most of our software; it applies also to
19
- any other work released this way by its authors. You can apply it to
20
- your programs, too.
21
-
22
- When we speak of free software, we are referring to freedom, not
23
- price. Our General Public Licenses are designed to make sure that you
24
- have the freedom to distribute copies of free software (and charge for
25
- them if you wish), that you receive source code or can get it if you
26
- want it, that you can change the software or use pieces of it in new
27
- free programs, and that you know you can do these things.
28
-
29
- To protect your rights, we need to prevent others from denying you
30
- these rights or asking you to surrender the rights. Therefore, you have
31
- certain responsibilities if you distribute copies of the software, or if
32
- you modify it: responsibilities to respect the freedom of others.
33
-
34
- For example, if you distribute copies of such a program, whether
35
- gratis or for a fee, you must pass on to the recipients the same
36
- freedoms that you received. You must make sure that they, too, receive
37
- or can get the source code. And you must show them these terms so they
38
- know their rights.
39
-
40
- Developers that use the GNU GPL protect your rights with two steps:
41
- (1) assert copyright on the software, and (2) offer you this License
42
- giving you legal permission to copy, distribute and/or modify it.
43
-
44
- For the developers' and authors' protection, the GPL clearly explains
45
- that there is no warranty for this free software. For both users' and
46
- authors' sake, the GPL requires that modified versions be marked as
47
- changed, so that their problems will not be attributed erroneously to
48
- authors of previous versions.
49
-
50
- Some devices are designed to deny users access to install or run
51
- modified versions of the software inside them, although the manufacturer
52
- can do so. This is fundamentally incompatible with the aim of
53
- protecting users' freedom to change the software. The systematic
54
- pattern of such abuse occurs in the area of products for individuals to
55
- use, which is precisely where it is most unacceptable. Therefore, we
56
- have designed this version of the GPL to prohibit the practice for those
57
- products. If such problems arise substantially in other domains, we
58
- stand ready to extend this provision to those domains in future versions
59
- of the GPL, as needed to protect the freedom of users.
60
-
61
- Finally, every program is threatened constantly by software patents.
62
- States should not allow patents to restrict development and use of
63
- software on general-purpose computers, but in those that do, we wish to
64
- avoid the special danger that patents applied to a free program could
65
- make it effectively proprietary. To prevent this, the GPL assures that
66
- patents cannot be used to render the program non-free.
67
-
68
- The precise terms and conditions for copying, distribution and
69
- modification follow.
70
-
71
- TERMS AND CONDITIONS
72
-
73
- 0. Definitions.
74
-
75
- "This License" refers to version 3 of the GNU General Public License.
76
-
77
- "Copyright" also means copyright-like laws that apply to other kinds of
78
- works, such as semiconductor masks.
79
-
80
- "The Program" refers to any copyrightable work licensed under this
81
- License. Each licensee is addressed as "you". "Licensees" and
82
- "recipients" may be individuals or organizations.
83
-
84
- To "modify" a work means to copy from or adapt all or part of the work
85
- in a fashion requiring copyright permission, other than the making of an
86
- exact copy. The resulting work is called a "modified version" of the
87
- earlier work or a work "based on" the earlier work.
88
-
89
- A "covered work" means either the unmodified Program or a work based
90
- on the Program.
91
-
92
- To "propagate" a work means to do anything with it that, without
93
- permission, would make you directly or secondarily liable for
94
- infringement under applicable copyright law, except executing it on a
95
- computer or modifying a private copy. Propagation includes copying,
96
- distribution (with or without modification), making available to the
97
- public, and in some countries other activities as well.
98
-
99
- To "convey" a work means any kind of propagation that enables other
100
- parties to make or receive copies. Mere interaction with a user through
101
- a computer network, with no transfer of a copy, is not conveying.
102
-
103
- An interactive user interface displays "Appropriate Legal Notices"
104
- to the extent that it includes a convenient and prominently visible
105
- feature that (1) displays an appropriate copyright notice, and (2)
106
- tells the user that there is no warranty for the work (except to the
107
- extent that warranties are provided), that licensees may convey the
108
- work under this License, and how to view a copy of this License. If
109
- the interface presents a list of user commands or options, such as a
110
- menu, a prominent item in the list meets this criterion.
111
-
112
- 1. Source Code.
113
-
114
- The "source code" for a work means the preferred form of the work
115
- for making modifications to it. "Object code" means any non-source
116
- form of a work.
117
-
118
- A "Standard Interface" means an interface that either is an official
119
- standard defined by a recognized standards body, or, in the case of
120
- interfaces specified for a particular programming language, one that
121
- is widely used among developers working in that language.
122
-
123
- The "System Libraries" of an executable work include anything, other
124
- than the work as a whole, that (a) is included in the normal form of
125
- packaging a Major Component, but which is not part of that Major
126
- Component, and (b) serves only to enable use of the work with that
127
- Major Component, or to implement a Standard Interface for which an
128
- implementation is available to the public in source code form. A
129
- "Major Component", in this context, means a major essential component
130
- (kernel, window system, and so on) of the specific operating system
131
- (if any) on which the executable work runs, or a compiler used to
132
- produce the work, or an object code interpreter used to run it.
133
-
134
- The "Corresponding Source" for a work in object code form means all
135
- the source code needed to generate, install, and (for an executable
136
- work) run the object code and to modify the work, including scripts to
137
- control those activities. However, it does not include the work's
138
- System Libraries, or general-purpose tools or generally available free
139
- programs which are used unmodified in performing those activities but
140
- which are not part of the work. For example, Corresponding Source
141
- includes interface definition files associated with source files for
142
- the work, and the source code for shared libraries and dynamically
143
- linked subprograms that the work is specifically designed to require,
144
- such as by intimate data communication or control flow between those
145
- subprograms and other parts of the work.
146
-
147
- The Corresponding Source need not include anything that users
148
- can regenerate automatically from other parts of the Corresponding
149
- Source.
150
-
151
- The Corresponding Source for a work in source code form is that
152
- same work.
153
-
154
- 2. Basic Permissions.
155
-
156
- All rights granted under this License are granted for the term of
157
- copyright on the Program, and are irrevocable provided the stated
158
- conditions are met. This License explicitly affirms your unlimited
159
- permission to run the unmodified Program. The output from running a
160
- covered work is covered by this License only if the output, given its
161
- content, constitutes a covered work. This License acknowledges your
162
- rights of fair use or other equivalent, as provided by copyright law.
163
-
164
- You may make, run and propagate covered works that you do not
165
- convey, without conditions so long as your license otherwise remains
166
- in force. You may convey covered works to others for the sole purpose
167
- of having them make modifications exclusively for you, or provide you
168
- with facilities for running those works, provided that you comply with
169
- the terms of this License in conveying all material for which you do
170
- not control copyright. Those thus making or running the covered works
171
- for you must do so exclusively on your behalf, under your direction
172
- and control, on terms that prohibit them from making any copies of
173
- your copyrighted material outside their relationship with you.
174
-
175
- Conveying under any other circumstances is permitted solely under
176
- the conditions stated below. Sublicensing is not allowed; section 10
177
- makes it unnecessary.
178
-
179
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
-
181
- No covered work shall be deemed part of an effective technological
182
- measure under any applicable law fulfilling obligations under article
183
- 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
- similar laws prohibiting or restricting circumvention of such
185
- measures.
186
-
187
- When you convey a covered work, you waive any legal power to forbid
188
- circumvention of technological measures to the extent such circumvention
189
- is effected by exercising rights under this License with respect to
190
- the covered work, and you disclaim any intention to limit operation or
191
- modification of the work as a means of enforcing, against the work's
192
- users, your or third parties' legal rights to forbid circumvention of
193
- technological measures.
194
-
195
- 4. Conveying Verbatim Copies.
196
-
197
- You may convey verbatim copies of the Program's source code as you
198
- receive it, in any medium, provided that you conspicuously and
199
- appropriately publish on each copy an appropriate copyright notice;
200
- keep intact all notices stating that this License and any
201
- non-permissive terms added in accord with section 7 apply to the code;
202
- keep intact all notices of the absence of any warranty; and give all
203
- recipients a copy of this License along with the Program.
204
-
205
- You may charge any price or no price for each copy that you convey,
206
- and you may offer support or warranty protection for a fee.
207
-
208
- 5. Conveying Modified Source Versions.
209
-
210
- You may convey a work based on the Program, or the modifications to
211
- produce it from the Program, in the form of source code under the
212
- terms of section 4, provided that you also meet all of these conditions:
213
-
214
- a) The work must carry prominent notices stating that you modified
215
- it, and giving a relevant date.
216
-
217
- b) The work must carry prominent notices stating that it is
218
- released under this License and any conditions added under section
219
- 7. This requirement modifies the requirement in section 4 to
220
- "keep intact all notices".
221
-
222
- c) You must license the entire work, as a whole, under this
223
- License to anyone who comes into possession of a copy. This
224
- License will therefore apply, along with any applicable section 7
225
- additional terms, to the whole of the work, and all its parts,
226
- regardless of how they are packaged. This License gives no
227
- permission to license the work in any other way, but it does not
228
- invalidate such permission if you have separately received it.
229
-
230
- d) If the work has interactive user interfaces, each must display
231
- Appropriate Legal Notices; however, if the Program has interactive
232
- interfaces that do not display Appropriate Legal Notices, your
233
- work need not make them do so.
234
-
235
- A compilation of a covered work with other separate and independent
236
- works, which are not by their nature extensions of the covered work,
237
- and which are not combined with it such as to form a larger program,
238
- in or on a volume of a storage or distribution medium, is called an
239
- "aggregate" if the compilation and its resulting copyright are not
240
- used to limit the access or legal rights of the compilation's users
241
- beyond what the individual works permit. Inclusion of a covered work
242
- in an aggregate does not cause this License to apply to the other
243
- parts of the aggregate.
244
-
245
- 6. Conveying Non-Source Forms.
246
-
247
- You may convey a covered work in object code form under the terms
248
- of sections 4 and 5, provided that you also convey the
249
- machine-readable Corresponding Source under the terms of this License,
250
- in one of these ways:
251
-
252
- a) Convey the object code in, or embodied in, a physical product
253
- (including a physical distribution medium), accompanied by the
254
- Corresponding Source fixed on a durable physical medium
255
- customarily used for software interchange.
256
-
257
- b) Convey the object code in, or embodied in, a physical product
258
- (including a physical distribution medium), accompanied by a
259
- written offer, valid for at least three years and valid for as
260
- long as you offer spare parts or customer support for that product
261
- model, to give anyone who possesses the object code either (1) a
262
- copy of the Corresponding Source for all the software in the
263
- product that is covered by this License, on a durable physical
264
- medium customarily used for software interchange, for a price no
265
- more than your reasonable cost of physically performing this
266
- conveying of source, or (2) access to copy the
267
- Corresponding Source from a network server at no charge.
268
-
269
- c) Convey individual copies of the object code with a copy of the
270
- written offer to provide the Corresponding Source. This
271
- alternative is allowed only occasionally and noncommercially, and
272
- only if you received the object code with such an offer, in accord
273
- with subsection 6b.
274
-
275
- d) Convey the object code by offering access from a designated
276
- place (gratis or for a charge), and offer equivalent access to the
277
- Corresponding Source in the same way through the same place at no
278
- further charge. You need not require recipients to copy the
279
- Corresponding Source along with the object code. If the place to
280
- copy the object code is a network server, the Corresponding Source
281
- may be on a different server (operated by you or a third party)
282
- that supports equivalent copying facilities, provided you maintain
283
- clear directions next to the object code saying where to find the
284
- Corresponding Source. Regardless of what server hosts the
285
- Corresponding Source, you remain obligated to ensure that it is
286
- available for as long as needed to satisfy these requirements.
287
-
288
- e) Convey the object code using peer-to-peer transmission, provided
289
- you inform other peers where the object code and Corresponding
290
- Source of the work are being offered to the general public at no
291
- charge under subsection 6d.
292
-
293
- A separable portion of the object code, whose source code is excluded
294
- from the Corresponding Source as a System Library, need not be
295
- included in conveying the object code work.
296
-
297
- A "User Product" is either (1) a "consumer product", which means any
298
- tangible personal property which is normally used for personal, family,
299
- or household purposes, or (2) anything designed or sold for incorporation
300
- into a dwelling. In determining whether a product is a consumer product,
301
- doubtful cases shall be resolved in favor of coverage. For a particular
302
- product received by a particular user, "normally used" refers to a
303
- typical or common use of that class of product, regardless of the status
304
- of the particular user or of the way in which the particular user
305
- actually uses, or expects or is expected to use, the product. A product
306
- is a consumer product regardless of whether the product has substantial
307
- commercial, industrial or non-consumer uses, unless such uses represent
308
- the only significant mode of use of the product.
309
-
310
- "Installation Information" for a User Product means any methods,
311
- procedures, authorization keys, or other information required to install
312
- and execute modified versions of a covered work in that User Product from
313
- a modified version of its Corresponding Source. The information must
314
- suffice to ensure that the continued functioning of the modified object
315
- code is in no case prevented or interfered with solely because
316
- modification has been made.
317
-
318
- If you convey an object code work under this section in, or with, or
319
- specifically for use in, a User Product, and the conveying occurs as
320
- part of a transaction in which the right of possession and use of the
321
- User Product is transferred to the recipient in perpetuity or for a
322
- fixed term (regardless of how the transaction is characterized), the
323
- Corresponding Source conveyed under this section must be accompanied
324
- by the Installation Information. But this requirement does not apply
325
- if neither you nor any third party retains the ability to install
326
- modified object code on the User Product (for example, the work has
327
- been installed in ROM).
328
-
329
- The requirement to provide Installation Information does not include a
330
- requirement to continue to provide support service, warranty, or updates
331
- for a work that has been modified or installed by the recipient, or for
332
- the User Product in which it has been modified or installed. Access to a
333
- network may be denied when the modification itself materially and
334
- adversely affects the operation of the network or violates the rules and
335
- protocols for communication across the network.
336
-
337
- Corresponding Source conveyed, and Installation Information provided,
338
- in accord with this section must be in a format that is publicly
339
- documented (and with an implementation available to the public in
340
- source code form), and must require no special password or key for
341
- unpacking, reading or copying.
342
-
343
- 7. Additional Terms.
344
-
345
- "Additional permissions" are terms that supplement the terms of this
346
- License by making exceptions from one or more of its conditions.
347
- Additional permissions that are applicable to the entire Program shall
348
- be treated as though they were included in this License, to the extent
349
- that they are valid under applicable law. If additional permissions
350
- apply only to part of the Program, that part may be used separately
351
- under those permissions, but the entire Program remains governed by
352
- this License without regard to the additional permissions.
353
-
354
- When you convey a copy of a covered work, you may at your option
355
- remove any additional permissions from that copy, or from any part of
356
- it. (Additional permissions may be written to require their own
357
- removal in certain cases when you modify the work.) You may place
358
- additional permissions on material, added by you to a covered work,
359
- for which you have or can give appropriate copyright permission.
360
-
361
- Notwithstanding any other provision of this License, for material you
362
- add to a covered work, you may (if authorized by the copyright holders of
363
- that material) supplement the terms of this License with terms:
364
-
365
- a) Disclaiming warranty or limiting liability differently from the
366
- terms of sections 15 and 16 of this License; or
367
-
368
- b) Requiring preservation of specified reasonable legal notices or
369
- author attributions in that material or in the Appropriate Legal
370
- Notices displayed by works containing it; or
371
-
372
- c) Prohibiting misrepresentation of the origin of that material, or
373
- requiring that modified versions of such material be marked in
374
- reasonable ways as different from the original version; or
375
-
376
- d) Limiting the use for publicity purposes of names of licensors or
377
- authors of the material; or
378
-
379
- e) Declining to grant rights under trademark law for use of some
380
- trade names, trademarks, or service marks; or
381
-
382
- f) Requiring indemnification of licensors and authors of that
383
- material by anyone who conveys the material (or modified versions of
384
- it) with contractual assumptions of liability to the recipient, for
385
- any liability that these contractual assumptions directly impose on
386
- those licensors and authors.
387
-
388
- All other non-permissive additional terms are considered "further
389
- restrictions" within the meaning of section 10. If the Program as you
390
- received it, or any part of it, contains a notice stating that it is
391
- governed by this License along with a term that is a further
392
- restriction, you may remove that term. If a license document contains
393
- a further restriction but permits relicensing or conveying under this
394
- License, you may add to a covered work material governed by the terms
395
- of that license document, provided that the further restriction does
396
- not survive such relicensing or conveying.
397
-
398
- If you add terms to a covered work in accord with this section, you
399
- must place, in the relevant source files, a statement of the
400
- additional terms that apply to those files, or a notice indicating
401
- where to find the applicable terms.
402
-
403
- Additional terms, permissive or non-permissive, may be stated in the
404
- form of a separately written license, or stated as exceptions;
405
- the above requirements apply either way.
406
-
407
- 8. Termination.
408
-
409
- You may not propagate or modify a covered work except as expressly
410
- provided under this License. Any attempt otherwise to propagate or
411
- modify it is void, and will automatically terminate your rights under
412
- this License (including any patent licenses granted under the third
413
- paragraph of section 11).
414
-
415
- However, if you cease all violation of this License, then your
416
- license from a particular copyright holder is reinstated (a)
417
- provisionally, unless and until the copyright holder explicitly and
418
- finally terminates your license, and (b) permanently, if the copyright
419
- holder fails to notify you of the violation by some reasonable means
420
- prior to 60 days after the cessation.
421
-
422
- Moreover, your license from a particular copyright holder is
423
- reinstated permanently if the copyright holder notifies you of the
424
- violation by some reasonable means, this is the first time you have
425
- received notice of violation of this License (for any work) from that
426
- copyright holder, and you cure the violation prior to 30 days after
427
- your receipt of the notice.
428
-
429
- Termination of your rights under this section does not terminate the
430
- licenses of parties who have received copies or rights from you under
431
- this License. If your rights have been terminated and not permanently
432
- reinstated, you do not qualify to receive new licenses for the same
433
- material under section 10.
434
-
435
- 9. Acceptance Not Required for Having Copies.
436
-
437
- You are not required to accept this License in order to receive or
438
- run a copy of the Program. Ancillary propagation of a covered work
439
- occurring solely as a consequence of using peer-to-peer transmission
440
- to receive a copy likewise does not require acceptance. However,
441
- nothing other than this License grants you permission to propagate or
442
- modify any covered work. These actions infringe copyright if you do
443
- not accept this License. Therefore, by modifying or propagating a
444
- covered work, you indicate your acceptance of this License to do so.
445
-
446
- 10. Automatic Licensing of Downstream Recipients.
447
-
448
- Each time you convey a covered work, the recipient automatically
449
- receives a license from the original licensors, to run, modify and
450
- propagate that work, subject to this License. You are not responsible
451
- for enforcing compliance by third parties with this License.
452
-
453
- An "entity transaction" is a transaction transferring control of an
454
- organization, or substantially all assets of one, or subdividing an
455
- organization, or merging organizations. If propagation of a covered
456
- work results from an entity transaction, each party to that
457
- transaction who receives a copy of the work also receives whatever
458
- licenses to the work the party's predecessor in interest had or could
459
- give under the previous paragraph, plus a right to possession of the
460
- Corresponding Source of the work from the predecessor in interest, if
461
- the predecessor has it or can get it with reasonable efforts.
462
-
463
- You may not impose any further restrictions on the exercise of the
464
- rights granted or affirmed under this License. For example, you may
465
- not impose a license fee, royalty, or other charge for exercise of
466
- rights granted under this License, and you may not initiate litigation
467
- (including a cross-claim or counterclaim in a lawsuit) alleging that
468
- any patent claim is infringed by making, using, selling, offering for
469
- sale, or importing the Program or any portion of it.
470
-
471
- 11. Patents.
472
-
473
- A "contributor" is a copyright holder who authorizes use under this
474
- License of the Program or a work on which the Program is based. The
475
- work thus licensed is called the contributor's "contributor version".
476
-
477
- A contributor's "essential patent claims" are all patent claims
478
- owned or controlled by the contributor, whether already acquired or
479
- hereafter acquired, that would be infringed by some manner, permitted
480
- by this License, of making, using, or selling its contributor version,
481
- but do not include claims that would be infringed only as a
482
- consequence of further modification of the contributor version. For
483
- purposes of this definition, "control" includes the right to grant
484
- patent sublicenses in a manner consistent with the requirements of
485
- this License.
486
-
487
- Each contributor grants you a non-exclusive, worldwide, royalty-free
488
- patent license under the contributor's essential patent claims, to
489
- make, use, sell, offer for sale, import and otherwise run, modify and
490
- propagate the contents of its contributor version.
491
-
492
- In the following three paragraphs, a "patent license" is any express
493
- agreement or commitment, however denominated, not to enforce a patent
494
- (such as an express permission to practice a patent or covenant not to
495
- sue for patent infringement). To "grant" such a patent license to a
496
- party means to make such an agreement or commitment not to enforce a
497
- patent against the party.
498
-
499
- If you convey a covered work, knowingly relying on a patent license,
500
- and the Corresponding Source of the work is not available for anyone
501
- to copy, free of charge and under the terms of this License, through a
502
- publicly available network server or other readily accessible means,
503
- then you must either (1) cause the Corresponding Source to be so
504
- available, or (2) arrange to deprive yourself of the benefit of the
505
- patent license for this particular work, or (3) arrange, in a manner
506
- consistent with the requirements of this License, to extend the patent
507
- license to downstream recipients. "Knowingly relying" means you have
508
- actual knowledge that, but for the patent license, your conveying the
509
- covered work in a country, or your recipient's use of the covered work
510
- in a country, would infringe one or more identifiable patents in that
511
- country that you have reason to believe are valid.
512
-
513
- If, pursuant to or in connection with a single transaction or
514
- arrangement, you convey, or propagate by procuring conveyance of, a
515
- covered work, and grant a patent license to some of the parties
516
- receiving the covered work authorizing them to use, propagate, modify
517
- or convey a specific copy of the covered work, then the patent license
518
- you grant is automatically extended to all recipients of the covered
519
- work and works based on it.
520
-
521
- A patent license is "discriminatory" if it does not include within
522
- the scope of its coverage, prohibits the exercise of, or is
523
- conditioned on the non-exercise of one or more of the rights that are
524
- specifically granted under this License. You may not convey a covered
525
- work if you are a party to an arrangement with a third party that is
526
- in the business of distributing software, under which you make payment
527
- to the third party based on the extent of your activity of conveying
528
- the work, and under which the third party grants, to any of the
529
- parties who would receive the covered work from you, a discriminatory
530
- patent license (a) in connection with copies of the covered work
531
- conveyed by you (or copies made from those copies), or (b) primarily
532
- for and in connection with specific products or compilations that
533
- contain the covered work, unless you entered into that arrangement,
534
- or that patent license was granted, prior to 28 March 2007.
535
-
536
- Nothing in this License shall be construed as excluding or limiting
537
- any implied license or other defenses to infringement that may
538
- otherwise be available to you under applicable patent law.
539
-
540
- 12. No Surrender of Others' Freedom.
541
-
542
- If conditions are imposed on you (whether by court order, agreement or
543
- otherwise) that contradict the conditions of this License, they do not
544
- excuse you from the conditions of this License. If you cannot convey a
545
- covered work so as to satisfy simultaneously your obligations under this
546
- License and any other pertinent obligations, then as a consequence you may
547
- not convey it at all. For example, if you agree to terms that obligate you
548
- to collect a royalty for further conveying from those to whom you convey
549
- the Program, the only way you could satisfy both those terms and this
550
- License would be to refrain entirely from conveying the Program.
551
-
552
- 13. Use with the GNU Affero General Public License.
553
-
554
- Notwithstanding any other provision of this License, you have
555
- permission to link or combine any covered work with a work licensed
556
- under version 3 of the GNU Affero General Public License into a single
557
- combined work, and to convey the resulting work. The terms of this
558
- License will continue to apply to the part which is the covered work,
559
- but the special requirements of the GNU Affero General Public License,
560
- section 13, concerning interaction through a network will apply to the
561
- combination as such.
562
-
563
- 14. Revised Versions of this License.
564
-
565
- The Free Software Foundation may publish revised and/or new versions of
566
- the GNU General Public License from time to time. Such new versions will
567
- be similar in spirit to the present version, but may differ in detail to
568
- address new problems or concerns.
569
-
570
- Each version is given a distinguishing version number. If the
571
- Program specifies that a certain numbered version of the GNU General
572
- Public License "or any later version" applies to it, you have the
573
- option of following the terms and conditions either of that numbered
574
- version or of any later version published by the Free Software
575
- Foundation. If the Program does not specify a version number of the
576
- GNU General Public License, you may choose any version ever published
577
- by the Free Software Foundation.
578
-
579
- If the Program specifies that a proxy can decide which future
580
- versions of the GNU General Public License can be used, that proxy's
581
- public statement of acceptance of a version permanently authorizes you
582
- to choose that version for the Program.
583
-
584
- Later license versions may give you additional or different
585
- permissions. However, no additional obligations are imposed on any
586
- author or copyright holder as a result of your choosing to follow a
587
- later version.
588
-
589
- 15. Disclaimer of Warranty.
590
-
591
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
- OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
- PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
- IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
- ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
-
600
- 16. Limitation of Liability.
601
-
602
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
- THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
- GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
- USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
- PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
- EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
- SUCH DAMAGES.
611
-
612
- 17. Interpretation of Sections 15 and 16.
613
-
614
- If the disclaimer of warranty and limitation of liability provided
615
- above cannot be given local legal effect according to their terms,
616
- reviewing courts shall apply local law that most closely approximates
617
- an absolute waiver of all civil liability in connection with the
618
- Program, unless a warranty or assumption of liability accompanies a
619
- copy of the Program in return for a fee.
620
-
621
- END OF TERMS AND CONDITIONS
622
-
623
- How to Apply These Terms to Your New Programs
624
-
625
- If you develop a new program, and you want it to be of the greatest
626
- possible use to the public, the best way to achieve this is to make it
627
- free software which everyone can redistribute and change under these terms.
628
-
629
- To do so, attach the following notices to the program. It is safest
630
- to attach them to the start of each source file to most effectively
631
- state the exclusion of warranty; and each file should have at least
632
- the "copyright" line and a pointer to where the full notice is found.
633
-
634
- <one line to give the program's name and a brief idea of what it does.>
635
- Copyright (C) <year> <name of author>
636
-
637
- This program is free software: you can redistribute it and/or modify
638
- it under the terms of the GNU General Public License as published by
639
- the Free Software Foundation, either version 3 of the License, or
640
- (at your option) any later version.
641
-
642
- This program is distributed in the hope that it will be useful,
643
- but WITHOUT ANY WARRANTY; without even the implied warranty of
644
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
- GNU General Public License for more details.
646
-
647
- You should have received a copy of the GNU General Public License
648
- along with this program. If not, see <https://www.gnu.org/licenses/>.
649
-
650
- Also add information on how to contact you by electronic and paper mail.
651
-
652
- If the program does terminal interaction, make it output a short
653
- notice like this when it starts in an interactive mode:
654
-
655
- <program> Copyright (C) <year> <name of author>
656
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
- This is free software, and you are welcome to redistribute it
658
- under certain conditions; type `show c' for details.
659
-
660
- The hypothetical commands `show w' and `show c' should show the appropriate
661
- parts of the General Public License. Of course, your program's commands
662
- might be different; for a GUI interface, you would use an "about box".
663
-
664
- You should also get your employer (if you work as a programmer) or school,
665
- if any, to sign a "copyright disclaimer" for the program, if necessary.
666
- For more information on this, and how to apply and follow the GNU GPL, see
667
- <https://www.gnu.org/licenses/>.
668
-
669
- The GNU General Public License does not permit incorporating your program
670
- into proprietary programs. If your program is a subroutine library, you
671
- may consider it more useful to permit linking proprietary applications with
672
- the library. If this is what you want to do, use the GNU Lesser General
673
- Public License instead of this License. But first, please read
674
- <https://www.gnu.org/licenses/why-not-lgpl.html>.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
east_text_detection/README.md DELETED
@@ -1,67 +0,0 @@
1
- # EAST Text Detection
2
-
3
- Scene-text detection with the EAST (Efficient and Accurate Scene Text) detector.
4
- The model was originally distributed as a frozen TensorFlow graph
5
- (`frozen_east_text_detection.pb`) and converted to ONNX for use with OpenCV's DNN module.
6
-
7
- ## Model Details
8
- - **Architecture**: EAST with a ResNet-50 backbone and a feature-fusion head
9
- - **Input**: RGB image, 320×320, raw 0–255 float, mean `(123.68, 116.78, 103.94)`, swapRB,
10
- NCHW layout (`input_images:0`, shape `[1, 3, 320, 320]`)
11
- - **Outputs**:
12
- - `feature_fusion/Conv_7/Sigmoid:0` — score map, shape `[1, 1, 80, 80]`
13
- - `feature_fusion/concat_3:0` — RBOX geometry, shape `[1, 5, 80, 80]`
14
- - **Post-processing**: OpenCV's `TextDetectionModel_EAST` decodes the score/geometry maps
15
- into rotated boxes (confidence threshold + rotated-NMS)
16
- - **Framework**: ONNX (converted from the TensorFlow frozen graph via tf2onnx, opset 15)
17
- - **Original weights**: https://github.com/argman/EAST
18
-
19
- Both input and outputs are emitted in NCHW so OpenCV consumes them directly.
20
-
21
- ## Usage
22
-
23
- ### Python
24
- ```bash
25
- python demo.py --model east_text_detection_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png
26
- ```
27
-
28
- Or import directly:
29
- ```python
30
- import cv2
31
-
32
- model = cv2.dnn.TextDetectionModel_EAST("east_text_detection_2026jul.onnx")
33
- # see demo.py for the full inference pipeline
34
- ```
35
-
36
- ### C++
37
- The C++ demo runs inference with OpenCV's DNN module (default engine — no ONNX Runtime
38
- needed). Adjust the OpenCV paths to your setup:
39
- ```bash
40
- OCV=/path/to/opencv # OpenCV source tree
41
- OCVBUILD=/path/to/opencv/build # OpenCV build directory (generated headers + libs)
42
- g++ -std=c++17 demo.cpp -o demo \
43
- -I$OCV/include \
44
- -I$OCV/modules/core/include \
45
- -I$OCV/modules/dnn/include \
46
- -I$OCV/modules/imgproc/include \
47
- -I$OCV/modules/imgcodecs/include \
48
- -I$OCVBUILD \
49
- -L$OCVBUILD/lib -Wl,-rpath,$OCVBUILD/lib -lopencv_dnn -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
50
- ./demo --model east_text_detection_2026jul.onnx --image example_outputs/input_image.png
51
- ```
52
-
53
- ## Conversion
54
- The ONNX model was exported from the frozen TensorFlow graph with tf2onnx (opset 15)
55
- via [convert_to_onnx.py](./convert_to_onnx.py) — input `input_images:0`, outputs
56
- `feature_fusion/Conv_7/Sigmoid:0` and `feature_fusion/concat_3:0`. Both the input and the
57
- outputs are forced to NCHW (`inputs_as_nchw` / `outputs_as_nchw`) so the tensors match
58
- OpenCV's layout; without `outputs_as_nchw` the score/geometry maps come out as NHWC and the
59
- EAST decoder rejects them. Requires `tensorflow`, `tf2onnx`, and `onnx`.
60
-
61
- ```bash
62
- python convert_to_onnx.py --pb ../pb/frozen_east_text_detection.pb
63
- ```
64
-
65
- ## License
66
- See [LICENSE](./LICENSE) — the model originates from [argman/EAST](https://github.com/argman/EAST),
67
- released under the GNU General Public License v3.0.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
east_text_detection/convert_to_onnx.py DELETED
@@ -1,44 +0,0 @@
1
- import argparse
2
- import datetime
3
-
4
- import onnx
5
- import tensorflow as tf
6
- import tf2onnx
7
-
8
-
9
- def load_graph_def(pb_path):
10
- with tf.io.gfile.GFile(pb_path, "rb") as f:
11
- graph_def = tf.compat.v1.GraphDef()
12
- graph_def.ParseFromString(f.read())
13
- return graph_def
14
-
15
-
16
- def main():
17
- parser = argparse.ArgumentParser(description="Export frozen_east_text_detection.pb to ONNX")
18
- parser.add_argument("--pb", default="../pb/frozen_east_text_detection.pb")
19
- parser.add_argument("--opset", type=int, default=15)
20
- args = parser.parse_args()
21
-
22
- graph_def = load_graph_def(args.pb)
23
-
24
- outputs = ["feature_fusion/Conv_7/Sigmoid:0", "feature_fusion/concat_3:0"]
25
- model_proto, _ = tf2onnx.convert.from_graph_def(
26
- graph_def,
27
- input_names=["input_images:0"],
28
- output_names=outputs,
29
- inputs_as_nchw=["input_images:0"],
30
- outputs_as_nchw=outputs,
31
- opset=args.opset,
32
- shape_override={"input_images:0": [1, 320, 320, 3]},
33
- )
34
- onnx.checker.check_model(model_proto)
35
-
36
- stamp = datetime.datetime.now().strftime("%Y%b").lower()
37
- onnx_path = "east_text_detection_%s.onnx" % stamp
38
- with open(onnx_path, "wb") as f:
39
- f.write(model_proto.SerializeToString())
40
- print("wrote", onnx_path)
41
-
42
-
43
- if __name__ == "__main__":
44
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
east_text_detection/demo.cpp DELETED
@@ -1,49 +0,0 @@
1
- #include <opencv2/dnn.hpp>
2
- #include <opencv2/imgproc.hpp>
3
- #include <opencv2/imgcodecs.hpp>
4
- #include <iostream>
5
- #include <string>
6
- #include <vector>
7
-
8
- static std::string argVal(int argc, char** argv, const std::string& key, const std::string& def)
9
- {
10
- for (int i = 1; i + 1 < argc; ++i)
11
- if (key == argv[i]) return argv[i + 1];
12
- return def;
13
- }
14
-
15
- int main(int argc, char** argv)
16
- {
17
- std::string model = argVal(argc, argv, "--model", "east_text_detection_2026jul.onnx");
18
- std::string image = argVal(argc, argv, "--image", "example_outputs/input_image.png");
19
- std::string output = argVal(argc, argv, "--output", "example_outputs/output_image.png");
20
-
21
- cv::Mat img = cv::imread(image);
22
- if (img.empty())
23
- {
24
- std::cerr << "could not read image: " << image << std::endl;
25
- return 1;
26
- }
27
-
28
- cv::dnn::TextDetectionModel_EAST east(model);
29
- east.setConfidenceThreshold(0.5f).setNMSThreshold(0.4f);
30
- east.setInputParams(1.0, cv::Size(320, 320), cv::Scalar(123.68, 116.78, 103.94), true, false);
31
-
32
- std::vector<cv::RotatedRect> boxes;
33
- east.detectTextRectangles(img, boxes);
34
- std::cout << "detections " << boxes.size() << std::endl;
35
-
36
- cv::Mat out = img.clone();
37
- for (const cv::RotatedRect& box : boxes)
38
- {
39
- cv::Mat pts;
40
- cv::boxPoints(box, pts);
41
- std::vector<cv::Point> poly(4);
42
- for (int i = 0; i < 4; ++i)
43
- poly[i] = cv::Point(cvRound(pts.at<float>(i, 0)), cvRound(pts.at<float>(i, 1)));
44
- cv::polylines(out, poly, true, cv::Scalar(0, 255, 0), 2);
45
- }
46
- cv::imwrite(output, out);
47
- std::cout << "wrote " << output << std::endl;
48
- return 0;
49
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
east_text_detection/demo.py DELETED
@@ -1,39 +0,0 @@
1
- import argparse
2
- import os
3
-
4
- import cv2 as cv
5
- import numpy as np
6
-
7
- here = os.path.dirname(os.path.abspath(__file__))
8
-
9
-
10
- def main():
11
- parser = argparse.ArgumentParser(description="EAST scene-text detection (ONNX) demo")
12
- parser.add_argument("--model", default=os.path.join(here, "east_text_detection_2026jul.onnx"))
13
- parser.add_argument("--image", default=os.path.join(here, "example_outputs", "input_image.png"))
14
- parser.add_argument("--output", default=os.path.join(here, "example_outputs", "output_image.png"))
15
- parser.add_argument("--conf", type=float, default=0.5, help="confidence threshold")
16
- parser.add_argument("--nms", type=float, default=0.4, help="NMS threshold")
17
- args = parser.parse_args()
18
-
19
- img = cv.imread(args.image)
20
- if img is None:
21
- raise SystemExit("could not read image: %s" % args.image)
22
-
23
- model = cv.dnn.TextDetectionModel_EAST(args.model)
24
- model.setConfidenceThreshold(args.conf).setNMSThreshold(args.nms)
25
- model.setInputParams(1.0, (320, 320), (123.68, 116.78, 103.94), True, False)
26
-
27
- boxes, confidences = model.detectTextRectangles(img)
28
- print("detections", len(boxes))
29
-
30
- out = img.copy()
31
- for box in boxes:
32
- pts = cv.boxPoints(box).astype(np.int32)
33
- cv.polylines(out, [pts], True, (0, 255, 0), 2)
34
- cv.imwrite(args.output, out)
35
- print("wrote", args.output)
36
-
37
-
38
- if __name__ == "__main__":
39
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
east_text_detection/east_text_detection_2026jul.onnx DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:63f96881e90b81f3f0e7fd79dc705ead31276da70d3c7dca008ca28d3554883a
3
- size 96217443
 
 
 
 
east_text_detection/example_outputs/input_image.png DELETED

Git LFS Details

  • SHA256: 6106d611b5b287f756e82f783d7490df243f0dcade7bef9a29a326c2c973d1e9
  • Pointer size: 131 Bytes
  • Size of remote file: 905 kB
east_text_detection/example_outputs/output_image.png DELETED

Git LFS Details

  • SHA256: d7a50b512308b9d0d1aa7618ce253fe1b73a1ed38a27fa6d7c0a99fd6bb26dd3
  • Pointer size: 131 Bytes
  • Size of remote file: 905 kB
efficientdet-d0/LICENSE DELETED
@@ -1,203 +0,0 @@
1
- Copyright 2020 Google Research. 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 2020, Google Research.
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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efficientdet-d0/README.md DELETED
@@ -1,62 +0,0 @@
1
- # EfficientDet-D0
2
-
3
- Object detection with EfficientDet-D0 trained on COCO. The model was originally
4
- distributed as a frozen TensorFlow graph (`efficientdet-d0.pb`) and converted to
5
- ONNX for use with OpenCV's DNN module. This is a **backbone-only** export: the
6
- graph emits raw class logits and box regressions, while anchor generation, sigmoid,
7
- box decoding and non-maximum suppression are performed in host code (see the demos).
8
-
9
- ## Model Details
10
- - **Architecture**: EfficientDet-D0
11
- - **Input**: RGB image, 512×512, raw uint8, NHWC layout (`image_arrays:0`, shape `[1, 512, 512, 3]`)
12
- - **Output**: raw class logits (`concat:0`, shape `[1, 49104, 90]`) and box regression (`concat_1:0`, shape `[1, 49104, 4]`); anchor decode + NMS are done in host code, not in the graph
13
- - **Framework**: ONNX (converted from the TensorFlow frozen graph via tf2onnx, opset 18)
14
- - **Original weights**: https://www.dropbox.com/s/9mqp99fd2tpuqn6/efficientdet-d0.pb?dl=1
15
-
16
- The graph outputs are per-anchor predictions only. The demos build the 49104 anchors
17
- (5 pyramid levels × 9 anchors/cell), apply sigmoid to the logits, decode the box
18
- regressions relative to the anchors, threshold on confidence and run NMS (IoU 0.6).
19
-
20
- ## Usage
21
-
22
- ### Python
23
- ```bash
24
- python demo.py --model efficientdet-d0_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png --conf 0.4
25
- ```
26
-
27
- Or import directly:
28
- ```python
29
- import cv2
30
-
31
- net = cv2.dnn.readNet("efficientdet-d0_2026jul.onnx")
32
- # see demo.py for the full anchor decode + NMS pipeline
33
- ```
34
-
35
- ### C++
36
- The C++ demo runs inference with OpenCV's DNN module. Adjust the OpenCV paths to your setup:
37
- ```bash
38
- OCV=/path/to/opencv # OpenCV source tree
39
- OCVBUILD=/path/to/opencv/build # OpenCV build directory (generated headers + libs)
40
- g++ -std=c++17 demo.cpp -o demo \
41
- -I$OCV/include \
42
- -I$OCV/modules/core/include \
43
- -I$OCV/modules/dnn/include \
44
- -I$OCV/modules/imgproc/include \
45
- -I$OCV/modules/imgcodecs/include \
46
- -I$OCVBUILD \
47
- -L$OCVBUILD/lib -Wl,-rpath,$OCVBUILD/lib -lopencv_dnn -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
48
- ./demo --model efficientdet-d0_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png
49
- ```
50
-
51
- ## Conversion
52
- The ONNX model was exported from the frozen TensorFlow graph with tf2onnx (opset 18)
53
- via [convert_to_onnx.py](./convert_to_onnx.py) — input `image_arrays:0`, outputs
54
- `concat:0` and `concat_1:0`, input shape overridden to `[1, 512, 512, 3]`. Requires
55
- `tensorflow`, `tf2onnx`, and `onnx`.
56
-
57
- ```bash
58
- python convert_to_onnx.py --pb ../pb/efficientdet-d0.pb
59
- ```
60
-
61
- ## License
62
- See [LICENSE](./LICENSE) — released under the Apache License 2.0.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efficientdet-d0/convert_to_onnx.py DELETED
@@ -1,41 +0,0 @@
1
- import argparse
2
- import datetime
3
-
4
- import onnx
5
- import tensorflow as tf
6
- import tf2onnx
7
-
8
-
9
- def load_graph_def(pb_path):
10
- with tf.io.gfile.GFile(pb_path, "rb") as f:
11
- graph_def = tf.compat.v1.GraphDef()
12
- graph_def.ParseFromString(f.read())
13
- return graph_def
14
-
15
-
16
- def main():
17
- parser = argparse.ArgumentParser(description="Export efficientdet-d0.pb to ONNX")
18
- parser.add_argument("--pb", default="../pb/efficientdet-d0.pb")
19
- parser.add_argument("--opset", type=int, default=18)
20
- args = parser.parse_args()
21
-
22
- graph_def = load_graph_def(args.pb)
23
-
24
- model_proto, _ = tf2onnx.convert.from_graph_def(
25
- graph_def,
26
- input_names=["image_arrays:0"],
27
- output_names=["concat:0", "concat_1:0"],
28
- opset=args.opset,
29
- shape_override={"image_arrays:0": [1, 512, 512, 3]},
30
- )
31
- onnx.checker.check_model(model_proto)
32
-
33
- stamp = datetime.datetime.now().strftime("%Y%b").lower()
34
- onnx_path = "efficientdet-d0_%s.onnx" % stamp
35
- with open(onnx_path, "wb") as f:
36
- f.write(model_proto.SerializeToString())
37
- print("wrote", onnx_path)
38
-
39
-
40
- if __name__ == "__main__":
41
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efficientdet-d0/demo.cpp DELETED
@@ -1,127 +0,0 @@
1
- #include <opencv2/dnn.hpp>
2
- #include <opencv2/imgproc.hpp>
3
- #include <opencv2/imgcodecs.hpp>
4
- #include <algorithm>
5
- #include <array>
6
- #include <cmath>
7
- #include <iostream>
8
- #include <string>
9
- #include <vector>
10
-
11
- using namespace cv;
12
-
13
- static std::string argVal(int argc, char** argv, const std::string& key, const std::string& def)
14
- {
15
- for (int i = 1; i + 1 < argc; ++i)
16
- if (key == argv[i]) return argv[i + 1];
17
- return def;
18
- }
19
-
20
- struct Det { float x1, y1, x2, y2, score; int cid; };
21
-
22
- int main(int argc, char** argv)
23
- {
24
- std::string model = argVal(argc, argv, "--model", "efficientdet-d0_2026jul.onnx");
25
- std::string image = argVal(argc, argv, "--image", "example_outputs/input_image.png");
26
- std::string output = argVal(argc, argv, "--output", "example_outputs/output_image.png");
27
- float conf = std::stof(argVal(argc, argv, "--conf", "0.4"));
28
-
29
- const int sz = 512;
30
-
31
- Mat img = imread(image);
32
- if (img.empty()) { std::cerr << "could not read image: " << image << std::endl; return 1; }
33
-
34
- Mat rgb;
35
- cvtColor(img, rgb, COLOR_BGR2RGB);
36
- resize(rgb, rgb, Size(sz, sz));
37
- if (!rgb.isContinuous()) rgb = rgb.clone();
38
-
39
- int blobShape[] = {1, sz, sz, 3};
40
- Mat blob(4, blobShape, CV_8U, rgb.data);
41
- dnn::Net net = dnn::readNetFromONNX(model);
42
- net.setInput(blob);
43
- std::vector<Mat> outs;
44
- net.forward(outs, net.getUnconnectedOutLayersNames());
45
-
46
- const float* boxp = nullptr;
47
- const float* clsp = nullptr;
48
- int n = 0, nc = 0;
49
- for (size_t i = 0; i < outs.size(); ++i)
50
- {
51
- const Mat& o = outs[i];
52
- const float* p = (const float*)o.data;
53
- int last = o.size[o.dims - 1];
54
- if (last == 4) { boxp = p; n = o.size[o.dims - 2]; }
55
- else { clsp = p; nc = last; }
56
- }
57
-
58
- std::vector<std::array<float, 2>> baseWH;
59
- double asp[3][2] = {{1.0, 1.0}, {1.4, 0.7}, {0.7, 1.4}};
60
- for (int i = 0; i < 3; ++i) {
61
- double s = std::pow(2.0, i / 3.0);
62
- for (int a = 0; a < 3; ++a)
63
- baseWH.push_back({(float)(32.0 * s * asp[a][0]), (float)(32.0 * s * asp[a][1])});
64
- }
65
- std::vector<float> acx, acy, aw, ah;
66
- for (int lvl = 0; lvl < 5; ++lvl) {
67
- int f = sz / (8 << lvl);
68
- int step = 8 << lvl;
69
- int m = 1 << lvl;
70
- for (int y = 0; y < f; ++y)
71
- for (int x = 0; x < f; ++x) {
72
- float cx = (x + 0.5f) * step;
73
- float cy = (y + 0.5f) * step;
74
- for (auto& b : baseWH) {
75
- acx.push_back(cx); acy.push_back(cy);
76
- aw.push_back(b[0] * m); ah.push_back(b[1] * m);
77
- }
78
- }
79
- }
80
-
81
- std::vector<Det> dets;
82
- for (int a = 0; a < n; ++a) {
83
- const float* bp = boxp + (size_t)a * 4;
84
- float ycenter = bp[0] * ah[a] + acy[a];
85
- float xcenter = bp[1] * aw[a] + acx[a];
86
- float bhv = std::exp(bp[2]) * ah[a];
87
- float bwv = std::exp(bp[3]) * aw[a];
88
- const float* cp = clsp + (size_t)a * nc;
89
- int best = 0; float bestLogit = cp[0];
90
- for (int c = 1; c < nc; ++c) if (cp[c] > bestLogit) { bestLogit = cp[c]; best = c; }
91
- float score = 1.0f / (1.0f + std::exp(-bestLogit));
92
- if (score > conf)
93
- dets.push_back({(xcenter - bwv / 2) / sz, (ycenter - bhv / 2) / sz,
94
- (xcenter + bwv / 2) / sz, (ycenter + bhv / 2) / sz, score, best});
95
- }
96
-
97
- std::sort(dets.begin(), dets.end(), [](const Det& a, const Det& b) { return a.score > b.score; });
98
- std::vector<char> removed(dets.size(), 0);
99
- std::vector<int> pick;
100
- for (size_t i = 0; i < dets.size(); ++i) {
101
- if (removed[i]) continue;
102
- pick.push_back((int)i);
103
- for (size_t j = i + 1; j < dets.size(); ++j) {
104
- if (removed[j]) continue;
105
- float xx1 = std::max(dets[i].x1, dets[j].x1);
106
- float yy1 = std::max(dets[i].y1, dets[j].y1);
107
- float xx2 = std::min(dets[i].x2, dets[j].x2);
108
- float yy2 = std::min(dets[i].y2, dets[j].y2);
109
- float inter = std::max(0.0f, xx2 - xx1) * std::max(0.0f, yy2 - yy1);
110
- float ai = (dets[i].x2 - dets[i].x1) * (dets[i].y2 - dets[i].y1);
111
- float aj = (dets[j].x2 - dets[j].x1) * (dets[j].y2 - dets[j].y1);
112
- if (inter / (ai + aj - inter + 1e-9f) > 0.6f) removed[j] = 1;
113
- }
114
- }
115
-
116
- std::cout << "efficientdet-d0 " << pick.size() << " detections" << std::endl;
117
- int w = img.cols, h = img.rows;
118
- for (int idx : pick) {
119
- const Det& d = dets[idx];
120
- std::cout << format("%d %.3f %.3f %.3f %.3f %.3f", d.cid, d.score, d.x1, d.y1, d.x2, d.y2) << std::endl;
121
- rectangle(img, Point((int)(d.x1 * w), (int)(d.y1 * h)), Point((int)(d.x2 * w), (int)(d.y2 * h)), Scalar(0, 255, 0), 2);
122
- putText(img, format("%d:%.2f", d.cid, d.score), Point((int)(d.x1 * w), (int)(d.y1 * h) - 5), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);
123
- }
124
- imwrite(output, img);
125
- std::cout << "wrote " << output << std::endl;
126
- return 0;
127
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efficientdet-d0/demo.py DELETED
@@ -1,105 +0,0 @@
1
- import argparse
2
- import glob
3
- import os
4
-
5
- import cv2 as cv
6
- import numpy as np
7
-
8
- here = os.path.dirname(os.path.abspath(__file__))
9
- sz = 512
10
-
11
-
12
- def build_anchors():
13
- scales = [2.0 ** (i / 3.0) for i in range(3)]
14
- aspects = [(1.0, 1.0), (1.4, 0.7), (0.7, 1.4)]
15
- base = []
16
- for s in scales:
17
- for aw, ah in aspects:
18
- base.append((32.0 * s * aw, 32.0 * s * ah))
19
- anchors = []
20
- for lvl in range(5):
21
- f = sz // (8 * 2 ** lvl)
22
- step = 8 * 2 ** lvl
23
- m = 2 ** lvl
24
- for y in range(f):
25
- for x in range(f):
26
- cx = (x + 0.5) * step
27
- cy = (y + 0.5) * step
28
- for bw, bh in base:
29
- anchors.append((cx, cy, bw * m, bh * m))
30
- return np.array(anchors, np.float32)
31
-
32
-
33
- def main():
34
- parser = argparse.ArgumentParser(description="EfficientDet-D0 (ONNX) object detection demo")
35
- parser.add_argument("--model", default=None)
36
- parser.add_argument("--image", default=os.path.join(here, "example_outputs", "input_image.png"))
37
- parser.add_argument("--output", default=os.path.join(here, "example_outputs", "output_image.png"))
38
- parser.add_argument("--conf", type=float, default=0.4)
39
- args = parser.parse_args()
40
-
41
- model = args.model
42
- if model is None:
43
- found = glob.glob(os.path.join(here, "*.onnx"))
44
- if not found:
45
- raise SystemExit("no onnx, run convert_to_onnx.py")
46
- model = found[0]
47
-
48
- img = cv.imread(args.image)
49
- if img is None:
50
- raise SystemExit("could not read image: %s" % args.image)
51
-
52
- anchors = build_anchors()
53
- acx, acy, aw, ah = anchors[:, 0], anchors[:, 1], anchors[:, 2], anchors[:, 3]
54
-
55
- net = cv.dnn.readNetFromONNX(model)
56
- inp = cv.resize(cv.cvtColor(img, cv.COLOR_BGR2RGB), (sz, sz))
57
- net.setInput(inp[None].astype(np.uint8))
58
- res = net.forward(net.getUnconnectedOutLayersNames())
59
- box = next(a for a in res if a.shape[-1] == 4).reshape(-1, 4)
60
- cls = next(a for a in res if a.shape[-1] != 4).reshape(box.shape[0], -1)
61
-
62
- ycenter = box[:, 0] * ah + acy
63
- xcenter = box[:, 1] * aw + acx
64
- bh = np.exp(box[:, 2]) * ah
65
- bw = np.exp(box[:, 3]) * aw
66
- boxes = np.stack([xcenter - bw / 2, ycenter - bh / 2, xcenter + bw / 2, ycenter + bh / 2], 1) / sz
67
-
68
- prob = 1.0 / (1.0 + np.exp(-cls))
69
- cid = prob.argmax(1)
70
- scores = prob.max(1)
71
-
72
- keep = scores > args.conf
73
- boxes = boxes[keep]
74
- scores = scores[keep]
75
- cid = cid[keep]
76
- order = scores.argsort()[::-1]
77
- pick = []
78
- while order.size:
79
- i = order[0]
80
- pick.append(i)
81
- xx1 = np.maximum(boxes[i, 0], boxes[order[1:], 0])
82
- yy1 = np.maximum(boxes[i, 1], boxes[order[1:], 1])
83
- xx2 = np.minimum(boxes[i, 2], boxes[order[1:], 2])
84
- yy2 = np.minimum(boxes[i, 3], boxes[order[1:], 3])
85
- iw = np.maximum(0, xx2 - xx1)
86
- ih = np.maximum(0, yy2 - yy1)
87
- inter = iw * ih
88
- ai = (boxes[i, 2] - boxes[i, 0]) * (boxes[i, 3] - boxes[i, 1])
89
- aj = (boxes[order[1:], 2] - boxes[order[1:], 0]) * (boxes[order[1:], 3] - boxes[order[1:], 1])
90
- iou = inter / (ai + aj - inter + 1e-9)
91
- order = order[1:][iou <= 0.6]
92
-
93
- print("efficientdet-d0", len(pick), "detections")
94
- h, w = img.shape[:2]
95
- for i in pick:
96
- x1, y1, x2, y2 = boxes[i]
97
- print(int(cid[i]), round(float(scores[i]), 3), round(float(x1), 3), round(float(y1), 3), round(float(x2), 3), round(float(y2), 3))
98
- cv.rectangle(img, (int(x1 * w), int(y1 * h)), (int(x2 * w), int(y2 * h)), (0, 255, 0), 2)
99
- cv.putText(img, "%d:%.2f" % (int(cid[i]), scores[i]), (int(x1 * w), int(y1 * h) - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
100
- cv.imwrite(args.output, img)
101
- print("wrote", args.output)
102
-
103
-
104
- if __name__ == "__main__":
105
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
efficientdet-d0/efficientdet-d0_2026jul.onnx DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:db344f69adf1c529e08a36bbaa1779d98b4b81621a2f046656fb966bdfdc6298
3
- size 15671001
 
 
 
 
efficientdet-d0/example_outputs/input_image.png DELETED

Git LFS Details

  • SHA256: 61db162464c0770138c5136af0e999ce3b6556244cec257945427396480d9caf
  • Pointer size: 131 Bytes
  • Size of remote file: 414 kB
efficientdet-d0/example_outputs/output_image.png DELETED

Git LFS Details

  • SHA256: 6edda1b62da08b28f04a227bc0054152b76b4dcbc04a50f856e6912fd8ea9b3a
  • Pointer size: 131 Bytes
  • Size of remote file: 331 kB
faster_rcnn_inception_v2_coco_2018_01_28/LICENSE DELETED
@@ -1,203 +0,0 @@
1
- Copyright 2015 The TensorFlow Authors. 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 2015, The TensorFlow Authors.
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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_inception_v2_coco_2018_01_28/README.md DELETED
@@ -1,49 +0,0 @@
1
- # Faster-RCNN InceptionV2 (COCO)
2
-
3
- Object detection with the Faster-RCNN meta-architecture and an Inception v2 backbone,
4
- trained on the COCO dataset. The model was originally distributed as a frozen TensorFlow
5
- graph (`faster_rcnn_inception_v2_coco_2018_01_28.pb`) from the TensorFlow Object Detection
6
- API and converted to ONNX for inference with OpenCV's DNN module.
7
-
8
- ## Model Details
9
- - **Architecture**: Faster-RCNN with an Inception v2 backbone
10
- - **Input**: RGB image, uint8, NHWC layout (`image_tensor:0`, shape `[1, H, W, 3]`)
11
- - **Output**: `detection_boxes:0` (normalized `[ymin, xmin, ymax, xmax]`), `detection_scores:0`, `detection_classes:0` (1-based COCO ids), `num_detections:0`
12
- - **Framework**: ONNX (converted from the TensorFlow frozen graph via tf2onnx, opset 18)
13
- - **Original weights**: http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz
14
-
15
- ## Usage
16
-
17
- ### Python
18
- ```bash
19
- python demo.py --model faster_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png --conf 0.3
20
- ```
21
-
22
- ### C++
23
- The C++ demo runs inference with OpenCV's DNN module. Adjust the OpenCV paths to your setup:
24
- ```bash
25
- OCV=/path/to/opencv # OpenCV source tree
26
- OCVBUILD=/path/to/opencv/build # OpenCV build directory (generated headers + libs)
27
- g++ -std=c++17 demo.cpp -o demo \
28
- -I$OCV/include \
29
- -I$OCV/modules/core/include \
30
- -I$OCV/modules/dnn/include \
31
- -I$OCV/modules/imgproc/include \
32
- -I$OCV/modules/imgcodecs/include \
33
- -I$OCVBUILD \
34
- -L$OCVBUILD/lib -Wl,-rpath,$OCVBUILD/lib -lopencv_dnn -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
35
- ./demo --model faster_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png
36
- ```
37
-
38
- ## Conversion
39
- The ONNX model was exported from the frozen TensorFlow graph with tf2onnx (opset 18)
40
- via [convert_to_onnx.py](./convert_to_onnx.py) — input `image_tensor:0`, outputs
41
- `detection_boxes:0`, `detection_scores:0`, `detection_classes:0`, `num_detections:0`.
42
- Requires `tensorflow`, `tf2onnx`, and `onnx`.
43
-
44
- ```bash
45
- python convert_to_onnx.py --pb ../pb/faster_rcnn_inception_v2_coco_2018_01_28.pb
46
- ```
47
-
48
- ## License
49
- See [LICENSE](./LICENSE) — the model is released by the TensorFlow Authors under the Apache License 2.0.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_inception_v2_coco_2018_01_28/convert_to_onnx.py DELETED
@@ -1,40 +0,0 @@
1
- import argparse
2
- import datetime
3
-
4
- import onnx
5
- import tensorflow as tf
6
- import tf2onnx
7
-
8
-
9
- def load_graph_def(pb_path):
10
- with tf.io.gfile.GFile(pb_path, "rb") as f:
11
- graph_def = tf.compat.v1.GraphDef()
12
- graph_def.ParseFromString(f.read())
13
- return graph_def
14
-
15
-
16
- def main():
17
- parser = argparse.ArgumentParser(description="Export faster_rcnn_inception_v2_coco_2018_01_28.pb to ONNX")
18
- parser.add_argument("--pb", default="../pb/faster_rcnn_inception_v2_coco_2018_01_28.pb")
19
- parser.add_argument("--opset", type=int, default=18)
20
- args = parser.parse_args()
21
-
22
- graph_def = load_graph_def(args.pb)
23
-
24
- model_proto, _ = tf2onnx.convert.from_graph_def(
25
- graph_def,
26
- input_names=["image_tensor:0"],
27
- output_names=["detection_boxes:0", "detection_scores:0", "detection_classes:0", "num_detections:0"],
28
- opset=args.opset,
29
- )
30
- onnx.checker.check_model(model_proto)
31
-
32
- stamp = datetime.datetime.now().strftime("%Y%b").lower()
33
- onnx_path = "faster_rcnn_inception_v2_coco_2018_01_28_%s.onnx" % stamp
34
- with open(onnx_path, "wb") as f:
35
- f.write(model_proto.SerializeToString())
36
- print("wrote", onnx_path)
37
-
38
-
39
- if __name__ == "__main__":
40
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_inception_v2_coco_2018_01_28/demo.cpp DELETED
@@ -1,83 +0,0 @@
1
- #include <opencv2/dnn.hpp>
2
- #include <opencv2/imgproc.hpp>
3
- #include <opencv2/imgcodecs.hpp>
4
- #include <array>
5
- #include <cstdint>
6
- #include <iostream>
7
- #include <string>
8
- #include <vector>
9
-
10
- static std::string argVal(int argc, char** argv, const std::string& key, const std::string& def)
11
- {
12
- for (int i = 1; i + 1 < argc; ++i)
13
- if (key == argv[i]) return argv[i + 1];
14
- return def;
15
- }
16
-
17
- int main(int argc, char** argv)
18
- {
19
- std::string model = argVal(argc, argv, "--model", "faster_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx");
20
- std::string image = argVal(argc, argv, "--image", "example_outputs/input_image.png");
21
- std::string output = argVal(argc, argv, "--output", "example_outputs/output_image.png");
22
- float conf = std::stof(argVal(argc, argv, "--conf", "0.3"));
23
-
24
- cv::Mat img = cv::imread(image);
25
- if (img.empty())
26
- {
27
- std::cerr << "could not read image: " << image << std::endl;
28
- return 1;
29
- }
30
-
31
- const int W = 800, H = 600;
32
- cv::Mat rgb;
33
- cv::cvtColor(img, rgb, cv::COLOR_BGR2RGB);
34
- cv::resize(rgb, rgb, cv::Size(W, H));
35
- if (!rgb.isContinuous()) rgb = rgb.clone();
36
-
37
- int blobShape[] = {1, H, W, 3};
38
- cv::Mat blob(4, blobShape, CV_8U, rgb.data);
39
- cv::dnn::Net net = cv::dnn::readNetFromONNX(model, cv::dnn::ENGINE_ORT);
40
- net.setInput(blob);
41
- std::vector<cv::String> out_strs = {"detection_boxes:0", "detection_scores:0", "detection_classes:0", "num_detections:0"};
42
- std::vector<cv::Mat> outs;
43
- net.forward(outs, out_strs);
44
-
45
- float* boxes = nullptr;
46
- float* scores = nullptr;
47
- float* classes = nullptr;
48
- float* numd = nullptr;
49
- for (size_t i = 0; i < out_strs.size(); ++i)
50
- {
51
- float* p = (float*)outs[i].data;
52
- const std::string& n = out_strs[i];
53
- if (n.find("detection_boxes") != std::string::npos) boxes = p;
54
- else if (n.find("detection_scores") != std::string::npos) scores = p;
55
- else if (n.find("detection_classes") != std::string::npos) classes = p;
56
- else if (n.find("num_detections") != std::string::npos) numd = p;
57
- }
58
- int nd = (int)numd[0];
59
-
60
- int w = img.cols, h = img.rows;
61
- std::vector<int> kept;
62
- for (int i = 0; i < nd; ++i)
63
- if (scores[i] >= conf) kept.push_back(i);
64
-
65
- std::cout << "faster_rcnn_inception_v2_coco_2018_01_28 " << kept.size() << " detections" << std::endl;
66
- for (int i : kept)
67
- {
68
- int cls = (int)classes[i] - 1;
69
- float score = scores[i];
70
- float ymin = boxes[i * 4 + 0], xmin = boxes[i * 4 + 1];
71
- float ymax = boxes[i * 4 + 2], xmax = boxes[i * 4 + 3];
72
- cv::Point p1((int)(xmin * w), (int)(ymin * h));
73
- cv::Point p2((int)(xmax * w), (int)(ymax * h));
74
- cv::rectangle(img, p1, p2, cv::Scalar(0, 255, 0), 2);
75
- cv::putText(img, cv::format("%d:%.2f", cls, score), cv::Point(p1.x, p1.y - 5),
76
- cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0), 1);
77
- std::cout << cls << " " << cv::format("%.3f %.3f %.3f %.3f %.3f", score, xmin, ymin, xmax, ymax) << std::endl;
78
- }
79
-
80
- cv::imwrite(output, img);
81
- std::cout << "wrote " << output << std::endl;
82
- return 0;
83
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_inception_v2_coco_2018_01_28/demo.py DELETED
@@ -1,51 +0,0 @@
1
- import argparse
2
- import glob
3
- import os
4
-
5
- import cv2 as cv
6
- import numpy as np
7
-
8
- here = os.path.dirname(os.path.abspath(__file__))
9
-
10
-
11
- def main():
12
- parser = argparse.ArgumentParser(description="Faster-RCNN InceptionV2 (COCO) ONNX detection demo")
13
- parser.add_argument("--model", default=None)
14
- parser.add_argument("--image", default=os.path.join(here, "example_outputs", "input_image.png"))
15
- parser.add_argument("--output", default=os.path.join(here, "example_outputs", "output_image.png"))
16
- parser.add_argument("--conf", type=float, default=0.3)
17
- args = parser.parse_args()
18
-
19
- model = args.model or glob.glob(os.path.join(here, "*.onnx"))[0]
20
- img = cv.imread(args.image)
21
- if img is None:
22
- raise SystemExit("could not read image: %s" % args.image)
23
-
24
- rgb = cv.resize(cv.cvtColor(img, cv.COLOR_BGR2RGB), (800, 600))
25
- net = cv.dnn.readNetFromONNX(model, cv.dnn.ENGINE_ORT)
26
- onames = ["detection_boxes:0", "detection_scores:0", "detection_classes:0", "num_detections:0"]
27
- net.setInput(rgb[None].astype(np.uint8))
28
- res = net.forward(onames)
29
- boxes = res[[i for i, n in enumerate(onames) if "detection_boxes" in n][0]].reshape(-1, 4)
30
- scores = res[[i for i, n in enumerate(onames) if "detection_scores" in n][0]].reshape(-1)
31
- classes = res[[i for i, n in enumerate(onames) if "detection_classes" in n][0]].reshape(-1)
32
- nd = int(res[[i for i, n in enumerate(onames) if "num_detections" in n][0]].reshape(-1)[0])
33
-
34
- out = np.zeros((nd, 7), np.float32)
35
- out[:, 1] = classes[:nd] - 1
36
- out[:, 2] = scores[:nd]
37
- out[:, 3:7] = boxes[:nd][:, [1, 0, 3, 2]]
38
-
39
- h, w = img.shape[:2]
40
- kept = [row for row in out if row[2] >= args.conf]
41
- print(os.path.basename(here), len(kept), "detections")
42
- for row in kept:
43
- cv.rectangle(img, (int(row[3] * w), int(row[4] * h)), (int(row[5] * w), int(row[6] * h)), (0, 255, 0), 2)
44
- cv.putText(img, "%d:%.2f" % (int(row[1]), row[2]), (int(row[3] * w), int(row[4] * h) - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
45
- print(int(row[1]), round(float(row[2]), 3), round(float(row[3]), 3), round(float(row[4]), 3), round(float(row[5]), 3), round(float(row[6]), 3))
46
- cv.imwrite(args.output, img)
47
- print("wrote", args.output)
48
-
49
-
50
- if __name__ == "__main__":
51
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_inception_v2_coco_2018_01_28/example_outputs/input_image.png DELETED

Git LFS Details

  • SHA256: 61db162464c0770138c5136af0e999ce3b6556244cec257945427396480d9caf
  • Pointer size: 131 Bytes
  • Size of remote file: 414 kB
faster_rcnn_inception_v2_coco_2018_01_28/example_outputs/output_image.png DELETED

Git LFS Details

  • SHA256: ef5519b779267068a419b329f67bab3b3529549ffbc5ffc26e79f154c4411a4d
  • Pointer size: 131 Bytes
  • Size of remote file: 324 kB
faster_rcnn_inception_v2_coco_2018_01_28/faster_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:bcf541da5a58e9d8ab6c16e4c803ccc4e0da7dd62ad89311ae2a75c36b39835b
3
- size 57016094
 
 
 
 
faster_rcnn_resnet50_coco_2018_01_28/LICENSE DELETED
@@ -1,203 +0,0 @@
1
- Copyright 2015 The TensorFlow Authors. 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 2015, The TensorFlow Authors.
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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_resnet50_coco_2018_01_28/README.md DELETED
@@ -1,49 +0,0 @@
1
- # Faster-RCNN ResNet-50 (COCO)
2
-
3
- Object detection with the Faster-RCNN meta-architecture and a ResNet-50 backbone,
4
- trained on the COCO dataset. The model was originally distributed as a frozen TensorFlow
5
- graph (`faster_rcnn_resnet50_coco_2018_01_28.pb`) from the TensorFlow Object Detection
6
- API and converted to ONNX for inference with OpenCV's DNN module.
7
-
8
- ## Model Details
9
- - **Architecture**: Faster-RCNN with a ResNet-50 backbone
10
- - **Input**: RGB image, uint8, NHWC layout (`image_tensor:0`, shape `[1, H, W, 3]`)
11
- - **Output**: `detection_boxes:0` (normalized `[ymin, xmin, ymax, xmax]`), `detection_scores:0`, `detection_classes:0` (1-based COCO ids), `num_detections:0`
12
- - **Framework**: ONNX (converted from the TensorFlow frozen graph via tf2onnx, opset 18)
13
- - **Original weights**: http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet50_coco_2018_01_28.tar.gz
14
-
15
- ## Usage
16
-
17
- ### Python
18
- ```bash
19
- python demo.py --model faster_rcnn_resnet50_coco_2018_01_28_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png --conf 0.3
20
- ```
21
-
22
- ### C++
23
- The C++ demo runs inference with OpenCV's DNN module. Adjust the OpenCV paths to your setup:
24
- ```bash
25
- OCV=/path/to/opencv # OpenCV source tree
26
- OCVBUILD=/path/to/opencv/build # OpenCV build directory (generated headers + libs)
27
- g++ -std=c++17 demo.cpp -o demo \
28
- -I$OCV/include \
29
- -I$OCV/modules/core/include \
30
- -I$OCV/modules/dnn/include \
31
- -I$OCV/modules/imgproc/include \
32
- -I$OCV/modules/imgcodecs/include \
33
- -I$OCVBUILD \
34
- -L$OCVBUILD/lib -Wl,-rpath,$OCVBUILD/lib -lopencv_dnn -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
35
- ./demo --model faster_rcnn_resnet50_coco_2018_01_28_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png
36
- ```
37
-
38
- ## Conversion
39
- The ONNX model was exported from the frozen TensorFlow graph with tf2onnx (opset 18)
40
- via [convert_to_onnx.py](./convert_to_onnx.py) — input `image_tensor:0`, outputs
41
- `detection_boxes:0`, `detection_scores:0`, `detection_classes:0`, `num_detections:0`.
42
- Requires `tensorflow`, `tf2onnx`, and `onnx`.
43
-
44
- ```bash
45
- python convert_to_onnx.py --pb ../pb/faster_rcnn_resnet50_coco_2018_01_28.pb
46
- ```
47
-
48
- ## License
49
- See [LICENSE](./LICENSE) — the model is released by the TensorFlow Authors under the Apache License 2.0.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_resnet50_coco_2018_01_28/convert_to_onnx.py DELETED
@@ -1,40 +0,0 @@
1
- import argparse
2
- import datetime
3
-
4
- import onnx
5
- import tensorflow as tf
6
- import tf2onnx
7
-
8
-
9
- def load_graph_def(pb_path):
10
- with tf.io.gfile.GFile(pb_path, "rb") as f:
11
- graph_def = tf.compat.v1.GraphDef()
12
- graph_def.ParseFromString(f.read())
13
- return graph_def
14
-
15
-
16
- def main():
17
- parser = argparse.ArgumentParser(description="Export faster_rcnn_resnet50_coco_2018_01_28.pb to ONNX")
18
- parser.add_argument("--pb", default="../pb/faster_rcnn_resnet50_coco_2018_01_28.pb")
19
- parser.add_argument("--opset", type=int, default=18)
20
- args = parser.parse_args()
21
-
22
- graph_def = load_graph_def(args.pb)
23
-
24
- model_proto, _ = tf2onnx.convert.from_graph_def(
25
- graph_def,
26
- input_names=["image_tensor:0"],
27
- output_names=["detection_boxes:0", "detection_scores:0", "detection_classes:0", "num_detections:0"],
28
- opset=args.opset,
29
- )
30
- onnx.checker.check_model(model_proto)
31
-
32
- stamp = datetime.datetime.now().strftime("%Y%b").lower()
33
- onnx_path = "faster_rcnn_resnet50_coco_2018_01_28_%s.onnx" % stamp
34
- with open(onnx_path, "wb") as f:
35
- f.write(model_proto.SerializeToString())
36
- print("wrote", onnx_path)
37
-
38
-
39
- if __name__ == "__main__":
40
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_resnet50_coco_2018_01_28/demo.cpp DELETED
@@ -1,83 +0,0 @@
1
- #include <opencv2/dnn.hpp>
2
- #include <opencv2/imgproc.hpp>
3
- #include <opencv2/imgcodecs.hpp>
4
- #include <array>
5
- #include <cstdint>
6
- #include <iostream>
7
- #include <string>
8
- #include <vector>
9
-
10
- static std::string argVal(int argc, char** argv, const std::string& key, const std::string& def)
11
- {
12
- for (int i = 1; i + 1 < argc; ++i)
13
- if (key == argv[i]) return argv[i + 1];
14
- return def;
15
- }
16
-
17
- int main(int argc, char** argv)
18
- {
19
- std::string model = argVal(argc, argv, "--model", "faster_rcnn_resnet50_coco_2018_01_28_2026jul.onnx");
20
- std::string image = argVal(argc, argv, "--image", "example_outputs/input_image.png");
21
- std::string output = argVal(argc, argv, "--output", "example_outputs/output_image.png");
22
- float conf = std::stof(argVal(argc, argv, "--conf", "0.3"));
23
-
24
- cv::Mat img = cv::imread(image);
25
- if (img.empty())
26
- {
27
- std::cerr << "could not read image: " << image << std::endl;
28
- return 1;
29
- }
30
-
31
- const int W = 800, H = 600;
32
- cv::Mat rgb;
33
- cv::cvtColor(img, rgb, cv::COLOR_BGR2RGB);
34
- cv::resize(rgb, rgb, cv::Size(W, H));
35
- if (!rgb.isContinuous()) rgb = rgb.clone();
36
-
37
- int blobShape[] = {1, H, W, 3};
38
- cv::Mat blob(4, blobShape, CV_8U, rgb.data);
39
- cv::dnn::Net net = cv::dnn::readNetFromONNX(model, cv::dnn::ENGINE_ORT);
40
- net.setInput(blob);
41
- std::vector<cv::String> out_strs = {"detection_boxes:0", "detection_scores:0", "detection_classes:0", "num_detections:0"};
42
- std::vector<cv::Mat> outs;
43
- net.forward(outs, out_strs);
44
-
45
- float* boxes = nullptr;
46
- float* scores = nullptr;
47
- float* classes = nullptr;
48
- float* numd = nullptr;
49
- for (size_t i = 0; i < out_strs.size(); ++i)
50
- {
51
- float* p = (float*)outs[i].data;
52
- const std::string& n = out_strs[i];
53
- if (n.find("detection_boxes") != std::string::npos) boxes = p;
54
- else if (n.find("detection_scores") != std::string::npos) scores = p;
55
- else if (n.find("detection_classes") != std::string::npos) classes = p;
56
- else if (n.find("num_detections") != std::string::npos) numd = p;
57
- }
58
- int nd = (int)numd[0];
59
-
60
- int w = img.cols, h = img.rows;
61
- std::vector<int> kept;
62
- for (int i = 0; i < nd; ++i)
63
- if (scores[i] >= conf) kept.push_back(i);
64
-
65
- std::cout << "faster_rcnn_resnet50_coco_2018_01_28 " << kept.size() << " detections" << std::endl;
66
- for (int i : kept)
67
- {
68
- int cls = (int)classes[i] - 1;
69
- float score = scores[i];
70
- float ymin = boxes[i * 4 + 0], xmin = boxes[i * 4 + 1];
71
- float ymax = boxes[i * 4 + 2], xmax = boxes[i * 4 + 3];
72
- cv::Point p1((int)(xmin * w), (int)(ymin * h));
73
- cv::Point p2((int)(xmax * w), (int)(ymax * h));
74
- cv::rectangle(img, p1, p2, cv::Scalar(0, 255, 0), 2);
75
- cv::putText(img, cv::format("%d:%.2f", cls, score), cv::Point(p1.x, p1.y - 5),
76
- cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0), 1);
77
- std::cout << cls << " " << cv::format("%.3f %.3f %.3f %.3f %.3f", score, xmin, ymin, xmax, ymax) << std::endl;
78
- }
79
-
80
- cv::imwrite(output, img);
81
- std::cout << "wrote " << output << std::endl;
82
- return 0;
83
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_resnet50_coco_2018_01_28/demo.py DELETED
@@ -1,51 +0,0 @@
1
- import argparse
2
- import glob
3
- import os
4
-
5
- import cv2 as cv
6
- import numpy as np
7
-
8
- here = os.path.dirname(os.path.abspath(__file__))
9
-
10
-
11
- def main():
12
- parser = argparse.ArgumentParser(description="Faster-RCNN ResNet-50 (COCO) ONNX detection demo")
13
- parser.add_argument("--model", default=None)
14
- parser.add_argument("--image", default=os.path.join(here, "example_outputs", "input_image.png"))
15
- parser.add_argument("--output", default=os.path.join(here, "example_outputs", "output_image.png"))
16
- parser.add_argument("--conf", type=float, default=0.3)
17
- args = parser.parse_args()
18
-
19
- model = args.model or glob.glob(os.path.join(here, "*.onnx"))[0]
20
- img = cv.imread(args.image)
21
- if img is None:
22
- raise SystemExit("could not read image: %s" % args.image)
23
-
24
- rgb = cv.resize(cv.cvtColor(img, cv.COLOR_BGR2RGB), (800, 600))
25
- net = cv.dnn.readNetFromONNX(model, cv.dnn.ENGINE_ORT)
26
- onames = ["detection_boxes:0", "detection_scores:0", "detection_classes:0", "num_detections:0"]
27
- net.setInput(rgb[None].astype(np.uint8))
28
- res = net.forward(onames)
29
- boxes = res[[i for i, n in enumerate(onames) if "detection_boxes" in n][0]].reshape(-1, 4)
30
- scores = res[[i for i, n in enumerate(onames) if "detection_scores" in n][0]].reshape(-1)
31
- classes = res[[i for i, n in enumerate(onames) if "detection_classes" in n][0]].reshape(-1)
32
- nd = int(res[[i for i, n in enumerate(onames) if "num_detections" in n][0]].reshape(-1)[0])
33
-
34
- out = np.zeros((nd, 7), np.float32)
35
- out[:, 1] = classes[:nd] - 1
36
- out[:, 2] = scores[:nd]
37
- out[:, 3:7] = boxes[:nd][:, [1, 0, 3, 2]]
38
-
39
- h, w = img.shape[:2]
40
- kept = [row for row in out if row[2] >= args.conf]
41
- print(os.path.basename(here), len(kept), "detections")
42
- for row in kept:
43
- cv.rectangle(img, (int(row[3] * w), int(row[4] * h)), (int(row[5] * w), int(row[6] * h)), (0, 255, 0), 2)
44
- cv.putText(img, "%d:%.2f" % (int(row[1]), row[2]), (int(row[3] * w), int(row[4] * h) - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
45
- print(int(row[1]), round(float(row[2]), 3), round(float(row[3]), 3), round(float(row[4]), 3), round(float(row[5]), 3), round(float(row[6]), 3))
46
- cv.imwrite(args.output, img)
47
- print("wrote", args.output)
48
-
49
-
50
- if __name__ == "__main__":
51
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
faster_rcnn_resnet50_coco_2018_01_28/example_outputs/input_image.png DELETED

Git LFS Details

  • SHA256: 61db162464c0770138c5136af0e999ce3b6556244cec257945427396480d9caf
  • Pointer size: 131 Bytes
  • Size of remote file: 414 kB
faster_rcnn_resnet50_coco_2018_01_28/example_outputs/output_image.png DELETED

Git LFS Details

  • SHA256: 1111a91eb2db29d6293ef1b0da18e2ca39c878ad709e10e1892ec4e028e9d4cc
  • Pointer size: 131 Bytes
  • Size of remote file: 328 kB
faster_rcnn_resnet50_coco_2018_01_28/faster_rcnn_resnet50_coco_2018_01_28_2026jul.onnx DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:217613103b36eba4771087bdae63a7c04ed545e7850087f205990db7e5f18b88
3
- size 120414387
 
 
 
 
mask_rcnn_inception_v2_coco_2018_01_28/LICENSE DELETED
@@ -1,203 +0,0 @@
1
- Copyright 2015 The TensorFlow Authors. 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 2015, The TensorFlow Authors.
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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mask_rcnn_inception_v2_coco_2018_01_28/README.md DELETED
@@ -1,51 +0,0 @@
1
- # Mask-RCNN Inception v2 COCO
2
-
3
- Instance segmentation with the Mask-RCNN Inception v2 network trained on the COCO dataset.
4
- The model was originally distributed as a frozen TensorFlow graph
5
- (`mask_rcnn_inception_v2_coco_2018_01_28.pb`) from the TensorFlow Object Detection API
6
- and converted to ONNX for use with OpenCV's DNN module.
7
-
8
- ## Model Details
9
- - **Architecture**: Mask-RCNN with an Inception v2 backbone
10
- - **Input**: RGB image, uint8, NHWC layout (`image_tensor:0`); the demo resizes to 800×800
11
- - **Output**: `num_detections:0`, `detection_boxes:0` (normalized `[ymin, xmin, ymax, xmax]`),
12
- `detection_scores:0`, `detection_classes:0` (COCO ids, subtract 1 for a 0-based label),
13
- and `detection_masks:0` (a 15×15 mask per detection, resized to its box)
14
- - **Framework**: ONNX (converted from the TensorFlow frozen graph via tf2onnx, opset 18)
15
- - **Original weights**: http://download.tensorflow.org/models/object_detection/mask_rcnn_inception_v2_coco_2018_01_28.tar.gz
16
-
17
- ## Usage
18
-
19
- ### Python
20
- ```bash
21
- python demo.py --model mask_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png --conf 0.3
22
- ```
23
-
24
- ### C++
25
- The C++ demo runs inference with OpenCV's DNN module. Adjust the OpenCV paths to your setup:
26
- ```bash
27
- OCV=/path/to/opencv # OpenCV source tree
28
- OCVBUILD=/path/to/opencv/build # OpenCV build directory (generated headers + libs)
29
- g++ -std=c++17 demo.cpp -o demo \
30
- -I$OCV/include \
31
- -I$OCV/modules/core/include \
32
- -I$OCV/modules/dnn/include \
33
- -I$OCV/modules/imgproc/include \
34
- -I$OCV/modules/imgcodecs/include \
35
- -I$OCVBUILD \
36
- -L$OCVBUILD/lib -Wl,-rpath,$OCVBUILD/lib -lopencv_dnn -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
37
- ./demo --model mask_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png
38
- ```
39
-
40
- ## Conversion
41
- The ONNX model was exported from the frozen TensorFlow graph with tf2onnx (opset 18)
42
- via [convert_to_onnx.py](./convert_to_onnx.py) — input `image_tensor:0`, outputs
43
- `num_detections:0`, `detection_boxes:0`, `detection_scores:0`, `detection_classes:0`,
44
- and `detection_masks:0`. Requires `tensorflow`, `tf2onnx`, and `onnx`.
45
-
46
- ```bash
47
- python convert_to_onnx.py --pb ../pb/mask_rcnn_inception_v2_coco_2018_01_28.pb
48
- ```
49
-
50
- ## License
51
- See [LICENSE](./LICENSE) — the model is released by the TensorFlow Authors under the Apache License 2.0.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mask_rcnn_inception_v2_coco_2018_01_28/convert_to_onnx.py DELETED
@@ -1,46 +0,0 @@
1
- import argparse
2
- import datetime
3
-
4
- import onnx
5
- import tensorflow as tf
6
- import tf2onnx
7
-
8
-
9
- def load_graph_def(pb_path):
10
- with tf.io.gfile.GFile(pb_path, "rb") as f:
11
- graph_def = tf.compat.v1.GraphDef()
12
- graph_def.ParseFromString(f.read())
13
- return graph_def
14
-
15
-
16
- def main():
17
- parser = argparse.ArgumentParser(description="Export mask_rcnn_inception_v2_coco_2018_01_28.pb to ONNX")
18
- parser.add_argument("--pb", default="../pb/mask_rcnn_inception_v2_coco_2018_01_28.pb")
19
- parser.add_argument("--opset", type=int, default=18)
20
- args = parser.parse_args()
21
-
22
- graph_def = load_graph_def(args.pb)
23
-
24
- model_proto, _ = tf2onnx.convert.from_graph_def(
25
- graph_def,
26
- input_names=["image_tensor:0"],
27
- output_names=[
28
- "num_detections:0",
29
- "detection_boxes:0",
30
- "detection_scores:0",
31
- "detection_classes:0",
32
- "detection_masks:0",
33
- ],
34
- opset=args.opset,
35
- )
36
- onnx.checker.check_model(model_proto)
37
-
38
- stamp = datetime.datetime.now().strftime("%Y%b").lower()
39
- onnx_path = "mask_rcnn_inception_v2_coco_2018_01_28_%s.onnx" % stamp
40
- with open(onnx_path, "wb") as f:
41
- f.write(model_proto.SerializeToString())
42
- print("wrote", onnx_path)
43
-
44
-
45
- if __name__ == "__main__":
46
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mask_rcnn_inception_v2_coco_2018_01_28/demo.cpp DELETED
@@ -1,109 +0,0 @@
1
- #include <opencv2/dnn.hpp>
2
- #include <opencv2/imgproc.hpp>
3
- #include <opencv2/imgcodecs.hpp>
4
- #include <algorithm>
5
- #include <array>
6
- #include <cstdint>
7
- #include <iostream>
8
- #include <string>
9
- #include <vector>
10
-
11
- static std::string argVal(int argc, char** argv, const std::string& key, const std::string& def)
12
- {
13
- for (int i = 1; i + 1 < argc; ++i)
14
- if (key == argv[i]) return argv[i + 1];
15
- return def;
16
- }
17
-
18
- int main(int argc, char** argv)
19
- {
20
- std::string model = argVal(argc, argv, "--model", "mask_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx");
21
- std::string image = argVal(argc, argv, "--image", "example_outputs/input_image.png");
22
- std::string output = argVal(argc, argv, "--output", "example_outputs/output_image.png");
23
- float conf = std::stof(argVal(argc, argv, "--conf", "0.3"));
24
-
25
- cv::Mat img = cv::imread(image);
26
- if (img.empty())
27
- {
28
- std::cerr << "could not read image: " << image << std::endl;
29
- return 1;
30
- }
31
-
32
- const int W = 800, H = 800;
33
- cv::Mat rgb;
34
- cv::cvtColor(img, rgb, cv::COLOR_BGR2RGB);
35
- cv::resize(rgb, rgb, cv::Size(W, H));
36
- if (!rgb.isContinuous()) rgb = rgb.clone();
37
-
38
- int blobShape[] = {1, H, W, 3};
39
- cv::Mat blob(4, blobShape, CV_8U, rgb.data);
40
- cv::dnn::Net net = cv::dnn::readNetFromONNX(model, cv::dnn::ENGINE_ORT);
41
- net.setInput(blob);
42
- std::vector<cv::String> out_strs = {"num_detections:0", "detection_boxes:0", "detection_scores:0", "detection_classes:0", "detection_masks:0"};
43
- std::vector<cv::Mat> outs;
44
- net.forward(outs, out_strs);
45
-
46
- float* boxes = nullptr;
47
- float* scores = nullptr;
48
- float* classes = nullptr;
49
- float* numd = nullptr;
50
- float* masks = nullptr;
51
- for (size_t i = 0; i < out_strs.size(); ++i)
52
- {
53
- float* p = (float*)outs[i].data;
54
- const std::string& n = out_strs[i];
55
- if (n.find("detection_boxes") != std::string::npos) boxes = p;
56
- else if (n.find("detection_scores") != std::string::npos) scores = p;
57
- else if (n.find("detection_classes") != std::string::npos) classes = p;
58
- else if (n.find("num_detections") != std::string::npos) numd = p;
59
- else if (n.find("detection_masks") != std::string::npos) masks = p;
60
- }
61
- int nd = (int)numd[0];
62
-
63
- int w = img.cols, h = img.rows;
64
- cv::Mat out = img.clone();
65
- std::vector<int> kept;
66
- for (int i = 0; i < nd; ++i)
67
- if (scores[i] >= conf) kept.push_back(i);
68
-
69
- std::cout << "mask_rcnn_inception_v2_coco_2018_01_28 " << kept.size() << " detections" << std::endl;
70
- for (int i : kept)
71
- {
72
- int cls = (int)classes[i] - 1;
73
- float score = scores[i];
74
- float y1 = boxes[i * 4 + 0], x1 = boxes[i * 4 + 1];
75
- float y2 = boxes[i * 4 + 2], x2 = boxes[i * 4 + 3];
76
- int px1 = std::max(0, (int)(x1 * w)), py1 = std::max(0, (int)(y1 * h));
77
- int px2 = std::min(w, (int)(x2 * w)), py2 = std::min(h, (int)(y2 * h));
78
-
79
- unsigned s = (unsigned)i * 2654435761u + 1u;
80
- int col[3];
81
- for (int c = 0; c < 3; ++c) { s = s * 1664525u + 1013904223u; col[c] = 80 + (int)((s >> 8) % 176u); }
82
- cv::Scalar color(col[0], col[1], col[2]);
83
-
84
- if (px2 > px1 && py2 > py1)
85
- {
86
- cv::Mat m15(15, 15, CV_32F, masks + (size_t)i * 225);
87
- cv::Mat mr;
88
- cv::resize(m15, mr, cv::Size(px2 - px1, py2 - py1));
89
- cv::Mat roi = out(cv::Rect(px1, py1, px2 - px1, py2 - py1));
90
- for (int y = 0; y < roi.rows; ++y)
91
- {
92
- cv::Vec3b* rp = roi.ptr<cv::Vec3b>(y);
93
- const float* mp = mr.ptr<float>(y);
94
- for (int x = 0; x < roi.cols; ++x)
95
- if (mp[x] > 0.5f)
96
- for (int c = 0; c < 3; ++c)
97
- rp[x][c] = (uchar)(0.5 * rp[x][c] + 0.5 * col[c]);
98
- }
99
- }
100
- cv::rectangle(out, cv::Point(px1, py1), cv::Point(px2, py2), color, 2);
101
- cv::putText(out, cv::format("%d:%.2f", cls, score), cv::Point(px1, py1 - 5),
102
- cv::FONT_HERSHEY_SIMPLEX, 0.5, color, 1);
103
- std::cout << cls << " " << cv::format("%.3f %.3f %.3f %.3f %.3f", score, x1, y1, x2, y2) << std::endl;
104
- }
105
-
106
- cv::imwrite(output, out);
107
- std::cout << "wrote " << output << std::endl;
108
- return 0;
109
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mask_rcnn_inception_v2_coco_2018_01_28/demo.py DELETED
@@ -1,59 +0,0 @@
1
- import argparse
2
- import glob
3
- import os
4
-
5
- import cv2 as cv
6
- import numpy as np
7
-
8
- here = os.path.dirname(os.path.abspath(__file__))
9
-
10
-
11
- def main():
12
- parser = argparse.ArgumentParser(description="Mask-RCNN Inception v2 COCO (OpenCV DNN) detection + mask demo")
13
- found = glob.glob(os.path.join(here, "*.onnx"))
14
- parser.add_argument("--model", default=found[0] if found else None)
15
- parser.add_argument("--image", default=os.path.join(here, "example_outputs", "input_image.png"))
16
- parser.add_argument("--output", default=os.path.join(here, "example_outputs", "output_image.png"))
17
- parser.add_argument("--conf", type=float, default=0.3)
18
- args = parser.parse_args()
19
-
20
- img = cv.imread(args.image)
21
- if img is None:
22
- raise SystemExit("could not read image: %s" % args.image)
23
-
24
- net = cv.dnn.readNetFromONNX(args.model, cv.dnn.ENGINE_ORT)
25
- rgb = cv.resize(cv.cvtColor(img, cv.COLOR_BGR2RGB), (800, 800))
26
- onames = ["num_detections:0", "detection_boxes:0", "detection_scores:0", "detection_classes:0", "detection_masks:0"]
27
- net.setInput(rgb[None].astype(np.uint8))
28
- res = net.forward(onames)
29
- boxes = res[[i for i, n in enumerate(onames) if "detection_boxes" in n][0]].reshape(-1, 4)
30
- scores = res[[i for i, n in enumerate(onames) if "detection_scores" in n][0]].reshape(-1)
31
- classes = res[[i for i, n in enumerate(onames) if "detection_classes" in n][0]].reshape(-1)
32
- nd = int(res[[i for i, n in enumerate(onames) if "num_detections" in n][0]].reshape(-1)[0])
33
- masks = res[[i for i, n in enumerate(onames) if "detection_masks" in n][0]].reshape(-1, 15, 15)
34
-
35
- h, w = img.shape[:2]
36
- out = img.copy()
37
- kept = [i for i in range(nd) if scores[i] >= args.conf]
38
- print("mask_rcnn_inception_v2_coco_2018_01_28", len(kept), "detections")
39
- for i in kept:
40
- cls = int(classes[i]) - 1
41
- score = float(scores[i])
42
- y1, x1, y2, x2 = boxes[i]
43
- px1, py1 = max(0, int(x1 * w)), max(0, int(y1 * h))
44
- px2, py2 = min(w, int(x2 * w)), min(h, int(y2 * h))
45
- color = tuple(int(c) for c in np.random.default_rng(i).integers(80, 256, 3))
46
- if px2 > px1 and py2 > py1:
47
- m = cv.resize(masks[i], (px2 - px1, py2 - py1)) > 0.5
48
- roi = out[py1:py2, px1:px2]
49
- roi[m] = (0.5 * roi[m] + 0.5 * np.array(color)).astype(np.uint8)
50
- cv.rectangle(out, (px1, py1), (px2, py2), color, 2)
51
- cv.putText(out, "%d:%.2f" % (cls, score), (px1, py1 - 5), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)
52
- print(cls, round(score, 3), round(float(x1), 3), round(float(y1), 3), round(float(x2), 3), round(float(y2), 3))
53
-
54
- cv.imwrite(args.output, out)
55
- print("wrote", args.output)
56
-
57
-
58
- if __name__ == "__main__":
59
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mask_rcnn_inception_v2_coco_2018_01_28/example_outputs/input_image.png DELETED

Git LFS Details

  • SHA256: d711ef10627f93def79c0c6ec2d0fc3da06cbb7e426d81fd2782538c3c549f52
  • Pointer size: 131 Bytes
  • Size of remote file: 508 kB
mask_rcnn_inception_v2_coco_2018_01_28/example_outputs/output_image.png DELETED

Git LFS Details

  • SHA256: 3e1d9152370bbb8a15fcf7424f4a767edca0e9317d27f1f44346996eba6c887e
  • Pointer size: 131 Bytes
  • Size of remote file: 454 kB
mask_rcnn_inception_v2_coco_2018_01_28/mask_rcnn_inception_v2_coco_2018_01_28_2026jul.onnx DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:27cdd89df33ab94f61fd278350f66996efec3437937b5679a311ba55e386690f
3
- size 66728941
 
 
 
 
opencv_face_detector_uint8/LICENSE DELETED
@@ -1,203 +0,0 @@
1
- Copyright (c) OpenCV team and the opencv_3rdparty contributors. 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 (c) OpenCV team and the opencv_3rdparty contributors.
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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
opencv_face_detector_uint8/README.md DELETED
@@ -1,67 +0,0 @@
1
- # OpenCV SSD Face Detector (UINT8)
2
-
3
- Single-shot face detection with the OpenCV SSD ResNet-10 network. The model ships in the
4
- OpenCV project as a quantized frozen TensorFlow graph (`opencv_face_detector_uint8.pb`) and is
5
- converted here to ONNX for use with OpenCV's DNN module. Only the backbone is
6
- exported — PriorBox generation, the confidence softmax, variance decode, score threshold and NMS
7
- are run in host code (see `demo.py` / `demo.cpp`).
8
-
9
- ## Model Details
10
- - **Architecture**: SSD with a ResNet-10 backbone (face detector)
11
- - **Input**: BGR image, 300×300, mean-subtracted by `[104, 177, 123]` (no scaling, no RGB swap),
12
- NHWC layout (`data:0`, shape `[1, 300, 300, 3]`)
13
- - **Output**: `mbox_loc` (`[1, 35568]`, box regressions) and `mbox_conf_flatten`
14
- (`[1, 17784]`, 2-class face/background logits); PriorBox decode + softmax + NMS are done in the demo
15
- - **Framework**: ONNX (converted from the TensorFlow frozen graph — uint8 weights with the
16
- `Dequantize` nodes folded to float `Const` — via tf2onnx, opset 18)
17
- - **Original weights**: https://github.com/opencv/opencv_3rdparty/raw/8033c2bc31b3256f0d461c919ecc01c2428ca03b/opencv_face_detector_uint8.pb
18
-
19
- The 6 SSD prior layers (min/max size, aspect ratios, step, feature-map size), the variances
20
- `[0.1, 0.1, 0.2, 0.2]`, the default confidence threshold `0.4` and the NMS IoU `0.3` are all
21
- defined in the demo scripts.
22
-
23
- ## Usage
24
-
25
- ### Python
26
- ```bash
27
- python demo.py --model opencv_face_detector_uint8_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png --conf 0.4
28
- ```
29
-
30
- Or import directly:
31
- ```python
32
- import cv2
33
-
34
- net = cv2.dnn.readNet("opencv_face_detector_uint8_2026jul.onnx")
35
- # see demo.py for the full PriorBox decode + softmax + NMS pipeline
36
- ```
37
-
38
- ### C++
39
- The C++ demo runs inference with OpenCV's DNN module. Adjust the OpenCV paths to your setup:
40
- ```bash
41
- OCV=/path/to/opencv # OpenCV source tree
42
- OCVBUILD=/path/to/opencv/build # OpenCV build directory (generated headers + libs)
43
- g++ -std=c++17 demo.cpp -o demo \
44
- -I$OCV/include \
45
- -I$OCV/modules/core/include \
46
- -I$OCV/modules/dnn/include \
47
- -I$OCV/modules/imgproc/include \
48
- -I$OCV/modules/imgcodecs/include \
49
- -I$OCVBUILD \
50
- -L$OCVBUILD/lib -Wl,-rpath,$OCVBUILD/lib -lopencv_dnn -lopencv_imgcodecs -lopencv_imgproc -lopencv_core
51
- ./demo --model opencv_face_detector_uint8_2026jul.onnx --image example_outputs/input_image.png --output example_outputs/output_image.png
52
- ```
53
-
54
- ## Conversion
55
- The ONNX model was exported from the frozen TensorFlow graph with tf2onnx (opset 18) via
56
- [convert_to_onnx.py](./convert_to_onnx.py). The `.pb` stores its weights behind `Dequantize`
57
- nodes, so the script first folds every `Dequantize` node to a float `Const` before conversion.
58
- Inputs `data:0`, outputs `mbox_loc:0` and `mbox_conf_flatten:0`, input shape overridden to
59
- `[1, 300, 300, 3]`. Requires `tensorflow`, `tf2onnx`, and `onnx`.
60
-
61
- ```bash
62
- python convert_to_onnx.py --pb ../pb/opencv_face_detector_uint8.pb
63
- ```
64
-
65
- ## License
66
- See [LICENSE](./LICENSE) — this is the OpenCV face detector distributed via `opencv_3rdparty`
67
- under the Apache License 2.0.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
opencv_face_detector_uint8/convert_to_onnx.py DELETED
@@ -1,73 +0,0 @@
1
- import argparse
2
- import datetime
3
-
4
- import numpy as np
5
- import tensorflow as tf
6
- import tf2onnx
7
- import onnx
8
- from tensorflow.python.framework import graph_util, tensor_util
9
-
10
-
11
- def dequantize(graph_def, outputs):
12
- dmin = {n.name: n.input[1] for n in graph_def.node if n.op == "Dequantize"}
13
- folded = {}
14
- with tf.Graph().as_default() as g:
15
- tf.import_graph_def(graph_def, name="")
16
- deq = list(dmin)
17
- with tf.compat.v1.Session(graph=g) as sess:
18
- for name in deq:
19
- v = np.asarray(sess.run(g.get_tensor_by_name(name + ":0")), np.float32)
20
- if not np.isfinite(v).all():
21
- mn = np.float32(sess.run(g.get_tensor_by_name(dmin[name] + ":0")))
22
- v = np.full(v.shape, mn, np.float32)
23
- folded[name] = v
24
- new = tf.compat.v1.GraphDef()
25
- for n in graph_def.node:
26
- if n.op == "Dequantize":
27
- v = folded[n.name]
28
- c = new.node.add()
29
- c.op = "Const"
30
- c.name = n.name
31
- c.attr["dtype"].type = tf.float32.as_datatype_enum
32
- c.attr["value"].tensor.CopyFrom(tensor_util.make_tensor_proto(v, tf.float32, v.shape))
33
- else:
34
- new.node.add().CopyFrom(n)
35
- return graph_util.extract_sub_graph(new, [o.split(":")[0] for o in outputs])
36
-
37
-
38
- def load_graph_def(pb_path):
39
- with tf.io.gfile.GFile(pb_path, "rb") as f:
40
- graph_def = tf.compat.v1.GraphDef()
41
- graph_def.ParseFromString(f.read())
42
- return graph_def
43
-
44
-
45
- def main():
46
- parser = argparse.ArgumentParser(description="Export opencv_face_detector_uint8.pb (backbone) to ONNX")
47
- parser.add_argument("--pb", default="../pb/opencv_face_detector_uint8.pb")
48
- parser.add_argument("--opset", type=int, default=18)
49
- args = parser.parse_args()
50
-
51
- output_names = ["mbox_loc:0", "mbox_conf_flatten:0"]
52
-
53
- graph_def = load_graph_def(args.pb)
54
- graph_def = dequantize(graph_def, output_names)
55
-
56
- model_proto, _ = tf2onnx.convert.from_graph_def(
57
- graph_def,
58
- input_names=["data:0"],
59
- output_names=output_names,
60
- opset=args.opset,
61
- shape_override={"data:0": [1, 300, 300, 3]},
62
- )
63
- onnx.checker.check_model(model_proto)
64
-
65
- stamp = datetime.datetime.now().strftime("%Y%b").lower()
66
- onnx_path = "opencv_face_detector_uint8_%s.onnx" % stamp
67
- with open(onnx_path, "wb") as f:
68
- f.write(model_proto.SerializeToString())
69
- print("wrote", onnx_path)
70
-
71
-
72
- if __name__ == "__main__":
73
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
opencv_face_detector_uint8/demo.cpp DELETED
@@ -1,146 +0,0 @@
1
- #include <opencv2/dnn.hpp>
2
- #include <opencv2/imgproc.hpp>
3
- #include <opencv2/imgcodecs.hpp>
4
- #include <algorithm>
5
- #include <array>
6
- #include <cmath>
7
- #include <iostream>
8
- #include <string>
9
- #include <vector>
10
-
11
- using namespace cv;
12
-
13
- static std::string argVal(int argc, char** argv, const std::string& key, const std::string& def)
14
- {
15
- for (int i = 1; i + 1 < argc; ++i)
16
- if (key == argv[i]) return argv[i + 1];
17
- return def;
18
- }
19
-
20
- struct Layer { float mn, mx; std::vector<int> ars; int step, fm; };
21
-
22
- int main(int argc, char** argv)
23
- {
24
- std::string model = argVal(argc, argv, "--model", "opencv_face_detector_uint8_2026jul.onnx");
25
- std::string image = argVal(argc, argv, "--image", "example_outputs/input_image.png");
26
- std::string output = argVal(argc, argv, "--output", "example_outputs/output_image.png");
27
- float thr = std::stof(argVal(argc, argv, "--conf", "0.4"));
28
-
29
- const int sz = 300;
30
- Mat img = imread(image);
31
- if (img.empty())
32
- {
33
- std::cerr << "could not read image: " << image << std::endl;
34
- return 1;
35
- }
36
-
37
- Mat inp;
38
- resize(img, inp, Size(sz, sz));
39
- inp.convertTo(inp, CV_32F);
40
- subtract(inp, Scalar(104, 177, 123), inp);
41
- if (!inp.isContinuous()) inp = inp.clone();
42
-
43
- int blobShape[] = {1, sz, sz, 3};
44
- Mat blob(4, blobShape, CV_32F, inp.data);
45
- dnn::Net net = dnn::readNetFromONNX(model);
46
- net.setInput(blob);
47
- std::vector<Mat> outs;
48
- net.forward(outs, net.getUnconnectedOutLayersNames());
49
-
50
- const float* loc = nullptr;
51
- const float* conf = nullptr;
52
- for (size_t i = 0; i < outs.size(); ++i)
53
- {
54
- const Mat& o = outs[i];
55
- size_t tot = o.total();
56
- const float* p = (const float*)o.data;
57
- if (tot == 35568) loc = p;
58
- else if (tot == 17784) conf = p;
59
- }
60
-
61
- std::vector<Layer> layers = {
62
- {30, 60, {2}, 8, 38},
63
- {60, 111, {2, 3}, 16, 19},
64
- {111, 162, {2, 3}, 32, 10},
65
- {162, 213, {2, 3}, 64, 5},
66
- {213, 264, {2}, 100, 5},
67
- {264, 315, {2}, 300, 5},
68
- };
69
- std::vector<Vec4f> priors;
70
- for (const Layer& L : layers)
71
- {
72
- std::vector<float> ratios = {1.0f};
73
- for (int a : L.ars) { ratios.push_back((float)a); ratios.push_back(1.0f / a); }
74
- for (int y = 0; y < L.fm; ++y)
75
- for (int x = 0; x < L.fm; ++x)
76
- {
77
- float cx = (x + 0.5f) * L.step;
78
- float cy = (y + 0.5f) * L.step;
79
- std::vector<Vec2f> boxes = {{L.mn, L.mn}, {std::sqrt(L.mn * L.mx), std::sqrt(L.mn * L.mx)}};
80
- for (size_t k = 1; k < ratios.size(); ++k)
81
- {
82
- float a = ratios[k];
83
- boxes.push_back({L.mn * std::sqrt(a), L.mn / std::sqrt(a)});
84
- }
85
- for (const Vec2f& b : boxes)
86
- priors.push_back({cx, cy, b[0], b[1]});
87
- }
88
- }
89
-
90
- const float var[4] = {0.1f, 0.1f, 0.2f, 0.2f};
91
- int n = (int)priors.size();
92
- std::vector<Rect2f> boxes;
93
- std::vector<float> scores;
94
- for (int i = 0; i < n; ++i)
95
- {
96
- float c0 = conf[i * 2], c1 = conf[i * 2 + 1];
97
- float m = std::max(c0, c1);
98
- float e0 = std::exp(c0 - m), e1 = std::exp(c1 - m);
99
- float s = e1 / (e0 + e1);
100
- if (s <= thr) continue;
101
- float pcx = priors[i][0] / sz, pcy = priors[i][1] / sz;
102
- float pw = priors[i][2] / sz, ph = priors[i][3] / sz;
103
- float cx = pcx + loc[i * 4] * var[0] * pw;
104
- float cy = pcy + loc[i * 4 + 1] * var[1] * ph;
105
- float bw = pw * std::exp(loc[i * 4 + 2] * var[2]);
106
- float bh = ph * std::exp(loc[i * 4 + 3] * var[3]);
107
- boxes.push_back(Rect2f(cx - bw / 2, cy - bh / 2, bw, bh));
108
- scores.push_back(s);
109
- }
110
-
111
- std::vector<int> order(scores.size());
112
- for (size_t i = 0; i < order.size(); ++i) order[i] = (int)i;
113
- std::sort(order.begin(), order.end(), [&](int a, int b){ return scores[a] > scores[b]; });
114
- std::vector<char> removed(order.size(), 0);
115
- std::vector<int> pick;
116
- for (size_t oi = 0; oi < order.size(); ++oi)
117
- {
118
- if (removed[oi]) continue;
119
- int i = order[oi];
120
- pick.push_back(i);
121
- for (size_t oj = oi + 1; oj < order.size(); ++oj)
122
- {
123
- if (removed[oj]) continue;
124
- int j = order[oj];
125
- const Rect2f& a = boxes[i];
126
- const Rect2f& b = boxes[j];
127
- float xx1 = std::max(a.x, b.x), yy1 = std::max(a.y, b.y);
128
- float xx2 = std::min(a.x + a.width, b.x + b.width);
129
- float yy2 = std::min(a.y + a.height, b.y + b.height);
130
- float inter = std::max(0.f, xx2 - xx1) * std::max(0.f, yy2 - yy1);
131
- float iou = inter / (a.area() + b.area() - inter + 1e-9f);
132
- if (iou > 0.3f) removed[oj] = 1;
133
- }
134
- }
135
-
136
- int W = img.cols, H = img.rows;
137
- for (int i : pick)
138
- {
139
- const Rect2f& b = boxes[i];
140
- rectangle(img, Point(int(b.x * W), int(b.y * H)),
141
- Point(int((b.x + b.width) * W), int((b.y + b.height) * H)), Scalar(0, 255, 0), 2);
142
- }
143
- imwrite(output, img);
144
- std::cout << "opencv_face_detector_uint8 " << pick.size() << " faces" << std::endl;
145
- return 0;
146
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
opencv_face_detector_uint8/demo.py DELETED
@@ -1,109 +0,0 @@
1
- import argparse
2
- import glob
3
- import os
4
-
5
- import cv2 as cv
6
- import numpy as np
7
-
8
- here = os.path.dirname(os.path.abspath(__file__))
9
-
10
- sz = 300
11
- layers = [
12
- (30, 60, [2], 8, 38),
13
- (60, 111, [2, 3], 16, 19),
14
- (111, 162, [2, 3], 32, 10),
15
- (162, 213, [2, 3], 64, 5),
16
- (213, 264, [2], 100, 5),
17
- (264, 315, [2], 300, 5),
18
- ]
19
- var = [0.1, 0.1, 0.2, 0.2]
20
-
21
-
22
- def build_priors():
23
- p = []
24
- for mn, mx, ars, step, fm in layers:
25
- ratios = [1.0]
26
- for a in ars:
27
- ratios += [a, 1.0 / a]
28
- for y in range(fm):
29
- for x in range(fm):
30
- cx = (x + 0.5) * step
31
- cy = (y + 0.5) * step
32
- boxes = [(mn, mn), ((mn * mx) ** 0.5, (mn * mx) ** 0.5)]
33
- for a in ratios[1:]:
34
- boxes.append((mn * a ** 0.5, mn / a ** 0.5))
35
- for bw, bh in boxes:
36
- p.append([cx, cy, bw, bh])
37
- return np.array(p, np.float32)
38
-
39
-
40
- def default_model():
41
- files = [f for f in glob.glob(os.path.join(here, "*.onnx")) if "known_good" not in os.path.basename(f)]
42
- return files[0] if files else os.path.join(here, "opencv_face_detector_uint8.onnx")
43
-
44
-
45
- def main():
46
- parser = argparse.ArgumentParser(description="OpenCV SSD face detector (ONNX) demo")
47
- parser.add_argument("--model", default=default_model())
48
- parser.add_argument("--image", default=os.path.join(here, "example_outputs", "input_image.png"))
49
- parser.add_argument("--output", default=os.path.join(here, "example_outputs", "output_image.png"))
50
- parser.add_argument("--conf", type=float, default=0.4)
51
- args = parser.parse_args()
52
-
53
- img = cv.imread(args.image)
54
- if img is None:
55
- raise SystemExit("could not read image: %s" % args.image)
56
-
57
- inp = cv.resize(img, (sz, sz)).astype(np.float32) - np.array([104.0, 177.0, 123.0], np.float32)
58
-
59
- net = cv.dnn.readNetFromONNX(args.model)
60
- onames = net.getUnconnectedOutLayersNames()
61
- net.setInput(inp[None])
62
- res = net.forward(onames)
63
- loc = res[[i for i, n in enumerate(onames) if "mbox_loc" in n][0]].reshape(-1, 4)
64
- conf = res[[i for i, n in enumerate(onames) if "mbox_conf" in n][0]].reshape(-1, 2)
65
-
66
- priors = build_priors()
67
- pcx = priors[:, 0] / sz
68
- pcy = priors[:, 1] / sz
69
- pw = priors[:, 2] / sz
70
- ph = priors[:, 3] / sz
71
-
72
- e = np.exp(conf - conf.max(1, keepdims=True))
73
- sm = e / e.sum(1, keepdims=True)
74
- scores = sm[:, 1]
75
-
76
- cx = pcx + loc[:, 0] * var[0] * pw
77
- cy = pcy + loc[:, 1] * var[1] * ph
78
- bw = pw * np.exp(loc[:, 2] * var[2])
79
- bh = ph * np.exp(loc[:, 3] * var[3])
80
- boxes = np.stack([cx - bw / 2, cy - bh / 2, cx + bw / 2, cy + bh / 2], 1)
81
-
82
- keep = scores > args.conf
83
- boxes = boxes[keep]
84
- scores = scores[keep]
85
- order = scores.argsort()[::-1]
86
- pick = []
87
- while order.size:
88
- i = order[0]
89
- pick.append(i)
90
- xx1 = np.maximum(boxes[i, 0], boxes[order[1:], 0])
91
- yy1 = np.maximum(boxes[i, 1], boxes[order[1:], 1])
92
- xx2 = np.minimum(boxes[i, 2], boxes[order[1:], 2])
93
- yy2 = np.minimum(boxes[i, 3], boxes[order[1:], 3])
94
- inter = np.maximum(0, xx2 - xx1) * np.maximum(0, yy2 - yy1)
95
- ai = (boxes[i, 2] - boxes[i, 0]) * (boxes[i, 3] - boxes[i, 1])
96
- aj = (boxes[order[1:], 2] - boxes[order[1:], 0]) * (boxes[order[1:], 3] - boxes[order[1:], 1])
97
- iou = inter / (ai + aj - inter + 1e-9)
98
- order = order[1:][iou <= 0.3]
99
-
100
- h, w = img.shape[:2]
101
- for i in pick:
102
- x1, y1, x2, y2 = boxes[i]
103
- cv.rectangle(img, (int(x1 * w), int(y1 * h)), (int(x2 * w), int(y2 * h)), (0, 255, 0), 2)
104
- cv.imwrite(args.output, img)
105
- print("opencv_face_detector_uint8", len(pick), "faces")
106
-
107
-
108
- if __name__ == "__main__":
109
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
opencv_face_detector_uint8/example_outputs/input_image.png DELETED

Git LFS Details

  • SHA256: c232b8830623d924c518183cd005f7ff7d7b735e19c1cd26a2a59613d452a3d4
  • Pointer size: 131 Bytes
  • Size of remote file: 198 kB
opencv_face_detector_uint8/example_outputs/output_image.png DELETED

Git LFS Details

  • SHA256: 15a6e1a27e04020e9cbce7a26e7c2d8752cc74157b179bfe3636825688c13d4e
  • Pointer size: 131 Bytes
  • Size of remote file: 440 kB
opencv_face_detector_uint8/opencv_face_detector_uint8_2026jul.onnx DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:f5b1efe9c4e792a010ac36248d92b64c3d94f9bdec764951d1e8684d919b1e40
3
- size 10671719
 
 
 
 
ssd_inception_v2_coco_2017_11_17/LICENSE DELETED
@@ -1,212 +0,0 @@
1
- Copyright 2022 Google LLC. All rights reserved.
2
-
3
- All files in the following folders:
4
- /community
5
- /official
6
- /orbit
7
- /research
8
- /tensorflow_models
9
-
10
- Are licensed as follows:
11
-
12
- Apache License
13
- Version 2.0, January 2004
14
- http://www.apache.org/licenses/
15
-
16
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
17
-
18
- 1. Definitions.
19
-
20
- "License" shall mean the terms and conditions for use, reproduction,
21
- and distribution as defined by Sections 1 through 9 of this document.
22
-
23
- "Licensor" shall mean the copyright owner or entity authorized by
24
- the copyright owner that is granting the License.
25
-
26
- "Legal Entity" shall mean the union of the acting entity and all
27
- other entities that control, are controlled by, or are under common
28
- control with that entity. For the purposes of this definition,
29
- "control" means (i) the power, direct or indirect, to cause the
30
- direction or management of such entity, whether by contract or
31
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
32
- outstanding shares, or (iii) beneficial ownership of such entity.
33
-
34
- "You" (or "Your") shall mean an individual or Legal Entity
35
- exercising permissions granted by this License.
36
-
37
- "Source" form shall mean the preferred form for making modifications,
38
- including but not limited to software source code, documentation
39
- source, and configuration files.
40
-
41
- "Object" form shall mean any form resulting from mechanical
42
- transformation or translation of a Source form, including but
43
- not limited to compiled object code, generated documentation,
44
- and conversions to other media types.
45
-
46
- "Work" shall mean the work of authorship, whether in Source or
47
- Object form, made available under the License, as indicated by a
48
- copyright notice that is included in or attached to the work
49
- (an example is provided in the Appendix below).
50
-
51
- "Derivative Works" shall mean any work, whether in Source or Object
52
- form, that is based on (or derived from) the Work and for which the
53
- editorial revisions, annotations, elaborations, or other modifications
54
- represent, as a whole, an original work of authorship. For the purposes
55
- of this License, Derivative Works shall not include works that remain
56
- separable from, or merely link (or bind by name) to the interfaces of,
57
- the Work and Derivative Works thereof.
58
-
59
- "Contribution" shall mean any work of authorship, including
60
- the original version of the Work and any modifications or additions
61
- to that Work or Derivative Works thereof, that is intentionally
62
- submitted to Licensor for inclusion in the Work by the copyright owner
63
- or by an individual or Legal Entity authorized to submit on behalf of
64
- the copyright owner. For the purposes of this definition, "submitted"
65
- means any form of electronic, verbal, or written communication sent
66
- to the Licensor or its representatives, including but not limited to
67
- communication on electronic mailing lists, source code control systems,
68
- and issue tracking systems that are managed by, or on behalf of, the
69
- Licensor for the purpose of discussing and improving the Work, but
70
- excluding communication that is conspicuously marked or otherwise
71
- designated in writing by the copyright owner as "Not a Contribution."
72
-
73
- "Contributor" shall mean Licensor and any individual or Legal Entity
74
- on behalf of whom a Contribution has been received by Licensor and
75
- subsequently incorporated within the Work.
76
-
77
- 2. Grant of Copyright License. Subject to the terms and conditions of
78
- this License, each Contributor hereby grants to You a perpetual,
79
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
80
- copyright license to reproduce, prepare Derivative Works of,
81
- publicly display, publicly perform, sublicense, and distribute the
82
- Work and such Derivative Works in Source or Object form.
83
-
84
- 3. Grant of Patent License. Subject to the terms and conditions of
85
- this License, each Contributor hereby grants to You a perpetual,
86
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
87
- (except as stated in this section) patent license to make, have made,
88
- use, offer to sell, sell, import, and otherwise transfer the Work,
89
- where such license applies only to those patent claims licensable
90
- by such Contributor that are necessarily infringed by their
91
- Contribution(s) alone or by combination of their Contribution(s)
92
- with the Work to which such Contribution(s) was submitted. If You
93
- institute patent litigation against any entity (including a
94
- cross-claim or counterclaim in a lawsuit) alleging that the Work
95
- or a Contribution incorporated within the Work constitutes direct
96
- or contributory patent infringement, then any patent licenses
97
- granted to You under this License for that Work shall terminate
98
- as of the date such litigation is filed.
99
-
100
- 4. Redistribution. You may reproduce and distribute copies of the
101
- Work or Derivative Works thereof in any medium, with or without
102
- modifications, and in Source or Object form, provided that You
103
- meet the following conditions:
104
-
105
- (a) You must give any other recipients of the Work or
106
- Derivative Works a copy of this License; and
107
-
108
- (b) You must cause any modified files to carry prominent notices
109
- stating that You changed the files; and
110
-
111
- (c) You must retain, in the Source form of any Derivative Works
112
- that You distribute, all copyright, patent, trademark, and
113
- attribution notices from the Source form of the Work,
114
- excluding those notices that do not pertain to any part of
115
- the Derivative Works; and
116
-
117
- (d) If the Work includes a "NOTICE" text file as part of its
118
- distribution, then any Derivative Works that You distribute must
119
- include a readable copy of the attribution notices contained
120
- within such NOTICE file, excluding those notices that do not
121
- pertain to any part of the Derivative Works, in at least one
122
- of the following places: within a NOTICE text file distributed
123
- as part of the Derivative Works; within the Source form or
124
- documentation, if provided along with the Derivative Works; or,
125
- within a display generated by the Derivative Works, if and
126
- wherever such third-party notices normally appear. The contents
127
- of the NOTICE file are for informational purposes only and
128
- do not modify the License. You may add Your own attribution
129
- notices within Derivative Works that You distribute, alongside
130
- or as an addendum to the NOTICE text from the Work, provided
131
- that such additional attribution notices cannot be construed
132
- as modifying the License.
133
-
134
- You may add Your own copyright statement to Your modifications and
135
- may provide additional or different license terms and conditions
136
- for use, reproduction, or distribution of Your modifications, or
137
- for any such Derivative Works as a whole, provided Your use,
138
- reproduction, and distribution of the Work otherwise complies with
139
- the conditions stated in this License.
140
-
141
- 5. Submission of Contributions. Unless You explicitly state otherwise,
142
- any Contribution intentionally submitted for inclusion in the Work
143
- by You to the Licensor shall be under the terms and conditions of
144
- this License, without any additional terms or conditions.
145
- Notwithstanding the above, nothing herein shall supersede or modify
146
- the terms of any separate license agreement you may have executed
147
- with Licensor regarding such Contributions.
148
-
149
- 6. Trademarks. This License does not grant permission to use the trade
150
- names, trademarks, service marks, or product names of the Licensor,
151
- except as required for reasonable and customary use in describing the
152
- origin of the Work and reproducing the content of the NOTICE file.
153
-
154
- 7. Disclaimer of Warranty. Unless required by applicable law or
155
- agreed to in writing, Licensor provides the Work (and each
156
- Contributor provides its Contributions) on an "AS IS" BASIS,
157
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
158
- implied, including, without limitation, any warranties or conditions
159
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
160
- PARTICULAR PURPOSE. You are solely responsible for determining the
161
- appropriateness of using or redistributing the Work and assume any
162
- risks associated with Your exercise of permissions under this License.
163
-
164
- 8. Limitation of Liability. In no event and under no legal theory,
165
- whether in tort (including negligence), contract, or otherwise,
166
- unless required by applicable law (such as deliberate and grossly
167
- negligent acts) or agreed to in writing, shall any Contributor be
168
- liable to You for damages, including any direct, indirect, special,
169
- incidental, or consequential damages of any character arising as a
170
- result of this License or out of the use or inability to use the
171
- Work (including but not limited to damages for loss of goodwill,
172
- work stoppage, computer failure or malfunction, or any and all
173
- other commercial damages or losses), even if such Contributor
174
- has been advised of the possibility of such damages.
175
-
176
- 9. Accepting Warranty or Additional Liability. While redistributing
177
- the Work or Derivative Works thereof, You may choose to offer,
178
- and charge a fee for, acceptance of support, warranty, indemnity,
179
- or other liability obligations and/or rights consistent with this
180
- License. However, in accepting such obligations, You may act only
181
- on Your own behalf and on Your sole responsibility, not on behalf
182
- of any other Contributor, and only if You agree to indemnify,
183
- defend, and hold each Contributor harmless for any liability
184
- incurred by, or claims asserted against, such Contributor by reason
185
- of your accepting any such warranty or additional liability.
186
-
187
- END OF TERMS AND CONDITIONS
188
-
189
- APPENDIX: How to apply the Apache License to your work.
190
-
191
- To apply the Apache License to your work, attach the following
192
- boilerplate notice, with the fields enclosed by brackets "[]"
193
- replaced with your own identifying information. (Don't include
194
- the brackets!) The text should be enclosed in the appropriate
195
- comment syntax for the file format. We also recommend that a
196
- file or class name and description of purpose be included on the
197
- same "printed page" as the copyright notice for easier
198
- identification within third-party archives.
199
-
200
- Copyright 2016, The Authors.
201
-
202
- Licensed under the Apache License, Version 2.0 (the "License");
203
- you may not use this file except in compliance with the License.
204
- You may obtain a copy of the License at
205
-
206
- http://www.apache.org/licenses/LICENSE-2.0
207
-
208
- Unless required by applicable law or agreed to in writing, software
209
- distributed under the License is distributed on an "AS IS" BASIS,
210
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
211
- See the License for the specific language governing permissions and
212
- limitations under the License.