Compare commits

...

451 Commits

Author SHA1 Message Date
7e49290a07 updated pre defined classes in labelImg 2023-02-21 21:53:37 +05:30
a52800deb9 Add 'labelImg/' from commit 'b33f965b6d14c14f1e46b247f1bf346e03f2e950'
git-subtree-dir: labelImg
git-subtree-mainline: dbe80aca780253f6ee1e5a2f8686407ca179e921
git-subtree-split: b33f965b6d14c14f1e46b247f1bf346e03f2e950
2023-02-21 21:52:18 +05:30
Lauren Sell
b33f965b6d
Readme updates (#950)
Adds information about Label Studio community to welcome LabelImg users
2022-09-22 15:12:32 -07:00
Ding
2d5537bad5
docs: update virtualenv section of readme (#911) 2022-07-09 19:53:33 -07:00
dependabot[bot]
dcc5e23485
Bump lxml from 4.6.5 to 4.9.1 in /requirements (#909)
Bumps [lxml](https://github.com/lxml/lxml) from 4.6.5 to 4.9.1.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.6.5...lxml-4.9.1)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-06 18:47:50 -07:00
s_teja
5bc7fb9a9c
CreateML fixes (#906)
Support createML format
2022-07-05 13:48:10 -07:00
tzutalin
eb603c29e1 Fix unexpected type 'float' labelImg in labelDialog 2022-06-18 23:38:03 -07:00
tzutalin
1c94399b91 Fix wrong link for different readme in diffeerent locales 2022-06-14 23:12:04 -07:00
tzutalin
dd6e530961 Update build badge 2022-06-14 23:07:24 -07:00
tzutalin
5a3899c2e0 Update README 2022-06-14 22:56:28 -07:00
tzutalin
3a360ad8f5 Revert "Create pylint.yml"
This reverts commit 1efa3d80d2e2f1820c635ed9b074155bf22a2558.
2022-06-14 22:39:47 -07:00
Ryan Hirasaki
62e0da6824
Replace Travis CI with GitHub Actions, and make Windows/Linux builds. (#896) 2022-06-14 22:37:49 -07:00
darrenl
1efa3d80d2
Create pylint.yml 2022-06-14 22:37:24 -07:00
tzutalin
bc8041946a Updated translations 2022-06-12 10:41:54 -07:00
tzutalin
267c465eb2 Update .gitignore 2022-06-12 10:31:38 -07:00
tzutalin
94212951ee Switch to travis-ci.com 2022-06-12 10:21:53 -07:00
Stefan Breunig
0c377fc258
move "OK" button below cursor when opening label dialog (#893)
The intent for this change is to allow faster labeling when there
are streaks of the same label occasionally, but not consistently
enough to enable "default label" mode. With this PR the user can
simply click again to confirm the previous selection, without
having to aim for the OK button, or move either hand to the
ENTER button.

The alignment and position change of the buttons is for two reasons:
- it covers less of the drawn shape, easing verification of the
  label to be selected
- the alignment wasn't taken into account for offset calculation.
  It works if the dialog is shown, but that causes the dialog to
  briefly flicker in the old position. Presumably an `adjustSize`
  or similar is needed on more widgets, but I was unable to
  figure out which.
2022-06-12 10:12:19 -07:00
Stefan Breunig
981be1f9c4
consider scale when panning image (#892)
The previous variant calculates the delta by checking how many
"image pixels" the cursor was moved, and then emit an absolute
scrollbar move based on that. However, when zoomed in a single
image pixel can be multiple scroll bar units.

The effect was that panning a zoomed in image was very slow,
giving a rubber band kind of effect. Wiggling the mouse would emit
more deltas, eventually moving the image below the cursor again.

This PR uses the absolute coordinates instead, which keeps the
image closer to the cursor. There is still a slight rubber band
effect, probably due to slight differences between painter and
scroll bar positions/units.

The result is that panning a zoomed in image feels less sluggish.
2022-06-12 10:09:22 -07:00
Stefan Breunig
efd90a481b
also clear highlights when loading a new image (#891)
This fixes a crash with the following steps to reproduce:
1. highlight a vertex or shape with the cursor
2. swap image using keyboard controls (i.e. press D)
3. left click on image without moving cursor. No shape may be below
   cursor.

What happens is that the canvas will emit a selection signal for
the shape from the previous image, which then can't be found anymore
in `shapes_to_items`, causing this error:

```
Traceback (most recent call last):
  File "/home/stefan/code/labelImg/./labelImg.py", line 806, in shape_selection_changed
    self.shapes_to_items[shape].setSelected(True)
KeyError: <libs.shape.Shape object at 0x7fdb281d06a0>
```

This builds upon the fix from #858, which fixed the issue for
selected shapes, but not highlights.
2022-06-12 10:05:42 -07:00
Stefan Breunig
9e06d10b94
prefer selected shape when highlighting vertexes or shapes (#890)
The use case is adjusting shapes by moving their vertexes, even if
they are adjacent or overlapping another shape. Currently always
the "later drawn" shape wins, making it impossible to adjust an
earlier shape without re-creating it. Adjusting existing shapes is
common for review scenarios.

I have experimented with preferring the highlighted shape, but
I found it finicky and less clear as to how the vertex preference
works. JOSM (and OpenStreetMap editor) also uses the "prefer
selected" approach and it works well there.
2022-06-12 10:05:06 -07:00
Stefan Breunig
1fca69f0b3
actually find nearest point of shape (#889)
For any shape with a dimension smaller than 2*epsilon, there can be
multiple potential points to select from. In practice this resulted
in e.g. the top right corner being highlighted when the cursor was
placed below the bottom right corner.
2022-06-12 10:03:14 -07:00
Stefan Breunig
e2d758f540
add brightness controls (#888)
Closes #860
2022-06-12 10:01:41 -07:00
Zhang Ch. N
861fbe9a2b
UX: Increase size of vertex controls around shape (#863)
* Increase shape vertex control size

* Increase canvas epsilon
2022-04-29 23:38:55 -07:00
Ozan-Alp
1a3313842c
Fixed delete selected shape error. (#858)
Co-authored-by: OZAN ALP (096023) <ozanalp@thy.com>
2022-04-15 07:45:42 -07:00
nine
784144aa29
Fixes deleting an image (cf. #822) (#861)
Co-authored-by: Erwin Nindl <erwin@nindl.net>
2022-03-27 10:04:09 -07:00
PTA00
0bc7a462d9
[tested]Fixed open file dialog cancel error. (#856)
* Fix

Error "IndexError: list index out of range"  occurs when there is no "predefined_classes.txt".

* Fix an error when default label is null.

Error "IndexError: list index out of range"  occurs when there is no "/data/predefined_classes.txt".

* Update README.rst

ADD: Package as a separate exe file method.

* Fixed an error after opening a file to cancel

The cause of the error:
QFileDialog.getOpenFileName(...) second parameter required cannot be empty.
2022-03-08 21:53:45 -08:00
PTA00
9e4a4b711e
Problems found while packaging as binaries.Has been tested. (#855)
* Fix

Error "IndexError: list index out of range"  occurs when there is no "predefined_classes.txt".

* Fix an error when default label is null.

Error "IndexError: list index out of range"  occurs when there is no "/data/predefined_classes.txt".

* Update README.rst

ADD: Package as a separate exe file method.
2022-03-07 22:56:10 -08:00
tzutalin
0f111e643a Change locale.getlocale() to locale.getdefaultlocale() 2022-03-07 17:54:53 -08:00
tzutalin
dd6781656c update translations for zh-CN 2022-03-07 16:55:26 -08:00
tzutalin
d685e50269 fix missing imports 2022-02-22 22:23:10 -08:00
Paul Anton Letnes
ca3a3accdd
remove unused import statements (#845)
To reduce clutter, all unused imports were removed. On the affected
files, imports were also reordered to be PEP8 sorted.
2022-02-17 11:18:21 -08:00
Aditya Kumar
276f40f5e5
Modified the default label text box into a drop down (#824)
* Modified the default label text box into a drop down

* Unchecked the box at startup

* Removed commented code

* Removed unnecessary update method for the combobox

* Changed naming style for class
2022-01-26 08:18:13 -08:00
Paul Anton Letnes
c35efbd480
convert floating point values of zoom level to int (#840)
In some cases, arithmetic results (in particular from division) on zoom
levels return floats; however, the PyQt API requires int values to
function correctly. Therefore, explicit conversion to int or integer
division has been added for these cases.

A behavior bug causing sudden crashes was fixed. When a rectangular box
is dragged with the right mouse button, but the left mouse button is
touched prior to release of the right mouse button, the  program
crashed. The root cause seems to be that this deselects the dragged
object so it is no longer available (i.e. `self.canvas.selected_shape is
None`). The new behavior does nothing / cancels the operation if this
occurs.

Added a shortcut for switching file format (CTRL+Y) since I often use
this functionality.
2022-01-26 08:17:27 -08:00
Sam.An
98e88371ad
Fix opening next image error (#835)
* Fix draw annotations error

* Fix opening next image
2021-12-28 09:10:38 -08:00
Sam.An
5c38b6bcdd
Fix draw annotations error (#833) 2021-12-27 19:05:21 -08:00
dependabot[bot]
b1e13347dd
Bump lxml from 4.6.3 to 4.6.5 in /requirements (#830)
Bumps [lxml](https://github.com/lxml/lxml) from 4.6.3 to 4.6.5.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.6.3...lxml-4.6.5)

---
updated-dependencies:
- dependency-name: lxml
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-26 21:04:23 -08:00
Stefan Breunig
9f2765e97b
fix h_vertex being kept after deleting shape, causing a crash if used (#832)
Steps to reproduce this particular issue:

1. draw a box
2. select the box
3. hover over one of the corners as if you want to resize the box (no click needed)
4. press DEL to delete the box
5. left click on the canvas

Note there are two more destructive operations on the canvas' `shape` in
`undo_last_line` and `reset_all_lines`, but former is dead code and latter
I don't know how to trigger. Thus I can't be sure un-highlighting will not
lead to visual glitches.

There are other potential fixes, e.g. checking in `selected_vertex`. I can
rework the patch, but then again, the fix is so straight forward that telling
me is probably more effort than just rewriting it.

See #750
See #605
2021-12-26 20:48:39 -08:00
HLiang
39ecb789a7
correct initial img_count (#817)
fixes issue https://github.com/tzutalin/labelImg/issues/816
2021-11-19 21:43:57 -08:00
Thinh Phan
d4030a71af
Update README.rst (#813)
Add "Annotation visualization"
2021-11-18 11:53:18 -08:00
Thinh Phan
aa529c3d38
Update requirements-linux-python3.txt (#812)
Update version of pyqt5
2021-11-18 09:04:44 -08:00
Naelson Douglas C. Oliveira
e9dbbd80bc
removed a default mutable argument pitfall (#809) 2021-10-31 08:21:18 -07:00
tzutalin
1ab8241d0e bump version to 1.8.6 2021-10-11 13:15:19 -07:00
Tiger Nie
3f53dce960
display bbox width and height while resizing, moving and hovering over (#798)
shape.
2021-10-11 13:04:40 -07:00
tzutalin
7457d58249 update instruction to install with pipenv 2021-10-11 13:04:03 -07:00
Enzo Di Tizio
cc8fd5a703
Changing installation methods order (#796)
Just to put the easiest one first.
2021-10-03 11:25:56 -07:00
ngc92
58406b578a
adds a utility function to hide a QT5/QT4 discrepancy (#765)
Co-authored-by: erik <ersre>
2021-07-25 09:09:01 -07:00
Keito Tobichi
c5971bffab
Japanese Translation Fix. (#760)
* fix.

* small fix.

* translation fix.

* shortcut fix.
2021-07-17 20:45:26 -07:00
Keito Tobichi
250de4bef8
Add Locale: Japanese (#756)
* [wip]japanese translation file.

* [wip]fixed japanese translation.

* create README.jp.rst

* add locale ja-JP.

* Removed Locale Data.
2021-06-27 14:42:27 -07:00
darrenl
d3e502439c
Update no-response.yml 2021-06-06 07:50:01 -07:00
tzutalin
ff681f7054 Remove unused code and add short cut link 2021-05-11 09:39:28 -07:00
WEN Hao
91c23d0a9d
Use webbrowser instead of get_available_screencast_viewer (#745)
* improve opening tutorial

* improve show_tutorial_dialog

* improve show_tutorial_dialog

* remove not implemented

* remove unncessary package QtWebEngineWidgets

* remove commented import of QtWebEngineWidgets
2021-05-11 09:20:54 -07:00
tzutalin
c4e8cd8390 Add .github/no-response.yml 2021-05-01 08:14:54 -07:00
Denis
4bf5c4528c
Fix deletion of image caused selection of the first image (#742)
Also removed the call to self.import_dir_images method that reloaded all
of the images in directory.
2021-04-28 07:22:14 -07:00
Denis
6b5c3c634b
Implement image counter. (#734)
* Introduced two new attributes of MainWindow:
  cur_img_idx - Index of current image in m_img_list.
  img_count   - Length of m_img_list.

* Implement counter_str method to get string representation of counter.

* Appended counter to window title.

* Based image switching logic on counter instead of local variables.

* Removed useless condition.
  current_index = self.m_img_list.index(ustr(item.text()))
  if current_index < len(self.m_img_list):
  list.index will raise ValueError if item doesn't exist.
2021-04-26 22:18:56 -07:00
tzutalin
0c09c7c5d1 Bump to 1.8.5 2021-04-11 22:36:08 -07:00
tzutalin
bf1da53b21 Update zh readme 2021-04-11 22:17:05 -07:00
tzutalin
61d19bd563 add zh readme 2021-04-11 22:13:07 -07:00
tzutalin
ec23bb42ce Update unit test to fix error and fix icon issue 2021-04-10 08:34:55 -07:00
Denis
62585531ca
Fix incorrect path handling (#731)
* Fix incorrect save dir path handling for ML format.

Save dir path was split by incorrect os.dependent separator '/'
which was the cause of labels being saved to parent folder.

* Implement path normalization for command arguments.

Renamed 'predefined_classes_file' parameter to 'class_file'.
2021-04-07 22:01:55 -07:00
Denis
0573a39ec3
Fix rounding issue that caused 1px box shift for YOLO format. (#730) 2021-04-06 16:38:48 -07:00
dependabot[bot]
3425fefd8d
Bump lxml from 4.6.2 to 4.6.3 in /requirements (#728)
Bumps [lxml](https://github.com/lxml/lxml) from 4.6.2 to 4.6.3.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.6.2...lxml-4.6.3)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-04-01 07:51:40 -07:00
Thijs van den Berg
34ed6a3a2a
Change encoding. Fix for #676 (#722)
First read the file in binary mode. Then, convert to utf-8. Fix for https://github.com/tzutalin/labelImg/issues/676
2021-04-01 07:50:00 -07:00
Cerno_b
c35f09747a
Pep 8 (#720)
* rename local variables in main file

* additional renaming of functions and variables

* Rename main file functions

* Rename functions and variables in canvas.py

* Rename functions and locals for remaining files

* Rename non-Qt derived class' members

* Rename members of Qt-derived classes

* Fix paint label issue
2021-03-14 16:56:14 -07:00
Christian Clauss
ef05452f7c
Travis CI: Trusty, Python 3.5, and sudo on Travis are all end of life (#719)
* Travis CI: Trusty, Python 3.5, and sudo on Travis are all end of life

* Matrix —> jobs

* python: does no work on macOS
2021-03-08 16:28:31 -08:00
tzutalin
4993dcb9e9 Update README 2021-02-28 11:13:14 -08:00
tzutalin
d8fdd478ef move convert dir to tools dir 2021-02-28 11:06:15 -08:00
Tomas SP
bfda006576
Mac os pipenv installation documentation bug fix (#711)
Fix mac os pipenv installation documentation

Co-authored-by: Tomás Sousa Pereira <up201507414@fe.up.pt>
2021-02-28 11:00:08 -08:00
Justin Ruan
144afe6b49
Add label_to_csv.py to convert txt or xml files to csv. Also, add the (#704)
README.md to tell how to do the transformation
2021-02-28 10:59:44 -08:00
dependabot[bot]
ebb2b83387
Bump lxml from 4.2.4 to 4.6.2 in /requirements (#694)
Bumps [lxml](https://github.com/lxml/lxml) from 4.2.4 to 4.6.2.
- [Release notes](https://github.com/lxml/lxml/releases)
- [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt)
- [Commits](https://github.com/lxml/lxml/compare/lxml-4.2.4...lxml-4.6.2)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-01-09 09:30:33 -08:00
LiXiaolin
eb4857f834
Translate texts on menu bar (#695) 2021-01-09 09:30:04 -08:00
chenghsiung
5d6557f994
Adaptively adjust label size (#678)
* Adjust label font size based on image size

* Adjust the upper boundary of the painted label

* Set font size based on both image width & height
2021-01-01 11:54:27 -08:00
darrenl
0a581ef7e9
Update README.rst 2021-01-01 11:24:08 -08:00
tzutalin
a64cbcae03 Updated history 2020-11-14 23:25:29 -08:00
tzutalin
e1c67fc0c3 Bump to 1.8.4 2020-11-14 23:17:25 -08:00
tzutalin
a86093ca60 Updated README 2020-11-14 22:51:44 -08:00
tzutalin
e13d154ad8 Fixed Autosave did not work as it does not use a proper file path separator 2020-11-14 09:05:33 -08:00
enicck
31463497c8
Adds create-ml format support (#651)
* adds createMl reader & writer class

* adds getFormatMeta function to support more than two save_format

* adds CreateML read & write support

* adds format CreateML icon

* fixes negative height/width

* removes type hints

* fixes coordinate calculation

* adds unit test

* removes typehint
2020-10-02 06:56:07 -07:00
tzutalin
d3486864fe update hotkey in readme 2020-09-26 11:22:20 -07:00
tzutalin
949e46cec4 change delete image hotkey 2020-09-26 11:15:30 -07:00
EuihyunLee
058d7a7e80
Read via QImageReader (#650)
* Now read via QImageReader

* Remove comment-out unused lines
2020-09-26 11:03:04 -07:00
tzutalin
08db03a36d rename functions 2020-09-12 10:59:57 -07:00
Crystal Silva Campos
12dadc67cd
Add ctrl+v hotkey to be able copy the bounding boxes from the previous image to the current (#627)
* Add previous bounding boxes code

* Create method to avoid repeated code

* Fix text in the action copyprevbounding

* Add description for different languages
2020-09-12 10:49:21 -07:00
Chris Rapson (AT)
39b0d68f09 Improve MessageBox when clicking Next/Prev without saving image 2020-09-12 00:15:20 -07:00
Chris Rapson (AT)
544cfb9e3c adjust position of popup labelDialog to make sure it is within edge of main window 2020-09-12 00:15:20 -07:00
Chris Rapson (AT)
5a7e3f8f4e allow panning by clicking and dragginng outside existing boxes 2020-09-12 00:15:20 -07:00
tzutalin
0e905160fe Changing format enables save button 2020-08-02 00:18:34 -07:00
tzutalin
f387c5932b use enum for label file formats 2020-08-02 00:14:18 -07:00
Laszlo Treszkai
196bd46828 Save used labeling format in settings 2020-08-01 23:44:36 -07:00
Laszlo Treszkai
b21b48e640 Parse command-line arguments using argparse 2020-08-01 23:44:36 -07:00
Rohit Lal
1a9b489bb4 updated anaconda installation instructions 2020-08-01 23:42:58 -07:00
Keechin G
bd5c2a46ba Update GitIgnore / .DS_Store Removal 2020-07-17 08:26:27 -07:00
tzutalin
03ef7c760c Add Stargazers over time in README.md 2020-07-12 19:37:46 -07:00
tzutalin
60ae6067ea Update zh translation and format code a little bit 2020-07-01 18:18:19 -07:00
heis2201
80e9722747 Added hint on install method on Linux
In the list of install options, in my opinion, it is not so clear which install method an end-user should choose (at least for Linux users). Python3 is now standard on basically any Linux distro, so the install from PyPI using pip3 install should work out the box in a vast majority of distros. I tested it for Fedora32.
2020-07-01 17:16:56 -07:00
Kirill Kalashnikov
9fca0b5e92 added delete image button 2020-07-01 17:16:18 -07:00
stephi
7cc5241664 strip string of detection values 2020-07-01 17:13:52 -07:00
tzutalin
7532f1ed87 removed python2 build from travis.yml and upgraded Anaconda3 for travis 2020-05-23 11:59:40 -07:00
tzutalin
500367c550 update strings and removed intersectingEdges 2020-05-18 08:52:42 -07:00
Adwait Bhope
9bebf84986 Change mouse event behaviour for point outside canvas 2020-05-18 08:43:05 -07:00
Mehrad Mahmoudian
5816f71157 [add] adding instruction on how to force reset the class settings to the README 2020-05-02 09:57:58 -07:00
Alice_space
49334ed9e3 fix typo 2020-04-24 08:13:13 -07:00
BIASUTTI Pierre
45078ac670 Added annotation width and height in toolbar while drawing. 2020-02-15 13:48:28 -08:00
Hakan Karaoguz
a74b00c219 Fixed import error for PyQt4 2020-01-10 08:51:12 -08:00
Hakan Karaoguz
c4f4fb3b7a Added missing import 2020-01-10 08:51:12 -08:00
Hakan Karaoguz
6c34a6c3e7 Update imports and added PyQt4 support 2020-01-10 08:51:12 -08:00
Hakan Karaoguz
e51bfce9a7 Added combobox to the main view for displaying unique labels individually 2020-01-10 08:51:12 -08:00
tzutalin
bf8cc1d575 Fixed a pyqt5 version to avoid build error for pipenv 2019-12-22 22:31:46 -08:00
Eetu Silvennoinen
731735f187 Update labelImg.py
Fixed a comment typo.
2019-10-28 18:23:14 -07:00
Michal Skreczko
a124c75df5 Fixed typo 2019-10-05 00:28:24 -07:00
Eduard Tamsa
157a4173f3 Add Silent option for openDirDialog
Add Silent option for openDirDialog to facilitate opening a directory at start up
    if the filePath provided is a directory without opening the file selector UI.
2019-10-04 20:30:42 -07:00
Gary Yang
53a78e2c93 Update README.rst to fix bug in instruction
Fix bug in pyqt5 compilation for windows
Changed "For pyqt5, pyrcc5 -o libs/resources.py resources qrc" to "For pyqt5, pyrcc5 -o libs/resources.py resources.qrc"
2019-08-28 09:46:49 -07:00
blueharen
22f1d7be0a typo 2019-08-02 08:40:31 -07:00
darrenl
883174f458
Update README.rst 2019-07-30 19:50:55 -07:00
GGDRriedel
c1c1dbef31 Fixed Windows+ Anaconda pyrcc5 compile command
added changes from https://github.com/tzutalin/labelImg/issues/475
2019-06-05 08:21:49 -07:00
darrenl
87c110a59c
Update README.rst 2019-06-02 16:29:39 -07:00
tzutalin
a1a32f6230 Update README.md and setup.py 2019-05-25 21:15:17 -07:00
tzutalin
3ecc86029b Fix build error 2019-05-25 14:56:25 -07:00
tzutalin
add1d9972c Fix typo 2019-05-25 14:38:32 -07:00
tzutalin
fd79454dc9 UPdate readme 2019-05-25 14:33:09 -07:00
tzutalin
5b9d2bf9b6 Update setup.py 2019-05-25 14:29:16 -07:00
tzutalin
8689a16f3d By default, use py3 qt5 to build 2019-05-25 14:14:49 -07:00
xdzhou
551fc7e00d Fix bug: An index error after select a directory when open a new file. 2019-05-22 15:02:20 -07:00
tzutalin
6afd15aa88 Update icons, README. Add zh-CN locale 2019-04-21 12:53:57 -07:00
Jorlogicus
cf5c3d5bbb Update README.rst 2019-04-21 11:53:36 -07:00
Jorlogicus
a38aef2a69 Update README.rst 2019-04-21 11:53:36 -07:00
Jorlogicus
30ab4a34e8 Update README.rst 2019-04-21 11:53:36 -07:00
Jorlogicus
90f81c6a90 Delete resource_Vertical.png 2019-04-21 11:53:36 -07:00
Jorlogicus
cf6da18f92 Delete resource_.png 2019-04-21 11:53:36 -07:00
Jorlogicus
a18f3308ce Add files via upload 2019-04-21 11:53:36 -07:00
Jorlogicus
d980e6b202 Delete resource_Horizontal.png 2019-04-21 11:53:36 -07:00
Jorlogicus
9041c044c9 Delete test 2019-04-21 11:53:36 -07:00
Jorlogicus
1469da8f50 Add files via upload 2019-04-21 11:53:36 -07:00
Jorlogicus
6fe1d8b993 Create test 2019-04-21 11:53:36 -07:00
Karan Maheshwari
6d937267e6 Update README.rst
I have given the simplest  steps for Mac OS which runs the program from command line.
 Mac OS easiest way to install and run 
STEPS

git clone https://github.com/tzutalin/labelImg
pip install PyQt5 lxml
cd labelImg    ##(enter the labelImg directory)
make qt5py3
python3 labelImg.py
2019-04-13 09:48:49 -07:00
Saber Derouiche
d1d3526fe7 readme.md for "difficult" and "Verify Image"
Added documentation to the readme.md for what "difficult" and "Verify Image"
2019-02-08 07:36:21 -08:00
tzutalin
ca28daddec Rename lib.py to utils.py and add test cases for natural sort 2019-01-26 23:16:21 -08:00
Lieven Govaerts
054f63f6f9 Show the file list in natural sorted order ( f1->f8->f9->f10 instead of f1->f10->f8->f9 ).
* labelImg.py
  (natural_sort): New function, copied from S.O.:
  https://stackoverflow.com/questions/4836710/does-python-have-a-built-in-function-for-string-natural-sort?answertab=votes#tab-top
  (scanAllImages): Return the image file list in natural sorted order.
2019-01-26 22:21:14 -08:00
Lieven Govaerts
ba12d85798 Avoid crash on "Edit Label" when there's no bounding boxes left.
The scenario is:
1. Open an image
2. Delete all bounding boxes
3. Select "Edit Label".

* labelImg.py
  (editLabel): Avoid crash zhen there's no currently selected item.
2019-01-26 22:15:03 -08:00
Joakim Eriksson
c2aca6e1d3 added float parsing before int conversion to enable support of VOC files that specify coordinates in float 2019-01-05 00:33:54 -08:00
Lieven Govaerts
4bb6be6986 Ensure a vertex always stays within the boundaries of the canvas. 2019-01-03 22:48:13 -08:00
yangjiangjie
a0fa187eff Update ustr.py 2019-01-03 22:06:57 -08:00
tzutalin
d27e6a5dfa fix the crash when providing invalid locale in env 2018-12-28 10:07:59 -08:00
Lieven Govaerts
40b30f1cee labelImg.py/loadLabels: correct shapes that are out of image bounds. 2018-12-28 09:28:14 -08:00
Saksham Dhull
e18ccf3be1 Minor correction in spelling.
Changed "labtel" to "label"
2018-12-18 16:00:33 -08:00
tzutalin
3f14cbf451 Update the version to v1.8.1 2018-12-02 21:21:00 -08:00
tzutalin
255afca1b3 Fix empty locale on windows platform 2018-12-02 21:10:15 -08:00
tzutalin
6db1dd500d FIx issue#403 2018-12-02 20:27:16 -08:00
tzutalin
eaac031404 Move icons to resource folder, fix the unicode issue, support zh-tw lang 2018-12-01 00:45:50 -08:00
Maxim Smirnov
13a700ad53 Fix program start when re-started without the second monitor.
When labelImg was closed on the second monitor, and later opened when it is disabled, it is impossible to see the app window.
2018-11-26 21:58:19 -08:00
tzutalin
699125aa5c workaroud for failure of loading setting 2018-11-18 09:51:24 -08:00
tzutalin
2df7b6e402 Fix issue serializing qstring in pscal_voc_io.py 2018-11-18 09:28:38 -08:00
tzutalin
f563c164d0 Create a const for encoding and fix an issue in yolo format according to pr#387 2018-11-04 20:13:34 -08:00
tzutalin
40ea8e7801 Fix travis build error 2018-10-28 20:08:42 -07:00
tzutalin
c881f2e1c8 Fix build error due to travis 2018-10-22 09:39:38 -07:00
tzutalin
d14d3b06df Update v1.8.0 2018-10-21 21:39:14 -07:00
Antoine Broyelle
4e278bb511 feature: draw square bounding boxes 2018-10-19 23:32:18 -07:00
tzutalin
5abf660222 Update README.md and create a folder for dependency requirements 2018-09-30 22:25:04 -07:00
Robert-Jan Bruintjes
ea30bf97af Add requirements file for Python3-Qt5 installation.
Update README with new instructions.
2018-09-30 21:48:29 -07:00
ap193uee
c88eb28e7c Added offset to label's y-pos so that the label does not overflow the image (#324) 2018-07-09 19:48:57 -07:00
vdalv
4f84f68b96 Fix issue #287 and a typo 2018-06-23 01:14:30 -07:00
wenliwyan
5f9f17f9b4 Add item single click slot in labelDialog.py (#312)
* Add item single click slot in labelDialog.py

In the original code, double clicking a list item will set the text property and automatically validate afterwards, with the label dialog window disappearing.

In this revised version, double click behavior is unchanged, while single click is added. When single clicking a list item, it will only set text in the QLineEdit. Users can change the text by clicking other items before validating themselves by clicking yes.
2018-06-13 21:13:28 -07:00
tzutalin
8b0f76f6c0 Fix unicode string issues 2018-05-18 23:34:59 -07:00
vdalv
e7a7b64f7e Add option to enable/disable label painting 2018-05-18 22:51:57 -07:00
vdalv
219e50dbfc Fix verify image issue 248 2018-05-18 22:51:32 -07:00
vdalv
508a4c8b37 Fix save dialog issue - #300 2018-05-18 22:51:00 -07:00
vdalv
fef4e6b057 Fix file save issue - #293 2018-05-18 22:50:45 -07:00
sebasrivera96
542b87fd0a Update saveLevels function to add an extension just when needed 2018-05-18 22:48:03 -07:00
Sebastian Rivera
96c723c139 Remove lines on saveLabels function to save correctly XML files 2018-05-18 22:48:03 -07:00
Sebastian Rivera
515a3f6606 Modify labelImg.py to solve an error when naming the .xml file
A line was commented out because there was an error. When a box was drawn
around an object and then saved, the file had a termination
".xml.xml" instead of just ".xml".
2018-05-18 22:48:03 -07:00
vdalv
5d59f6cfb2 Update the Windows + Anaconda install instructions 2018-05-18 22:46:29 -07:00
Nhan Cao
7a8e6a0c7a Update README.rst 2018-05-13 20:24:25 -07:00
Nhan Cao
689ce8ee2f update readme for build on macOS 2018-05-13 20:24:25 -07:00
Nhan Cao
1a77b788d1 update build macOS 2018-05-13 20:24:25 -07:00
Garry Lam
a7fc85270f fix issue #267 (YOLO output becomes all zero) 2018-04-29 08:27:48 -07:00
tzutalin
9fd505c124 Update version to 1.6.1 2018-04-17 20:03:31 -07:00
jeffrey
90bd8fdbd8 support saveDir argument 2018-04-15 05:42:14 +08:00
Haozhe Xie
bc71e12a9a Fix a bug that the application crashes when the browser opens. 2018-04-15 05:40:01 +08:00
cclauss
ee31cad396 import unittest for line 26 2018-04-15 05:29:35 +08:00
cclauss
baa032d2dc import unittest for line 32 2018-04-15 05:29:35 +08:00
蔡俊杰
9e8185077b fix missing command line arguments 2018-03-31 11:24:21 -07:00
Golovanov
ca10b0dd2a add completer for label 2018-03-31 11:24:11 -07:00
Madhava Jay
357018b722 Change xvfb-run to open app file 2018-03-24 23:56:32 -07:00
Madhava Jay
c8932cca67 Swap pipenv shell for pipenv run 2018-03-24 23:56:32 -07:00
Madhava Jay
5ef19667dd Changed pip to pip3 for Travis OS X Images 2018-03-24 23:56:32 -07:00
Madhava Jay
5db0d3a890 Fixing pipenv issues on Travis CI
- Updated README.md
2018-03-24 23:56:32 -07:00
Madhava Jay
335114d96e Fixing travis python issues 2018-03-24 23:56:32 -07:00
Madhava Jay
98188d2891 Add osx to .travis file 2018-03-24 23:56:32 -07:00
Madhava Jay
f48e13ad5f Added instructions on building stand-alone Mac OS X binary
- Build occurs inside a virtualenv
- Added new icon
- Updated README.md and Icon GPL Attribution
2018-03-24 23:56:32 -07:00
Jérôme Wax
8d1bd68ab6 update easier installation with anaconda and change code to be compliant with python 3.5 2018-03-15 19:02:52 -07:00
darrenl
6c774267ec
Merge pull request #249 from cjermain/supported_extensions
Allowing all supported extensions (TIFF in Qt 4.8, along with PPM, PBM, and PGM)
2018-03-10 10:02:01 -08:00
darrenl
3a3415238e
Merge pull request #247 from isVoid/yolosupport
Yolo support
2018-03-10 10:01:16 -08:00
Colin Jermain
8e892c4f25 Allowing all supported extensions to be read in the directory 2018-03-08 14:47:19 -05:00
Wang Yinghao
ebe78036ed README 2018-03-02 14:59:54 -06:00
Wang Yinghao
e5ef7f4523 README 2018-03-02 14:50:20 -06:00
Wang Yinghao
dda0295aac README 2018-03-02 14:48:06 -06:00
Wang Yinghao
852c63d04d Change Label Text 2018-03-02 09:44:42 -06:00
Wang Yinghao
180d25a2d7 bugfix, toggle button 2018-03-01 23:05:57 -06:00
Wang Yinghao
201a54d0f9 YOLO READ 2018-03-01 22:34:57 -06:00
Wang Yinghao
2783071c85 YOLO Write 2018-03-01 21:38:22 -06:00
darrenl
dec4885e29
Merge pull request #236 from jgars/master
Fixed bug in shape.py
2018-02-16 08:28:57 +08:00
Javier Garcia
82ace1acfc Fixed bug in shape.py 2018-02-15 13:35:46 +01:00
tzutalin
deb8b844f9 Show label text at the top-left of the rect 2018-01-30 18:50:30 +08:00
tzutalin
c1954b3244 Update version 2018-01-29 15:56:02 +08:00
tzutalin
d43613d9c4 allow opening of directory on launch 2018-01-29 15:45:40 +08:00
darrenl
1270b2c778
Merge pull request #227 from tomasra/master
Show cursor coordinates in status bar + filepath bugfix
2018-01-26 10:54:15 +08:00
Tomas Raila
0b20e5c929 Show cursor coordinates in status bar 2018-01-25 12:04:47 +02:00
Tomas Raila
eda381e437 Cast filepath to python string 2018-01-25 11:35:09 +02:00
tzutalin
3391ab632e Do not allow to hide file list 2017-12-25 11:12:15 +08:00
darrenl
8b13c25b9f
Merge pull request #215 from RodolfoFerro/master
Instructions for macOS High Sierra (qt5 + python3) added. (Updated README)
2017-12-22 13:45:13 +08:00
Rodolfo Ferro
43d911c12e Screenshot of macOS High Sierra usage added. 2017-12-21 15:49:43 -06:00
Rodolfo Ferro
ae0bacfb88 Updated README. Instructions for macOS High Sierra (qt5 + python3) added. 2017-12-21 15:42:15 -06:00
darrenl
5fdcbcc51c
Merge pull request #214 from deniswernert/master
Fixes the call to changeSavedDirDialog
2017-12-20 16:52:00 +08:00
Denis Wernert
53016093d6 Fixes the call to changeSavedDirDialog 2017-12-20 09:29:24 +01:00
darrenl
aa447d6242
Merge pull request #207 from luoyetx/color
change color when label has changed
2017-11-30 16:58:09 +08:00
zhangjie
7be0a01af8 change color when label has changed 2017-11-29 21:20:14 +08:00
tzutalin
821ffae6b9 Assign specific bg colors to widget item by different labels 2017-11-06 17:31:33 +08:00
tzutalin
7c145ef6e9 Add an icon for 'verify images' 2017-10-31 12:08:34 +08:00
tzutalin
5adaa669d2 Support showing version info 2017-10-27 10:28:47 +08:00
tzutalin
a77184a176 Update version to 1.5.2 2017-10-24 11:49:46 +08:00
tzutalin
2e525f8ab2 Fix issue and disable choosing box color 2017-10-24 11:26:42 +08:00
tzutalin
6cf04adfa5 Assign different labels with different colors 2017-10-23 16:27:40 +08:00
tzutalin
713cf4537e Save autosave/single class mode to setting file 2017-10-14 00:01:13 +08:00
tzutalin
1c5298f13d Add a button in menu to reset all 2017-10-13 23:44:47 +08:00
darrenl
32d5954da4 Merge pull request #175 from alanyee/master
Update README.rst
2017-10-13 09:28:35 +08:00
Alan Yee
1368578914 Update README.rst
-Made explicit HTTPS calls
-Fix missing links
2017-10-12 13:50:45 -07:00
Alan Yee
b8c06f0848 Update README.rst
Replace "OS X" with "macOS"
2017-10-12 13:46:48 -07:00
tzutalin
2d2cde219f Update README 2017-10-06 17:17:53 +08:00
darrenl
f4d87a9951 Merge pull request #169 from jiyeqian/master
Load classes before creating label dialog
2017-09-30 07:06:40 +08:00
Jiye Qian
c0176f2f9f Load classes before creating label dialog
The "editLabel()" may not pop predefined classes without preloaded "labelHist".
2017-09-29 22:43:07 +08:00
darren_lin
aca53bd59f Revise setup.py 2017-09-27 19:07:06 +08:00
tzutalin
cbc1761e9f If there no default saved dir, show a dialog for autosaving 2017-09-27 18:43:24 +08:00
tzutalin
d8e961126a Fix the issue that is unable to import libs if installing by pip 2017-09-27 17:57:09 +08:00
tzutalin
5dab21b847 v1.5.0 2017-09-14 14:17:59 +08:00
darrenl
429290c799 Merge pull request #157 from jaewchoi/fix
fix a minor cursor restore bug
2017-09-05 21:09:59 +08:00
Jaewoo Choi
91a830e01b fix a minor cursor restore bug 2017-09-05 21:39:43 +09:00
darrenl
374aabc7bf Merge pull request #156 from jaewchoi/roundbox
Add a feature to draw a box easier
2017-08-30 11:30:54 +08:00
Jaewoo Choi
dd09ffb497 Added a feature to draw a box easier 2017-08-30 03:33:07 +09:00
darrenl
b40edc3ab3 Merge pull request #152 from BOTFritz/master
Fixed scroll zoom on nonprimary monitor or in small window
2017-08-29 12:20:39 +08:00
BOTFritz
511e4a6ac0 Fixed scroll zoom on nonprimary monitor or in small window 2017-08-29 03:34:49 +00:00
darrenl
79f736139b Merge pull request #151 from jaewchoi/create
Fix a bug: creating a box with one point
2017-08-25 13:47:46 +08:00
darrenl
295e0e970b Merge pull request #149 from jaewchoi/selection
fix a bug to select a small bounding box
2017-08-25 13:46:16 +08:00
Jaewoo Choi
835af44c3a Prevent from creating a zero sized box 2017-08-22 21:28:36 +09:00
Jaewoo Choi
95ff5062fe fix a bug: creating a box with one point 2017-08-22 20:57:05 +09:00
Jaewoo Choi
7b8519f50e fix a bug to select a small bounding box 2017-08-22 14:59:40 +09:00
darrenl
fcffa12842 Merge pull request #148 from jaewchoi/selection
fix a bug of disabled edit and delete menu in the label list menu
2017-08-22 08:30:09 +08:00
Jaewoo Choi
f1ee71bf1c fix a bug of disabled edit and delete menu in the label list menu 2017-08-22 02:05:58 +09:00
darrenl
e62ce15649 Update README.rst 2017-08-17 20:02:20 +08:00
darrenl
10102c9e37 Merge pull request #144 from jiyeqian/master
Prevent the crash
2017-08-14 09:40:12 +08:00
Jiye Qian
a1decb8e24 Enhance compatibility
Adding the path to '.settings.pkl' file, this is especailly useful for MacOS. Then we can put '.settings.pkl' into 'MacOS' folder within 'labelImg.app'. The App will crash without path setting, as soon as we close the App in MacOS.
2017-08-14 02:29:26 +08:00
Jiye Qian
6222214ff3 Prevent the crash caused by illegal XML 2017-08-13 19:50:50 +08:00
tzutalin
6186acd575 Update version to v1.4.3 2017-08-09 14:11:09 +08:00
tzutalin
c64a5eae9b Refactor settings class 2017-08-08 09:53:22 +08:00
darrenl
3c63864997 Merge pull request #139 from jiyeqian/master
Enhance compatibility
2017-08-05 06:05:41 -05:00
Jiye Qian
6859657c36 Enhance compatibility
Adding the path to 'data' folder, this is especailly useful for Mac OSX.
Then we can put the 'data' folder into 'MacOS' folder within 'labelImg.app'.
2017-08-05 15:38:37 +08:00
tzutalin
6958e69851 Fix the issue # 136 and add constants.py 2017-08-04 14:45:42 +08:00
darrenl
f6c27b0c10 Merge pull request #138 from jiyeqian/master
Enhance compatibility
2017-08-04 00:20:21 -05:00
Jiye Qian
67de46730f Enhance compatibility
With Anaconda3-4.4.0-Windows-x86_64 in Win 8 & 10, encoding name "utf8" will lead to error.  We change the encoding name to "utf-8", it's OK. Very strange, we do not know why.
2017-08-03 23:34:55 +08:00
tzutalin
e86472a592 Upload missing files 2017-08-01 09:30:27 +08:00
darrenl
7cef42c8df Update .travis.yml 2017-07-27 18:31:53 +08:00
darrenl
dbda4976ca Merge pull request #129 from KevinGay/patch-1
Made spelling corrections to variables
2017-07-27 10:15:38 +08:00
Kevin Gay
5506da5b55 Made spelling corrections to variables 2017-07-26 21:59:59 -04:00
darrenl
3aa1c59fc2 Merge pull request #126 from jiyeqian/master
Fix filename bug
2017-07-26 14:16:46 +08:00
Jiye Qian
a878ab83b7 Fix filename bug
If the file name contains ".", it will go wrong.  e.g. hello.world.jpg --> hello.xml
2017-07-26 01:53:49 +08:00
tzutalin
14edc88a64 Fix runtime errors for py3qt5 2017-07-25 16:43:04 +08:00
tzutalin
1889d8c88f Add README for build-tools 2017-07-21 22:38:03 +08:00
tzutalin
d11fbb57de Update version to 1.4.0 2017-07-21 18:01:53 +08:00
tzutalin
398da39dce Don't save verified by default 2017-07-21 17:55:26 +08:00
tzutalin
a09ecbb7bb Add single mode features and fix minor issues 2017-07-21 17:32:30 +08:00
darrenl
4015a0eab5 Merge pull request #112 from proste/qt5-deprecated-fix
Fixed usage of deprecated function
2017-07-11 11:36:19 +08:00
Stepan Prochazka
bfd502e64f Fixed usage of deprecated function 2017-07-10 16:56:36 +02:00
darrenl
7baa5a17ef Merge pull request #110 from Langhalsdino/patch-1
Fixed possible typo in makefile
2017-07-10 14:19:49 +08:00
Frederic Tausch
f987cbc6ca Fixed possible typo
"make qt5" will now actually use qt5: "pyrcc5 -o resources.py resources.qrc"

Bug: "make qt5" installed qt4py2. That is kind of miss leading, since "qt5" should actually use qt5 and not use qt4.
2017-07-10 14:44:48 +09:00
tzutalin
2d92e10529 Fix build error for qt5+py3 2017-07-07 23:14:41 +08:00
tzutalin
9899c131d1 Update build-windows-binary.sh 2017-07-07 14:23:28 +08:00
tzutalin
7f288a0817 fix crash for py3 2017-07-07 13:48:25 +08:00
tzutalin
b0e7706de9 Update build-for-pypi.sh 2017-07-07 13:29:09 +08:00
tzutalin
d9e16955f4 Update veriosn to v1.3.4 2017-07-07 11:13:46 +08:00
tzutalin
27cf04aecc Fix issue #96 2017-07-07 11:09:00 +08:00
darrenl
0efb50ac62 Merge pull request #104 from lhk/master
Zooming in on cursor
2017-06-27 10:39:52 +08:00
Lars Klein
9f6fdbd06b cleaning up the code 2017-06-23 19:33:00 +02:00
Lars Klein
708e1a21e6 reworking the zoom behaviour 2017-06-23 19:28:52 +02:00
tzutalin
cde8aee17a Update a demo video to README.md 2017-06-06 20:37:04 +08:00
tzutalin
8c2191d655 Add the usage of Docker to README 2017-06-06 18:25:18 +08:00
tzutalin
b7a614d264 Update version to v1.3.3 2017-05-31 09:34:51 +08:00
darrenl
550c4581ec Merge pull request #100 from ConlonNovak/patch-1
Changed .lif to .xml, allowing annotation I/O
2017-05-31 09:29:11 +08:00
Conlon Novak
f5106a2a6a Changed .lif to .xml, allowing annotation I/O
LabelImg cannot read .lif files, but saving the annotations as .xml allows the annotations to be read when switching between images or reopening previously annotated images.
2017-05-30 15:36:43 -04:00
tzutalin
26a50c36bc Update README 2017-05-25 09:51:47 +08:00
darrenl
d17d26f6a3 Merge pull request #98 from RegisWang/master
Add using arrow keys to move the box.
2017-05-25 09:40:51 +08:00
RegisWANG
2560085e2c Add using arrow key to move the box. 2017-05-24 23:50:32 +08:00
RegisWang
2120d4f7b4 Merge pull request #1 from tzutalin/master
Sync from upstream
2017-05-24 07:44:36 -05:00
tzutalin
9cb05ebdae Refactor some of widgets 2017-05-24 10:25:23 +08:00
darrenl
1513300dfa Merge pull request #97 from RegisWang/master
Add use default label checkbox
2017-05-24 09:40:36 +08:00
RegisWANG
4a25352dbe Add use default label checkbox 2017-05-23 23:27:31 +08:00
darrenl
8edbfb63d9 Merge pull request #94 from JNKielmann/fixMoveRect
Fix moving RectBox with right click
2017-05-22 10:34:12 +08:00
JNKielmann
965f358bfb Fix moving RectBox with right click 2017-05-19 16:21:36 +02:00
tzutalin
14b0b82437 Update history 2017-05-18 10:52:48 +08:00
tzutalin
7cf546b500 Fix issues and update version to 1.3.2 2017-05-18 10:44:42 +08:00
darrenl
f55ef8ee8c Merge pull request #91 from aaronshan/ruifeng.shan
fix bugs:some pictures become invalid after repeat labeled and save it.
2017-05-18 10:32:44 +08:00
aaronshan
777d03e25d fix bugs:some pictures become invalid after repeat labeled and save it. 2017-05-17 16:09:53 +08:00
tzutalin
01bf8deac9 Update patch version 2017-05-11 09:24:15 +08:00
tzutalin
132492d61f Provide an extra argument to change predefined classes path 2017-05-10 21:58:39 +08:00
tzutalin
a7e3a32385 Replace Difficult with difficult 2017-05-10 21:26:51 +08:00
tzutalin
8df94a45c8 Add pip method to README 2017-05-04 10:01:05 +08:00
tzutalin
db3a6ba1b6 Change README to rst format 2017-05-04 09:53:54 +08:00
tzutalin
c5dd714394 Modify build-os.binary.sh 2017-05-03 22:01:31 +08:00
tzutalin
fffc99047b Change version to v1.3.0 2017-05-03 20:03:14 +08:00
tzutalin
b365c103ba Increase version name to 1.2.4 2017-05-03 19:22:55 +08:00
tzutalin
a8de414015 Add missing files 2017-05-03 19:18:56 +08:00
tzutalin
d56ab8cea2 Create new files for pypackage 2017-05-03 18:31:18 +08:00
tzutalin
c6ad6e3499 Fix build error for qt3 2017-05-03 16:53:55 +08:00
tzutalin
1787670afa rename test files 2017-05-03 16:27:58 +08:00
tzutalin
9a7ecb4a07 Add ustr.py, add more test, and fix build error for py3 2017-05-03 16:13:08 +08:00
darrenl
4ee8287e51 Merge pull request #80 from ChrisDal/master
Add Difficult checkbox
2017-05-03 02:07:52 -05:00
tzutalin
4810e6fbfb Update README 2017-04-26 11:19:23 +08:00
ChrisDal
04a5e8e7e4 Add difficult in writer 2017-04-25 10:24:06 +02:00
ChrisDal
0bace8fe2b refined Layout 2017-04-25 10:22:26 +02:00
ChrisDal
73c343458d Update labelImg.py 2017-04-25 10:19:15 +02:00
ChrisDal
0dae300a61 Add difficult in Shape
Add in shape 
Add in copy shape
2017-04-25 09:48:32 +02:00
ChrisDal
f0f1bb2b5a Select and set as current item last item 2017-04-25 09:44:01 +02:00
ChrisDal
2708b4bbb8 Add Truncated - difficult 2017-04-25 09:39:15 +02:00
ChrisDal
2899d4dbf7 Add Diificult Checkbox and link to items
Difficult Checkbox 
Link to Items
2017-04-25 09:24:34 +02:00
tzutalin
2198c34077 Disable building on osx for CI 2017-04-21 22:17:53 +08:00
darrenl
23a9d2d975 Merge pull request #79 from aaronshan/ruifeng.shan
Resolve some inconvenient use issue.
2017-04-21 21:42:39 +08:00
ruifeng.shan
6dae9fdac7 resolve save utf-8 characters but xml file content is like "&#x54C8;", not person readable 2017-04-21 15:20:26 +08:00
ruifeng.shan
c3d1baac5f resolve if don't select default save dir, can't load xml file(saved dir same with image) issue.
resolve cannot open annotation xml file issue.
2017-04-21 15:17:46 +08:00
darrenl
7f1ed5eed3 Create issue_template.md 2017-04-03 10:27:34 +08:00
tzutalin
ef13a1ede5 Use u() functions to convert string for python2/3 2017-03-09 13:18:55 +08:00
darrenl
634fc0c637 Merge pull request #65 from yjmade/master
fix some bugs when running on Mac with PyQT5
2017-03-09 13:07:45 +08:00
tzutalin
910cd73320 Fix unicode issue for showing window title 2017-03-09 11:55:56 +08:00
darrenl
29f62ad64f Merge pull request #64 from des0ps/feature/verified_flag
Implement verification feature
2017-03-09 11:52:40 +08:00
Jay Young
3778c43fad [IMP] For PyQt5, make scroll can happen on vertical and horizontal at the same time 2017-03-08 12:35:33 +08:00
Jay Young
f631ce9339 [FIX]in PyQT5, scroll does not work, because PyQT5 deprecated the orientation and delte method under QWheelEvent and replaced by angleDelta, so I add some code to detect what version of qt and use the correspond method to get delta 2017-03-08 12:30:12 +08:00
Jay Young
4d1ed6f7e6 [FIX]move hot key for open annotation from ctrl+q to Ctrl+Shift+O to avoid colision with Mac universial application quit key Command+Q 2017-03-08 11:41:06 +08:00
Jay Young
7460e4316b [FIX]when startup with out specify image, self.filePath will be None, but when loadFile get it, the filePath is 'None', so if there real is a img name as None, it will open it unexceptly
[FIX]when open file, QImageReader.supportedImageFormats() gives items in QbyteArray type, so if do str(fmt) will gives bbmp so that open prompt will not be able to open any thing
[FIX]in PyQT5, QFileDialog.getOpenFileName returns a tuple with (filename,filters)
2017-03-08 11:29:43 +08:00
Thibaut Mattio
1055c3c85e Add documentation for the verification feature 2017-03-08 11:28:03 +08:00
Thibaut Mattio
6151e9cf6a Fix crash when verified key does not exist 2017-03-08 11:26:51 +08:00
Thibaut Mattio
3abd685a8d Implement verified feature
When pressing space, the user can flag the image as verified, a green background will appear.
This is used when creating a dataset automatically, the user can then through all the pictures and flag them instead of annotate them.
2017-03-08 11:01:36 +08:00
tzutalin
ce853362e5 Update README and copying the rect won't add prefix string 2017-03-01 20:33:14 +08:00
tzutalin
5a9439be80 Fix the issue about undefined pos variable 2017-03-01 20:13:02 +08:00
darrenl
a81bc381f7 Merge pull request #60 from des0ps/master
Fasten user labelling
2017-03-01 19:21:26 +08:00
Thibaut Mattio
6600f9fe30 Annotate on release mouse 2017-02-28 13:29:56 +08:00
Thibaut Mattio
1f01cf9074 Remove confirmation when deleting a ROI 2017-02-28 13:29:38 +08:00
Thibaut Mattio
77d5fae05f Save an annotation file when there is no ROI 2017-02-28 13:18:26 +08:00
Thibaut Mattio
c5c2a34a39 Apply PEP recommendation on formatting
Running pylint to make the code complient with PEP recommendations on lintage.
2017-02-28 11:50:15 +08:00
darrenl
eb87c3d680 Merge pull request #58 from s-alexey/focus
Set focus on image canvas after image is loaded
2017-02-27 10:07:21 +08:00
tzutalin
4b9c530b1a Show the prev label text when creating a new label 2017-02-24 22:27:04 +08:00
tzutalin
34420d4053 Fix the wrong path/width/height in annotation files 2017-02-24 22:11:38 +08:00
Alexey
36ab14943e Set focus on canvas after image is loaded 2017-02-23 15:59:54 +03:00
darrenl
700bba348f Merge pull request #55 from tzutalin/py2-qt4
Update lxml-2.3 to lxml-3.7.3 for windows
2017-02-20 17:06:51 +08:00
tzutalin
43e62708d4 Update lxml-2.3 to lxml-3.7.3 for windows 2017-02-20 17:04:07 +08:00
tzutalin
c5ceaa687d Fix the issue when failing to open unicode dir and rename filename to
filePath
2017-02-16 14:49:46 +08:00
tzutalin
70721ad597 Fix qstring/asic code convert for python 2 2017-02-16 11:00:49 +08:00
tzutalin
8239d1811b Revert "Fix encode filename issues python2"
This reverts commit 62507a195829e3f0eb93a390997e91033cb52e47.
2017-02-15 20:35:57 +08:00
tzutalin
62507a1958 Fix encode filename issues python2 2017-02-15 17:33:55 +08:00
tzutalin
afee5a4e95 Remove setting bg features and uncomment some print message 2017-02-15 16:39:06 +08:00
tzutalin
effc3c0a3d Update README 2017-02-13 11:33:35 +08:00
tzutalin
318710c8e3 Draft version for supporting change background color 2017-02-08 16:56:24 +08:00
tzutalin
1fb28d81a7 Fix ascii codec issue when outputing pascal file 2017-01-29 22:51:59 +08:00
tzutalin
b7913f4de9 Add Ryan Flynn as one of the contributors 2017-01-16 10:34:25 +08:00
darrenl
f7b688711e Merge pull request #47 from rflynn/refactor-README
refactor README for simplicity and clarity
2017-01-16 10:28:06 +08:00
Ryan Flynn
a6ad229dca refactor README for simplicity and clarity 2017-01-15 17:24:56 -05:00
darrenl
633f26694b Merge pull request #46 from tzutalin/py2-qt4
Change hotkeys
2017-01-09 14:31:41 +08:00
tzutalin
d9ba7b18d0 Change hotkeys 2017-01-09 14:30:17 +08:00
darrenl
43b730b6e6 Merge pull request #45 from rflynn/py3qt5
Py3qt5
2017-01-09 14:18:29 +08:00
Ryan Flynn
87bba51bfe automate anaconda 2017-01-04 23:57:41 -05:00
Ryan Flynn
a0a375eaa1 fix OSX+qt4 2017-01-03 22:13:33 -05:00
Ryan Flynn
54d7b3afc4 test linux + conda 2017-01-03 22:09:33 -05:00
Ryan Flynn
226b9552da test QT4 combos on OS X 2017-01-03 21:42:59 -05:00
Ryan Flynn
b846c325a8 try OSX10.10/11 to see if the OpenGL issue is there too... 2017-01-02 23:15:01 -05:00
Ryan Flynn
b6d1929306 add unit testing via 'make test' 2017-01-02 22:34:55 -05:00
Ryan Flynn
2beed27cf2 add support for QT5, fallback to QT4 2017-01-02 21:55:30 -05:00
Ryan Flynn
c7ddf4a3ef make py2 unicode-handling py3-compatibe 2016-12-31 14:53:09 -05:00
Ryan Flynn
67a8583e22 conservative conversion of some python2-isms to py3-compatible code 2016-12-31 14:48:17 -05:00
Ryan Flynn
9afb00d6ee add travis osx 2016-12-31 13:23:33 -05:00
Ryan Flynn
f21c538f53 set up travis matrix: py2+qt4, py3+qt5 2016-12-30 01:56:55 -05:00
darrenl
d6b3ec8aa8 Merge pull request #42 from rflynn/py3-friendlier-maxint
py3 removes sys.maxint, float(inf) works in py2/py3
2016-12-30 11:29:45 +08:00
Ryan Flynn
e7eddf02ab py3 removes sys.maxint, float(inf) works in py2/py3 2016-12-29 21:25:23 -05:00
darrenl
37d968d6b6 Merge pull request #41 from tzutalin/revert-40-build-osx-travis
Revert "include osx in travis build"
2016-12-29 10:20:42 +08:00
darrenl
cd4e440c32 Revert "include osx in travis build" 2016-12-29 10:20:32 +08:00
darrenl
445d940968 Merge pull request #38 from rflynn/readme-build-section-canonical
refactor/simplify README build instructions so subsections are linkab…
2016-12-29 09:30:57 +08:00
darrenl
831d5f33f0 Merge pull request #40 from rflynn/build-osx-travis
include osx in travis build
2016-12-29 09:29:51 +08:00
Ryan Flynn
d8c8016dcc include osx in travis build 2016-12-28 20:20:12 -05:00
Ryan Flynn
13a0887e3f refactor/simplify README build instructions so subsections are linkable and commands are copy-pasteable 2016-12-28 18:46:56 -05:00
tzutalin
27bc319fba UPdate README.md 2016-12-22 21:26:43 +08:00
tzutalin
89bc590136 Use pyinstall v3.2 to build linux binary 2016-12-22 15:43:51 +08:00
darrenl
af76ae25bd Merge pull request #36 from rflynn/unicode-labels
https://github.com/tzutalin/labelImg/issues/31 add support for displa…
2016-12-22 13:17:55 +08:00
Ryan Flynn
03236397d7 https://github.com/tzutalin/labelImg/issues/31 add support for displaying and saving unicode labels 2016-12-21 23:49:40 -05:00
darrenl
9a4c922d98 Merge pull request #35 from WillieMaddox/master
Fix bbox bug.
2016-12-21 10:01:48 +08:00
WillieMaddox
b55f6e13a2 Fix bbox bug. 2016-12-20 08:30:11 -06:00
darrenl
d9eaef0e40 Merge pull request #32 from Google1234/master
Fix a bug
2016-12-17 00:16:44 +08:00
Number1Tao
7b5a43fce1 Fix a bug
when run :./labelImg.py
Error: 
  File "./labelImg.py", line 815
    extensions = {'.jpeg','.jpg', '.png', '.bmp'}
Fix:
 change {'.jpeg','.jpg', '.png', '.bmp'} to ['.jpeg','.jpg', '.png', '.bmp']
Environment:python=2.6.9   qt=4.11.3 OX=mac os
2016-12-16 22:34:40 +08:00
Tzutalin
c73e65eb40 remove clean 2016-12-10 16:24:33 +08:00
tzutalin
dbbd6fc0f7 Update scripts for releasing 2016-12-08 10:09:42 +08:00
tzutalin
51bd7b1ca1 Update README 2016-12-07 15:05:53 +08:00
tzutalin
9792a610e2 Update envsetup.sh to download lxml.exe for building windows 2016-12-07 14:52:30 +08:00
tzutalin
3bbf5e23e5 remove numpy and jsos dependencies, and download pytqt for windows 2016-12-07 14:39:45 +08:00
tzutalin
16e6742094 Update script to build window/linux binary 2016-12-07 11:34:58 +08:00
tzutalin
7ff5f77484 Add envsetup.sh build-window-binary.sh for building windows 32 binary 2016-12-07 10:51:50 +08:00
tzutalin
c111544e12 Upload build-ubuntu-binary.sh 2016-12-06 18:03:15 +08:00
tzutalin
50a079edc4 Support Unicode for saving and loading Pascal XML format
Use lxml to pretty the xml instead of minidom because minido does not support unicode
Save xml with unicode
Add tests dir to collect more images for unit tests in the future
2016-12-02 11:26:37 +08:00
darrenl
930d111eb8 Merge pull request #25 from Faraadid/pull-request-fixes-issue#18
This fixes #18 where openning previous annotation files causes a bug …
2016-11-08 18:11:41 +08:00
nkh
43f9166aff This fixes #18 where openning previous annotation files causes a bug in resizing bounding boxes, they were not rectangle anymore and could become deformed. 2016-11-08 13:06:13 +03:30
darrenl
de98e88dcb Merge pull request #23 from rflynn/ensure-filename-defined
ensure filename variable exists for all code paths
2016-10-24 09:18:42 +08:00
Ryan Flynn
5ae63c09cd ensure filename variable exists for all code paths 2016-10-22 23:37:33 -04:00
tzutalin
a550ee426d Update README and add clean in Makefile 2016-10-22 10:27:50 +08:00
tzutalin
616435d8a2 resize demo image 2016-09-06 20:44:19 +08:00
tzutalin
031c6e95bd Add gitignore, README, and demo icon 2016-09-06 20:42:13 +08:00
tzutalin
f2712d4cc7 Add file list and dock to move faster 2016-09-06 20:39:42 +08:00
tzutalin
4a3a47a7c7 rm opencv module 2016-09-06 17:24:47 +08:00
tzutalin
ab5e4db242 update gif link 2016-06-21 14:14:46 +08:00
tzutalin
110934ca9c remove unused file and update README 2016-05-10 22:42:13 +08:00
tzutalin
9bbfce26c2 remove requirements.txt 2016-04-19 14:58:44 +08:00
tzutalin
6bd9e31231 Upload build status 2016-04-19 14:56:02 +08:00
tzutalin
3079b300a5 Add travis-ci 2016-04-19 14:36:03 +08:00
tzutalin
64ce0b2dc6 Add LICENSE 2016-04-11 17:18:33 +08:00
tzutalin
b502624f59 Update demo gif and png 2016-04-05 12:28:37 +08:00
tzutalin
c70fc5eae3 Fix typo in README 2016-04-01 09:45:35 +08:00
darrenl
a3557f2f98 Merge pull request #9 from XunChangqing/master
bugfix: can not load xml with multiple dots file name such as xxx.xxx.ext
2016-03-26 11:37:14 +08:00
xunchangqing
6e4e576499 remove codes for debug 2016-03-25 09:52:55 +08:00
xunchangqing
83048cee65 bugfix: can not load xml with multiple dots file name such as xxx.xxx.xxx 2016-03-25 09:48:53 +08:00
darrenl
f6663a6327 Merge pull request #8 from markd666/master
Set a default file name when saving label data.
2016-02-15 19:24:26 +08:00
Mark Shilton
28062bafc4 Filename of current image is used as default name when saving label data 2016-02-12 13:23:12 +00:00
Mark Shilton
1981da9b22 Filename of current image is used as default name when saving label data 2016-02-12 13:16:29 +00:00
tzutalin
dd56234989 sort by name while importing all images 2016-01-05 13:51:12 +08:00
tzutalin
4da87bd622 Avoid to be deformed while resizing it 2015-12-17 13:33:13 +08:00
tzutalin
3b01871851 Load Pascal xml for each image if setting saved annotation folder 2015-12-10 17:20:06 +08:00
tzutalin
38c9cabb01 If no image, cannot load annotion xml 2015-12-09 21:51:26 +08:00
tzutalin
ed787d4f3a Add a function which can load xml file 2015-12-09 21:29:26 +08:00
tzutalin
e85c4568b9 Update README 2015-12-04 22:51:44 +08:00
TzuTa Lin
16de4a1a40 Replace Image with cv2 and upload freeze_build for pyinstaller 2015-11-24 13:08:43 +08:00
TzuTa Lin
30cce26d22 Update README 2015-11-23 14:21:55 +08:00
Darren Lin(林子達)
1187b96403 Add setep steps for windows 2015-11-22 16:57:50 +08:00
tzutalin
f6842b3377 Fix unreferenced variable in openPrevImg 2015-11-21 21:42:16 +08:00
tzutalin
76b610aa6d Support openPrevious function 2015-11-21 17:39:47 +08:00
tzutalin
db2a223cc3 Update README 2015-11-21 00:32:05 +08:00
tzutalin
ccdc3aecb3 Update README and demo.png 2015-11-21 00:26:00 +08:00
tzutalin
aa1860b497 add predefined class text file 2015-11-21 00:15:21 +08:00
tzutalin
66645103e5 Merge features: 1.autoSaving while nexting 2.Add predefined classes 3. avoid using 0-valued coordinates, from https://github.com/tzutalin/labelImg/pull/1 2015-11-20 23:43:03 +08:00
TzuTa Lin
ef61f0d827 Save the last open dir and target dir 2015-11-17 13:00:37 +08:00
TzuTa Lin
87dab57ec9 Labels will be added to history and re-use it while showing pop window 2015-11-17 10:50:28 +08:00
TzuTa Lin
06c9adf494 show message when saving 2015-11-16 20:34:55 +08:00
TzuTa Lin
9f35536561 Show message when changing saved folder 2015-11-16 20:30:13 +08:00
TzuTa Lin
f3cf1ba2c4 Fix default saved folder issue 2015-11-16 20:19:44 +08:00
tzutalin
17fbb5e9a7 Update README 2015-11-16 13:40:19 +08:00
tzutalin
a87ef4c70e Fix typo 2015-09-18 22:49:00 +08:00
TzuTa Lin
26e1056e02 Add demo.png 2015-09-18 19:29:51 +08:00
TzuTa Lin
8d81647864 mv some of python files to libs 2015-09-17 15:22:58 +08:00
TzuTa Lin
7b8a3bf2af rename pascal voc writer 2015-09-17 15:00:52 +08:00
TzuTa Lin
c40b0db7f2 Typo 2015-09-17 14:50:58 +08:00
TzuTa Lin
0f9cae650d Add video demo link 2015-09-17 10:44:35 +08:00
TzuTa Lin
c4413d62a5 First commit 2015-09-17 10:37:20 +08:00
117 changed files with 10279 additions and 0 deletions

8
labelImg/.github/no-response.yml vendored Normal file
View File

@ -0,0 +1,8 @@
daysUntilClose: 14
responseRequiredLabel: more-information-needed
closeComment: >
This issue has been automatically closed because there has been no response
to our request for more information from the original author. With only the
information that is currently in the issue, we don't have enough information
to take action or reproduce the issue. Please reach out if you have or find
the answers we need so that we can investigate further.

66
labelImg/.github/workflows/package.yml vendored Normal file
View File

@ -0,0 +1,66 @@
name: Package
on: [push, pull_request]
jobs:
package-macos:
runs-on: macos-latest
env:
PIPENV_VENV_IN_PROJECT: 1
PIPENV_IGNORE_VIRTUALENVS: 1
steps:
- uses: actions/checkout@v3
- name: Setup Python Environment
run: |
pip3 install pipenv
pipenv install pyqt5 lxml
pipenv run pip install pyqt5==5.15.6 lxml
- name: Build LabelImg
run: |
pipenv run make qt5py3
rm -rf build dist
- name: Package LabelImg
run: |
pipenv run python setup.py py2app
open dist/labelImg.app
- name: Archive macOS app
run: |
cd dist/
tar czf labelImg.tgz labelImg.app
- uses: actions/upload-artifact@v3
with:
name: macOS artifact
path: dist/labelImg.tgz
package-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Setup Python Environment
run: |
pip3 install pyinstaller pyqt5==5.15.6 lxml
- name: Build LabelImg
run: |
pyrcc5 -o libs/resources.py resources.qrc
- name: Package LabelImg
run: |
pyinstaller --hidden-import=pyqt5 --hidden-import=lxml -F -n "labelImg" -c labelImg.py -p ./libs -p ./
- uses: actions/upload-artifact@v3
with:
name: Windows artifact
path: dist/labelImg.exe
package-linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Python Environment
run: |
pip3 install pyinstaller pyqt5==5.15.6 lxml
- name: Build LabelImg
run: |
pyrcc5 -o libs/resources.py resources.qrc
- name: Package LabelImg
run: |
pyinstaller --hidden-import=pyqt5 --hidden-import=lxml -F -n "labelImg" -c labelImg.py -p ./libs -p ./
- uses: actions/upload-artifact@v3
with:
name: Linux artifact
path: dist/labelImg

43
labelImg/.gitignore vendored Normal file
View File

@ -0,0 +1,43 @@
resources/icons/.DS_Store
resources.py
labelImg.egg-info*
*.pyc
.*.swp
build/
dist/
tags
cscope*
.ycm_extra_conf.py
.subvimrc
.vscode
*.pkl
Pipfile
*.xml
# MacOS System-Generated
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# IDE
*.DS_Store
*.iml
.idea
.unison*
.attach*
tmp.*

View File

@ -0,0 +1,3 @@
TzuTa Lin
[LabelMe](http://labelme2.csail.mit.edu/Release3.0/index.php)
Ryan Flynn

130
labelImg/HISTORY.rst Normal file
View File

@ -0,0 +1,130 @@
History
=======
1.8.6 (2021-10-10)
------------------
* Display box width and height
1.8.5 (2021-04-11)
------------------
* Merged a couple of PRs
* Fixed issues
* Support CreateML format
1.8.4 (2020-11-04)
------------------
* Merged a couple of PRs
* Fixed issues
1.8.2 (2018-12-02)
------------------
* Fix pip depolyment issue
1.8.1 (2018-12-02)
------------------
* Fix issues
* Support zh-Tw strings
1.8.0 (2018-10-21)
------------------
* Support drawing sqaure rect
* Add item single click slot
* Fix issues
1.7.0 (2018-05-18)
------------------
* Support YOLO
* Fix minor issues
1.6.1 (2018-04-17)
------------------
* Fix issue
1.6.0 (2018-01-29)
------------------
* Add more pre-defined labels
* Show cursor pose in status bar
* Fix minor issues
1.5.2 (2017-10-24)
------------------
* Assign different colors to different lablels
1.5.1 (2017-9-27)
------------------
* Show a autosaving dialog
1.5.0 (2017-9-14)
------------------
* Fix the issues
* Add feature: Draw a box easier
1.4.3 (2017-08-09)
------------------
* Refactor setting
* Fix the issues
1.4.0 (2017-07-07)
------------------
* Add feature: auto saving
* Add feature: single class mode
* Fix the issues
1.3.4 (2017-07-07)
------------------
* Fix issues and improve zoom-in
1.3.3 (2017-05-31)
------------------
* Fix issues
1.3.2 (2017-05-18)
------------------
* Fix issues
1.3.1 (2017-05-11)
------------------
* Fix issues
1.3.0 (2017-04-22)
------------------
* Fix issues
* Add difficult tag
* Create new files for pypi
1.2.3 (2017-04-22)
------------------
* Fix issues
1.2.2 (2017-01-09)
------------------
* Fix issues

9
labelImg/LICENSE Normal file
View File

@ -0,0 +1,9 @@
Copyright (c) <2015-Present> Tzutalin
Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, William T. Freeman
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

15
labelImg/MANIFEST.in Normal file
View File

@ -0,0 +1,15 @@
include CONTRIBUTING.rst
include HISTORY.rst
include LICENSE
include README.rst
include resources.qrc
recursive-include data *
recursive-include icons *
recursive-include libs *
recursive-exclude build-tools *
recursive-exclude tests *
recursive-exclude * __pycache__
recursive-exclude * *.py[co]

35
labelImg/Makefile Normal file
View File

@ -0,0 +1,35 @@
# ex: set ts=8 noet:
all: qt5 test
test: testpy3
testpy2:
python -m unittest discover tests
testpy3:
python3 -m unittest discover tests
qt4: qt4py2
qt5: qt5py3
qt4py2:
pyrcc4 -py2 -o libs/resources.py resources.qrc
qt4py3:
pyrcc4 -py3 -o libs/resources.py resources.qrc
qt5py3:
pyrcc5 -o libs/resources.py resources.qrc
clean:
rm -rf ~/.labelImgSettings.pkl *.pyc dist labelImg.egg-info __pycache__ build
pip_upload:
python3 setup.py upload
long_description:
restview --long-description
.PHONY: all

317
labelImg/README.rst Normal file
View File

@ -0,0 +1,317 @@
.. image:: /readme/images/labelimg.png
:target: https://github.com/heartexlabs/label-studio
Label Studio is a modern, multi-modal data annotation tool
=======
LabelImg, the popular image annotation tool created by Tzutalin with the help of dozens contributors, is no longer actively being developed and has become part of the Label Studio community. Check out `Label Studio <https://github.com/heartexlabs/label-studio>`__, the most flexible open source data labeling tool for images, text, hypertext, audio, video and time-series data. `Install <https://labelstud.io/guide/install.html>`__ Label Studio and join the `slack community <https://label-studio.slack.com/>`__ to get started.
.. image:: /readme/images/label-studio-1-6-player-screenshot.png
:target: https://github.com/heartexlabs/label-studio
About LabelImg
========
.. image:: https://img.shields.io/pypi/v/labelimg.svg
:target: https://pypi.python.org/pypi/labelimg
.. image:: https://img.shields.io/github/workflow/status/tzutalin/labelImg/Package?style=for-the-badge
:alt: GitHub Workflow Status
.. image:: https://img.shields.io/badge/lang-en-blue.svg
:target: https://github.com/tzutalin/labelImg
.. image:: https://img.shields.io/badge/lang-zh-green.svg
:target: https://github.com/tzutalin/labelImg/blob/master/readme/README.zh.rst
.. image:: https://img.shields.io/badge/lang-jp-green.svg
:target: https://github.com/tzutalin/labelImg/blob/master/readme/README.jp.rst
LabelImg is a graphical image annotation tool.
It is written in Python and uses Qt for its graphical interface.
Annotations are saved as XML files in PASCAL VOC format, the format used
by `ImageNet <http://www.image-net.org/>`__. Besides, it also supports YOLO and CreateML formats.
.. image:: https://raw.githubusercontent.com/tzutalin/labelImg/master/demo/demo3.jpg
:alt: Demo Image
.. image:: https://raw.githubusercontent.com/tzutalin/labelImg/master/demo/demo.jpg
:alt: Demo Image
`Watch a demo video <https://youtu.be/p0nR2YsCY_U>`__
Installation
------------------
Get from PyPI but only python3.0 or above
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is the simplest (one-command) install method on modern Linux distributions such as Ubuntu and Fedora.
.. code:: shell
pip3 install labelImg
labelImg
labelImg [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Build from source
~~~~~~~~~~~~~~~~~
Linux/Ubuntu/Mac requires at least `Python
2.6 <https://www.python.org/getit/>`__ and has been tested with `PyQt
4.8 <https://www.riverbankcomputing.com/software/pyqt/intro>`__. However, `Python
3 or above <https://www.python.org/getit/>`__ and `PyQt5 <https://pypi.org/project/PyQt5/>`__ are strongly recommended.
Ubuntu Linux
^^^^^^^^^^^^
Python 3 + Qt5
.. code:: shell
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
macOS
^^^^^
Python 3 + Qt5
.. code:: shell
brew install qt # Install qt-5.x.x by Homebrew
brew install libxml2
or using pip
pip3 install pyqt5 lxml # Install qt and lxml by pip
make qt5py3
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Python 3 Virtualenv (Recommended)
Virtualenv can avoid a lot of the QT / Python version issues
.. code:: shell
brew install python3
pip3 install pipenv
pipenv run pip install pyqt5==5.15.2 lxml
pipenv run make qt5py3
pipenv run python3 labelImg.py
[Optional] rm -rf build dist; pipenv run python setup.py py2app -A;mv "dist/labelImg.app" /Applications
Note: The Last command gives you a nice .app file with a new SVG Icon in your /Applications folder. You can consider using the script: build-tools/build-for-macos.sh
Windows
^^^^^^^
Install `Python <https://www.python.org/downloads/windows/>`__,
`PyQt5 <https://www.riverbankcomputing.com/software/pyqt/download5>`__
and `install lxml <http://lxml.de/installation.html>`__.
Open cmd and go to the `labelImg <#labelimg>`__ directory
.. code:: shell
pyrcc4 -o libs/resources.py resources.qrc
For pyqt5, pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py
python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
If you want to package it into a separate EXE file
.. code:: shell
Install pyinstaller and execute:
pip install pyinstaller
pyinstaller --hidden-import=pyqt5 --hidden-import=lxml -F -n "labelImg" -c labelImg.py -p ./libs -p ./
Windows + Anaconda
^^^^^^^^^^^^^^^^^^
Download and install `Anaconda <https://www.anaconda.com/download/#download>`__ (Python 3+)
Open the Anaconda Prompt and go to the `labelImg <#labelimg>`__ directory
.. code:: shell
conda install pyqt=5
conda install -c anaconda lxml
pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py
python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Use Docker
~~~~~~~~~~~~~~~~~
.. code:: shell
docker run -it \
--user $(id -u) \
-e DISPLAY=unix$DISPLAY \
--workdir=$(pwd) \
--volume="/home/$USER:/home/$USER" \
--volume="/etc/group:/etc/group:ro" \
--volume="/etc/passwd:/etc/passwd:ro" \
--volume="/etc/shadow:/etc/shadow:ro" \
--volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
tzutalin/py2qt4
make qt4py2;./labelImg.py
You can pull the image which has all of the installed and required dependencies. `Watch a demo video <https://youtu.be/nw1GexJzbCI>`__
Usage
-----
Steps (PascalVOC)
~~~~~~~~~~~~~~~~~
1. Build and launch using the instructions above.
2. Click 'Change default saved annotation folder' in Menu/File
3. Click 'Open Dir'
4. Click 'Create RectBox'
5. Click and release left mouse to select a region to annotate the rect
box
6. You can use right mouse to drag the rect box to copy or move it
The annotation will be saved to the folder you specify.
You can refer to the below hotkeys to speed up your workflow.
Steps (YOLO)
~~~~~~~~~~~~
1. In ``data/predefined_classes.txt`` define the list of classes that will be used for your training.
2. Build and launch using the instructions above.
3. Right below "Save" button in the toolbar, click "PascalVOC" button to switch to YOLO format.
4. You may use Open/OpenDIR to process single or multiple images. When finished with a single image, click save.
A txt file of YOLO format will be saved in the same folder as your image with same name. A file named "classes.txt" is saved to that folder too. "classes.txt" defines the list of class names that your YOLO label refers to.
Note:
- Your label list shall not change in the middle of processing a list of images. When you save an image, classes.txt will also get updated, while previous annotations will not be updated.
- You shouldn't use "default class" function when saving to YOLO format, it will not be referred.
- When saving as YOLO format, "difficult" flag is discarded.
Create pre-defined classes
~~~~~~~~~~~~~~~~~~~~~~~~~~
You can edit the
`data/predefined\_classes.txt <https://github.com/tzutalin/labelImg/blob/master/data/predefined_classes.txt>`__
to load pre-defined classes
Annotation visualization
~~~~~~~~~~~~~~~~~~~~~~~~
1. Copy the existing lables file to same folder with the images. The labels file name must be same with image file name.
2. Click File and choose 'Open Dir' then Open the image folder.
3. Select image in File List, it will appear the bounding box and label for all objects in that image.
(Choose Display Labels mode in View to show/hide lablels)
Hotkeys
~~~~~~~
+--------------------+--------------------------------------------+
| Ctrl + u | Load all of the images from a directory |
+--------------------+--------------------------------------------+
| Ctrl + r | Change the default annotation target dir |
+--------------------+--------------------------------------------+
| Ctrl + s | Save |
+--------------------+--------------------------------------------+
| Ctrl + d | Copy the current label and rect box |
+--------------------+--------------------------------------------+
| Ctrl + Shift + d | Delete the current image |
+--------------------+--------------------------------------------+
| Space | Flag the current image as verified |
+--------------------+--------------------------------------------+
| w | Create a rect box |
+--------------------+--------------------------------------------+
| d | Next image |
+--------------------+--------------------------------------------+
| a | Previous image |
+--------------------+--------------------------------------------+
| del | Delete the selected rect box |
+--------------------+--------------------------------------------+
| Ctrl++ | Zoom in |
+--------------------+--------------------------------------------+
| Ctrl-- | Zoom out |
+--------------------+--------------------------------------------+
| ↑→↓← | Keyboard arrows to move selected rect box |
+--------------------+--------------------------------------------+
**Verify Image:**
When pressing space, the user can flag the image as verified, a green background will appear.
This is used when creating a dataset automatically, the user can then through all the pictures and flag them instead of annotate them.
**Difficult:**
The difficult field is set to 1 indicates that the object has been annotated as "difficult", for example, an object which is clearly visible but difficult to recognize without substantial use of context.
According to your deep neural network implementation, you can include or exclude difficult objects during training.
How to reset the settings
~~~~~~~~~~~~~~~~~~~~~~~~~
In case there are issues with loading the classes, you can either:
1. From the top menu of the labelimg click on Menu/File/Reset All
2. Remove the `.labelImgSettings.pkl` from your home directory. In Linux and Mac you can do:
`rm ~/.labelImgSettings.pkl`
How to contribute
~~~~~~~~~~~~~~~~~
Send a pull request
License
~~~~~~~
`Free software: MIT license <https://github.com/tzutalin/labelImg/blob/master/LICENSE>`_
Citation: Tzutalin. LabelImg. Git code (2015). https://github.com/tzutalin/labelImg
Related and additional tools
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. `Label Studio <https://github.com/heartexlabs/label-studio>`__ to label images, text, audio, video and time-series data for machine learning and AI
2. `ImageNet Utils <https://github.com/tzutalin/ImageNet_Utils>`__ to
download image, create a label text for machine learning, etc
3. `Use Docker to run labelImg <https://hub.docker.com/r/tzutalin/py2qt4>`__
4. `Generating the PASCAL VOC TFRecord files <https://github.com/tensorflow/models/blob/4f32535fe7040bb1e429ad0e3c948a492a89482d/research/object_detection/g3doc/preparing_inputs.md#generating-the-pascal-voc-tfrecord-files>`__
5. `App Icon based on Icon by Nick Roach (GPL) <https://www.elegantthemes.com/>`__
6. `Setup python development in vscode <https://tzutalin.blogspot.com/2019/04/set-up-visual-studio-code-for-python-in.html>`__
7. `The link of this project on iHub platform <https://code.ihub.org.cn/projects/260/repository/labelImg>`__
8. `Convert annotation files to CSV format or format for Google Cloud AutoML <https://github.com/tzutalin/labelImg/tree/master/tools>`__
Stargazers over time
~~~~~~~~~~~~~~~~~~~~
.. image:: https://starchart.cc/tzutalin/labelImg.svg

0
labelImg/__init__.py Normal file
View File

12
labelImg/build-tools/.gitignore vendored Normal file
View File

@ -0,0 +1,12 @@
*.spec
build
dist
pyinstaller
python-2.*
pywin32*
virtual-wine
venv_wine
PyQt4-*
lxml-*
windows_v*
linux_v*

View File

@ -0,0 +1,35 @@
### Deploy to PyPI
```
cd [ROOT]
sh build-tools/build-for-pypi.sh
```
### Build for Ubuntu
```
cd build-tools
sh run-in-container.sh
sh envsetup.sh
sh build-ubuntu-binary.sh
```
### Build for Windows
```
cd build-tools
sh run-in-container.sh
sh envsetup.sh
sh build-windows-binary.sh
```
### Build for macOS High Sierra
```
cd build-tools
./build-for-macos.sh
```
Note: If there are some problems, try to
```
sudo rm -rf virtual-wne venv_wine
```

View File

@ -0,0 +1,30 @@
#!/bin/sh
brew install python@2
pip install --upgrade virtualenv
# clone labelimg source
rm -rf /tmp/labelImgSetup
mkdir /tmp/labelImgSetup
cd /tmp/labelImgSetup
curl https://codeload.github.com/tzutalin/labelImg/zip/master --output labelImg.zip
unzip labelImg.zip
rm labelImg.zip
# setup python3 space
virtualenv --system-site-packages -p python3 /tmp/labelImgSetup/labelImg-py3
source /tmp/labelImgSetup/labelImg-py3/bin/activate
cd labelImg-master
# build labelImg app
pip install py2app
pip install PyQt5 lxml
make qt5py3
rm -rf build dist
python setup.py py2app -A
mv "/tmp/labelImgSetup/labelImg-master/dist/labelImg.app" /Applications
# deactivate python3
deactivate
cd ../
rm -rf /tmp/labelImgSetup
echo 'DONE'

View File

@ -0,0 +1,17 @@
#!/bin/sh
# Packaging and Release
docker run --workdir=$(pwd)/ --volume="/home/$USER:/home/$USER" tzutalin/py2qt4 /bin/sh -c 'make qt4py2; make test;sudo python setup.py sdist;sudo python setup.py install'
while true; do
read -p "Do you wish to deploy this to PyPI(twine upload dist/* or pip install dist/*)?" yn
case $yn in
[Yy]* ) docker run -it --rm --workdir=$(pwd)/ --volume="/home/$USER:/home/$USER" tzutalin/py2qt4; break;;
[Nn]* ) exit;;
* ) echo "Please answer yes or no.";;
esac
done
# python setup.py register
# python setup.py sdist upload
# Net pypi: twine upload dist/*
# Test before upladoing: pip install dist/labelImg.tar.gz

View File

@ -0,0 +1,24 @@
#!/bin/bash
### Ubuntu use pyinstall v3.0
THIS_SCRIPT_PATH=`readlink -f $0`
THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}`
cd pyinstaller
git checkout v3.2
cd ${THIS_SCRIPT_DIR}
rm -r build
rm -r dist
rm labelImg.spec
python pyinstaller/pyinstaller.py --hidden-import=xml \
--hidden-import=xml.etree \
--hidden-import=xml.etree.ElementTree \
--hidden-import=lxml.etree \
-D -F -n labelImg -c "../labelImg.py" -p ../libs -p ../
FOLDER=$(git describe --abbrev=0 --tags)
FOLDER="linux_"$FOLDER
rm -rf "$FOLDER"
mkdir "$FOLDER"
cp dist/labelImg $FOLDER
cp -rf ../data $FOLDER/data
zip "$FOLDER.zip" -r $FOLDER

View File

@ -0,0 +1,32 @@
#!/bin/bash
### Window requires pyinstall v2.1
wine msiexec -i python-2.7.8.msi
wine pywin32-218.win32-py2.7.exe
wine PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe
wine lxml-3.7.3.win32-py2.7.exe
THIS_SCRIPT_PATH=`readlink -f $0`
THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}`
cd pyinstaller
git checkout v2.1
cd ${THIS_SCRIPT_DIR}
echo ${THIS_SCRIPT_DIR}
#. venv_wine/bin/activate
rm -r build
rm -r dist
rm labelImg.spec
wine c:/Python27/python.exe pyinstaller/pyinstaller.py --hidden-import=xml \
--hidden-import=xml.etree \
--hidden-import=xml.etree.ElementTree \
--hidden-import=lxml.etree \
-D -F -n labelImg -c "../labelImg.py" -p ../libs -p ../
FOLDER=$(git describe --abbrev=0 --tags)
FOLDER="windows_"$FOLDER
rm -rf "$FOLDER"
mkdir "$FOLDER"
cp dist/labelImg.exe $FOLDER
cp -rf ../data $FOLDER/data
zip "$FOLDER.zip" -r $FOLDER

View File

@ -0,0 +1,53 @@
#!/bin/sh
THIS_SCRIPT_PATH=`readlink -f $0`
THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}`
#OS Ubuntu 14.04
### Common packages for linux/windows
if [ ! -e "pyinstaller" ]; then
git clone https://github.com/pyinstaller/pyinstaller
cd pyinstaller
git checkout v2.1 -b v2.1
cd ${THIS_SCRIPT_DIR}
fi
echo "Going to clone and download packages for building windows"
#Pacakges
#> pyinstaller (2.1)
#> wine (1.6.2)
#> virtual-wine (0.1)
#> python-2.7.8.msi
#> pywin32-218.win32-py2.7.exe
## tool to install on Ubuntu
#$ sudo apt-get install wine
### Clone a repo to create virtual wine env
if [ ! -e "virtual-wine" ]; then
git clone https://github.com/htgoebel/virtual-wine.git
fi
apt-get install scons
### Create virtual env
rm -rf venv_wine
./virtual-wine/vwine-setup venv_wine
#### Active virutal env
. venv_wine/bin/activate
### Use wine to install packages to virtual env
if [ ! -e "python-2.7.8.msi" ]; then
wget "https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi"
fi
if [ ! -e "pywin32-218.win32-py2.7.exe" ]; then
wget "http://nchc.dl.sourceforge.net/project/pywin32/pywin32/Build%20218/pywin32-218.win32-py2.7.exe"
fi
if [ ! -e "PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe" ]; then
wget "http://nchc.dl.sourceforge.net/project/pyqt/PyQt4/PyQt-4.11.4/PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe"
fi
if [ ! -e "lxml-3.7.3.win32-py2.7.exe" ]; then
wget "https://pypi.python.org/packages/a3/f6/a28c5cf63873f6c55a3eb7857b736379229b85ba918261d2e88cf886905e/lxml-3.7.3.win32-py2.7.exe#md5=a0f746355876aca4ca5371cb0f1d13ce"
fi

View File

@ -0,0 +1,13 @@
#!/bin/sh
docker run -it \
--user $(id -u) \
-e DISPLAY=unix$DISPLAY \
--workdir=$(pwd) \
--volume="/home/$USER:/home/$USER" \
--volume="/etc/group:/etc/group:ro" \
--volume="/etc/passwd:/etc/passwd:ro" \
--volume="/etc/shadow:/etc/shadow:ro" \
--volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
tzutalin/py2qt4

View File

@ -0,0 +1,4 @@
pipe
l_trail
r_trail
track

BIN
labelImg/demo/demo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
labelImg/demo/demo3.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
labelImg/demo/demo4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

BIN
labelImg/demo/demo5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

View File

@ -0,0 +1,7 @@
<!--
Please provide as much as detail and example as you can.
You can add screenshots if appropriate.
-->
- **OS:**
- **PyQt version:**

1722
labelImg/labelImg.py Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
__version_info__ = ('1', '8', '6')
__version__ = '.'.join(__version_info__)

748
labelImg/libs/canvas.py Normal file
View File

@ -0,0 +1,748 @@
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
except ImportError:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
# from PyQt4.QtOpenGL import *
from libs.shape import Shape
from libs.utils import distance
CURSOR_DEFAULT = Qt.ArrowCursor
CURSOR_POINT = Qt.PointingHandCursor
CURSOR_DRAW = Qt.CrossCursor
CURSOR_MOVE = Qt.ClosedHandCursor
CURSOR_GRAB = Qt.OpenHandCursor
# class Canvas(QGLWidget):
class Canvas(QWidget):
zoomRequest = pyqtSignal(int)
lightRequest = pyqtSignal(int)
scrollRequest = pyqtSignal(int, int)
newShape = pyqtSignal()
selectionChanged = pyqtSignal(bool)
shapeMoved = pyqtSignal()
drawingPolygon = pyqtSignal(bool)
CREATE, EDIT = list(range(2))
epsilon = 24.0
def __init__(self, *args, **kwargs):
super(Canvas, self).__init__(*args, **kwargs)
# Initialise local state.
self.mode = self.EDIT
self.shapes = []
self.current = None
self.selected_shape = None # save the selected shape here
self.selected_shape_copy = None
self.drawing_line_color = QColor(0, 0, 255)
self.drawing_rect_color = QColor(0, 0, 255)
self.line = Shape(line_color=self.drawing_line_color)
self.prev_point = QPointF()
self.offsets = QPointF(), QPointF()
self.scale = 1.0
self.overlay_color = None
self.label_font_size = 8
self.pixmap = QPixmap()
self.visible = {}
self._hide_background = False
self.hide_background = False
self.h_shape = None
self.h_vertex = None
self._painter = QPainter()
self._cursor = CURSOR_DEFAULT
# Menus:
self.menus = (QMenu(), QMenu())
# Set widget options.
self.setMouseTracking(True)
self.setFocusPolicy(Qt.WheelFocus)
self.verified = False
self.draw_square = False
# initialisation for panning
self.pan_initial_pos = QPoint()
def set_drawing_color(self, qcolor):
self.drawing_line_color = qcolor
self.drawing_rect_color = qcolor
def enterEvent(self, ev):
self.override_cursor(self._cursor)
def leaveEvent(self, ev):
self.restore_cursor()
def focusOutEvent(self, ev):
self.restore_cursor()
def isVisible(self, shape):
return self.visible.get(shape, True)
def drawing(self):
return self.mode == self.CREATE
def editing(self):
return self.mode == self.EDIT
def set_editing(self, value=True):
self.mode = self.EDIT if value else self.CREATE
if not value: # Create
self.un_highlight()
self.de_select_shape()
self.prev_point = QPointF()
self.repaint()
def un_highlight(self, shape=None):
if shape == None or shape == self.h_shape:
if self.h_shape:
self.h_shape.highlight_clear()
self.h_vertex = self.h_shape = None
def selected_vertex(self):
return self.h_vertex is not None
def mouseMoveEvent(self, ev):
"""Update line with last point and current coordinates."""
pos = self.transform_pos(ev.pos())
# Update coordinates in status bar if image is opened
window = self.parent().window()
if window.file_path is not None:
self.parent().window().label_coordinates.setText(
'X: %d; Y: %d' % (pos.x(), pos.y()))
# Polygon drawing.
if self.drawing():
self.override_cursor(CURSOR_DRAW)
if self.current:
# Display annotation width and height while drawing
current_width = abs(self.current[0].x() - pos.x())
current_height = abs(self.current[0].y() - pos.y())
self.parent().window().label_coordinates.setText(
'Width: %d, Height: %d / X: %d; Y: %d' % (current_width, current_height, pos.x(), pos.y()))
color = self.drawing_line_color
if self.out_of_pixmap(pos):
# Don't allow the user to draw outside the pixmap.
# Clip the coordinates to 0 or max,
# if they are outside the range [0, max]
size = self.pixmap.size()
clipped_x = min(max(0, pos.x()), size.width())
clipped_y = min(max(0, pos.y()), size.height())
pos = QPointF(clipped_x, clipped_y)
elif len(self.current) > 1 and self.close_enough(pos, self.current[0]):
# Attract line to starting point and colorise to alert the
# user:
pos = self.current[0]
color = self.current.line_color
self.override_cursor(CURSOR_POINT)
self.current.highlight_vertex(0, Shape.NEAR_VERTEX)
if self.draw_square:
init_pos = self.current[0]
min_x = init_pos.x()
min_y = init_pos.y()
min_size = min(abs(pos.x() - min_x), abs(pos.y() - min_y))
direction_x = -1 if pos.x() - min_x < 0 else 1
direction_y = -1 if pos.y() - min_y < 0 else 1
self.line[1] = QPointF(min_x + direction_x * min_size, min_y + direction_y * min_size)
else:
self.line[1] = pos
self.line.line_color = color
self.prev_point = QPointF()
self.current.highlight_clear()
else:
self.prev_point = pos
self.repaint()
return
# Polygon copy moving.
if Qt.RightButton & ev.buttons():
if self.selected_shape_copy and self.prev_point:
self.override_cursor(CURSOR_MOVE)
self.bounded_move_shape(self.selected_shape_copy, pos)
self.repaint()
elif self.selected_shape:
self.selected_shape_copy = self.selected_shape.copy()
self.repaint()
return
# Polygon/Vertex moving.
if Qt.LeftButton & ev.buttons():
if self.selected_vertex():
self.bounded_move_vertex(pos)
self.shapeMoved.emit()
self.repaint()
# Display annotation width and height while moving vertex
point1 = self.h_shape[1]
point3 = self.h_shape[3]
current_width = abs(point1.x() - point3.x())
current_height = abs(point1.y() - point3.y())
self.parent().window().label_coordinates.setText(
'Width: %d, Height: %d / X: %d; Y: %d' % (current_width, current_height, pos.x(), pos.y()))
elif self.selected_shape and self.prev_point:
self.override_cursor(CURSOR_MOVE)
self.bounded_move_shape(self.selected_shape, pos)
self.shapeMoved.emit()
self.repaint()
# Display annotation width and height while moving shape
point1 = self.selected_shape[1]
point3 = self.selected_shape[3]
current_width = abs(point1.x() - point3.x())
current_height = abs(point1.y() - point3.y())
self.parent().window().label_coordinates.setText(
'Width: %d, Height: %d / X: %d; Y: %d' % (current_width, current_height, pos.x(), pos.y()))
else:
# pan
delta = ev.pos() - self.pan_initial_pos
self.scrollRequest.emit(delta.x(), Qt.Horizontal)
self.scrollRequest.emit(delta.y(), Qt.Vertical)
self.update()
return
# Just hovering over the canvas, 2 possibilities:
# - Highlight shapes
# - Highlight vertex
# Update shape/vertex fill and tooltip value accordingly.
self.setToolTip("Image")
priority_list = self.shapes + ([self.selected_shape] if self.selected_shape else [])
for shape in reversed([s for s in priority_list if self.isVisible(s)]):
# Look for a nearby vertex to highlight. If that fails,
# check if we happen to be inside a shape.
index = shape.nearest_vertex(pos, self.epsilon)
if index is not None:
if self.selected_vertex():
self.h_shape.highlight_clear()
self.h_vertex, self.h_shape = index, shape
shape.highlight_vertex(index, shape.MOVE_VERTEX)
self.override_cursor(CURSOR_POINT)
self.setToolTip("Click & drag to move point")
self.setStatusTip(self.toolTip())
self.update()
break
elif shape.contains_point(pos):
if self.selected_vertex():
self.h_shape.highlight_clear()
self.h_vertex, self.h_shape = None, shape
self.setToolTip(
"Click & drag to move shape '%s'" % shape.label)
self.setStatusTip(self.toolTip())
self.override_cursor(CURSOR_GRAB)
self.update()
# Display annotation width and height while hovering inside
point1 = self.h_shape[1]
point3 = self.h_shape[3]
current_width = abs(point1.x() - point3.x())
current_height = abs(point1.y() - point3.y())
self.parent().window().label_coordinates.setText(
'Width: %d, Height: %d / X: %d; Y: %d' % (current_width, current_height, pos.x(), pos.y()))
break
else: # Nothing found, clear highlights, reset state.
if self.h_shape:
self.h_shape.highlight_clear()
self.update()
self.h_vertex, self.h_shape = None, None
self.override_cursor(CURSOR_DEFAULT)
def mousePressEvent(self, ev):
pos = self.transform_pos(ev.pos())
if ev.button() == Qt.LeftButton:
if self.drawing():
self.handle_drawing(pos)
else:
selection = self.select_shape_point(pos)
self.prev_point = pos
if selection is None:
# pan
QApplication.setOverrideCursor(QCursor(Qt.OpenHandCursor))
self.pan_initial_pos = ev.pos()
elif ev.button() == Qt.RightButton and self.editing():
self.select_shape_point(pos)
self.prev_point = pos
self.update()
def mouseReleaseEvent(self, ev):
if ev.button() == Qt.RightButton:
menu = self.menus[bool(self.selected_shape_copy)]
self.restore_cursor()
if not menu.exec_(self.mapToGlobal(ev.pos()))\
and self.selected_shape_copy:
# Cancel the move by deleting the shadow copy.
self.selected_shape_copy = None
self.repaint()
elif ev.button() == Qt.LeftButton and self.selected_shape:
if self.selected_vertex():
self.override_cursor(CURSOR_POINT)
else:
self.override_cursor(CURSOR_GRAB)
elif ev.button() == Qt.LeftButton:
pos = self.transform_pos(ev.pos())
if self.drawing():
self.handle_drawing(pos)
else:
# pan
QApplication.restoreOverrideCursor()
def end_move(self, copy=False):
assert self.selected_shape and self.selected_shape_copy
shape = self.selected_shape_copy
# del shape.fill_color
# del shape.line_color
if copy:
self.shapes.append(shape)
self.selected_shape.selected = False
self.selected_shape = shape
self.repaint()
else:
self.selected_shape.points = [p for p in shape.points]
self.selected_shape_copy = None
def hide_background_shapes(self, value):
self.hide_background = value
if self.selected_shape:
# Only hide other shapes if there is a current selection.
# Otherwise the user will not be able to select a shape.
self.set_hiding(True)
self.repaint()
def handle_drawing(self, pos):
if self.current and self.current.reach_max_points() is False:
init_pos = self.current[0]
min_x = init_pos.x()
min_y = init_pos.y()
target_pos = self.line[1]
max_x = target_pos.x()
max_y = target_pos.y()
self.current.add_point(QPointF(max_x, min_y))
self.current.add_point(target_pos)
self.current.add_point(QPointF(min_x, max_y))
self.finalise()
elif not self.out_of_pixmap(pos):
self.current = Shape()
self.current.add_point(pos)
self.line.points = [pos, pos]
self.set_hiding()
self.drawingPolygon.emit(True)
self.update()
def set_hiding(self, enable=True):
self._hide_background = self.hide_background if enable else False
def can_close_shape(self):
return self.drawing() and self.current and len(self.current) > 2
def mouseDoubleClickEvent(self, ev):
# We need at least 4 points here, since the mousePress handler
# adds an extra one before this handler is called.
if self.can_close_shape() and len(self.current) > 3:
self.current.pop_point()
self.finalise()
def select_shape(self, shape):
self.de_select_shape()
shape.selected = True
self.selected_shape = shape
self.set_hiding()
self.selectionChanged.emit(True)
self.update()
def select_shape_point(self, point):
"""Select the first shape created which contains this point."""
self.de_select_shape()
if self.selected_vertex(): # A vertex is marked for selection.
index, shape = self.h_vertex, self.h_shape
shape.highlight_vertex(index, shape.MOVE_VERTEX)
self.select_shape(shape)
return self.h_vertex
for shape in reversed(self.shapes):
if self.isVisible(shape) and shape.contains_point(point):
self.select_shape(shape)
self.calculate_offsets(shape, point)
return self.selected_shape
return None
def calculate_offsets(self, shape, point):
rect = shape.bounding_rect()
x1 = rect.x() - point.x()
y1 = rect.y() - point.y()
x2 = (rect.x() + rect.width()) - point.x()
y2 = (rect.y() + rect.height()) - point.y()
self.offsets = QPointF(x1, y1), QPointF(x2, y2)
def snap_point_to_canvas(self, x, y):
"""
Moves a point x,y to within the boundaries of the canvas.
:return: (x,y,snapped) where snapped is True if x or y were changed, False if not.
"""
if x < 0 or x > self.pixmap.width() or y < 0 or y > self.pixmap.height():
x = max(x, 0)
y = max(y, 0)
x = min(x, self.pixmap.width())
y = min(y, self.pixmap.height())
return x, y, True
return x, y, False
def bounded_move_vertex(self, pos):
index, shape = self.h_vertex, self.h_shape
point = shape[index]
if self.out_of_pixmap(pos):
size = self.pixmap.size()
clipped_x = min(max(0, pos.x()), size.width())
clipped_y = min(max(0, pos.y()), size.height())
pos = QPointF(clipped_x, clipped_y)
if self.draw_square:
opposite_point_index = (index + 2) % 4
opposite_point = shape[opposite_point_index]
min_size = min(abs(pos.x() - opposite_point.x()), abs(pos.y() - opposite_point.y()))
direction_x = -1 if pos.x() - opposite_point.x() < 0 else 1
direction_y = -1 if pos.y() - opposite_point.y() < 0 else 1
shift_pos = QPointF(opposite_point.x() + direction_x * min_size - point.x(),
opposite_point.y() + direction_y * min_size - point.y())
else:
shift_pos = pos - point
shape.move_vertex_by(index, shift_pos)
left_index = (index + 1) % 4
right_index = (index + 3) % 4
left_shift = None
right_shift = None
if index % 2 == 0:
right_shift = QPointF(shift_pos.x(), 0)
left_shift = QPointF(0, shift_pos.y())
else:
left_shift = QPointF(shift_pos.x(), 0)
right_shift = QPointF(0, shift_pos.y())
shape.move_vertex_by(right_index, right_shift)
shape.move_vertex_by(left_index, left_shift)
def bounded_move_shape(self, shape, pos):
if self.out_of_pixmap(pos):
return False # No need to move
o1 = pos + self.offsets[0]
if self.out_of_pixmap(o1):
pos -= QPointF(min(0, o1.x()), min(0, o1.y()))
o2 = pos + self.offsets[1]
if self.out_of_pixmap(o2):
pos += QPointF(min(0, self.pixmap.width() - o2.x()),
min(0, self.pixmap.height() - o2.y()))
# The next line tracks the new position of the cursor
# relative to the shape, but also results in making it
# a bit "shaky" when nearing the border and allows it to
# go outside of the shape's area for some reason. XXX
# self.calculateOffsets(self.selectedShape, pos)
dp = pos - self.prev_point
if dp:
shape.move_by(dp)
self.prev_point = pos
return True
return False
def de_select_shape(self):
if self.selected_shape:
self.selected_shape.selected = False
self.selected_shape = None
self.set_hiding(False)
self.selectionChanged.emit(False)
self.update()
def delete_selected(self):
if self.selected_shape:
shape = self.selected_shape
self.un_highlight(shape)
self.shapes.remove(self.selected_shape)
self.selected_shape = None
self.update()
return shape
def copy_selected_shape(self):
if self.selected_shape:
shape = self.selected_shape.copy()
self.de_select_shape()
self.shapes.append(shape)
shape.selected = True
self.selected_shape = shape
self.bounded_shift_shape(shape)
return shape
def bounded_shift_shape(self, shape):
# Try to move in one direction, and if it fails in another.
# Give up if both fail.
point = shape[0]
offset = QPointF(2.0, 2.0)
self.calculate_offsets(shape, point)
self.prev_point = point
if not self.bounded_move_shape(shape, point - offset):
self.bounded_move_shape(shape, point + offset)
def paintEvent(self, event):
if not self.pixmap:
return super(Canvas, self).paintEvent(event)
p = self._painter
p.begin(self)
p.setRenderHint(QPainter.Antialiasing)
p.setRenderHint(QPainter.HighQualityAntialiasing)
p.setRenderHint(QPainter.SmoothPixmapTransform)
p.scale(self.scale, self.scale)
p.translate(self.offset_to_center())
temp = self.pixmap
if self.overlay_color:
temp = QPixmap(self.pixmap)
painter = QPainter(temp)
painter.setCompositionMode(painter.CompositionMode_Overlay)
painter.fillRect(temp.rect(), self.overlay_color)
painter.end()
p.drawPixmap(0, 0, temp)
Shape.scale = self.scale
Shape.label_font_size = self.label_font_size
for shape in self.shapes:
if (shape.selected or not self._hide_background) and self.isVisible(shape):
shape.fill = shape.selected or shape == self.h_shape
shape.paint(p)
if self.current:
self.current.paint(p)
self.line.paint(p)
if self.selected_shape_copy:
self.selected_shape_copy.paint(p)
# Paint rect
if self.current is not None and len(self.line) == 2:
left_top = self.line[0]
right_bottom = self.line[1]
rect_width = right_bottom.x() - left_top.x()
rect_height = right_bottom.y() - left_top.y()
p.setPen(self.drawing_rect_color)
brush = QBrush(Qt.BDiagPattern)
p.setBrush(brush)
p.drawRect(int(left_top.x()), int(left_top.y()), int(rect_width), int(rect_height))
if self.drawing() and not self.prev_point.isNull() and not self.out_of_pixmap(self.prev_point):
p.setPen(QColor(0, 0, 0))
p.drawLine(int(self.prev_point.x()), 0, int(self.prev_point.x()), int(self.pixmap.height()))
p.drawLine(0, int(self.prev_point.y()), int(self.pixmap.width()), int(self.prev_point.y()))
self.setAutoFillBackground(True)
if self.verified:
pal = self.palette()
pal.setColor(self.backgroundRole(), QColor(184, 239, 38, 128))
self.setPalette(pal)
else:
pal = self.palette()
pal.setColor(self.backgroundRole(), QColor(232, 232, 232, 255))
self.setPalette(pal)
p.end()
def transform_pos(self, point):
"""Convert from widget-logical coordinates to painter-logical coordinates."""
return point / self.scale - self.offset_to_center()
def offset_to_center(self):
s = self.scale
area = super(Canvas, self).size()
w, h = self.pixmap.width() * s, self.pixmap.height() * s
aw, ah = area.width(), area.height()
x = (aw - w) / (2 * s) if aw > w else 0
y = (ah - h) / (2 * s) if ah > h else 0
return QPointF(x, y)
def out_of_pixmap(self, p):
w, h = self.pixmap.width(), self.pixmap.height()
return not (0 <= p.x() <= w and 0 <= p.y() <= h)
def finalise(self):
assert self.current
if self.current.points[0] == self.current.points[-1]:
self.current = None
self.drawingPolygon.emit(False)
self.update()
return
self.current.close()
self.shapes.append(self.current)
self.current = None
self.set_hiding(False)
self.newShape.emit()
self.update()
def close_enough(self, p1, p2):
# d = distance(p1 - p2)
# m = (p1-p2).manhattanLength()
# print "d %.2f, m %d, %.2f" % (d, m, d - m)
return distance(p1 - p2) < self.epsilon
# These two, along with a call to adjustSize are required for the
# scroll area.
def sizeHint(self):
return self.minimumSizeHint()
def minimumSizeHint(self):
if self.pixmap:
return self.scale * self.pixmap.size()
return super(Canvas, self).minimumSizeHint()
def wheelEvent(self, ev):
qt_version = 4 if hasattr(ev, "delta") else 5
if qt_version == 4:
if ev.orientation() == Qt.Vertical:
v_delta = ev.delta()
h_delta = 0
else:
h_delta = ev.delta()
v_delta = 0
else:
delta = ev.angleDelta()
h_delta = delta.x()
v_delta = delta.y()
mods = ev.modifiers()
if int(Qt.ControlModifier) | int(Qt.ShiftModifier) == int(mods) and v_delta:
self.lightRequest.emit(v_delta)
elif Qt.ControlModifier == int(mods) and v_delta:
self.zoomRequest.emit(v_delta)
else:
v_delta and self.scrollRequest.emit(v_delta, Qt.Vertical)
h_delta and self.scrollRequest.emit(h_delta, Qt.Horizontal)
ev.accept()
def keyPressEvent(self, ev):
key = ev.key()
if key == Qt.Key_Escape and self.current:
print('ESC press')
self.current = None
self.drawingPolygon.emit(False)
self.update()
elif key == Qt.Key_Return and self.can_close_shape():
self.finalise()
elif key == Qt.Key_Left and self.selected_shape:
self.move_one_pixel('Left')
elif key == Qt.Key_Right and self.selected_shape:
self.move_one_pixel('Right')
elif key == Qt.Key_Up and self.selected_shape:
self.move_one_pixel('Up')
elif key == Qt.Key_Down and self.selected_shape:
self.move_one_pixel('Down')
def move_one_pixel(self, direction):
# print(self.selectedShape.points)
if direction == 'Left' and not self.move_out_of_bound(QPointF(-1.0, 0)):
# print("move Left one pixel")
self.selected_shape.points[0] += QPointF(-1.0, 0)
self.selected_shape.points[1] += QPointF(-1.0, 0)
self.selected_shape.points[2] += QPointF(-1.0, 0)
self.selected_shape.points[3] += QPointF(-1.0, 0)
elif direction == 'Right' and not self.move_out_of_bound(QPointF(1.0, 0)):
# print("move Right one pixel")
self.selected_shape.points[0] += QPointF(1.0, 0)
self.selected_shape.points[1] += QPointF(1.0, 0)
self.selected_shape.points[2] += QPointF(1.0, 0)
self.selected_shape.points[3] += QPointF(1.0, 0)
elif direction == 'Up' and not self.move_out_of_bound(QPointF(0, -1.0)):
# print("move Up one pixel")
self.selected_shape.points[0] += QPointF(0, -1.0)
self.selected_shape.points[1] += QPointF(0, -1.0)
self.selected_shape.points[2] += QPointF(0, -1.0)
self.selected_shape.points[3] += QPointF(0, -1.0)
elif direction == 'Down' and not self.move_out_of_bound(QPointF(0, 1.0)):
# print("move Down one pixel")
self.selected_shape.points[0] += QPointF(0, 1.0)
self.selected_shape.points[1] += QPointF(0, 1.0)
self.selected_shape.points[2] += QPointF(0, 1.0)
self.selected_shape.points[3] += QPointF(0, 1.0)
self.shapeMoved.emit()
self.repaint()
def move_out_of_bound(self, step):
points = [p1 + p2 for p1, p2 in zip(self.selected_shape.points, [step] * 4)]
return True in map(self.out_of_pixmap, points)
def set_last_label(self, text, line_color=None, fill_color=None):
assert text
self.shapes[-1].label = text
if line_color:
self.shapes[-1].line_color = line_color
if fill_color:
self.shapes[-1].fill_color = fill_color
return self.shapes[-1]
def undo_last_line(self):
assert self.shapes
self.current = self.shapes.pop()
self.current.set_open()
self.line.points = [self.current[-1], self.current[0]]
self.drawingPolygon.emit(True)
def reset_all_lines(self):
assert self.shapes
self.current = self.shapes.pop()
self.current.set_open()
self.line.points = [self.current[-1], self.current[0]]
self.drawingPolygon.emit(True)
self.current = None
self.drawingPolygon.emit(False)
self.update()
def load_pixmap(self, pixmap):
self.pixmap = pixmap
self.shapes = []
self.repaint()
def load_shapes(self, shapes):
self.shapes = list(shapes)
self.current = None
self.repaint()
def set_shape_visible(self, shape, value):
self.visible[shape] = value
self.repaint()
def current_cursor(self):
cursor = QApplication.overrideCursor()
if cursor is not None:
cursor = cursor.shape()
return cursor
def override_cursor(self, cursor):
self._cursor = cursor
if self.current_cursor() is None:
QApplication.setOverrideCursor(cursor)
else:
QApplication.changeOverrideCursor(cursor)
def restore_cursor(self):
QApplication.restoreOverrideCursor()
def reset_state(self):
self.de_select_shape()
self.un_highlight()
self.selected_shape_copy = None
self.restore_cursor()
self.pixmap = None
self.update()
def set_drawing_shape_to_square(self, status):
self.draw_square = status

View File

@ -0,0 +1,37 @@
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QColorDialog, QDialogButtonBox
except ImportError:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
BB = QDialogButtonBox
class ColorDialog(QColorDialog):
def __init__(self, parent=None):
super(ColorDialog, self).__init__(parent)
self.setOption(QColorDialog.ShowAlphaChannel)
# The Mac native dialog does not support our restore button.
self.setOption(QColorDialog.DontUseNativeDialog)
# Add a restore defaults button.
# The default is set at invocation time, so that it
# works across dialogs for different elements.
self.default = None
self.bb = self.layout().itemAt(1).widget()
self.bb.addButton(BB.RestoreDefaults)
self.bb.clicked.connect(self.check_restore)
def getColor(self, value=None, title=None, default=None):
self.default = default
if title:
self.setWindowTitle(title)
if value:
self.setCurrentColor(value)
return self.currentColor() if self.exec_() else None
def check_restore(self, button):
if self.bb.buttonRole(button) & BB.ResetRole and self.default:
self.setCurrentColor(self.default)

33
labelImg/libs/combobox.py Normal file
View File

@ -0,0 +1,33 @@
import sys
try:
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QComboBox
except ImportError:
# needed for py3+qt4
# Ref:
# http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html
# http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string
if sys.version_info.major >= 3:
import sip
sip.setapi('QVariant', 2)
from PyQt4.QtGui import QWidget, QHBoxLayout, QComboBox
class ComboBox(QWidget):
def __init__(self, parent=None, items=[]):
super(ComboBox, self).__init__(parent)
layout = QHBoxLayout()
self.cb = QComboBox()
self.items = items
self.cb.addItems(self.items)
self.cb.currentIndexChanged.connect(parent.combo_selection_changed)
layout.addWidget(self.cb)
self.setLayout(layout)
def update_items(self, items):
self.items = items
self.cb.clear()
self.cb.addItems(self.items)

View File

@ -0,0 +1,20 @@
SETTING_FILENAME = 'filename'
SETTING_RECENT_FILES = 'recentFiles'
SETTING_WIN_SIZE = 'window/size'
SETTING_WIN_POSE = 'window/position'
SETTING_WIN_GEOMETRY = 'window/geometry'
SETTING_LINE_COLOR = 'line/color'
SETTING_FILL_COLOR = 'fill/color'
SETTING_ADVANCE_MODE = 'advanced'
SETTING_WIN_STATE = 'window/state'
SETTING_SAVE_DIR = 'savedir'
SETTING_PAINT_LABEL = 'paintlabel'
SETTING_LAST_OPEN_DIR = 'lastOpenDir'
SETTING_AUTO_SAVE = 'autosave'
SETTING_SINGLE_CLASS = 'singleclass'
FORMAT_PASCALVOC='PascalVOC'
FORMAT_YOLO='YOLO'
FORMAT_CREATEML='CreateML'
SETTING_DRAW_SQUARE = 'draw/square'
SETTING_LABEL_FILE_FORMAT= 'labelFileFormat'
DEFAULT_ENCODING = 'utf-8'

View File

@ -0,0 +1,135 @@
#!/usr/bin/env python
# -*- coding: utf8 -*-
import json
from pathlib import Path
from libs.constants import DEFAULT_ENCODING
import os
JSON_EXT = '.json'
ENCODE_METHOD = DEFAULT_ENCODING
class CreateMLWriter:
def __init__(self, folder_name, filename, img_size, shapes, output_file, database_src='Unknown', local_img_path=None):
self.folder_name = folder_name
self.filename = filename
self.database_src = database_src
self.img_size = img_size
self.box_list = []
self.local_img_path = local_img_path
self.verified = False
self.shapes = shapes
self.output_file = output_file
def write(self):
if os.path.isfile(self.output_file):
with open(self.output_file, "r") as file:
input_data = file.read()
output_dict = json.loads(input_data)
else:
output_dict = []
output_image_dict = {
"image": self.filename,
"verified": self.verified,
"annotations": []
}
for shape in self.shapes:
points = shape["points"]
x1 = points[0][0]
y1 = points[0][1]
x2 = points[1][0]
y2 = points[2][1]
height, width, x, y = self.calculate_coordinates(x1, x2, y1, y2)
shape_dict = {
"label": shape["label"],
"coordinates": {
"x": x,
"y": y,
"width": width,
"height": height
}
}
output_image_dict["annotations"].append(shape_dict)
# check if image already in output
exists = False
for i in range(0, len(output_dict)):
if output_dict[i]["image"] == output_image_dict["image"]:
exists = True
output_dict[i] = output_image_dict
break
if not exists:
output_dict.append(output_image_dict)
Path(self.output_file).write_text(json.dumps(output_dict), ENCODE_METHOD)
def calculate_coordinates(self, x1, x2, y1, y2):
if x1 < x2:
x_min = x1
x_max = x2
else:
x_min = x2
x_max = x1
if y1 < y2:
y_min = y1
y_max = y2
else:
y_min = y2
y_max = y1
width = x_max - x_min
if width < 0:
width = width * -1
height = y_max - y_min
# x and y from center of rect
x = x_min + width / 2
y = y_min + height / 2
return height, width, x, y
class CreateMLReader:
def __init__(self, json_path, file_path):
self.json_path = json_path
self.shapes = []
self.verified = False
self.filename = os.path.basename(file_path)
try:
self.parse_json()
except ValueError:
print("JSON decoding failed")
def parse_json(self):
with open(self.json_path, "r") as file:
input_data = file.read()
# Returns a list
output_list = json.loads(input_data)
if output_list:
self.verified = output_list[0].get("verified", False)
if len(self.shapes) > 0:
self.shapes = []
for image in output_list:
if image["image"] == self.filename:
for shape in image["annotations"]:
self.add_shape(shape["label"], shape["coordinates"])
def add_shape(self, label, bnd_box):
x_min = bnd_box["x"] - (bnd_box["width"] / 2)
y_min = bnd_box["y"] - (bnd_box["height"] / 2)
x_max = bnd_box["x"] + (bnd_box["width"] / 2)
y_max = bnd_box["y"] + (bnd_box["height"] / 2)
points = [(x_min, y_min), (x_max, y_min), (x_max, y_max), (x_min, y_max)]
self.shapes.append((label, points, None, None, True))
def get_shapes(self):
return self.shapes

View File

@ -0,0 +1,27 @@
import sys
try:
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QComboBox
except ImportError:
# needed for py3+qt4
# Ref:
# http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html
# http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string
if sys.version_info.major >= 3:
import sip
sip.setapi('QVariant', 2)
from PyQt4.QtGui import QWidget, QHBoxLayout, QComboBox
class DefaultLabelComboBox(QWidget):
def __init__(self, parent=None, items=[]):
super(DefaultLabelComboBox, self).__init__(parent)
layout = QHBoxLayout()
self.cb = QComboBox()
self.items = items
self.cb.addItems(self.items)
self.cb.currentIndexChanged.connect(parent.default_label_combo_selection_changed)
layout.addWidget(self.cb)
self.setLayout(layout)

View File

@ -0,0 +1,28 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
except ImportError:
# needed for py3+qt4
# Ref:
# http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html
# http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string
if sys.version_info.major >= 3:
import sip
sip.setapi('QVariant', 2)
from PyQt4.QtGui import *
from PyQt4.QtCore import *
# PyQt5: TypeError: unhashable type: 'QListWidgetItem'
class HashableQListWidgetItem(QListWidgetItem):
def __init__(self, *args):
super(HashableQListWidgetItem, self).__init__(*args)
def __hash__(self):
return hash(id(self))

View File

@ -0,0 +1,95 @@
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
except ImportError:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from libs.utils import new_icon, label_validator, trimmed
BB = QDialogButtonBox
class LabelDialog(QDialog):
def __init__(self, text="Enter object label", parent=None, list_item=None):
super(LabelDialog, self).__init__(parent)
self.edit = QLineEdit()
self.edit.setText(text)
self.edit.setValidator(label_validator())
self.edit.editingFinished.connect(self.post_process)
model = QStringListModel()
model.setStringList(list_item)
completer = QCompleter()
completer.setModel(model)
self.edit.setCompleter(completer)
self.button_box = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self)
bb.button(BB.Ok).setIcon(new_icon('done'))
bb.button(BB.Cancel).setIcon(new_icon('undo'))
bb.accepted.connect(self.validate)
bb.rejected.connect(self.reject)
layout = QVBoxLayout()
layout.addWidget(bb, alignment=Qt.AlignmentFlag.AlignLeft)
layout.addWidget(self.edit)
if list_item is not None and len(list_item) > 0:
self.list_widget = QListWidget(self)
for item in list_item:
self.list_widget.addItem(item)
self.list_widget.itemClicked.connect(self.list_item_click)
self.list_widget.itemDoubleClicked.connect(self.list_item_double_click)
layout.addWidget(self.list_widget)
self.setLayout(layout)
def validate(self):
if trimmed(self.edit.text()):
self.accept()
def post_process(self):
self.edit.setText(trimmed(self.edit.text()))
def pop_up(self, text='', move=True):
"""
Shows the dialog, setting the current text to `text`, and blocks the caller until the user has made a choice.
If the user entered a label, that label is returned, otherwise (i.e. if the user cancelled the action)
`None` is returned.
"""
self.edit.setText(text)
self.edit.setSelection(0, len(text))
self.edit.setFocus(Qt.PopupFocusReason)
if move:
cursor_pos = QCursor.pos()
# move OK button below cursor
btn = self.button_box.buttons()[0]
self.adjustSize()
btn.adjustSize()
offset = btn.mapToGlobal(btn.pos()) - self.pos()
offset += QPoint(btn.size().width() // 4, btn.size().height() // 2)
cursor_pos.setX(max(0, cursor_pos.x() - offset.x()))
cursor_pos.setY(max(0, cursor_pos.y() - offset.y()))
parent_bottom_right = self.parentWidget().geometry()
max_x = parent_bottom_right.x() + parent_bottom_right.width() - self.sizeHint().width()
max_y = parent_bottom_right.y() + parent_bottom_right.height() - self.sizeHint().height()
max_global = self.parentWidget().mapToGlobal(QPoint(max_x, max_y))
if cursor_pos.x() > max_global.x():
cursor_pos.setX(max_global.x())
if cursor_pos.y() > max_global.y():
cursor_pos.setY(max_global.y())
self.move(cursor_pos)
return trimmed(self.edit.text()) if self.exec_() else None
def list_item_click(self, t_qlist_widget_item):
text = trimmed(t_qlist_widget_item.text())
self.edit.setText(text)
def list_item_double_click(self, t_qlist_widget_item):
self.list_item_click(t_qlist_widget_item)
self.validate()

174
labelImg/libs/labelFile.py Normal file
View File

@ -0,0 +1,174 @@
# Copyright (c) 2016 Tzutalin
# Create by TzuTaLin <tzu.ta.lin@gmail.com>
try:
from PyQt5.QtGui import QImage
except ImportError:
from PyQt4.QtGui import QImage
import os.path
from enum import Enum
from libs.create_ml_io import CreateMLWriter
from libs.pascal_voc_io import PascalVocWriter
from libs.pascal_voc_io import XML_EXT
from libs.yolo_io import YOLOWriter
class LabelFileFormat(Enum):
PASCAL_VOC = 1
YOLO = 2
CREATE_ML = 3
class LabelFileError(Exception):
pass
class LabelFile(object):
# It might be changed as window creates. By default, using XML ext
# suffix = '.lif'
suffix = XML_EXT
def __init__(self, filename=None):
self.shapes = ()
self.image_path = None
self.image_data = None
self.verified = False
def save_create_ml_format(self, filename, shapes, image_path, image_data, class_list, line_color=None, fill_color=None, database_src=None):
img_folder_name = os.path.basename(os.path.dirname(image_path))
img_file_name = os.path.basename(image_path)
image = QImage()
image.load(image_path)
image_shape = [image.height(), image.width(),
1 if image.isGrayscale() else 3]
writer = CreateMLWriter(img_folder_name, img_file_name,
image_shape, shapes, filename, local_img_path=image_path)
writer.verified = self.verified
writer.write()
return
def save_pascal_voc_format(self, filename, shapes, image_path, image_data,
line_color=None, fill_color=None, database_src=None):
img_folder_path = os.path.dirname(image_path)
img_folder_name = os.path.split(img_folder_path)[-1]
img_file_name = os.path.basename(image_path)
# imgFileNameWithoutExt = os.path.splitext(img_file_name)[0]
# Read from file path because self.imageData might be empty if saving to
# Pascal format
if isinstance(image_data, QImage):
image = image_data
else:
image = QImage()
image.load(image_path)
image_shape = [image.height(), image.width(),
1 if image.isGrayscale() else 3]
writer = PascalVocWriter(img_folder_name, img_file_name,
image_shape, local_img_path=image_path)
writer.verified = self.verified
for shape in shapes:
points = shape['points']
label = shape['label']
# Add Chris
difficult = int(shape['difficult'])
bnd_box = LabelFile.convert_points_to_bnd_box(points)
writer.add_bnd_box(bnd_box[0], bnd_box[1], bnd_box[2], bnd_box[3], label, difficult)
writer.save(target_file=filename)
return
def save_yolo_format(self, filename, shapes, image_path, image_data, class_list,
line_color=None, fill_color=None, database_src=None):
img_folder_path = os.path.dirname(image_path)
img_folder_name = os.path.split(img_folder_path)[-1]
img_file_name = os.path.basename(image_path)
# imgFileNameWithoutExt = os.path.splitext(img_file_name)[0]
# Read from file path because self.imageData might be empty if saving to
# Pascal format
if isinstance(image_data, QImage):
image = image_data
else:
image = QImage()
image.load(image_path)
image_shape = [image.height(), image.width(),
1 if image.isGrayscale() else 3]
writer = YOLOWriter(img_folder_name, img_file_name,
image_shape, local_img_path=image_path)
writer.verified = self.verified
for shape in shapes:
points = shape['points']
label = shape['label']
# Add Chris
difficult = int(shape['difficult'])
bnd_box = LabelFile.convert_points_to_bnd_box(points)
writer.add_bnd_box(bnd_box[0], bnd_box[1], bnd_box[2], bnd_box[3], label, difficult)
writer.save(target_file=filename, class_list=class_list)
return
def toggle_verify(self):
self.verified = not self.verified
''' ttf is disable
def load(self, filename):
import json
with open(filename, 'rb') as f:
data = json.load(f)
imagePath = data['imagePath']
imageData = b64decode(data['imageData'])
lineColor = data['lineColor']
fillColor = data['fillColor']
shapes = ((s['label'], s['points'], s['line_color'], s['fill_color'])\
for s in data['shapes'])
# Only replace data after everything is loaded.
self.shapes = shapes
self.imagePath = imagePath
self.imageData = imageData
self.lineColor = lineColor
self.fillColor = fillColor
def save(self, filename, shapes, imagePath, imageData, lineColor=None, fillColor=None):
import json
with open(filename, 'wb') as f:
json.dump(dict(
shapes=shapes,
lineColor=lineColor, fillColor=fillColor,
imagePath=imagePath,
imageData=b64encode(imageData)),
f, ensure_ascii=True, indent=2)
'''
@staticmethod
def is_label_file(filename):
file_suffix = os.path.splitext(filename)[1].lower()
return file_suffix == LabelFile.suffix
@staticmethod
def convert_points_to_bnd_box(points):
x_min = float('inf')
y_min = float('inf')
x_max = float('-inf')
y_max = float('-inf')
for p in points:
x = p[0]
y = p[1]
x_min = min(x, x_min)
y_min = min(y, y_min)
x_max = max(x, x_max)
y_max = max(y, y_max)
# Martin Kersner, 2015/11/12
# 0-valued coordinates of BB caused an error while
# training faster-rcnn object detector.
if x_min < 1:
x_min = 1
if y_min < 1:
y_min = 1
return int(x_min), int(y_min), int(x_max), int(y_max)

View File

@ -0,0 +1,33 @@
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
except ImportError:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class LightWidget(QSpinBox):
def __init__(self, title, value=50):
super(LightWidget, self).__init__()
self.setButtonSymbols(QAbstractSpinBox.NoButtons)
self.setRange(0, 100)
self.setSuffix(' %')
self.setValue(value)
self.setToolTip(title)
self.setStatusTip(self.toolTip())
self.setAlignment(Qt.AlignCenter)
def minimumSizeHint(self):
height = super(LightWidget, self).minimumSizeHint().height()
fm = QFontMetrics(self.font())
width = fm.width(str(self.maximum()))
return QSize(width, height)
def color(self):
if self.value() == 50:
return None
strength = int(self.value()/100 * 255 + 0.5)
return QColor(strength, strength, strength)

View File

@ -0,0 +1,171 @@
#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement
from lxml import etree
import codecs
from libs.constants import DEFAULT_ENCODING
from libs.ustr import ustr
XML_EXT = '.xml'
ENCODE_METHOD = DEFAULT_ENCODING
class PascalVocWriter:
def __init__(self, folder_name, filename, img_size, database_src='Unknown', local_img_path=None):
self.folder_name = folder_name
self.filename = filename
self.database_src = database_src
self.img_size = img_size
self.box_list = []
self.local_img_path = local_img_path
self.verified = False
def prettify(self, elem):
"""
Return a pretty-printed XML string for the Element.
"""
rough_string = ElementTree.tostring(elem, 'utf8')
root = etree.fromstring(rough_string)
return etree.tostring(root, pretty_print=True, encoding=ENCODE_METHOD).replace(" ".encode(), "\t".encode())
# minidom does not support UTF-8
# reparsed = minidom.parseString(rough_string)
# return reparsed.toprettyxml(indent="\t", encoding=ENCODE_METHOD)
def gen_xml(self):
"""
Return XML root
"""
# Check conditions
if self.filename is None or \
self.folder_name is None or \
self.img_size is None:
return None
top = Element('annotation')
if self.verified:
top.set('verified', 'yes')
folder = SubElement(top, 'folder')
folder.text = self.folder_name
filename = SubElement(top, 'filename')
filename.text = self.filename
if self.local_img_path is not None:
local_img_path = SubElement(top, 'path')
local_img_path.text = self.local_img_path
source = SubElement(top, 'source')
database = SubElement(source, 'database')
database.text = self.database_src
size_part = SubElement(top, 'size')
width = SubElement(size_part, 'width')
height = SubElement(size_part, 'height')
depth = SubElement(size_part, 'depth')
width.text = str(self.img_size[1])
height.text = str(self.img_size[0])
if len(self.img_size) == 3:
depth.text = str(self.img_size[2])
else:
depth.text = '1'
segmented = SubElement(top, 'segmented')
segmented.text = '0'
return top
def add_bnd_box(self, x_min, y_min, x_max, y_max, name, difficult):
bnd_box = {'xmin': x_min, 'ymin': y_min, 'xmax': x_max, 'ymax': y_max}
bnd_box['name'] = name
bnd_box['difficult'] = difficult
self.box_list.append(bnd_box)
def append_objects(self, top):
for each_object in self.box_list:
object_item = SubElement(top, 'object')
name = SubElement(object_item, 'name')
name.text = ustr(each_object['name'])
pose = SubElement(object_item, 'pose')
pose.text = "Unspecified"
truncated = SubElement(object_item, 'truncated')
if int(float(each_object['ymax'])) == int(float(self.img_size[0])) or (int(float(each_object['ymin'])) == 1):
truncated.text = "1" # max == height or min
elif (int(float(each_object['xmax'])) == int(float(self.img_size[1]))) or (int(float(each_object['xmin'])) == 1):
truncated.text = "1" # max == width or min
else:
truncated.text = "0"
difficult = SubElement(object_item, 'difficult')
difficult.text = str(bool(each_object['difficult']) & 1)
bnd_box = SubElement(object_item, 'bndbox')
x_min = SubElement(bnd_box, 'xmin')
x_min.text = str(each_object['xmin'])
y_min = SubElement(bnd_box, 'ymin')
y_min.text = str(each_object['ymin'])
x_max = SubElement(bnd_box, 'xmax')
x_max.text = str(each_object['xmax'])
y_max = SubElement(bnd_box, 'ymax')
y_max.text = str(each_object['ymax'])
def save(self, target_file=None):
root = self.gen_xml()
self.append_objects(root)
out_file = None
if target_file is None:
out_file = codecs.open(
self.filename + XML_EXT, 'w', encoding=ENCODE_METHOD)
else:
out_file = codecs.open(target_file, 'w', encoding=ENCODE_METHOD)
prettify_result = self.prettify(root)
out_file.write(prettify_result.decode('utf8'))
out_file.close()
class PascalVocReader:
def __init__(self, file_path):
# shapes type:
# [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult]
self.shapes = []
self.file_path = file_path
self.verified = False
try:
self.parse_xml()
except:
pass
def get_shapes(self):
return self.shapes
def add_shape(self, label, bnd_box, difficult):
x_min = int(float(bnd_box.find('xmin').text))
y_min = int(float(bnd_box.find('ymin').text))
x_max = int(float(bnd_box.find('xmax').text))
y_max = int(float(bnd_box.find('ymax').text))
points = [(x_min, y_min), (x_max, y_min), (x_max, y_max), (x_min, y_max)]
self.shapes.append((label, points, None, None, difficult))
def parse_xml(self):
assert self.file_path.endswith(XML_EXT), "Unsupported file format"
parser = etree.XMLParser(encoding=ENCODE_METHOD)
xml_tree = ElementTree.parse(self.file_path, parser=parser).getroot()
filename = xml_tree.find('filename').text
try:
verified = xml_tree.attrib['verified']
if verified == 'yes':
self.verified = True
except KeyError:
self.verified = False
for object_iter in xml_tree.findall('object'):
bnd_box = object_iter.find("bndbox")
label = object_iter.find('name').text
# Add chris
difficult = False
if object_iter.find('difficult') is not None:
difficult = bool(int(object_iter.find('difficult').text))
self.add_shape(label, bnd_box, difficult)
return True

45
labelImg/libs/settings.py Normal file
View File

@ -0,0 +1,45 @@
import os
import pickle
class Settings(object):
def __init__(self):
# Be default, the home will be in the same folder as labelImg
home = os.path.expanduser("~")
self.data = {}
self.path = os.path.join(home, '.labelImgSettings.pkl')
def __setitem__(self, key, value):
self.data[key] = value
def __getitem__(self, key):
return self.data[key]
def get(self, key, default=None):
if key in self.data:
return self.data[key]
return default
def save(self):
if self.path:
with open(self.path, 'wb') as f:
pickle.dump(self.data, f, pickle.HIGHEST_PROTOCOL)
return True
return False
def load(self):
try:
if os.path.exists(self.path):
with open(self.path, 'rb') as f:
self.data = pickle.load(f)
return True
except:
print('Loading setting failed')
return False
def reset(self):
if os.path.exists(self.path):
os.remove(self.path)
print('Remove setting pkl file ${0}'.format(self.path))
self.data = {}
self.path = None

209
labelImg/libs/shape.py Normal file
View File

@ -0,0 +1,209 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
except ImportError:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from libs.utils import distance
import sys
DEFAULT_LINE_COLOR = QColor(0, 255, 0, 128)
DEFAULT_FILL_COLOR = QColor(255, 0, 0, 128)
DEFAULT_SELECT_LINE_COLOR = QColor(255, 255, 255)
DEFAULT_SELECT_FILL_COLOR = QColor(0, 128, 255, 155)
DEFAULT_VERTEX_FILL_COLOR = QColor(0, 255, 0, 255)
DEFAULT_HVERTEX_FILL_COLOR = QColor(255, 0, 0)
class Shape(object):
P_SQUARE, P_ROUND = range(2)
MOVE_VERTEX, NEAR_VERTEX = range(2)
# The following class variables influence the drawing
# of _all_ shape objects.
line_color = DEFAULT_LINE_COLOR
fill_color = DEFAULT_FILL_COLOR
select_line_color = DEFAULT_SELECT_LINE_COLOR
select_fill_color = DEFAULT_SELECT_FILL_COLOR
vertex_fill_color = DEFAULT_VERTEX_FILL_COLOR
h_vertex_fill_color = DEFAULT_HVERTEX_FILL_COLOR
point_type = P_ROUND
point_size = 16
scale = 1.0
label_font_size = 8
def __init__(self, label=None, line_color=None, difficult=False, paint_label=False):
self.label = label
self.points = []
self.fill = False
self.selected = False
self.difficult = difficult
self.paint_label = paint_label
self._highlight_index = None
self._highlight_mode = self.NEAR_VERTEX
self._highlight_settings = {
self.NEAR_VERTEX: (4, self.P_ROUND),
self.MOVE_VERTEX: (1.5, self.P_SQUARE),
}
self._closed = False
if line_color is not None:
# Override the class line_color attribute
# with an object attribute. Currently this
# is used for drawing the pending line a different color.
self.line_color = line_color
def close(self):
self._closed = True
def reach_max_points(self):
if len(self.points) >= 4:
return True
return False
def add_point(self, point):
if not self.reach_max_points():
self.points.append(point)
def pop_point(self):
if self.points:
return self.points.pop()
return None
def is_closed(self):
return self._closed
def set_open(self):
self._closed = False
def paint(self, painter):
if self.points:
color = self.select_line_color if self.selected else self.line_color
pen = QPen(color)
# Try using integer sizes for smoother drawing(?)
pen.setWidth(max(1, int(round(2.0 / self.scale))))
painter.setPen(pen)
line_path = QPainterPath()
vertex_path = QPainterPath()
line_path.moveTo(self.points[0])
# Uncommenting the following line will draw 2 paths
# for the 1st vertex, and make it non-filled, which
# may be desirable.
# self.drawVertex(vertex_path, 0)
for i, p in enumerate(self.points):
line_path.lineTo(p)
self.draw_vertex(vertex_path, i)
if self.is_closed():
line_path.lineTo(self.points[0])
painter.drawPath(line_path)
painter.drawPath(vertex_path)
painter.fillPath(vertex_path, self.vertex_fill_color)
# Draw text at the top-left
if self.paint_label:
min_x = sys.maxsize
min_y = sys.maxsize
min_y_label = int(1.25 * self.label_font_size)
for point in self.points:
min_x = min(min_x, point.x())
min_y = min(min_y, point.y())
if min_x != sys.maxsize and min_y != sys.maxsize:
font = QFont()
font.setPointSize(self.label_font_size)
font.setBold(True)
painter.setFont(font)
if self.label is None:
self.label = ""
if min_y < min_y_label:
min_y += min_y_label
painter.drawText(int(min_x), int(min_y), self.label)
if self.fill:
color = self.select_fill_color if self.selected else self.fill_color
painter.fillPath(line_path, color)
def draw_vertex(self, path, i):
d = self.point_size / self.scale
shape = self.point_type
point = self.points[i]
if i == self._highlight_index:
size, shape = self._highlight_settings[self._highlight_mode]
d *= size
if self._highlight_index is not None:
self.vertex_fill_color = self.h_vertex_fill_color
else:
self.vertex_fill_color = Shape.vertex_fill_color
if shape == self.P_SQUARE:
path.addRect(point.x() - d / 2, point.y() - d / 2, d, d)
elif shape == self.P_ROUND:
path.addEllipse(point, d / 2.0, d / 2.0)
else:
assert False, "unsupported vertex shape"
def nearest_vertex(self, point, epsilon):
index = None
for i, p in enumerate(self.points):
dist = distance(p - point)
if dist <= epsilon:
index = i
epsilon = dist
return index
def contains_point(self, point):
return self.make_path().contains(point)
def make_path(self):
path = QPainterPath(self.points[0])
for p in self.points[1:]:
path.lineTo(p)
return path
def bounding_rect(self):
return self.make_path().boundingRect()
def move_by(self, offset):
self.points = [p + offset for p in self.points]
def move_vertex_by(self, i, offset):
self.points[i] = self.points[i] + offset
def highlight_vertex(self, i, action):
self._highlight_index = i
self._highlight_mode = action
def highlight_clear(self):
self._highlight_index = None
def copy(self):
shape = Shape("%s" % self.label)
shape.points = [p for p in self.points]
shape.fill = self.fill
shape.selected = self.selected
shape._closed = self._closed
if self.line_color != Shape.line_color:
shape.line_color = self.line_color
if self.fill_color != Shape.fill_color:
shape.fill_color = self.fill_color
shape.difficult = self.difficult
return shape
def __len__(self):
return len(self.points)
def __getitem__(self, key):
return self.points[key]
def __setitem__(self, key, value):
self.points[key] = value

View File

@ -0,0 +1,78 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
if items were added in files in the resources/strings folder,
then execute "pyrcc5 resources.qrc -o resources.py" in the root directory
and execute "pyrcc5 ../resources.qrc -o resources.py" in the libs directory
"""
import re
import os
import sys
import locale
from libs.ustr import ustr
try:
from PyQt5.QtCore import *
except ImportError:
if sys.version_info.major >= 3:
import sip
sip.setapi('QVariant', 2)
from PyQt4.QtCore import *
class StringBundle:
__create_key = object()
def __init__(self, create_key, locale_str):
assert(create_key == StringBundle.__create_key), "StringBundle must be created using StringBundle.getBundle"
self.id_to_message = {}
paths = self.__create_lookup_fallback_list(locale_str)
for path in paths:
self.__load_bundle(path)
@classmethod
def get_bundle(cls, locale_str=None):
if locale_str is None:
try:
locale_str = locale.getdefaultlocale()[0] if locale.getdefaultlocale() and len(
locale.getdefaultlocale()) > 0 else os.getenv('LANG')
except:
print('Invalid locale')
locale_str = 'en'
return StringBundle(cls.__create_key, locale_str)
def get_string(self, string_id):
assert(string_id in self.id_to_message), "Missing string id : " + string_id
return self.id_to_message[string_id]
def __create_lookup_fallback_list(self, locale_str):
result_paths = []
base_path = ":/strings"
result_paths.append(base_path)
if locale_str is not None:
# Don't follow standard BCP47. Simple fallback
tags = re.split('[^a-zA-Z]', locale_str)
for tag in tags:
last_path = result_paths[-1]
result_paths.append(last_path + '-' + tag)
return result_paths
def __load_bundle(self, path):
PROP_SEPERATOR = '='
f = QFile(path)
if f.exists():
if f.open(QIODevice.ReadOnly | QFile.Text):
text = QTextStream(f)
text.setCodec("UTF-8")
while not text.atEnd():
line = ustr(text.readLine())
key_value = line.split(PROP_SEPERATOR)
key = key_value[0].strip()
value = PROP_SEPERATOR.join(key_value[1:]).strip().strip('"')
self.id_to_message[key] = value
f.close()

39
labelImg/libs/toolBar.py Normal file
View File

@ -0,0 +1,39 @@
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
except ImportError:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class ToolBar(QToolBar):
def __init__(self, title):
super(ToolBar, self).__init__(title)
layout = self.layout()
m = (0, 0, 0, 0)
layout.setSpacing(0)
layout.setContentsMargins(*m)
self.setContentsMargins(*m)
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)
def addAction(self, action):
if isinstance(action, QWidgetAction):
return super(ToolBar, self).addAction(action)
btn = ToolButton()
btn.setDefaultAction(action)
btn.setToolButtonStyle(self.toolButtonStyle())
self.addWidget(btn)
class ToolButton(QToolButton):
"""ToolBar companion class which ensures all buttons have the same size."""
minSize = (60, 60)
def minimumSizeHint(self):
ms = super(ToolButton, self).minimumSizeHint()
w1, h1 = ms.width(), ms.height()
w2, h2 = self.minSize
ToolButton.minSize = max(w1, w2), max(h1, h2)
return QSize(*ToolButton.minSize)

17
labelImg/libs/ustr.py Normal file
View File

@ -0,0 +1,17 @@
import sys
from libs.constants import DEFAULT_ENCODING
def ustr(x):
"""py2/py3 unicode helper"""
if sys.version_info < (3, 0, 0):
from PyQt4.QtCore import QString
if type(x) == str:
return x.decode(DEFAULT_ENCODING)
if type(x) == QString:
# https://blog.csdn.net/friendan/article/details/51088476
# https://blog.csdn.net/xxm524/article/details/74937308
return unicode(x.toUtf8(), DEFAULT_ENCODING, 'ignore')
return x
else:
return x

117
labelImg/libs/utils.py Normal file
View File

@ -0,0 +1,117 @@
from math import sqrt
from libs.ustr import ustr
import hashlib
import re
import sys
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
QT5 = True
except ImportError:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
QT5 = False
def new_icon(icon):
return QIcon(':/' + icon)
def new_button(text, icon=None, slot=None):
b = QPushButton(text)
if icon is not None:
b.setIcon(new_icon(icon))
if slot is not None:
b.clicked.connect(slot)
return b
def new_action(parent, text, slot=None, shortcut=None, icon=None,
tip=None, checkable=False, enabled=True):
"""Create a new action and assign callbacks, shortcuts, etc."""
a = QAction(text, parent)
if icon is not None:
a.setIcon(new_icon(icon))
if shortcut is not None:
if isinstance(shortcut, (list, tuple)):
a.setShortcuts(shortcut)
else:
a.setShortcut(shortcut)
if tip is not None:
a.setToolTip(tip)
a.setStatusTip(tip)
if slot is not None:
a.triggered.connect(slot)
if checkable:
a.setCheckable(True)
a.setEnabled(enabled)
return a
def add_actions(widget, actions):
for action in actions:
if action is None:
widget.addSeparator()
elif isinstance(action, QMenu):
widget.addMenu(action)
else:
widget.addAction(action)
def label_validator():
return QRegExpValidator(QRegExp(r'^[^ \t].+'), None)
class Struct(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def distance(p):
return sqrt(p.x() * p.x() + p.y() * p.y())
def format_shortcut(text):
mod, key = text.split('+', 1)
return '<b>%s</b>+<b>%s</b>' % (mod, key)
def generate_color_by_text(text):
s = ustr(text)
hash_code = int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16)
r = int((hash_code / 255) % 255)
g = int((hash_code / 65025) % 255)
b = int((hash_code / 16581375) % 255)
return QColor(r, g, b, 100)
def have_qstring():
"""p3/qt5 get rid of QString wrapper as py3 has native unicode str type"""
return not (sys.version_info.major >= 3 or QT_VERSION_STR.startswith('5.'))
def util_qt_strlistclass():
return QStringList if have_qstring() else list
def natural_sort(list, key=lambda s:s):
"""
Sort the list into natural alphanumeric order.
"""
def get_alphanum_key_func(key):
convert = lambda text: int(text) if text.isdigit() else text
return lambda s: [convert(c) for c in re.split('([0-9]+)', key(s))]
sort_key = get_alphanum_key_func(key)
list.sort(key=sort_key)
# QT4 has a trimmed method, in QT5 this is called strip
if QT5:
def trimmed(text):
return text.strip()
else:
def trimmed(text):
return text.trimmed()

143
labelImg/libs/yolo_io.py Normal file
View File

@ -0,0 +1,143 @@
#!/usr/bin/env python
# -*- coding: utf8 -*-
import codecs
import os
from libs.constants import DEFAULT_ENCODING
TXT_EXT = '.txt'
ENCODE_METHOD = DEFAULT_ENCODING
class YOLOWriter:
def __init__(self, folder_name, filename, img_size, database_src='Unknown', local_img_path=None):
self.folder_name = folder_name
self.filename = filename
self.database_src = database_src
self.img_size = img_size
self.box_list = []
self.local_img_path = local_img_path
self.verified = False
def add_bnd_box(self, x_min, y_min, x_max, y_max, name, difficult):
bnd_box = {'xmin': x_min, 'ymin': y_min, 'xmax': x_max, 'ymax': y_max}
bnd_box['name'] = name
bnd_box['difficult'] = difficult
self.box_list.append(bnd_box)
def bnd_box_to_yolo_line(self, box, class_list=[]):
x_min = box['xmin']
x_max = box['xmax']
y_min = box['ymin']
y_max = box['ymax']
x_center = float((x_min + x_max)) / 2 / self.img_size[1]
y_center = float((y_min + y_max)) / 2 / self.img_size[0]
w = float((x_max - x_min)) / self.img_size[1]
h = float((y_max - y_min)) / self.img_size[0]
# PR387
box_name = box['name']
if box_name not in class_list:
class_list.append(box_name)
class_index = class_list.index(box_name)
return class_index, x_center, y_center, w, h
def save(self, class_list=[], target_file=None):
out_file = None # Update yolo .txt
out_class_file = None # Update class list .txt
if target_file is None:
out_file = open(
self.filename + TXT_EXT, 'w', encoding=ENCODE_METHOD)
classes_file = os.path.join(os.path.dirname(os.path.abspath(self.filename)), "classes.txt")
out_class_file = open(classes_file, 'w')
else:
out_file = codecs.open(target_file, 'w', encoding=ENCODE_METHOD)
classes_file = os.path.join(os.path.dirname(os.path.abspath(target_file)), "classes.txt")
out_class_file = open(classes_file, 'w')
for box in self.box_list:
class_index, x_center, y_center, w, h = self.bnd_box_to_yolo_line(box, class_list)
# print (classIndex, x_center, y_center, w, h)
out_file.write("%d %.6f %.6f %.6f %.6f\n" % (class_index, x_center, y_center, w, h))
# print (classList)
# print (out_class_file)
for c in class_list:
out_class_file.write(c+'\n')
out_class_file.close()
out_file.close()
class YoloReader:
def __init__(self, file_path, image, class_list_path=None):
# shapes type:
# [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult]
self.shapes = []
self.file_path = file_path
if class_list_path is None:
dir_path = os.path.dirname(os.path.realpath(self.file_path))
self.class_list_path = os.path.join(dir_path, "classes.txt")
else:
self.class_list_path = class_list_path
# print (file_path, self.class_list_path)
classes_file = open(self.class_list_path, 'r')
self.classes = classes_file.read().strip('\n').split('\n')
# print (self.classes)
img_size = [image.height(), image.width(),
1 if image.isGrayscale() else 3]
self.img_size = img_size
self.verified = False
# try:
self.parse_yolo_format()
# except:
# pass
def get_shapes(self):
return self.shapes
def add_shape(self, label, x_min, y_min, x_max, y_max, difficult):
points = [(x_min, y_min), (x_max, y_min), (x_max, y_max), (x_min, y_max)]
self.shapes.append((label, points, None, None, difficult))
def yolo_line_to_shape(self, class_index, x_center, y_center, w, h):
label = self.classes[int(class_index)]
x_min = max(float(x_center) - float(w) / 2, 0)
x_max = min(float(x_center) + float(w) / 2, 1)
y_min = max(float(y_center) - float(h) / 2, 0)
y_max = min(float(y_center) + float(h) / 2, 1)
x_min = round(self.img_size[1] * x_min)
x_max = round(self.img_size[1] * x_max)
y_min = round(self.img_size[0] * y_min)
y_max = round(self.img_size[0] * y_max)
return label, x_min, y_min, x_max, y_max
def parse_yolo_format(self):
bnd_box_file = open(self.file_path, 'r')
for bndBox in bnd_box_file:
class_index, x_center, y_center, w, h = bndBox.strip().split(' ')
label, x_min, y_min, x_max, y_max = self.yolo_line_to_shape(class_index, x_center, y_center, w, h)
# Caveat: difficult flag is discarded when saved as yolo format.
self.add_shape(label, x_min, y_min, x_max, y_max, False)

View File

@ -0,0 +1,26 @@
try:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
except ImportError:
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class ZoomWidget(QSpinBox):
def __init__(self, value=100):
super(ZoomWidget, self).__init__()
self.setButtonSymbols(QAbstractSpinBox.NoButtons)
self.setRange(1, 500)
self.setSuffix(' %')
self.setValue(value)
self.setToolTip(u'Zoom Level')
self.setStatusTip(self.toolTip())
self.setAlignment(Qt.AlignCenter)
def minimumSizeHint(self):
height = super(ZoomWidget, self).minimumSizeHint().height()
fm = QFontMetrics(self.font())
width = fm.width(str(self.maximum()))
return QSize(width, height)

View File

@ -0,0 +1,197 @@
labelImg
========
.. image:: https://img.shields.io/pypi/v/labelimg.svg
:target: https://pypi.python.org/pypi/labelimg
.. image:: https://img.shields.io/github/workflow/status/tzutalin/labelImg/Package?style=for-the-badge :alt: GitHub Workflow Status
.. image:: https://img.shields.io/badge/lang-en-blue.svg
:target: https://github.com/tzutalin/labelImg
.. image:: https://img.shields.io/badge/lang-zh-green.svg
:target: https://github.com/tzutalin/labelImg/blob/master/readme/README.zh.rst
.. image:: https://img.shields.io/badge/lang-jp-green.svg
:target: https://github.com/tzutalin/labelImg/blob/master/readme/README.jp.rst
.. image:: /resources/icons/app.png
:width: 200px
:align: center
LabelImgは、PythonとQtを使うアテーション補助ツールです。
このツールはPascalVOCフォーマットとYOLOとCreateMLをサポートしています。
.. image:: https://raw.githubusercontent.com/tzutalin/labelImg/master/demo/demo3.jpg
:alt: Demo Image
.. image:: https://raw.githubusercontent.com/tzutalin/labelImg/master/demo/demo.jpg
:alt: Demo Image
`サンプル動画は <https://youtu.be/p0nR2YsCY_U>にあります。`__
インストール方法
-------------------
ソースからビルドする
~~~~~~~~~~~~~~~~~~~~
Linuxまたは、Ubuntuまたは、macOSの場合は
Ubuntuの場合
^^^^^^^^^^^^
Python 3とQt5を使う場合
.. code:: shell
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
macOSの場合
^^^^^^^^^^^
Python 3とQt5を使う場合
.. code:: shell
brew install qt # Install qt-5.x.x by Homebrew
brew install libxml2
or using pip
pip3 install pyqt5 lxml # Install qt and lxml by pip
make qt5py3
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Python 3 Virtualenv (推奨)
VirtualenvはQtとPythonのバージョン衝突問題を解消できます。
.. code:: shell
brew install python3
pip3 install pipenv
pipenv run pip install pyqt5==5.15.2 lxml
pipenv run make qt5py3
pipenv run python3 labelImg.py
[任意で] rm -rf build dist; python setup.py py2app -A;mv "dist/labelImg.app" /Applications
注意:最後のコマンドを実行すると、/ApplicationsフォルダにSVGアイコンを含む.appファイルが生成されます。build-tools/build-for-macos.shというスクリプトの仕様も検討してください。
Windowsの場合
^^^^^^^^^^^^^
最初に`Python <https://www.python.org/downloads/windows/>`__
`PyQt5 <https://www.riverbankcomputing.com/software/pyqt/download5>`__
`install lxml <http://lxml.de/installation.html>`__ をインストールしてください。
コマンドプロンプトを起動し `labelImg <#labelimg>`__ がインストールされているフォルダに移動してから以下のコマンドを実行します。
.. code:: shell
pyrcc4 -o libs/resources.py resources.qrc
pyqt5の場合は、 pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py
python labelImg.py [画像パス] [定義済みクラスファイル]
Windows + Anaconda
^^^^^^^^^^^^^^^^^^
`Anaconda <https://www.anaconda.com/download/#download>`__ をダウンロードしてからインストールしてください。
Anaconda Promptを起動し `labelImg <#labelimg>`__ インストールされているフォルダに移動してから以下のコマンドを実行します。
.. code:: shell
conda install pyqt=5
conda install -c anaconda lxml
pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py
python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
PyPIから入手するPython 3以降のみ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
現代的なLinuxディストリビューションの場合は以下のコマンドを入力するだけでインストールできます。
.. code:: shell
pip3 install labelImg
labelImg
labelImg [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Dockerの場合
~~~~~~~~~~~~~~~~~
.. code:: shell
docker run -it \
--user $(id -u) \
-e DISPLAY=unix$DISPLAY \
--workdir=$(pwd) \
--volume="/home/$USER:/home/$USER" \
--volume="/etc/group:/etc/group:ro" \
--volume="/etc/passwd:/etc/passwd:ro" \
--volume="/etc/shadow:/etc/shadow:ro" \
--volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
tzutalin/py2qt4
make qt4py2;./labelImg.py
あとは`サンプル動画<https://youtu.be/nw1GexJzbCI>`__
を見るだけです。
定義済みクラスを作成するには?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
`data/predefined\_classes.txt <https://github.com/tzutalin/labelImg/blob/master/data/predefined_classes.txt>`__
を編集してください。
ショートカット一覧
~~~~~~~~~~~~~~~~~~
+--------------------+--------------------------------------------+
| Ctrl + u | そのディレクトリの画像を読み込む |
+--------------------+--------------------------------------------+
| Ctrl + r | アノテーションの生成ディレクトリを変更 |
+--------------------+--------------------------------------------+
| Ctrl + s | 保存する |
+--------------------+--------------------------------------------+
| Ctrl + d | 現在選択している矩形トラベルをコピー |
+--------------------+--------------------------------------------+
| Ctrl + Shift + d | 現在表示している画像を削除 |
+--------------------+--------------------------------------------+
| Space | 現在の画像に検証済みフラグを立てる |
+--------------------+--------------------------------------------+
| w | 矩形を生成する |
+--------------------+--------------------------------------------+
| d | 次の画像へ移動する |
+--------------------+--------------------------------------------+
| a | 前の画像へ移動する |
+--------------------+--------------------------------------------+
| del | 選択した矩形を削除 |
+--------------------+--------------------------------------------+
| Ctrl++ | 画像を拡大 |
+--------------------+--------------------------------------------+
| Ctrl-- | 画像を縮小 |
+--------------------+--------------------------------------------+
| ↑→↓← | 十字キーで矩形を移動する |
+--------------------+--------------------------------------------+
開発に参加するには?
~~~~~~~~~~~~~~~~~~~~~
このリポジトリにPull Request を送ってください。

View File

@ -0,0 +1,195 @@
LabelImg
========
.. image:: https://img.shields.io/pypi/v/labelimg.svg
:target: https://pypi.python.org/pypi/labelimg
.. image:: https://img.shields.io/github/workflow/status/tzutalin/labelImg/Package?style=for-the-badge :alt: GitHub Workflow Status
.. image:: https://img.shields.io/badge/lang-en-blue.svg
:target: https://github.com/tzutalin/labelImg
.. image:: https://img.shields.io/badge/lang-zh-green.svg
:target: https://github.com/tzutalin/labelImg/blob/master/readme/README.zh.rst
.. image:: https://img.shields.io/badge/lang-jp-green.svg
:target: https://github.com/tzutalin/labelImg/blob/master/readme/README.jp.rst
.. image:: /resources/icons/app.png
:width: 200px
:align: center
LabelImg 是影像標註工具它是用python 和 QT 寫成的.
支持的儲存格式包括PASCAL VOC format, YOLO, createML.
.. image:: https://raw.githubusercontent.com/tzutalin/labelImg/master/demo/demo3.jpg
:alt: Demo Image
.. image:: https://raw.githubusercontent.com/tzutalin/labelImg/master/demo/demo.jpg
:alt: Demo Image
`展示影片 <https://youtu.be/p0nR2YsCY_U>`__
安裝
------------------
透過編譯原始碼
~~~~~~~~~~~~~~~~~
Linux/Ubuntu/Mac 需要 Python 和 `PyQt <https://pypi.org/project/PyQt5/>`__
Ubuntu Linux
^^^^^^^^^^^^
Python 3 + Qt5
.. code:: shell
sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
macOS
^^^^^
Python 3 + Qt5
.. code:: shell
brew install qt # Install qt-5.x.x by Homebrew
brew install libxml2
or using pip
pip3 install pyqt5 lxml # Install qt and lxml by pip
make qt5py3
python3 labelImg.py
python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Python 3 Virtualenv (推薦方法)
Virtualenv 可以避免版本和相依性問題
.. code:: shell
brew install python3
pip3 install pipenv
pipenv run pip install pyqt5==5.15.2 lxml
pipenv run make qt5py3
pipenv run python3 labelImg.py
[Optional] rm -rf build dist; python setup.py py2app -A;mv "dist/labelImg.app" /Applications
Windows
^^^^^^^
安裝 `Python <https://www.python.org/downloads/windows/>`__,
`PyQt5 <https://www.riverbankcomputing.com/software/pyqt/download5>`__
`install lxml <http://lxml.de/installation.html>`__.
安裝並到 `labelImg <#labelimg>`__ 目錄
.. code:: shell
pyrcc4 -o libs/resources.py resources.qrc
For pyqt5, pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py
python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Windows + Anaconda
^^^^^^^^^^^^^^^^^^
下載並安裝 `Anaconda <https://www.anaconda.com/download/#download>`__ (Python 3+)
打開 Anaconda Prompt 然後到 `labelImg <#labelimg>`__ 目錄
.. code:: shell
conda install pyqt=5
conda install -c anaconda lxml
pyrcc5 -o libs/resources.py resources.qrc
python labelImg.py
python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Get from PyPI but only python3.0 or above
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: shell
pip3 install labelImg
labelImg
labelImg [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
Use Docker
~~~~~~~~~~~~~~~~~
.. code:: shell
docker run -it \
--user $(id -u) \
-e DISPLAY=unix$DISPLAY \
--workdir=$(pwd) \
--volume="/home/$USER:/home/$USER" \
--volume="/etc/group:/etc/group:ro" \
--volume="/etc/passwd:/etc/passwd:ro" \
--volume="/etc/shadow:/etc/shadow:ro" \
--volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
tzutalin/py2qt4
make qt4py2;./labelImg.py
`你可以參考影片 <https://youtu.be/nw1GexJzbCI>`__
使用方法
-----
你可以先產生標籤
~~~~~~~~~~~~~~~~~~~~~~~~~~
修改這個檔案
`data/predefined\_classes.txt <https://github.com/tzutalin/labelImg/blob/master/data/predefined_classes.txt>`__
快捷鍵
~~~~~~~
+--------------------+--------------------------------------------+
| Ctrl + u | 讀取所有影像從每個目錄 |
+--------------------+--------------------------------------------+
| Ctrl + r | 改變標示結果的存檔目錄 |
+--------------------+--------------------------------------------+
| Ctrl + s | 存檔 |
+--------------------+--------------------------------------------+
| Ctrl + d | 複製目前的標籤和物件的區塊 |
+--------------------+--------------------------------------------+
| Ctrl + Shift + d | 刪除目前影像 |
+--------------------+--------------------------------------------+
| Space | 標示目前照片已經處理過 |
+--------------------+--------------------------------------------+
| w | 產生新的物件區塊 |
+--------------------+--------------------------------------------+
| d | 下張影像 |
+--------------------+--------------------------------------------+
| a | 上張影像 |
+--------------------+--------------------------------------------+
| del | 刪除所選的物件區塊 |
+--------------------+--------------------------------------------+
| Ctrl++ | 放大影像 |
+--------------------+--------------------------------------------+
| Ctrl-- | 縮小影像 |
+--------------------+--------------------------------------------+
| ↑→↓← | 移動所選的物件區塊 |
+--------------------+--------------------------------------------+
如何貢獻
~~~~~~~~~~~~~~~~~
歡迎上傳程式碼直接貢獻

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

@ -0,0 +1,2 @@
pyqt5==5.14.1
lxml==4.9.1

43
labelImg/resources.qrc Normal file
View File

@ -0,0 +1,43 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file alias="help">resources/icons/help.png</file>
<file alias="app">resources/icons/app.png</file>
<file alias="expert">resources/icons/expert2.png</file>
<file alias="done">resources/icons/done.png</file>
<file alias="file">resources/icons/file.png</file>
<file alias="labels">resources/icons/labels.png</file>
<file alias="new">resources/icons/objects.png</file>
<file alias="close">resources/icons/close.png</file>
<file alias="fit-width">resources/icons/fit-width.png</file>
<file alias="fit-window">resources/icons/fit-window.png</file>
<file alias="undo">resources/icons/undo.png</file>
<file alias="hide">resources/icons/eye.png</file>
<file alias="quit">resources/icons/quit.png</file>
<file alias="copy">resources/icons/copy.png</file>
<file alias="edit">resources/icons/edit.png</file>
<file alias="open">resources/icons/open.png</file>
<file alias="save">resources/icons/save.png</file>
<file alias="format_voc">resources/icons/format_voc.png</file>
<file alias="format_yolo">resources/icons/format_yolo.png</file>
<file alias="format_createml">resources/icons/format_createml.png</file>
<file alias="save-as">resources/icons/save-as.png</file>
<file alias="color">resources/icons/color.png</file>
<file alias="color_line">resources/icons/color_line.png</file>
<file alias="zoom">resources/icons/zoom.png</file>
<file alias="zoom-in">resources/icons/zoom-in.png</file>
<file alias="zoom-out">resources/icons/zoom-out.png</file>
<file alias="light_reset">resources/icons/light_reset.png</file>
<file alias="light_lighten">resources/icons/light_lighten.png</file>
<file alias="light_darken">resources/icons/light_darken.png</file>
<file alias="delete">resources/icons/cancel.png</file>
<file alias="next">resources/icons/next.png</file>
<file alias="prev">resources/icons/prev.png</file>
<file alias="resetall">resources/icons/resetall.png</file>
<file alias="verify">resources/icons/verify.png</file>
<file alias="strings">resources/strings/strings.properties</file>
<file alias="strings-zh-TW">resources/strings/strings-zh-TW.properties</file>
<file alias="strings-zh-CN">resources/strings/strings-zh-CN.properties</file>
<file alias="strings-ja-JP">resources/strings/strings-ja-JP.properties</file>
</qresource>
</RCC>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,30 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="256.000000pt" height="256.000000pt" viewBox="0 0 256.000000 256.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.15, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,256.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1410 1595 l0 -35 -107 -1 c-60 -1 -137 -4 -173 -8 l-65 -6 -6 -115
c-4 -63 -7 -145 -8 -182 l-1 -68 -39 0 c-22 0 -43 -5 -46 -11 -4 -5 -4 -37 0
-70 l7 -59 39 0 39 0 0 -188 c0 -133 4 -192 12 -200 8 -8 64 -12 185 -12 l173
0 0 -30 0 -30 65 0 65 0 0 30 0 30 185 0 185 0 0 200 0 200 40 0 40 0 0 65 0
65 -40 0 -40 0 -2 188 -3 187 -130 6 c-71 4 -151 7 -177 8 -48 1 -48 1 -48 36
l0 35 -75 0 -75 0 0 -35z m10 -225 l5 -45 60 0 60 0 3 48 3 47 114 0 c135 0
127 9 123 -145 l-3 -100 -37 -3 -38 -3 0 -64 0 -64 38 -3 37 -3 3 -105 c4
-160 13 -150 -123 -150 l-115 0 0 50 0 50 -65 0 -65 0 0 -50 0 -50 -115 0
-115 0 0 130 0 130 40 0 40 0 0 65 0 65 -40 0 -40 0 0 125 0 126 113 -3 112
-3 5 -45z"/>
<path d="M71 986 l-1 -330 32 45 c18 24 37 47 43 51 12 8 20 381 10 476 l-7
62 -33 0 c-18 0 -36 6 -38 13 -3 6 -6 -136 -6 -317z"/>
<path d="M284 1102 c-39 -3 -42 -5 -48 -40 -3 -20 -6 -151 -6 -291 l0 -255 24
35 c14 19 39 52 55 75 l31 41 -1 154 c-1 85 -4 183 -8 219 l-6 65 -41 -3z"/>
<path d="M415 959 c-3 -13 -4 -150 -3 -304 l3 -280 132 180 c73 99 138 187
145 195 16 18 51 66 110 150 l45 65 -205 -3 c-155 -2 -207 0 -213 10 -5 8 -10
4 -14 -13z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,400 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
<svg
width="48pt"
height="48pt"
viewBox="0 0 256 256"
style="overflow:visible;enable-background:new 0 0 256 256"
xml:space="preserve"
xmlns="http://www.w3.org/2000/svg"
xmlns:xap="http://ns.adobe.com/xap/1.0/"
xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
xmlns:x="adobe:ns:meta/"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="svg548"
sodipodi:version="0.32"
sodipodi:docname="/home/david/Desktop/action/button_ok.svg"
sodipodi:docbase="/home/david/Desktop/action/">
<defs
id="defs584">
<linearGradient
id="XMLID_5_"
gradientUnits="userSpaceOnUse"
x1="127.9536"
y1="47.3267"
x2="127.9536"
y2="212.9885">
<stop
offset="0"
style="stop-color:#009900"
id="stop556" />
<stop
offset="1"
style="stop-color:#334966"
id="stop557" />
<a:midPointStop
offset="0"
style="stop-color:#009900"
id="midPointStop558" />
<a:midPointStop
offset="0.5"
style="stop-color:#009900"
id="midPointStop559" />
<a:midPointStop
offset="1"
style="stop-color:#334966"
id="midPointStop560" />
</linearGradient>
<linearGradient
id="XMLID_6_"
gradientUnits="userSpaceOnUse"
x1="127.9536"
y1="77.2075"
x2="127.9536"
y2="307.6057">
<stop
offset="0"
style="stop-color:#33CC33"
id="stop563" />
<stop
offset="1"
style="stop-color:#336666"
id="stop564" />
<a:midPointStop
offset="0"
style="stop-color:#33CC33"
id="midPointStop565" />
<a:midPointStop
offset="0.5"
style="stop-color:#33CC33"
id="midPointStop566" />
<a:midPointStop
offset="1"
style="stop-color:#336666"
id="midPointStop567" />
</linearGradient>
<linearGradient
id="XMLID_7_"
gradientUnits="userSpaceOnUse"
x1="127.9536"
y1="77.3672"
x2="127.9536"
y2="307.3626">
<stop
offset="0.0056"
style="stop-color:#CCFF66"
id="stop570" />
<stop
offset="1"
style="stop-color:#009900"
id="stop571" />
<a:midPointStop
offset="0.0056"
style="stop-color:#CCFF66"
id="midPointStop572" />
<a:midPointStop
offset="0.5"
style="stop-color:#CCFF66"
id="midPointStop573" />
<a:midPointStop
offset="1"
style="stop-color:#009900"
id="midPointStop574" />
</linearGradient>
<radialGradient
id="XMLID_8_"
cx="54.2729"
cy="89.3477"
r="120.8132"
fx="54.2729"
fy="89.3477"
gradientUnits="userSpaceOnUse">
<stop
offset="0.000000"
style="stop-color:#ffffff;stop-opacity:1;"
id="stop577" />
<stop
offset="1.000000"
style="stop-color:#92ff00;stop-opacity:1;"
id="stop578" />
<a:midPointStop
offset="0"
style="stop-color:#FFFFFF"
id="midPointStop579" />
<a:midPointStop
offset="0.5"
style="stop-color:#FFFFFF"
id="midPointStop580" />
<a:midPointStop
offset="1"
style="stop-color:#000000"
id="midPointStop581" />
</radialGradient>
</defs>
<sodipodi:namedview
id="base" />
<metadata
id="metadata549">
<xpacket>begin='' id='W5M0MpCehiHzreSzNTczkc9d' </xpacket>
<x:xmpmeta
x:xmptk="XMP toolkit 3.0-29, framework 1.6">
<rdf:RDF>
<rdf:Description
rdf:about="uuid:609bc623-b01c-476b-9349-300763160df1">
<pdf:Producer>
Adobe PDF library 5.00</pdf:Producer>
</rdf:Description>
<rdf:Description
rdf:about="uuid:609bc623-b01c-476b-9349-300763160df1" />
<rdf:Description
rdf:about="uuid:609bc623-b01c-476b-9349-300763160df1" />
<rdf:Description
rdf:about="uuid:609bc623-b01c-476b-9349-300763160df1">
<xap:CreateDate>
2003-12-22T22:34:35+02:00</xap:CreateDate>
<xap:ModifyDate>
2004-04-17T21:25:50Z</xap:ModifyDate>
<xap:CreatorTool>
Adobe Illustrator 10.0</xap:CreatorTool>
<xap:MetadataDate>
2004-01-19T17:51:02+01:00</xap:MetadataDate>
<xap:Thumbnails>
<rdf:Alt>
<rdf:li
rdf:parseType="Resource">
<xapGImg:format>
JPEG</xapGImg:format>
<xapGImg:width>
256</xapGImg:width>
<xapGImg:height>
256</xapGImg:height>
<xapGImg:image>
/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
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</xapGImg:image>
</rdf:li>
</rdf:Alt>
</xap:Thumbnails>
</rdf:Description>
<rdf:Description
rdf:about="uuid:609bc623-b01c-476b-9349-300763160df1">
<xapMM:DocumentID>
uuid:4b4d592f-95b8-4bcd-a892-74a536c5e52f</xapMM:DocumentID>
</rdf:Description>
<rdf:Description
rdf:about="uuid:609bc623-b01c-476b-9349-300763160df1">
<dc:format>
image/svg+xml</dc:format>
<dc:title>
<rdf:Alt>
<rdf:li
xml:lang="x-default">
test.ai</rdf:li>
</rdf:Alt>
</dc:title>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<xpacket>end='w' </xpacket>
</metadata>
<rect
id="_x3C_Slice_x3E_"
style="font-size:12;fill:none;"
width="256"
height="256" />
<path
style="font-size:12;opacity:0.2;"
d="M221.848,47.811c0,0-130.558,89.471-132.578,90.855c-1.689-1.683-41.779-41.595-41.779-41.595 c-2.978-2.968-6.891-4.068-10.467-2.943c-3.89,1.232-6.403,4.005-7.08,7.809l-0.42,2.363c-0.135,0.765-0.122,1.532,0.037,2.285 l0.589,2.802l0.408,1.247l46.254,101.694c1.449,3.183,4.375,5.427,7.83,6.001c3.441,0.579,6.936-0.598,9.349-3.144 L235.225,65.893c2.066-2.169,3.252-5.263,3.252-8.481l-0.129-1.236l-0.572-2.723c-0.697-3.33-2.852-5.804-6.227-7.157 C229.395,45.431,225.963,44.991,221.848,47.811z"
id="path552" />
<path
style="font-size:12;opacity:0.2;"
d="M218.848,47.811c0,0-130.558,89.471-132.578,90.855c-1.689-1.683-41.779-41.595-41.779-41.595 c-2.978-2.968-6.891-4.068-10.467-2.943c-3.89,1.232-6.403,4.005-7.08,7.809l-0.42,2.363c-0.135,0.765-0.122,1.532,0.037,2.285 l0.589,2.802l0.408,1.247l46.254,101.694c1.449,3.183,4.375,5.427,7.83,6.001c3.441,0.579,6.936-0.598,9.349-3.144 L232.225,65.893c2.066-2.169,3.252-5.263,3.252-8.481l-0.129-1.236l-0.572-2.723c-0.697-3.33-2.852-5.804-6.227-7.157 C226.395,45.431,222.963,44.991,218.848,47.811z"
id="path553" />
<path
style="font-size:12;opacity:0.2;"
d="M217.848,45.811c0,0-130.558,89.471-132.578,90.855c-1.689-1.683-41.779-41.595-41.779-41.595 c-2.978-2.968-6.891-4.068-10.467-2.943c-3.89,1.232-6.403,4.005-7.08,7.809l-0.42,2.363c-0.135,0.765-0.122,1.532,0.037,2.285 l0.589,2.802l0.408,1.247l46.254,101.694c1.449,3.183,4.375,5.427,7.83,6.001c3.441,0.579,6.936-0.598,9.349-3.144 L231.225,63.893c2.066-2.169,3.252-5.263,3.252-8.481l-0.129-1.236l-0.572-2.723c-0.697-3.33-2.852-5.804-6.227-7.157 C225.395,43.431,221.963,42.991,217.848,45.811z"
id="path554" />
<path
style="font-size:12;fill:url(#XMLID_5_);"
d="M215.848,43.811c0,0-130.558,89.471-132.578,90.855 c-1.689-1.683-41.779-41.595-41.779-41.595c-2.978-2.968-6.891-4.068-10.467-2.943c-3.89,1.232-6.403,4.005-7.08,7.809 l-0.42,2.363c-0.135,0.765-0.122,1.532,0.037,2.285l0.589,2.802l0.408,1.247l46.254,101.694c1.449,3.183,4.375,5.427,7.83,6.001 c3.441,0.579,6.936-0.598,9.349-3.144L229.225,61.893c2.066-2.169,3.252-5.263,3.252-8.481l-0.129-1.236l-0.572-2.723 c-0.697-3.33-2.852-5.804-6.227-7.157C223.395,41.431,219.963,40.991,215.848,43.811z"
id="path561" />
<path
style="font-size:12;fill:url(#XMLID_6_);"
d="M219.239,48.761c0,0-135.454,92.824-136.679,93.665 c-5.106-5.083-45.302-45.103-45.302-45.103c-1.187-1.182-2.833-1.976-4.431-1.472c-1.597,0.505-2.684,1.485-2.977,3.135 l-0.42,2.364l0.589,2.802c0.007,0.016,46.252,101.691,46.252,101.691c0.621,1.363,1.876,2.321,3.354,2.567 c1.477,0.247,2.978-0.265,4.008-1.353L224.865,57.77c1.021-1.072,1.611-2.665,1.611-4.358l-0.572-2.728 c-0.309-1.471-1.192-2.26-2.588-2.82C221.922,47.305,220.477,47.913,219.239,48.761z"
id="path568" />
<path
style="font-size:12;fill:url(#XMLID_7_);"
d="M84.485,146.561c-1.425,0.977-3.344,0.803-4.567-0.416c0,0-44.921-44.724-45.833-45.632 c-0.091,0.252-0.154,0.533-0.154,0.838c0,0.328,0.06,0.662,0.192,0.955c0,0,46.096,101.347,46.241,101.664 c0.877-0.93,141.232-149.292,141.232-149.292c0.232-0.243,0.381-0.741,0.381-1.266c0-0.322-0.074-0.645-0.2-0.935 C220.751,53.177,84.485,146.561,84.485,146.561z"
id="path575" />
<path
style="font-size:12;fill:url(#XMLID_8_);"
d="M86.517,149.525c-0.001,0-0.001,0.004-0.001,0.004 c-2.848,1.947-6.69,1.596-9.133-0.838c0,0-20.052-19.966-33.287-33.141c10.589,23.282,30.678,67.45,37.327,82.069 c6.078-6.424,93.826-99.178,119.981-126.826C170.026,92.297,86.517,149.525,86.517,149.525z"
id="path582" />
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,819 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
<svg
xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"
xmlns:xap="http://ns.adobe.com/xap/1.0/"
xmlns:ns0="http://ns.adobe.com/SaveForWeb/1.0/"
xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
xmlns:x="adobe:ns:meta/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48pt"
height="48pt"
viewBox="0 0 256 256"
overflow="visible"
enable-background="new 0 0 256 256"
xml:space="preserve"
id="svg710"
sodipodi:version="0.32"
sodipodi:docname="application-text.svg"
version="1.1"
inkscape:version="0.48.1 r9760">
<defs
id="defs796">
<linearGradient
y2="245.0005"
x2="128.9995"
y1="11"
x1="128.9995"
gradientUnits="userSpaceOnUse"
id="XMLID_9_">
<stop
id="stop717"
style="stop-color:#494949"
offset="0" />
<stop
id="stop718"
style="stop-color:#000000"
offset="1" />
<a:midPointStop
id="midPointStop719"
style="stop-color:#494949"
offset="0" />
<a:midPointStop
id="midPointStop720"
style="stop-color:#494949"
offset="0.5" />
<a:midPointStop
id="midPointStop721"
style="stop-color:#000000"
offset="1" />
</linearGradient>
<linearGradient
y2="226.9471"
x2="226.9471"
y1="29.0532"
x1="29.0532"
gradientUnits="userSpaceOnUse"
id="XMLID_10_">
<stop
id="stop725"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop726"
style="stop-color:#DADADA"
offset="1" />
<a:midPointStop
id="midPointStop727"
style="stop-color:#FFFFFF"
offset="0" />
<a:midPointStop
id="midPointStop728"
style="stop-color:#FFFFFF"
offset="0.5" />
<a:midPointStop
id="midPointStop729"
style="stop-color:#DADADA"
offset="1" />
</linearGradient>
<linearGradient
gradientTransform="matrix(0.1991,0.98,-0.98,0.1991,91.6944,573.5653)"
y2="-164.2214"
x2="-360.2456"
y1="-94.4194"
x1="-481.7007"
gradientUnits="userSpaceOnUse"
id="XMLID_11_">
<stop
id="stop736"
style="stop-color:#990000"
offset="0" />
<stop
id="stop737"
style="stop-color:#7C0000"
offset="1" />
<a:midPointStop
id="midPointStop738"
style="stop-color:#990000"
offset="0" />
<a:midPointStop
id="midPointStop739"
style="stop-color:#990000"
offset="0.5" />
<a:midPointStop
id="midPointStop740"
style="stop-color:#7C0000"
offset="1" />
</linearGradient>
<linearGradient
gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-496.5172)"
y2="706.3217"
x2="-1355.0455"
y1="685.3809"
x1="-1375.9844"
gradientUnits="userSpaceOnUse"
id="XMLID_12_">
<stop
id="stop743"
style="stop-color:#F8F1DC"
offset="0" />
<stop
id="stop744"
style="stop-color:#D6A84A"
offset="1" />
<a:midPointStop
id="midPointStop745"
style="stop-color:#F8F1DC"
offset="0" />
<a:midPointStop
id="midPointStop746"
style="stop-color:#F8F1DC"
offset="0.5" />
<a:midPointStop
id="midPointStop747"
style="stop-color:#D6A84A"
offset="1" />
</linearGradient>
<linearGradient
y2="160.1823"
x2="137.6021"
y1="-0.7954"
x1="65.0947"
gradientUnits="userSpaceOnUse"
id="XMLID_13_">
<stop
id="stop750"
style="stop-color:#FFA700"
offset="0" />
<stop
id="stop751"
style="stop-color:#FFD700"
offset="0.7753" />
<stop
id="stop752"
style="stop-color:#FF794B"
offset="1" />
<a:midPointStop
id="midPointStop753"
style="stop-color:#FFA700"
offset="0" />
<a:midPointStop
id="midPointStop754"
style="stop-color:#FFA700"
offset="0.5" />
<a:midPointStop
id="midPointStop755"
style="stop-color:#FFD700"
offset="0.7753" />
<a:midPointStop
id="midPointStop756"
style="stop-color:#FFD700"
offset="0.5" />
<a:midPointStop
id="midPointStop757"
style="stop-color:#FF794B"
offset="1" />
</linearGradient>
<linearGradient
gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-496.5172)"
y2="622.5333"
x2="-1325.3219"
y1="635.7949"
x1="-1336.4497"
gradientUnits="userSpaceOnUse"
id="XMLID_14_">
<stop
id="stop763"
style="stop-color:#FFC957"
offset="0" />
<stop
id="stop764"
style="stop-color:#FF6D00"
offset="1" />
<a:midPointStop
id="midPointStop765"
style="stop-color:#FFC957"
offset="0" />
<a:midPointStop
id="midPointStop766"
style="stop-color:#FFC957"
offset="0.5" />
<a:midPointStop
id="midPointStop767"
style="stop-color:#FF6D00"
offset="1" />
</linearGradient>
<linearGradient
gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-496.5172)"
y2="699.4763"
x2="-1354.6851"
y1="595.6309"
x1="-1401.459"
gradientUnits="userSpaceOnUse"
id="XMLID_15_">
<stop
id="stop770"
style="stop-color:#FFA700"
offset="0" />
<stop
id="stop771"
style="stop-color:#FFD700"
offset="0.7753" />
<stop
id="stop772"
style="stop-color:#FF9200"
offset="1" />
<a:midPointStop
id="midPointStop773"
style="stop-color:#FFA700"
offset="0" />
<a:midPointStop
id="midPointStop774"
style="stop-color:#FFA700"
offset="0.5" />
<a:midPointStop
id="midPointStop775"
style="stop-color:#FFD700"
offset="0.7753" />
<a:midPointStop
id="midPointStop776"
style="stop-color:#FFD700"
offset="0.5" />
<a:midPointStop
id="midPointStop777"
style="stop-color:#FF9200"
offset="1" />
</linearGradient>
<linearGradient
y2="115.5361"
x2="144.5898"
y1="115.5361"
x1="67.8452"
gradientUnits="userSpaceOnUse"
id="XMLID_16_">
<stop
id="stop780"
style="stop-color:#7D7D99"
offset="0" />
<stop
id="stop781"
style="stop-color:#B1B1C5"
offset="0.1798" />
<stop
id="stop782"
style="stop-color:#BCBCC8"
offset="0.3727" />
<stop
id="stop783"
style="stop-color:#C8C8CB"
offset="0.6825" />
<stop
id="stop784"
style="stop-color:#CCCCCC"
offset="1" />
<a:midPointStop
id="midPointStop785"
style="stop-color:#7D7D99"
offset="0" />
<a:midPointStop
id="midPointStop786"
style="stop-color:#7D7D99"
offset="0.5" />
<a:midPointStop
id="midPointStop787"
style="stop-color:#B1B1C5"
offset="0.1798" />
<a:midPointStop
id="midPointStop788"
style="stop-color:#B1B1C5"
offset="0.2881" />
<a:midPointStop
id="midPointStop789"
style="stop-color:#CCCCCC"
offset="1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_16_"
id="linearGradient80060"
gradientUnits="userSpaceOnUse"
x1="67.8452"
y1="115.5361"
x2="144.5898"
y2="115.5361"
gradientTransform="translate(0,-25.600002)" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_15_"
id="linearGradient80063"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-522.11722)"
x1="-1401.459"
y1="595.6309"
x2="-1354.6851"
y2="699.4763" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_14_"
id="linearGradient80066"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-522.11722)"
x1="-1336.4497"
y1="635.7949"
x2="-1325.3219"
y2="622.5333" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_13_"
id="linearGradient80072"
gradientUnits="userSpaceOnUse"
x1="65.0947"
y1="-0.7954"
x2="137.6021"
y2="160.1823"
gradientTransform="translate(0,-25.600002)" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_12_"
id="linearGradient80075"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.999,0.0435,0.0435,0.999,-1277.0056,-522.11722)"
x1="-1375.9844"
y1="685.3809"
x2="-1355.0455"
y2="706.3217" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_11_"
id="linearGradient80078"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.1991,0.98,-0.98,0.1991,91.6944,547.96528)"
x1="-481.7007"
y1="-94.4194"
x2="-360.2456"
y2="-164.2214" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_10_"
id="linearGradient80085"
gradientUnits="userSpaceOnUse"
x1="29.0532"
y1="29.0532"
x2="226.9471"
y2="226.9471" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_9_"
id="linearGradient80089"
gradientUnits="userSpaceOnUse"
x1="128.9995"
y1="11"
x2="128.9995"
y2="245.0005" /></defs>
<sodipodi:namedview
id="base"
showgrid="false"
inkscape:zoom="3.6203867"
inkscape:cx="24.932695"
inkscape:cy="18.484388"
inkscape:window-width="1280"
inkscape:window-height="766"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
inkscape:current-layer="svg710" />
<metadata
id="metadata711">
<ns0:sfw>
<ns0:slices>
<ns0:slice
x="0"
y="0"
width="256"
height="256"
sliceID="124333141" />
</ns0:slices>
<ns0:sliceSourceBounds
x="0"
y="0"
width="256"
height="256"
bottomLeftOrigin="true" />
<ns0:optimizationSettings>
<ns0:targetSettings
fileFormat="PNG24Format"
targetSettingsID="0">
<ns0:PNG24Format
transparency="true"
includeCaption="false"
interlaced="false"
noMatteColor="false"
matteColor="#FFFFFF"
filtered="false" />
</ns0:targetSettings>
</ns0:optimizationSettings>
</ns0:sfw>
<xpacket
id="xpacket79197">begin='' id='W5M0MpCehiHzreSzNTczkc9d' </xpacket>
<x:xmpmeta
x:xmptk="XMP toolkit 3.0-29, framework 1.6">
<metadata
id="metadata79254"><rdf:RDF>
<rdf:Description
rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c">
<pdf:Producer>
Adobe PDF library 5.00</pdf:Producer>
</rdf:Description>
<rdf:Description
rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c" />
<rdf:Description
rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c" />
<rdf:Description
rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c">
<xap:CreateDate>
2004-01-26T11:58:28+02:00</xap:CreateDate>
<xap:ModifyDate>
2004-03-28T20:41:40Z</xap:ModifyDate>
<xap:CreatorTool>
Adobe Illustrator 10.0</xap:CreatorTool>
<xap:MetadataDate>
2004-02-16T23:58:32+01:00</xap:MetadataDate>
<xap:Thumbnails>
<rdf:Alt>
<rdf:li
rdf:parseType="Resource">
<xapGImg:format>
JPEG</xapGImg:format>
<xapGImg:width>
256</xapGImg:width>
<xapGImg:height>
256</xapGImg:height>
<xapGImg:image>
/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlvmDzFo
3l7TJdT1e5W1tItuTbszHoiKN2Y+AxV4j5g/5ydvTcMnl/SYlgU0Se/LOzDxMcTIF/4M4qk//QzP
nv8A5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/soxV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8
sGl/8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hmfPf/ACwaX/yKuP8AsoxV3/QzPnv/AJYNL/5F
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
f//Z</xapGImg:image>
</rdf:li>
</rdf:Alt>
</xap:Thumbnails>
</rdf:Description>
<rdf:Description
rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c">
<xapMM:DocumentID>
uuid:4ee3f24b-6ed2-4a2e-8f7a-50b762c8da8b</xapMM:DocumentID>
</rdf:Description>
<rdf:Description
rdf:about="uuid:cbee75c6-82d1-45ba-8274-b89c6084675c">
<dc:format>
image/svg+xml</dc:format>
<dc:title>
<rdf:Alt>
<rdf:li
xml:lang="x-default">
mime.ai</rdf:li>
</rdf:Alt>
</dc:title>
</rdf:Description>
<cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata></x:xmpmeta>
<xpacket
id="xpacket79199">end='w' </xpacket>
</metadata>
<path
style="opacity:0.2"
inkscape:connector-curvature="0"
id="path713"
d="m 44,15.5 c -9.374,0 -17,7.626 -17,17 v 200 c 0,9.374 7.626,17 17,17 h 176 c 9.375,0 17,-7.626 17,-17 v -200 c 0,-9.374 -7.625,-17 -17,-17 H 44 z" /><path
style="opacity:0.2"
inkscape:connector-curvature="0"
id="path714"
d="m 42,13.5 c -9.374,0 -17,7.626 -17,17 v 200 c 0,9.374 7.626,17 17,17 h 176 c 9.375,0 17,-7.626 17,-17 v -200 c 0,-9.374 -7.625,-17 -17,-17 H 42 z" /><path
style="opacity:0.2"
inkscape:connector-curvature="0"
id="path715"
d="m 40,12.5 c -9.374,0 -17,7.626 -17,17 v 200 c 0,9.374 7.626,17 17,17 h 176 c 9.375,0 17,-7.626 17,-17 v -200 c 0,-9.374 -7.625,-17 -17,-17 H 40 z" /><path
inkscape:connector-curvature="0"
style="fill:url(#linearGradient80089)"
id="path722"
d="m 41,11 c -9.374,0 -17,7.626 -17,17 v 200 c 0,9.374 7.626,17 17,17 h 176 c 9.375,0 17,-7.626 17,-17 V 28 c 0,-9.374 -7.625,-17 -17,-17 H 41 z" /><path
style="fill:#ffffff"
inkscape:connector-curvature="0"
id="path723"
d="m 28,228 c 0,6.627 5.373,12 12,12 h 176 c 6.627,0 12,-5.373 12,-12 V 28 c 0,-6.627 -5.373,-12 -12,-12 H 40 c -6.627,0 -12,5.373 -12,12 v 200 z" /><path
inkscape:connector-curvature="0"
style="fill:url(#linearGradient80085)"
id="path730"
d="m 40,21 c -3.86,0 -7,3.14 -7,7 v 200 c 0,3.859 3.14,7 7,7 h 176 c 3.859,0 7,-3.141 7,-7 V 28 c 0,-3.86 -3.141,-7 -7,-7 H 40 z" /><path
style="opacity:0.2"
inkscape:connector-curvature="0"
id="path731"
d="m 191.924,170.38398 c -11.613,-36.12699 -13.717,-42.66999 -14.859,-44.06399 0.119,0.076 0.289,0.178 0.289,0.178 L 98.804,39.042999 c -4.195,-4.65 -14.005,0.356 -21.355,6.976 -7.283,6.542 -13.32,15.772999 -9.37,20.563999 l 78.944,87.542982 0.533,0.094 37.768,17.602 7.688,2.365 -1.088,-3.803 z" /><path
style="opacity:0.2"
inkscape:connector-curvature="0"
id="path732"
d="m 193.557,167.91598 c -11.611,-36.12499 -13.713,-42.66999 -14.855,-44.06399 0.117,0.072 0.287,0.178 0.287,0.178 L 100.444,36.574999 c -4.199,-4.651 -14.015,0.355 -21.361,6.975 -7.281,6.545 -13.32,15.772999 -9.368,20.565999 l 78.945,87.538982 0.533,0.1 37.77,17.598 7.682,2.367 -1.088,-3.804 z" /><path
style="opacity:0.2"
inkscape:connector-curvature="0"
id="path733"
d="M 186.773,165.44898 C 175.16,129.32199 173.06,122.77699 171.91,121.38099 c 0.121,0.074 0.295,0.18 0.295,0.18 L 93.653,34.103999 c -4.192,-4.65 -14.009,0.359 -21.354,6.978 -7.283,6.542 -13.321,15.770999 -9.369,20.564999 l 78.942,87.540982 0.535,0.096 37.768,17.598 7.686,2.367 -1.088,-3.8 z" /><path
style="fill:#ffffff"
inkscape:connector-curvature="0"
id="path734"
d="m 186.43,163.75498 c -11.613,-36.12499 -13.713,-42.66599 -14.863,-44.06099 0.123,0.072 0.293,0.18 0.293,0.18 L 93.314,32.415999 c -4.199,-4.651 -14.015,0.357 -21.359,6.977 -7.283,6.543 -13.322,15.773999 -9.37,20.565999 l 78.941,87.540982 0.535,0.098 37.771,17.598 7.686,2.363 -1.088,-3.804 z" /><path
inkscape:connector-curvature="0"
style="fill:url(#linearGradient80078)"
id="path741"
d="m 186.43,163.75498 c -11.613,-36.12499 -13.713,-42.66599 -14.863,-44.06099 0.123,0.072 0.293,0.18 0.293,0.18 L 93.314,32.415999 c -4.199,-4.651 -14.015,0.357 -21.359,6.977 -7.283,6.543 -13.322,15.773999 -9.37,20.565999 l 78.941,87.540982 0.535,0.098 37.771,17.598 7.686,2.363 -1.088,-3.804 z" /><path
inkscape:connector-curvature="0"
style="fill:url(#linearGradient80075)"
id="path748"
d="m 166.969,122.16199 13.723,38.12899 -36.371,-17.90199 0.168,-0.152 c -0.25,-0.08 -0.496,-0.178 -0.701,-0.316 l -0.125,0.121 -75.303,-83.569992 0.123,-0.104 c -2.246,-2.49 1.032,-9.093999 7.308,-14.751999 6.28,-5.652 13.18,-8.219 15.425,-5.733 l 75.292,83.564991 0.461,0.714 z" /><path
inkscape:connector-curvature="0"
style="fill:url(#linearGradient80072)"
id="path758"
d="m 148.652,144.52098 c 2.076,-0.369 4.635,-1.479 7.252,-3.13899 1.617,-1.018 3.279,-2.283 4.898,-3.744 1.455,-1.303 2.736,-2.666 3.84,-4.01 2.076,-2.531 3.322,-5.213 3.781,-7.424 l -1.455,-4.043 -0.463,-0.715 -74.798,-83.017991 c 0.608,2.24 -0.962,5.938 -4.063,9.74 -1.134,1.389 -2.441,2.789 -3.945,4.141 -1.574,1.418999 -3.195,2.651999 -4.767,3.653999 -4.493,2.871 -8.628,3.928 -10.548,2.486 l -0.025,0.021 75.303,83.569992 0.125,-0.121 c 0.205,0.139 0.451,0.236 0.701,0.316 l -0.168,0.152 4.332,2.13399 z" /><path
style="fill:#ffffff"
inkscape:connector-curvature="0"
id="path759"
d="m 68.083,57.809998 c 1.732,1.772 5.994,0.776 10.643,-2.194 1.541,-0.982 3.132,-2.193 4.677,-3.585999 1.476,-1.325 2.759,-2.701 3.872,-4.063 3.578,-4.388 5.091,-8.642 3.477,-10.584 l 0.023,-0.024 75.817,84.118991 c 0.635,2.262 -0.588,6.498 -3.754,10.357 -1.082,1.318 -2.34,2.656 -3.77,3.934 -1.588,1.434 -3.219,2.676 -4.807,3.676 -4.74,3.006 -9.303,4.19899 -11.016,2.301 -0.393,-0.439 -2.098,-2.336 -2.145,-2.406 l -73.255,-81.313992 0.238,-0.216 z" /><path
style="fill:#ffffff"
inkscape:connector-curvature="0"
id="path760"
d="m 75.79,43.614999 c 6.28,-5.652 13.18,-8.219 15.425,-5.733 l 16.961,18.827999 1.152,26.49 -17.973,0.784 -22.996,-25.513 0.123,-0.104 c -2.246,-2.49 1.032,-9.092999 7.308,-14.751999 z" /><path
style="fill:#ffffff"
inkscape:connector-curvature="0"
id="path761"
d="m 68.083,57.809998 c 1.732,1.772 5.994,0.776 10.643,-2.194 1.541,-0.982 3.132,-2.193 4.677,-3.585999 1.476,-1.325 2.759,-2.701 3.872,-4.063 3.578,-4.388 5.091,-8.642 3.477,-10.584 l 0.023,-0.024 75.817,84.118991 c 0.635,2.262 -0.588,6.498 -3.754,10.357 -1.082,1.318 -2.34,2.656 -3.77,3.934 -1.588,1.434 -3.219,2.676 -4.807,3.676 -4.74,3.006 -9.303,4.19899 -11.016,2.301 -0.393,-0.439 -2.098,-2.336 -2.145,-2.406 l -73.255,-81.313992 0.238,-0.216 z" /><path
inkscape:connector-curvature="0"
style="fill:url(#linearGradient80066)"
id="path768"
d="m 75.79,43.614999 c 6.28,-5.652 13.18,-8.219 15.425,-5.733 l 16.961,18.827999 1.152,26.49 -17.973,0.784 -22.996,-25.513 0.123,-0.104 c -2.246,-2.49 1.032,-9.092999 7.308,-14.751999 z" /><path
inkscape:connector-curvature="0"
style="fill:url(#linearGradient80063)"
id="path778"
d="m 68.083,57.809998 c 1.732,1.772 5.994,0.776 10.643,-2.194 1.541,-0.982 3.132,-2.193 4.677,-3.585999 1.476,-1.325 2.759,-2.701 3.872,-4.063 3.578,-4.388 5.091,-8.642 3.477,-10.584 l 0.023,-0.024 75.817,84.118991 c 0.635,2.262 -0.588,6.498 -3.754,10.357 -1.082,1.318 -2.34,2.656 -3.77,3.934 -1.588,1.434 -3.219,2.676 -4.807,3.676 -4.74,3.006 -9.303,4.19899 -11.016,2.301 -0.393,-0.439 -2.098,-2.336 -2.145,-2.406 l -73.255,-81.313992 0.238,-0.216 z" /><path
inkscape:connector-curvature="0"
style="fill:url(#linearGradient80060)"
id="path790"
d="m 74.357,65.112998 c 0,0 6.036,-0.212 10.685,-3.182 1.542,-0.983 3.132,-2.193 4.677,-3.586 1.477,-1.326 2.76,-2.701 3.873,-4.064 2.928,-3.588999 4.469,-7.087999 4.049,-9.306999 l -6.865,-7.617 -0.023,0.024 c 1.614,1.942 0.102,6.196 -3.477,10.584 -1.113,1.362 -2.396,2.738 -3.872,4.063 -1.545,1.392999 -3.136,2.603999 -4.677,3.585999 -4.648,2.971 -8.91,3.967 -10.643,2.194 l -0.238,0.217 73.256,81.310992 c 0.047,0.07 1.752,1.967 2.145,2.406 0.342,0.377 0.799,0.627 1.344,0.771 L 74.357,65.112998 z" /><path
style="fill:#003333"
inkscape:connector-curvature="0"
id="path791"
d="m 172.035,149.75398 c -1.635,1.477 -3.307,2.764 -4.949,3.84 l 13.605,6.697 -5.096,-14.156 c -1.058,1.218 -2.243,2.441 -3.56,3.619 z" /><path
style="opacity:0.5;fill:#ffffff"
inkscape:connector-curvature="0"
id="path792"
d="M 163.121,131.45299 86.968,48.329999 c 0.1,-0.12 0.213,-0.242 0.307,-0.364 1.428,-1.752 2.52,-3.49 3.225,-5.058 l 75.768,82.706991 c -0.553,1.824 -1.6,3.867 -3.147,5.838 z" /><path
style="opacity:0.5;fill:#ffffff"
inkscape:connector-curvature="0"
id="path793"
d="m 87.275,47.965999 c 0.634,-0.774 1.189,-1.548 1.694,-2.3 l 76.015,82.973991 c -0.578,1.063 -1.283,2.146 -2.146,3.193 -0.744,0.896 -1.566,1.805 -2.465,2.697 L 84.152,51.331999 c 1.164,-1.108 2.209,-2.24 3.123,-3.366 z" /><rect
style="fill:none"
y="0"
x="0"
height="256"
width="256"
id="_x3C_Slice_x3E_" />
<rect
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:4.26666689;stroke-opacity:1"
id="rect79256"
width="150.77966"
height="48.813557"
x="9.313406"
y="170.86343"
ry="0" /><text
xml:space="preserve"
style="font-size:42.66666794px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:justify;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Linux Libertine O C;-inkscape-font-specification:Linux Libertine O C"
x="24.554667"
y="207.10201"
id="text80094"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan80096"
x="24.554667"
y="207.10201"
style="font-style:italic;font-weight:bold;-inkscape-font-specification:Linux Libertine O C Bold Italic">Labels</tspan></text>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="62.630001mm"
height="62.630001mm"
viewBox="0 0 62.630001 62.630001"
version="1.1"
id="svg5304"
inkscape:export-xdpi="9.7749033"
inkscape:export-ydpi="9.7749033"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="light_brighten.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview5306"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="1.557211"
inkscape:cx="34.998468"
inkscape:cy="107.88519"
inkscape:window-width="1916"
inkscape:window-height="1046"
inkscape:window-x="0"
inkscape:window-y="14"
inkscape:window-maximized="1"
inkscape:current-layer="layer1"
showguides="true"
inkscape:guide-bbox="true">
<sodipodi:guide
position="31.348111,32.811064"
orientation="1,0"
id="guide1684" />
<sodipodi:guide
position="40.947939,31.281888"
orientation="0,-1"
id="guide1686" />
<sodipodi:guide
position="7.3908081,55.253208"
orientation="0.70710678,0.70710678"
id="guide1688"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
<sodipodi:guide
position="15.758196,15.75491"
orientation="-0.70710678,0.70710678"
id="guide1690"
inkscape:label=""
inkscape:locked="false"
inkscape:color="rgb(0,0,255)" />
</sodipodi:namedview>
<defs
id="defs5301" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-203.83832,-71.309715)">
<circle
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.23761;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"
id="path936"
cx="235.19633"
cy="102.68153"
r="10.674651" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 235.18643,85.591175 V 73.397669"
id="path1269" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 235.18643,132.01987 V 119.82636"
id="path1269-3" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 247.31125,114.76863 8.62212,8.62211"
id="path1269-6" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 214.45899,81.916379 8.62212,8.62211"
id="path1269-6-3" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 252.29226,102.65783 h 12.19352"
id="path1269-7" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 205.84546,102.65783 h 12.19352"
id="path1269-7-5" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 255.86336,81.91796 -8.62211,8.62212"
id="path1269-6-5" />
<path
style="fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 223.05193,114.72939 -8.62211,8.62212"
id="path1269-6-5-6" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 B

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="62.228001mm"
height="62.228001mm"
viewBox="0 0 62.228001 62.228001"
version="1.1"
id="svg5125"
inkscape:export-xdpi="9.7962332"
inkscape:export-ydpi="9.7962332"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview5127"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="0.7786055"
inkscape:cx="285.76731"
inkscape:cy="139.99387"
inkscape:window-width="1916"
inkscape:window-height="1046"
inkscape:window-x="0"
inkscape:window-y="14"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs5122" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-29.373413,-111.60912)">
<path
id="path3811"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:5.23083;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"
d="m 59.434186,113.30847 a 29.762751,29.762751 0 0 0 -14.233875,3.64581 24.884542,24.226615 0 0 1 7.144983,-1.02718 24.884542,24.226615 0 0 1 24.884111,24.22658 24.884542,24.226615 0 0 1 -24.884111,24.22726 24.884542,24.226615 0 0 1 -20.79296,-10.93947 29.762751,29.762751 0 0 0 27.881852,19.39275 29.762751,29.762751 0 0 0 29.762545,-29.76321 29.762751,29.762751 0 0 0 -29.762545,-29.76254 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

View File

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="62.630001mm"
height="62.630001mm"
viewBox="0 0 62.630001 62.630001"
version="1.1"
id="svg9023"
inkscape:export-xdpi="9.7299995"
inkscape:export-ydpi="9.7299995"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
sodipodi:docname="light_reset.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview9025"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:zoom="2.2022289"
inkscape:cx="78.783817"
inkscape:cy="145.30733"
inkscape:window-width="1916"
inkscape:window-height="1058"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs9020" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-75.546089,-129.8161)">
<path
id="path936-2"
style="stroke-width:0.893163;stroke-linecap:round;stroke-linejoin:round;paint-order:markers stroke fill"
d="M 118.64258 78.96875 A 40.125506 40.125506 0 0 0 78.517578 119.09375 A 40.125506 40.125506 0 0 0 80.337891 130.81641 L 153.37891 99.007812 A 40.125506 40.125506 0 0 0 118.64258 78.96875 z "
transform="matrix(0.26458333,0,0,0.26458333,75.546089,129.8161)" />
<path
id="rect8031-9"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:5.36721;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:markers stroke fill"
d="m 133.84074,148.31878 -9.60962,4.19947 a 24.226615,24.884542 89.927756 0 1 0.89687,6.36385 24.226615,24.884542 89.927756 0 1 -24.85372,24.25881 24.226615,24.884542 89.927756 0 1 -20.806298,-10.91315 29.762751,29.762751 0 0 0 27.905948,19.35743 29.762751,29.762751 0 0 0 29.72496,-29.80052 29.762751,29.762751 0 0 0 -3.25814,-13.46589 z" />
<path
style="fill:none;stroke:#000000;stroke-width:0.258714px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 75.612466,173.64974 138.37433,146.19963"
id="path8580"
sodipodi:nodetypes="cc" />
<path
id="path936"
style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.898054;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers stroke fill"
d="M 118.50195 78.773438 A 40.345138 40.345138 0 0 0 78.15625 119.11914 A 40.345138 40.345138 0 0 0 79.972656 130.99609 L 153.33984 98.779297 A 40.345138 40.345138 0 0 0 118.50195 78.773438 z "
transform="matrix(0.26458333,0,0,0.26458333,75.546089,129.8161)" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 106.88976,144.24271 V 132.0492"
id="path1269" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 86.162341,140.56791 8.62212,8.62211"
id="path1269-6-3" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 77.548811,161.30936 h 12.19352"
id="path1269-7-5" />
<path
style="opacity:1;fill:none;stroke:#000000;stroke-width:3.71779;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 127.56669,140.56949 -8.62211,8.62212"
id="path1269-6-5" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,577 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0"
width="48pt"
height="48pt"
viewBox="0 0 256 256"
id="svg2"
xml:space="preserve"
sodipodi:version="0.32"
inkscape:version="0.42+devel"
sodipodi:docname="gtk-open2.svg"
sodipodi:docbase="/home/cschalle/gnome/gnome-themes-extras/Nuvola/icons/scalable/stock"><metadata
id="metadata85"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
inkscape:cy="417.84947"
inkscape:cx="305.25953"
inkscape:zoom="0.43415836"
inkscape:window-height="563"
inkscape:window-width="822"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
inkscape:window-x="0"
inkscape:window-y="30"
inkscape:current-layer="svg2" /><defs
id="defs151" />
<g
id="switch6">
<foreignObject
id="foreignObject8"
height="1"
width="1"
y="0"
x="0"
requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/">
<i:pgfRef
xlink:href="#adobe_illustrator_pgf">
</i:pgfRef>
</foreignObject>
<g
id="g10">
<g
id="Layer_1">
<rect
width="256"
height="256"
x="0"
y="0"
style="fill:none"
id="rect13" />
</g>
<g
id="Layer_2">
<linearGradient
x1="98.551804"
y1="41.2593"
x2="98.551804"
y2="214.72549"
id="XMLID_14_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#c9e6ff;stop-opacity:1"
offset="0"
id="stop17" />
<stop
style="stop-color:#006dff;stop-opacity:1"
offset="0.55620003"
id="stop19" />
<stop
style="stop-color:#0035ed;stop-opacity:1"
offset="1"
id="stop21" />
<a:midPointStop
style="stop-color:#C9E6FF"
offset="0" />
<a:midPointStop
style="stop-color:#C9E6FF"
offset="0.5" />
<a:midPointStop
style="stop-color:#006DFF"
offset="0.5562" />
<a:midPointStop
style="stop-color:#006DFF"
offset="0.5" />
<a:midPointStop
style="stop-color:#0035ED"
offset="1" />
</linearGradient>
<path
d="M 17.219,51.266 C 16.115,51.266 15.219,52.163 15.219,53.266 L 15.219,202.735 C 15.219,203.838 16.115,204.735 17.219,204.735 L 179.885,204.735 C 180.989,204.735 181.885,203.838 181.885,202.735 L 181.885,75.933 C 181.885,74.83 180.989,73.933 179.885,73.933 L 100.552,73.933 L 100.552,53.266 C 100.552,52.163 99.656,51.266 98.552,51.266 L 17.219,51.266 z "
style="fill:url(#XMLID_14_)"
id="path23" />
<linearGradient
x1="98.551804"
y1="41.258801"
x2="98.551804"
y2="214.7274"
id="XMLID_15_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#dcf0ff;stop-opacity:1"
offset="0"
id="stop26" />
<stop
style="stop-color:#428aff;stop-opacity:1"
offset="0.58990002"
id="stop28" />
<stop
style="stop-color:#006dff;stop-opacity:1"
offset="0.85949999"
id="stop30" />
<stop
style="stop-color:#0035ed;stop-opacity:1"
offset="1"
id="stop32" />
<a:midPointStop
style="stop-color:#DCF0FF"
offset="0" />
<a:midPointStop
style="stop-color:#DCF0FF"
offset="0.5" />
<a:midPointStop
style="stop-color:#428AFF"
offset="0.5899" />
<a:midPointStop
style="stop-color:#428AFF"
offset="0.5" />
<a:midPointStop
style="stop-color:#006DFF"
offset="0.8595" />
<a:midPointStop
style="stop-color:#006DFF"
offset="0.5" />
<a:midPointStop
style="stop-color:#0035ED"
offset="1" />
</linearGradient>
<path
d="M 20.219,56.266 C 20.219,61.91 20.219,194.091 20.219,199.735 C 25.891,199.735 171.213,199.735 176.885,199.735 C 176.885,194.154 176.885,84.514 176.885,78.933 C 171.33,78.933 95.552,78.933 95.552,78.933 C 95.552,78.933 95.552,60.651 95.552,56.266 C 90.2,56.266 25.572,56.266 20.219,56.266 z "
style="fill:url(#XMLID_15_)"
id="path34" />
<linearGradient
x1="98.551804"
y1="41.2593"
x2="98.551804"
y2="214.72549"
id="XMLID_16_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop37" />
<stop
style="stop-color:#e9f2ff;stop-opacity:1"
offset="0.1147"
id="stop39" />
<stop
style="stop-color:#b0d2ff;stop-opacity:1"
offset="0.35389999"
id="stop41" />
<stop
style="stop-color:#579fff;stop-opacity:1"
offset="0.6936"
id="stop43" />
<stop
style="stop-color:#006dff;stop-opacity:1"
offset="1"
id="stop45" />
<a:midPointStop
style="stop-color:#FFFFFF"
offset="0" />
<a:midPointStop
style="stop-color:#FFFFFF"
offset="0.5424" />
<a:midPointStop
style="stop-color:#006DFF"
offset="1" />
</linearGradient>
<path
d="M 179.885,73.933 L 100.552,73.933 L 100.552,53.266 C 100.552,52.163 99.656,51.266 98.552,51.266 L 17.219,51.266 C 16.115,51.266 15.219,52.163 15.219,53.266 L 15.219,57.266 L 91.552,57.266 C 92.656,57.266 93.552,58.163 93.552,59.266 L 93.552,79.933 L 172.885,79.933 C 173.989,79.933 174.885,80.83 174.885,81.933 L 174.885,204.735 L 179.885,204.735 C 180.989,204.735 181.885,203.838 181.885,202.735 L 181.885,75.933 C 181.885,74.83 180.988,73.933 179.885,73.933 z "
style="fill:url(#XMLID_16_)"
id="path47" />
<linearGradient
x1="106.9839"
y1="98.599098"
x2="106.9839"
y2="206.73489"
id="XMLID_17_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#0099ff;stop-opacity:1"
offset="0"
id="stop50" />
<stop
style="stop-color:#0089e5;stop-opacity:1"
offset="0.0937"
id="stop52" />
<stop
style="stop-color:#00406b;stop-opacity:1"
offset="0.54689997"
id="stop54" />
<stop
style="stop-color:#00121e;stop-opacity:1"
offset="0.85769999"
id="stop56" />
<stop
style="stop-color:#000000;stop-opacity:1"
offset="1"
id="stop58" />
<a:midPointStop
style="stop-color:#0099FF"
offset="0" />
<a:midPointStop
style="stop-color:#0099FF"
offset="0.4689" />
<a:midPointStop
style="stop-color:#000000"
offset="1" />
</linearGradient>
<path
d="M 32.083,106.599 L 32.083,206.734 L 42.083,206.734 C 42.083,180.445 42.083,111.718 42.083,108.599 C 45.222,108.599 143.57,108.599 181.884,108.599 L 181.884,98.599 L 40.083,98.599 C 35.665,98.599 32.083,102.181 32.083,106.599 z "
style="opacity:0.3;fill:url(#XMLID_17_)"
id="path60" />
<linearGradient
x1="6.3671999"
y1="47.148399"
x2="179.4046"
y2="220.1859"
id="XMLID_18_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#0053bd;stop-opacity:1"
offset="0"
id="stop63" />
<stop
style="stop-color:#00008d;stop-opacity:1"
offset="1"
id="stop65" />
<a:midPointStop
style="stop-color:#0053BD"
offset="0" />
<a:midPointStop
style="stop-color:#0053BD"
offset="0.5" />
<a:midPointStop
style="stop-color:#00008D"
offset="1" />
</linearGradient>
<path
d="M 179.885,63.933 L 110.552,63.933 L 110.552,53.266 C 110.552,46.639 105.18,41.266 98.552,41.266 L 17.219,41.266 C 10.591,41.266 5.219,46.639 5.219,53.266 L 5.219,75.933 L 5.219,202.735 C 5.219,209.362 10.591,214.735 17.219,214.735 L 98.552,214.735 L 179.885,214.735 C 186.512,214.735 191.885,209.362 191.885,202.735 L 191.885,75.933 C 191.885,69.305 186.512,63.933 179.885,63.933 z M 181.885,202.734 C 181.885,203.837 180.989,204.734 179.885,204.734 L 17.219,204.734 C 16.115,204.734 15.219,203.837 15.219,202.734 L 15.219,53.266 C 15.219,52.163 16.115,51.266 17.219,51.266 L 98.552,51.266 C 99.656,51.266 100.552,52.163 100.552,53.266 L 100.552,73.933 L 179.885,73.933 C 180.989,73.933 181.885,74.83 181.885,75.933 L 181.885,202.734 z "
style="fill:url(#XMLID_18_)"
id="path67" />
<linearGradient
x1="128.48441"
y1="86.066902"
x2="128.48441"
y2="228.0708"
id="XMLID_19_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#c9e6ff;stop-opacity:1"
offset="0"
id="stop70" />
<stop
style="stop-color:#006dff;stop-opacity:1"
offset="0.55620003"
id="stop72" />
<stop
style="stop-color:#0035ed;stop-opacity:1"
offset="1"
id="stop74" />
<a:midPointStop
style="stop-color:#C9E6FF"
offset="0" />
<a:midPointStop
style="stop-color:#C9E6FF"
offset="0.5" />
<a:midPointStop
style="stop-color:#006DFF"
offset="0.5562" />
<a:midPointStop
style="stop-color:#006DFF"
offset="0.5" />
<a:midPointStop
style="stop-color:#0035ED"
offset="1" />
</linearGradient>
<path
d="M 51.083,96.599 C 51.083,100.388 51.083,200.946 51.083,204.734 C 54.933,204.734 202.035,204.734 205.884,204.734 C 205.884,200.946 205.884,100.387 205.884,96.599 C 202.035,96.599 54.933,96.599 51.083,96.599 z "
style="fill:url(#XMLID_19_)"
id="path76" />
<linearGradient
x1="128.48441"
y1="86.064499"
x2="128.48441"
y2="228.06689"
id="XMLID_20_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#dcf0ff;stop-opacity:1"
offset="0"
id="stop79" />
<stop
style="stop-color:#428aff;stop-opacity:1"
offset="0.6742"
id="stop81" />
<stop
style="stop-color:#006dff;stop-opacity:1"
offset="1"
id="stop83" />
<a:midPointStop
style="stop-color:#DCF0FF"
offset="0" />
<a:midPointStop
style="stop-color:#DCF0FF"
offset="0.5" />
<a:midPointStop
style="stop-color:#428AFF"
offset="0.6742" />
<a:midPointStop
style="stop-color:#428AFF"
offset="0.5" />
<a:midPointStop
style="stop-color:#006DFF"
offset="1" />
</linearGradient>
<path
d="M 56.083,101.599 C 56.083,110.255 56.083,191.079 56.083,199.734 C 65.135,199.734 191.833,199.734 200.884,199.734 C 200.884,191.079 200.884,110.255 200.884,101.599 C 191.834,101.599 65.135,101.599 56.083,101.599 z "
style="fill:url(#XMLID_20_)"
id="path85" />
<linearGradient
x1="54.491199"
y1="76.673798"
x2="217.155"
y2="239.3376"
id="XMLID_21_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#0053bd;stop-opacity:1"
offset="0"
id="stop88" />
<stop
style="stop-color:#00008d;stop-opacity:1"
offset="1"
id="stop90" />
<a:midPointStop
style="stop-color:#0053BD"
offset="0" />
<a:midPointStop
style="stop-color:#0053BD"
offset="0.5" />
<a:midPointStop
style="stop-color:#00008D"
offset="1" />
</linearGradient>
<path
d="M 207.885,86.599 L 49.083,86.599 C 44.664,86.599 41.083,90.181 41.083,94.599 L 41.083,206.734 C 41.083,211.152 44.664,214.734 49.083,214.734 L 207.884,214.734 C 212.302,214.734 215.884,211.152 215.884,206.734 L 215.884,94.599 C 215.885,90.181 212.303,86.599 207.885,86.599 z M 205.885,204.734 C 202.035,204.734 54.933,204.734 51.084,204.734 C 51.084,200.946 51.084,100.387 51.084,96.599 C 54.934,96.599 202.036,96.599 205.885,96.599 C 205.885,100.388 205.885,200.946 205.885,204.734 z "
style="fill:url(#XMLID_21_)"
id="path92" />
<linearGradient
x1="128.48441"
y1="86.066902"
x2="128.48441"
y2="228.0708"
id="XMLID_22_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop95" />
<stop
style="stop-color:#f7fbff;stop-opacity:1"
offset="0.0862"
id="stop97" />
<stop
style="stop-color:#e2eeff;stop-opacity:1"
offset="0.2177"
id="stop99" />
<stop
style="stop-color:#c0dbff;stop-opacity:1"
offset="0.3779"
id="stop101" />
<stop
style="stop-color:#8fbfff;stop-opacity:1"
offset="0.56089997"
id="stop103" />
<stop
style="stop-color:#529cff;stop-opacity:1"
offset="0.76310003"
id="stop105" />
<stop
style="stop-color:#0871ff;stop-opacity:1"
offset="0.97839999"
id="stop107" />
<stop
style="stop-color:#006dff;stop-opacity:1"
offset="1"
id="stop109" />
<a:midPointStop
style="stop-color:#FFFFFF"
offset="0" />
<a:midPointStop
style="stop-color:#FFFFFF"
offset="0.6158" />
<a:midPointStop
style="stop-color:#006DFF"
offset="1" />
</linearGradient>
<path
d="M 51.083,96.599 C 51.083,97.141 51.083,99.667 51.083,103.599 C 82.419,103.599 194.529,103.599 197.884,103.599 C 197.884,106.846 197.884,181.163 197.884,204.734 C 202.511,204.734 205.39,204.734 205.884,204.734 C 205.884,200.946 205.884,100.387 205.884,96.599 C 202.035,96.599 54.933,96.599 51.083,96.599 z "
style="fill:url(#XMLID_22_)"
id="path111" />
<path
d="M 132.455,30.044 C 126.885,30.044 122.355,34.574 122.355,40.143 L 122.355,158.953 C 122.355,164.521 126.885,169.053 132.455,169.053 L 237.008,169.053 C 242.576,169.053 247.108,164.522 247.108,158.953 L 247.108,40.143 C 247.108,34.574 242.577,30.044 237.008,30.044 L 132.455,30.044 z "
style="fill:#003366"
id="path113" />
<linearGradient
x1="158.8916"
y1="73.708504"
x2="299.68201"
y2="214.4994"
id="XMLID_23_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop116" />
<stop
style="stop-color:#99ccff;stop-opacity:1"
offset="1"
id="stop118" />
<a:midPointStop
style="stop-color:#FFFFFF"
offset="0" />
<a:midPointStop
style="stop-color:#FFFFFF"
offset="0.5" />
<a:midPointStop
style="stop-color:#99CCFF"
offset="1" />
</linearGradient>
<path
d="M 132.455,35.984 C 130.162,35.984 128.295,37.85 128.295,40.143 L 128.295,158.953 C 128.295,161.246 130.162,163.111 132.455,163.111 L 237.008,163.111 C 239.301,163.111 241.166,161.246 241.166,158.953 L 241.166,40.143 C 241.166,37.85 239.301,35.984 237.008,35.984 L 132.455,35.984 z "
style="fill:url(#XMLID_23_)"
id="path120" />
<path
d="M 205.523,86.479 C 216.566,76.124 229.841,71.031 244.136,68.5 L 244.136,40.143 C 244.136,36.206 240.943,33.014 237.007,33.014 L 132.455,33.014 C 128.517,33.014 125.326,36.206 125.326,40.143 L 125.326,125.251 C 154.779,127.473 182.639,106.979 205.523,86.479 z "
style="opacity:0.4;fill:#ffffff"
id="path122" />
<linearGradient
x1="141.7061"
y1="66.528297"
x2="239.2188"
y2="164.041"
id="XMLID_24_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#0053bd;stop-opacity:1"
offset="0"
id="stop125" />
<stop
style="stop-color:#00008d;stop-opacity:1"
offset="1"
id="stop127" />
<a:midPointStop
style="stop-color:#0053BD"
offset="0" />
<a:midPointStop
style="stop-color:#0053BD"
offset="0.5" />
<a:midPointStop
style="stop-color:#00008D"
offset="1" />
</linearGradient>
<path
d="M 207.885,86.599 L 122.355,86.599 L 122.355,96.599 C 162.027,96.599 203.855,96.599 205.885,96.599 C 205.885,98.946 205.885,138.441 205.885,169.053 L 215.885,169.053 L 215.885,94.599 C 215.885,90.181 212.303,86.599 207.885,86.599 z "
style="opacity:0.2;fill:url(#XMLID_24_)"
id="path129" />
<linearGradient
x1="164.1201"
y1="89.542"
x2="164.1201"
y2="184.68871"
id="XMLID_25_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#c9e6ff;stop-opacity:1"
offset="0"
id="stop132" />
<stop
style="stop-color:#006dff;stop-opacity:1"
offset="0.55620003"
id="stop134" />
<stop
style="stop-color:#0035ed;stop-opacity:1"
offset="1"
id="stop136" />
<a:midPointStop
style="stop-color:#C9E6FF"
offset="0" />
<a:midPointStop
style="stop-color:#C9E6FF"
offset="0.5" />
<a:midPointStop
style="stop-color:#006DFF"
offset="0.5562" />
<a:midPointStop
style="stop-color:#006DFF"
offset="0.5" />
<a:midPointStop
style="stop-color:#0035ED"
offset="1" />
</linearGradient>
<path
d="M 122.355,158.953 C 122.355,164.521 126.885,169.053 132.455,169.053 L 205.885,169.053 C 205.885,138.442 205.885,98.947 205.885,96.599 C 203.856,96.599 162.028,96.599 122.355,96.599 L 122.355,158.953 L 122.355,158.953 z "
style="opacity:0.2;fill:url(#XMLID_25_)"
id="path138" />
<linearGradient
x1="185.8848"
y1="86.066902"
x2="185.8848"
y2="228.0708"
id="XMLID_26_"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#0053bd;stop-opacity:1"
offset="0"
id="stop141" />
<stop
style="stop-color:#00008d;stop-opacity:1"
offset="1"
id="stop143" />
<a:midPointStop
style="stop-color:#0053BD"
offset="0" />
<a:midPointStop
style="stop-color:#0053BD"
offset="0.5" />
<a:midPointStop
style="stop-color:#00008D"
offset="1" />
</linearGradient>
<path
d="M 181.885,96.599 L 181.885,202.734 C 181.885,203.837 180.989,204.734 179.885,204.734 C 184.268,204.734 188.244,204.734 191.705,204.734 C 191.814,204.083 191.885,203.417 191.885,202.734 L 191.885,96.599 C 188.916,96.599 185.557,96.599 181.885,96.599 z "
style="opacity:0.3;fill:url(#XMLID_26_)"
id="path145" />
<path
d="M 122.355,96.599 L 122.355,103.599 C 159.458,103.599 195.991,103.599 197.885,103.599 C 197.885,105.771 197.885,139.741 197.885,169.053 L 205.885,169.053 C 205.885,138.442 205.885,98.947 205.885,96.599 C 203.855,96.599 162.027,96.599 122.355,96.599 z "
style="opacity:0.2;fill:#ffffff"
id="path147" />
<rect
width="256"
height="256"
x="0"
y="0"
style="fill:none"
id="_x3C_Slice_x3E_" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,679 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<!-- Created with Sodipodi ("http://www.sodipodi.com/") -->
<svg
width="48pt"
height="48pt"
viewBox="0 0 48 48"
style="overflow:visible;enable-background:new 0 0 48 48"
xml:space="preserve"
xmlns="http://www.w3.org/2000/svg"
xmlns:xap="http://ns.adobe.com/xap/1.0/"
xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
xmlns:x="adobe:ns:meta/"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="svg589"
sodipodi:version="0.32"
sodipodi:docname="/home/david/Desktop/temp/devices/gnome-dev-floppy.svg"
sodipodi:docbase="/home/david/Desktop/temp/devices/">
<defs
id="defs677" />
<sodipodi:namedview
id="base" />
<metadata
id="metadata590">
<xpacket>begin='' id='W5M0MpCehiHzreSzNTczkc9d' </xpacket>
<x:xmpmeta
x:xmptk="XMP toolkit 3.0-29, framework 1.6">
<rdf:RDF>
<rdf:Description
rdf:about="uuid:9dfcc10e-f4e2-4cbf-91b0-8deea2f1a998">
<pdf:Producer>
Adobe PDF library 5.00</pdf:Producer>
</rdf:Description>
<rdf:Description
rdf:about="uuid:9dfcc10e-f4e2-4cbf-91b0-8deea2f1a998" />
<rdf:Description
rdf:about="uuid:9dfcc10e-f4e2-4cbf-91b0-8deea2f1a998" />
<rdf:Description
rdf:about="uuid:9dfcc10e-f4e2-4cbf-91b0-8deea2f1a998">
<xap:CreateDate>
2004-02-04T02:08:51+02:00</xap:CreateDate>
<xap:ModifyDate>
2004-03-29T09:20:16Z</xap:ModifyDate>
<xap:CreatorTool>
Adobe Illustrator 10.0</xap:CreatorTool>
<xap:MetadataDate>
2004-02-29T14:54:28+01:00</xap:MetadataDate>
<xap:Thumbnails>
<rdf:Alt>
<rdf:li
rdf:parseType="Resource">
<xapGImg:format>
JPEG</xapGImg:format>
<xapGImg:width>
256</xapGImg:width>
<xapGImg:height>
256</xapGImg:height>
<xapGImg:image>
/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXzd+b/wDzlWum3k+h+QxFc3EJMdzrkoEkKuNiLZPsyU/nb4fAEb50vZ/YXEBPLsP5v62meXue
A3v5mfmprl080vmLVriXdjHBcTIi17rFCVRfoXOghocEBQhH5NJmepUf8Tfmj/1dtb/6SLv/AJqy
f5fD/Nj8gjxPN3+JvzR/6u2t/wDSRd/81Y/l8P8ANj8gviebv8Tfmj/1dtb/AOki7/5qx/L4f5sf
kF8Tzd/ib80f+rtrf/SRd/8ANWP5fD/Nj8gviebv8Tfmj/1dtb/6SLv/AJqx/L4f5sfkF8Tzd/ib
80f+rtrf/SRd/wDNWP5fD/Nj8gviebv8Tfmj/wBXbW/+ki7/AOasfy+H+bH5BfE83f4m/NH/AKu2
t/8ASRd/81Y/l8P82PyC+J5u/wATfmj/ANXbW/8ApIu/+asfy+H+bH5BfE83f4m/NH/q7a3/ANJF
3/zVj+Xw/wA2PyC+J5u/xN+aP/V21v8A6SLv/mrH8vh/mx+QXxPN3+JvzR/6u2t/9JF3/wA1Y/l8
P82PyC+J5u/xN+aP/V21v/pIu/8AmrH8vh/mx+QXxPN3+JvzR/6u2t/9JF3/AM1Y/l8P82PyC+J5
u/xN+aP/AFdtb/6SLv8A5qx/L4f5sfkF8Tzd/ib80f8Aq7a3/wBJF3/zVj+Xw/zY/IL4nm7/ABN+
aP8A1dtb/wCki7/5qx/L4f5sfkF8Tzd/ib80f+rtrf8A0kXf/NWP5fD/ADY/IL4nm7/E35o/9XbW
/wDpIu/+asfy+H+bH5BfE82j5t/M+Aes2ta3EI/i9U3N2vGnfly2x/LYT/DH5BePzZ15C/5yh/Mb
y7cxRaxcHzDpQIEsF2f9IC9zHc058v8AX5D9ea/VdiYcg9I4JeXL5NkchD688jeefLvnby/DrmhT
+rayEpLE4CywygAtFKtTxYV+RG4qDnH6nTTwT4JjdyIytkGY6XYq7FXYq7FXYq7FXjX/ADlH+YV1
5W8hppunymHU/MMj2qSqaMltGoNwynxPNE/2WbrsPSDLl4pfTDf49GvJKg+VPy+8lP5ivecqM9rG
4jWFaqZpTvw57cVUULGvcfMdtYFk7Ac3Ua3VHGAI/XLk+jNK/LfSLS0SK4JYqDSGCkUCV3PBVAPX
vtXwzWT7TlfoAA+11f5Xi3mTIo608meV/wBL2lnLbSSLcc/92sB8Kk70IOU5+0s4xSmCPT5NuDRY
pZBEjmyu2/KnydcFgliF4ip5TT/wY5ov5f1f877B+p2/8kaf+b9pVv8AlT3lL/lkT/kdcf1w/wAv
az+d9kf1I/kjTfzftLR/J/yl/wAsif8AI65/rj/L2s/nfZH9S/yRpv5v2lafyg8p/wDLKn/I65/r
h/l3Wfzvsj+pf5J03837S0fyh8p/8sqf8jrn+uP8u6z+d9kf1L/JOm/m/aWj+UXlP/llj/5HXP8A
XH+XdZ/O+yP6l/knTfzftLX/ACqPyn/yzR/8jrn+uH+XNb/O+yP6l/knTd32lr/lUflX/lmj/wCR
1z/XB/Lmt/nfZH9S/wAk6bu+0u/5VD5W/wCWaP8A5HXP9cf5d1n877I/qX+SdN/N+0u/5VB5Y/5Z
ov8Akdc/1x/l3Wfzvsj+pf5J03837S7/AJU/5a/5Zov+R1z/AFx/l3Wfzvsj+pf5J03837S7/lT3
lv8A5Zov+R1z/XB/L2s/nfZH9S/yRpv5v2l3/KnfLv8AyzRf8jrn+uP8vaz+d9kf1L/JGm/m/aXf
8qc8v/8ALNF/yOuf64/y9rP532R/Uv8AJGm/m/aXf8qb0H/lmh/5HXP9cf5f1n877I/qX+SNN/N+
0u/5U1oP/LND/wAjrn+uD+X9Z/O+wfqT/JGn/m/aVk/5P6BDBJM1rEVjUswE1xWg8KnH/RBq/wCd
9g/Uv8kaf+b9pYp5i8oeXLOGBoLQo0j8SRJIe3+Uxza9ldq6jNKQnLkO4Ov1/Z2HGAYj7SkreXdK
IoEZD/Mrmo+Vaj8M3I1eR1fgRee/mD+W8NxE91ZIPrhq0UygL6rbt6ctNubfssevy6XwmJjbYjo5
ml1csUhGRuB+xJP+cfvzGvfJvny1T1T+iNXdLTUbcn4SWNIpPZkduvgTmq7Z0gy4Sf4obj9L0WOV
F93xSJLGsiGqOAyn2O+cK5K7FXYq7FXYq7FXYq+R/wDnM65lbzjoFsT+6i05pEG/2pJ2VvbpGM6/
2cH7uR/pfocfNzb/ACCs7caXZzBAJPQuJS3fn9ZMXL/gNs2uvkRirvl+h0GffUm+kfx972EnNKyU
LXfzNpZ/4y/8QOOo/wAWn8PvbdN/fRei6SPjl/1R+vOWDvyjyMsQsIwoWkYVWEYULSMKFhGSVrFV
wOBVwOBVwOBK4HFVwOBK4HAq4HAlcDgVQ1I/7jrn/jE36siUh5X5uH+j23tL/DN52F9U/c6vtX6Q
x0nOidEgNZodNmBAP2aE9jzG4+jL9P8AWGrL9JfNGuSmDzPqEsICGK9maNRsF4ykgCnhmRKArhel
08iccT5B+iHk+4afQbcsalBx+8Bv+Ns8wdknWKuxV2KuxV2KuxV8hf8AOZn/ACneif8AbLH/AFES
52Hs7/dS/rfoDj5uaO/IUf7gbI/8ulx/1GnNlr/7v/O/Q6DN/jEv6v6nqxOahksshXzJpv8Az0/4
gcjqf8Xn8PvbdL/exei6SPjk/wBUfrzlw9AmBGTYrSMKrCMKFpGFVhGFC0jChYRklaxVcDgVcDgV
cDgSuBxVcDgSuBwKuBwJUdRP+4+5/wCMTfqyJSHlvmwf6Lb+0n8M3XYX1S9zq+1fpDwzzXoX1nzD
eT8a82U1/wBgBm1y6fikS6qGfhFJt5T076lomoJSnOSM/dTMzQYuCTj6rJxh4h5k/wCUi1T/AJjJ
/wDk62bM83fab+6j/VH3P0N8jf8AHBj+Y/5NpnlztGQYq7FXYq7FXYq7FXyF/wA5mf8AKd6J/wBs
sf8AURLnYezv91L+t+gOPm5ph+Q4/wCddsj/AMutx/1Gtmx1/wBH+d+h0Gb/ABiX9X9T1InNUl2n
b+Y9P/56f8QOQ1X+Lz+H3t+l/vYvRtJH7yT/AFR+vOWDv0xIySFhGSQtIwqsIwoWkYVWEYULSMKF
hGSVrFVwOBVwOBVwOBK4HFVwOBK4HAqjf/8AHPuf+MTfqyEkh5j5rH+iQ/65/Uc3XYf1y9zre1Pp
DDpbGzkcu8QZ26k50weeMQoXVvDDZyrEgQNQkD5jLMX1BhMbPmrzN/ykmrf8xlx/ydbMp6XTf3cf
6o+5+hnkb/jgx/Mf8m0zy52bIMVdirsVdirsVdir5C/5zM/5TvRP+2WP+oiXOw9nf7qX9b9AcfNz
TL8iR/zrFif+Xa4/6jWzYa76f879Doc/9/L3fqenE5rEL9KFfMNh85P+IHK9X/cT+H3uRpP72L0f
SR+8k/1f45yzv0xIwqtIwoWEZJC0jCqwjChaRhVYRhQtIwoWEZJWsVXA4FXA4FXA4ErgcVXA4EqV
9/vBc/8AGJv1ZCXJIea+ah/ocfsx/wCInNx2H9cvcHW9qfQGIE507z6HvN7dx8v1jLMfNhPk+Z/N
H/KTav8A8xtx/wAnWzJek0/93H+qPufoX5G/44MfzH/JtM8vdmyDFXYq7FXYq7FXYq+Qv+czP+U7
0T/tlj/qIlzsPZ3+6l/W/QHHzc0z/Isf86nYH/l3uP8AqNbM/W8v879Doc/9/L3fqelk5rkK2j76
/ZfN/wDiBynWf3Evx1cjSf3oej6UP3r/AOr/ABzl3fpliq0jCq0jChYRkkLSMKrCMKFpGFVhGFC0
jChYRklaxVcDgVcDgVcDgSuBxVTvP94rn/jE36shPkyDzjzUP9BX5n/iJzbdifXL4Ou7U+gfFhhO
dS86pXG8TD5frycebGXJ8z+av+Un1j/mNuf+TrZkh6TT/wB3H+qPufoV5G/44MfzH/JtM8vdmyDF
XYq7FXYq7FXYq+Qv+czP+U70T/tlj/qIlzsPZ3+6l/W/QHHzc01/I0f86fp5/wCKLj/qNbM7W8v8
79Dos/8AfH3fqejE5gMEVoe+u2fzf/iByjW/3Evx1cnR/wB4Ho+l/wB4/wAv45y7v0xxV2KrSMKr
SMKFhGSQtIwqsIwoWkYVWEYULSMKFhGSVrFVwOBVwOBVwOBKy6P+h3H/ABib9WQnySHnnmkf6APY
t/xE5texPrPwdf2n9A+LByc6t5xTfcEZIIL5p82f8pTrP/Mdc/8AJ5syRyek0/8Adx9w+5+hPkb/
AI4MfzH/ACbTPL3ZsgxV2KuxV2KuxV2KvkL/AJzM/wCU70T/ALZY/wCoiXOw9nf7qX9b9AcfNzTf
8jx/zpWnH/im4/6jHzO1n6f0Oi1H98fd+p6ETmE1o3y/vrdr82/4gcxtd/cycrR/3gej6b/eP8v4
5y7v0wxV2KuxVaRhVaRhQsIySFpGFVhGFC0jCqwjChaRhQsIyStYquBwKuBwKtuT/olx/wAYm/Vk
J8mUXn/mkf7jj/sv+InNp2L/AHh+Dr+0/oHxYGTnWvONDdgMUPmnzb/yletf8x9z/wAnmzIjyelw
f3cfcH6EeRv+ODH8x/ybTPMHZMgxV2KuxV2KuxV2KvkL/nMz/lO9E/7ZY/6iJc7D2d/upf1v0Bx8
3NOPyRH/ADo2mn/im4/6jHzN1fP4/odHqP70+5n5OYjUmHlzfWrb5t/xA5ia7+5k5Wi/vA9H07+8
f5fxzmHfo/FXYq7FXYqtIwqtIwoWEZJC0jCqwjChaRhVYRhQtIwoWEZJWsVXA4Fan/3luP8AjE36
shk5MosD80D/AHGt8m/4gc2XY394fg4Haf0fN56TnXvNLod5VHz/AFYJclD5p83/APKWa3/zH3X/
ACebMiPIPS4P7uPuD9CPI3/HBj+Y/wCTaZ5g7JkGKuxV2KuxV2KuxV8hf85mf8p3on/bLH/URLnY
ezv91L+t+gOPm5p1+SYp5B0w/wDFVx/1GPmZq/q+P6HR6n+9PuZ0TmM0pr5Y31iD5t/xA5h6/wDu
i5mi/vA9G0/7b/LOYd8jsVdirsVdirsVWkYVWkYULCMkhaRhVYRhQtIwqsIwoWkYULCMkrWKul/3
mn/4xt+rK8nJMebB/NA/3Fyf6r/8QObHsb+8Pw+9we0/o+bzgnOxeZVLXe4QfP8AUcjPkmPN81ec
f+Uu1z/toXX/ACebL4fSHpcH0R9wfoP5G/44MfzH/JtM8xdkyDFXYq7FXYq7FXYq+Qv+czP+U70T
/tlj/qIlzsPZ3+6l/W/QHHzc08/JUf8AIPNLP/Fdx/1GSZl6r6z7/wBDpNT/AHh9zNicocdOPKu+
rQ/M/wDEGzB7Q/ui5uh+sPRbEhXappt3zmXfI3mn8w+/FXeon8w+/FWvUj/mH3jFXepH/MPvGKu9
WP8AnH3jFXepF/Ov3jFVpeP+dfvGG1Wl4/51+8YbQtLJ/Mv3jDa0tJT+ZfvGHiCKWnj/ADL/AMEP
64eILS08f5l/4If1w8QRS0qP5l/4If1w8YWlpUfzL/wS/wBceMIorCn+Uv8AwS/1w8YXhKyai289
WXeNgPiB3I+eRnIEJiGFeZx/uKm/1H/4gc2PY/8AefL73B7S+j5vNCc7N5dWsN7uMfP/AIichl+k
so83zX5z/wCUw13/ALaF1/yffL8f0j3PS4foj7g/QbyN/wAcGP5j/k2meYuyZBirsVdirsVdirsV
fIX/ADmZ/wAp3on/AGyx/wBREudh7O/3Uv636A4+bmnv5Lj/AJBxpZ/yLj/qMkzK1X1n3/odJqv7
w+5mZOVOOmvly5jtrwTyAlIzuFpXdSO9Mw9bjM4cI6uVpJiMrLK/8T2H++5fuX/mrNL/ACdk7x+P
g7b85DuLX+JbD/fcv3L/AM1Y/wAnZO8fj4L+ch3Fr/Elj/vuX7l/5qx/k7J3j8fBfzkO4tf4jsf9
9y/cv/NWP8nZO8fj4L+ch3Fo+YrH/fcv3L/zVj/J2TvH4+C/nIdxW/4hsv5JPuX/AJqx/k7J3j8f
BfzkO4tfp+y/kk+5f+asf5Oyd4/HwX85DuLX6es/5JPuX/mrH+TsnePx8F/OQ7i1+nbP+ST7l/5q
x/k7J3j8fBfzkO4tfpy0/kk+5f64/wAnZO8fj4L+ch3Fr9N2n8kn3L/XH+TsnePx8F/OQ7i0datf
5JPuX+uP8nZO8fj4L+ch3Fb+mLX+R/uH9cf5Oyd4/HwX85DuLX6Xtv5H+4f1x/k7J3j8fBfzkO4t
fpa2/lf7h/XH+TsnePx8F/OQ7i0dVt/5X+4f1x/k7J3j8fBfzkO4tHVLf+V/uH9cf5Oyd4/HwX85
DuKW6/dxz6XcKgYFY5DvT+Q++bDs7TSx5Bdbkfe4etzicNvN5sTnWPOojTN7+If63/ETleb6Cyhz
fNnnX/lMte/7aN3/AMn3y/H9I9z02H6B7g/QXyN/xwY/mP8Ak2meYuxZBirsVdirsVdirsVfIX/O
Zn/Kd6J/2yx/1ES52Hs7/dS/rfoDj5uaf/kyP+QZ6Uf8m4/6jJMytT/eH8dHS6r6z7mXk5W4rSyy
JXgxWvWhIxMQVEiOTjdXH+/X/wCCOPAO5eM9603Vz/v1/wDgjh4I9y8Z71pu7n/fz/8ABHDwR7kc
Z71pu7r/AH8//BH+uHw49y8cu9aby6/39J/wR/rh8OPcEccu9ab27/3/ACf8E39cPhx7gjjl3rTe
3f8Av+T/AINv64fDj3BfEl3rTfXn+/5P+Db+uHw49wR4ku8rTfXv/LRJ/wAG39cPhR7gviS7ytN/
e/8ALRJ/wbf1w+FHuCPEl3ladQvv+WiX/g2/rh8KPcEeJLvK06hff8tMv/Bt/XD4Ue4L4ku8rTqN
/wD8tMv/AAbf1w+FDuCPEl3ladRv/wDlpl/4Nv64fBh3D5L4ku8rTqWof8tUv/Bt/XD4MO4fJHiy
7ytOp6h/y1Tf8jG/rh8GHcPkjxZd5aOp6j/y1Tf8jG/rh8GHcPkviy7ypvqN+6lWuZWVhRlLsQQe
xFcIwwHQfJByS7yhScta0Xo++pQj/W/4icq1H0Fnj+p82+d/+Uz1/wD7aN3/AMn3y7F9I9z02H6B
7g/QTyN/xwY/mP8Ak2meZOxZBirsVdirsVdirsVfIX/OZn/Kd6J/2yx/1ES52Hs7/dS/rfoDj5ub
IfybH/ILtJPtcf8AUZLmTqP70/jo6XVfWWVE5FxFpOFVpOFDCLz82fLtrdz2slteGSCRonKpFQlC
VNKyDbbLRjLLgKgfzh8tf8s17/wEX/VXD4ZXwytP5weWv+Wa9/4CL/qrjwFHhlo/m95b/wCWa8/4
CL/qrh4Cvhlo/m75b/5Zrz/gIv8Aqrh4V8Mrf+Vt+XD/AMe15/wEX/VXCIFHhF3/ACtjy6f+Pa8/
4CL/AKqZMYijwy1/ytXy8f8Aj3u/+Ai/6qZYNPJHhl3/ACtPy+f+Pe7/AOAj/wCqmTGll5I8Mtf8
rQ0A/wDHvd/8BH/1UywaKfkjwy7/AJWboR/497r/AICP/qpkx2fPvCOAtf8AKytDP+6Lr/gI/wDq
pkx2bk7x+PgjgLY/MXRT0guf+Bj/AOa8P8nZO8fj4LwFseftIPSG4/4FP+a8f5Pn3j8fBHAUTY+b
dOvbqO2iimWSQkKXVQNhXejHwyGTSSiLNIMSE4JzGYLCcKFpOFCN0PfVYB/rf8QOU6n+7LZi+oPm
7zx/ymvmD/tpXn/J98uxfQPcHpsX0D3B+gfkb/jgx/Mf8m0zzJ2LIMVdirsVdirsVdir5C/5zM/5
TvRP+2WP+oiXOw9nf7qX9b9AcfNzZF+To/5BVpB9rj/qMlzI1H98fx0dNq/qLJycXDWk4ULScKEq
/IbT7OTVvMty0S/Wm1BoRPQcxHVmKqT0BPXNL25M3EdKd52bEUS9s/RNv/O/3j+maC3Zu/RNv/O/
3j+mNq79E2/87/eP6Y2rv0Tb/wA7/eP6Y2rv0Tb/AM7/AHj+mNq79E2/87/eP6Y2rv0Tb/zv94/p
jau/RNv/ADv94/pjau/RNv8Azv8AeP6Y2rv0Tb/zv94/pjau/RNv/O/3j+mNq80/PXTbMeUJmaMP
LbyQvBKwBZC8gRqEU6qc6L2YyyjqwAdpA38nA7RiDiJ7nzykeekEvOpz5cSmsWx9z/xE5jak+gsZ
cmeE5qWhaThQtJwqj/L2+sW4/wBf/iDZRq/7s/jq2YfqD5v89f8AKb+Yf+2nef8AUQ+W4foHuD02
L6R7n6BeRv8Ajgx/Mf8AJtM8zdiyDFXYq7FXYq7FXYq+Qv8AnMz/AJTvRP8Atlj/AKiJc7D2d/up
f1v0Bx83Nkn5Pj/kEujn/mI/6jJcvz/35/HR02r+osjJyThLScKFhOSQgvyCamo+YR46o3/G2aHt
z6o+533Zv0l7pmhdk7FXYq7FXYq7FXYq7FXYq7FXYq8w/PPfytdr7wf8nRm/9m/8bj7pfc4PaP8A
cn4PntI89IJebTXQUpqlufc/8ROY+c+gsZcmZk5rWhaThVaThQmPlrfW7Yf6/wDybbMfWf3R/HVt
wfWHzh58/wCU58xf9tO8/wCoh8twfRH3B6fH9I9z9AfI3/HBj+Y/5NpnmbsGQYq7FXYq7FXYq7FX
yF/zmZ/yneif9ssf9REudh7O/wB1L+t+gOPm5sm/KEf8gh0Y+9x/1GTZdm/vz+OgdPrOZT8nLHAW
E5JC0nCqX/kO9NT8wf8AbUb/AI2zQ9ufVH3O+7N+kvdPUzQ07Jg/5n+a7ny3o9zq0CGY20cREHMx
hvUnEfUA9OVemZmh03jZRC6u/utpz5eCBl3PIv8AoY3V/wDq1j/pKf8A5ozoR7NxP8f2ftdf/KR/
m/ay/wDLf81dQ826lcW0tsbQWypJyWZpOXJuNKELmu7U7JGliJCXFZ7nJ0ur8UkVVPZvUzR05rvU
xpXepjSu9TGld6mNK71MaV3qY0rzP8625eXrlf8AjB/ydGb32c/xuPul9zg9o/3J+DwdI89FJebT
PRkpqEJ9z+o5RmPpLCXJlJOYLStJwoWE4UJp5V31+1H/ABk/5NtmNrf7o/D727T/AFh84efv+U68
x/8AbUvf+oh8swf3cfcHp8f0j3P0B8jf8cGP5j/k2meaOwZBirsVdirsVdirsVfIX/OZn/Kd6J/2
yx/1ES52Hs7/AHUv636A4+bmyf8AKMf8gc0U/wCVcf8AUZNl2b/GD+OgdPrOZTsnLnXrScKrScKE
s/I1qanr3/bTb/jbND22PVH3O/7N+kvb/UzROyeYfny9fJmoj/iu2/6i0zbdiD/CofH/AHJcTW/3
R+H3vmQDPQ4wefep/kEeOuah/wAYov8Ak5nOe1Eaxw/rH7nZdmfUfc+l/UziXcu9TFXepirvUxV3
qYq71MVd6mKvOPzhblolwPaH/k5m79nv8aj7j9zgdo/3J+DxdI89BJebTDTEpeRH3P6jlOQ7MZck
/JzFaFhOFC0nCqbeUd/MVoP+Mn/Jpsxdf/cy+H3hu031h84/mB/ynnmT/tqXv/UQ+Waf+7j/AFR9
z0+P6R7n6AeRv+ODH8x/ybTPNHYMgxV2KuxV2KuxV2KvkL/nMz/lO9E/7ZY/6iJc7D2d/upf1v0B
x83NlP5TD/kC+iH/AC7n/qMmy3L/AIzL8dA6jWcym5OZDrlpOFC0nChKfyUbjqmue+pN/wAbZpO3
h6of1Xf9m/SXtXqZz9Oyeafnm9fKOoD/AIrt/wDqKXNz2CP8Lh/nf7kuJrv7o/D73zaFz0mMHnre
nfkWeOt33/GKP/k5nMe1kaxQ/rH7nZ9l/Ufc+j/UzhKdy71MaV3qY0rvUxpXepjSu9TGld6mNK8/
/NduWlzL7Rf8nM3XYH+NR+P3OD2l/cn4PJEjzvSXmkbYpS4Q/wCfTKpnZjLkmpOUtC0nCq0nJITj
ybv5lsx/xk/5NPmH2h/cy+H3hv0394Hzl+YP/KfeZf8Atq3v/US+Waf+7j/VH3PTw+kPv/yN/wAc
GP5j/k2meaOwZBirsVdirsVdirsVfIX/ADmZ/wAp3on/AGyx/wBREudh7O/3Uv636A4+bmyv8qB/
yBPRD/xZc/8AUZNlmT/GpfjoHUa1MycynWrScKFhOFUn/JxuOqa1/wBtJv8AjbNR7QD1Q/qu+7M+
kvZfUznKdm83/Ox+XlW/H/Fdv/1Erm69nh/hkP8AO/3JcTXf3J+H3vncLnp8YvOPSvyUHDWL0+Mc
f/E85P2u/uof1j9ztOy/qPufQ3qZwVO6d6mNK71MaV3qY0rvUxpXepjSu9TGlYJ+ZjcrGUe0X/E8
3HYX+Mx+P3OB2l/cn4PNEjzuSXmkVbpSRTlZLGXJFk5FpWk5JC0nChOvJG/miyH/ABl/5MvmF2l/
cS+H3hyNL/eD8dHzn+Yf/Kf+Zv8AtrX3/US+T0391H+qPueoh9Iff3kb/jgx/Mf8m0zzVz2QYq7F
XYq7FXYq7FXyF/zmZ/yneif9ssf9REudh7O/3Uv636A4+bmyz8qv/JHaGf8Aiy5/6jJ8nk/xuXu/
QHUa1MCczHWLCcKrScKEk/KN+Gqaz/20W/42zV+0Y3x/1Xfdl/SXr31gZzVO0Yv520E+YLSSwbms
EyIHkjKhgUk9Tbl8hmXodXLTZRliATG+fmKas2IZImJ6sFH5J2Q/3ddffF/TOh/0W5/5kPt/W4P8
lw7ynvlX8v18vXbz25mkMoVX9QpQBWrtxAzV9pdsZNXERkAOHutyNPpI4iSDzei/WBmnpy3fWBjS
u+sDGld9YGNK76wMaV31gY0rvrAxpWGfmA4kt5B/kx/8Tzbdi/4wPj9zgdpf3J+DAkjztCXmldEp
vkbYy5Licm0LScKFhOFU98ib+a7H/nr/AMmXzB7T/wAXl8PvDkaT+8H46PnT8xf/ACYPmf8A7a19
/wBRL5PTf3Uf6o+56iHIPv3yN/xwY/mP+TaZ5q57IMVdirsVdirsVdir5C/5zMB/x1oh7fosf9RE
udh7O/3Uv636A4+bmyz8qv8AyRuh07S3Ffb/AEyfJz/xuXu/QHUa3kjSczXWLScKFpOFDH/ywfhq
OsH/AJf2/W2a72lG+P8AqO+7L+kvT/rXvnMU7R31r3xpXfWvfGld9a98aV31r3xpXfWvfGld9a98
aV31r3xpXfWvfGld9a98aV31r3xpWM+bpPUiYeyf8Szadj/4wPj9zg9pf3J+DFUjzsCXmVVkpGTg
id2MuSHJy9oWE4VWk4UJ95CqfNljQbD1a/8AIl8wO1P8Xl8PvDkaP+8H46PnX8xf/Jg+Z/8AtrX3
/US+T0v91H+qPuephyD798jf8cGP5j/k2meaueyDFXYq7FXYq7FXYq+b/wDnMvyrcXGj6F5ngQtH
YSSWV6QK8VuOLxMfBQ8bLXxYZ0vs7nAlLGeu4+DTmHVif/OOXm+xvdGvfImoTiO5LvdaSXbZlIDS
RINt0ZfUp1ILeGbPtDGYTGUfF12pxcQZ/fafeWUhjuIytDQPT4W+Ry3FljMWC6acDHmhCcta1hOF
Uo/KW39fzBf2/X1dQYU/4LNf7UHfH/Ud92V9Je4/4U/yPwzkuN2tO/wp/kfhjxrTv8Kf5H4Y8a07
/Cn+R+GPGtO/wp/kfhjxrTv8Kf5H4Y8a07/Cn+R+GPGtO/wp/kfhjxrTv8Kf5H4Y8a07/Cn+R+GP
GtO/wp/kfhjxrTz78wrH6lf/AFelKxI1Pmx/pm27GN5x8fucDtP+5PwYmkedcS8wuuEpbufb+OMD
6mMuSWE5ltK0nChyJJK4jjUu7bKqgkk+wGJIAsqBfJldi1p5F0G982+Yf3BjjMdlZsQsskjbqig/
tvxoB2FSds0Wu1H5iQxY9+8u20OlINl82eV7HUPNvny1WWs1zqF4bm8cDqC5lmb2rvT3zK1mUYMB
PdGh9wd/AWafoD5TtzBo6L2LEj5ABf8AjXPPHLTjFXYq7FXYq7FXYql/mDQdL8waLeaLqsIuNPv4
mhuIj3Vu4PZlO6nsd8sxZZY5CUeYQRb4V/NL8oPNv5a656pEs2kiX1NL1uDko+FqpzZf7qVdtvHd
Sc7vQ9o49TGuUusfxzDjTgQmOjf85K/mRp1klrMbLUymy3F5C5loBQAtDJCG+ZFfE4z7KxSN7j3O
OcUSj/8Aoaf8wf8Aq36T/wAibn/soyH8kYu+X2fqR4Ad/wBDT/mD/wBW/Sf+RNz/ANlGP8kYu+X2
fqXwAoN/zkl5puryK6v9OtRJACIHsXmtXUk9SzvcfgBlObsSEuUiPfv+puxejkjP+hnPMn++bz/u
JS/9U8xv9Dw/n/7H9rd4rv8AoZzzJ/vm8/7iUv8A1Tx/0PD+f/sf2r4rv+hnPMn++bz/ALiUv/VP
H/Q8P5/+x/aviu/6Gc8yf75vP+4lL/1Tx/0PD+f/ALH9q+K7/oZzzJ/vm8/7iUv/AFTx/wBDw/n/
AOx/aviu/wChnPMn++bz/uJS/wDVPH/Q8P5/+x/aviu/6Gc8yf75vP8AuJS/9U8f9Dw/n/7H9q+K
7/oZzzJ/vm8/7iUv/VPH/Q8P5/8Asf2r4rv+hnPMn++bz/uJS/8AVPH/AEPD+f8A7H9q+K7/AKGc
8yf75vP+4lL/ANU8f9Dw/n/7H9q+K7/oZzzJ/vm8/wC4lL/1Tx/0PD+f/sf2r4qEm/5yR8yi8jvr
awikvEBQyahNLdjgRSg4mBh1/mPyy7D2FCJ3kT7hX62vJLjFK3/Q0/5g/wDVv0n/AJE3P/ZRmT/J
GLvl9n6nH8AO/wChp/zB/wCrfpP/ACJuf+yjH+SMXfL7P1L4Ad/0NP8AmD/1b9J/5E3P/ZRj/JGL
vl9n6l8AO/6Gn/MH/q36T/yJuf8Asox/kjF3y+z9S+AGj/zlP+YJH/HP0ke/o3P/AGUY/wAkYu+X
2fqXwQwPXvM/nfz/AKxF9emm1O7qRa2cS0jiDHf040AVR0qx32+I5lxhi08L2iO9tjCtg+ifyJ/J
ubQF+u36q+tXajmRusEXXiD+vxNPAE8f2r2l+YlUfoH2+f6nKhCn0XBCkEKQxiiRgKv0ZqGxfirs
VdirsVdirsVdiqhfWFlf2slpewpcW0o4yQyKGVh7g4QSNwryzXP+cZ/yy1G4a4i0xIGY1McTyQrX
5RMo/wCFzYY+1tTAUJn40fvYHGEp/wChVPy+/wCWAf8ASXdf1yf8tar+f9kf1L4cXf8AQqn5ff8A
LAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/
rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n
/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF
3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff
8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r
+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+
f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4c
Xf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cW1/5xW/L
9WDCwWo33urkj7icT2zqv5/2R/UvhxZl5Z/KLy9oKcLG1t7RduRgT42p4sQN/c5g5tRkym5yMmQA
DNrOytrSL04E4j9o9ST7nKUq+KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q==</xapGImg:image>
</rdf:li>
</rdf:Alt>
</xap:Thumbnails>
</rdf:Description>
<rdf:Description
rdf:about="uuid:9dfcc10e-f4e2-4cbf-91b0-8deea2f1a998">
<xapMM:DocumentID>
uuid:f3c53255-be8a-4b04-817b-695bf2c54c8b</xapMM:DocumentID>
</rdf:Description>
<rdf:Description
rdf:about="uuid:9dfcc10e-f4e2-4cbf-91b0-8deea2f1a998">
<dc:format>
image/svg+xml</dc:format>
<dc:title>
<rdf:Alt>
<rdf:li
xml:lang="x-default">
filesave.ai</rdf:li>
</rdf:Alt>
</dc:title>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<xpacket>end='w' </xpacket>
</metadata>
<g
id="Layer_1">
<path
style="opacity:0.2;"
d="M9.416,5.208c-2.047,0-3.712,1.693-3.712,3.775V39.15c0,2.082,1.666,3.775,3.712,3.775h29.401 c2.047,0,3.712-1.693,3.712-3.775V8.983c0-2.082-1.665-3.775-3.712-3.775H9.416z"
id="path592" />
<path
style="opacity:0.2;"
d="M9.041,4.833c-2.047,0-3.712,1.693-3.712,3.775v30.167c0,2.082,1.666,3.775,3.712,3.775h29.401 c2.047,0,3.712-1.693,3.712-3.775V8.608c0-2.082-1.665-3.775-3.712-3.775H9.041z"
id="path593" />
<path
style="fill:#00008D;"
d="M8.854,4.646c-2.047,0-3.712,1.693-3.712,3.775v30.167c0,2.082,1.666,3.775,3.712,3.775h29.401 c2.047,0,3.712-1.693,3.712-3.775V8.42c0-2.082-1.665-3.775-3.712-3.775H8.854z"
id="path594" />
<path
style="fill:#00008D;"
d="M8.854,5.021c-1.84,0-3.337,1.525-3.337,3.4v30.167c0,1.875,1.497,3.4,3.337,3.4h29.401 c1.84,0,3.337-1.525,3.337-3.4V8.42c0-1.875-1.497-3.4-3.337-3.4H8.854z"
id="path595" />
<path
id="path166_1_"
style="fill:#FFFFFF;"
d="M40.654,38.588c0,1.36-1.074,2.463-2.399,2.463H8.854c-1.326,0-2.4-1.103-2.4-2.463V8.42 c0-1.36,1.074-2.462,2.4-2.462h29.401c1.325,0,2.399,1.103,2.399,2.462V38.588z" />
<linearGradient
id="path166_2_"
gradientUnits="userSpaceOnUse"
x1="-149.0464"
y1="251.1436"
x2="-149.0464"
y2="436.303"
gradientTransform="matrix(0.1875 0 0 -0.1875 51.5 83.75)">
<stop
offset="0"
style="stop-color:#B4E2FF"
id="stop598" />
<stop
offset="1"
style="stop-color:#006DFF"
id="stop599" />
<a:midPointStop
offset="0"
style="stop-color:#B4E2FF"
id="midPointStop600" />
<a:midPointStop
offset="0.5"
style="stop-color:#B4E2FF"
id="midPointStop601" />
<a:midPointStop
offset="1"
style="stop-color:#006DFF"
id="midPointStop602" />
</linearGradient>
<path
id="path166"
style="fill:url(#path166_2_);"
d="M40.654,38.588c0,1.36-1.074,2.463-2.399,2.463H8.854c-1.326,0-2.4-1.103-2.4-2.463V8.42 c0-1.36,1.074-2.462,2.4-2.462h29.401c1.325,0,2.399,1.103,2.399,2.462V38.588z" />
<path
style="fill:#FFFFFF;"
d="M8.854,6.521c-1.013,0-1.837,0.852-1.837,1.9v30.167c0,1.048,0.824,1.9,1.837,1.9h29.401 c1.013,0,1.837-0.853,1.837-1.9V8.42c0-1.048-0.824-1.9-1.837-1.9H8.854z"
id="path604" />
<linearGradient
id="XMLID_1_"
gradientUnits="userSpaceOnUse"
x1="7.3057"
y1="7.2559"
x2="50.7728"
y2="50.7231">
<stop
offset="0"
style="stop-color:#94CAFF"
id="stop606" />
<stop
offset="1"
style="stop-color:#006DFF"
id="stop607" />
<a:midPointStop
offset="0"
style="stop-color:#94CAFF"
id="midPointStop608" />
<a:midPointStop
offset="0.5"
style="stop-color:#94CAFF"
id="midPointStop609" />
<a:midPointStop
offset="1"
style="stop-color:#006DFF"
id="midPointStop610" />
</linearGradient>
<path
style="fill:url(#XMLID_1_);"
d="M8.854,6.521c-1.013,0-1.837,0.852-1.837,1.9v30.167c0,1.048,0.824,1.9,1.837,1.9h29.401 c1.013,0,1.837-0.853,1.837-1.9V8.42c0-1.048-0.824-1.9-1.837-1.9H8.854z"
id="path611" />
<linearGradient
id="XMLID_2_"
gradientUnits="userSpaceOnUse"
x1="23.5039"
y1="2.187"
x2="23.5039"
y2="34.4368">
<stop
offset="0"
style="stop-color:#428AFF"
id="stop613" />
<stop
offset="1"
style="stop-color:#C9E6FF"
id="stop614" />
<a:midPointStop
offset="0"
style="stop-color:#428AFF"
id="midPointStop615" />
<a:midPointStop
offset="0.5"
style="stop-color:#428AFF"
id="midPointStop616" />
<a:midPointStop
offset="1"
style="stop-color:#C9E6FF"
id="midPointStop617" />
</linearGradient>
<path
style="fill:url(#XMLID_2_);"
d="M36.626,6.861c0,0-26.184,0-26.914,0c0,0.704,0,16.59,0,17.294c0.721,0,26.864,0,27.583,0 c0-0.704,0-16.59,0-17.294C36.988,6.861,36.626,6.861,36.626,6.861z"
id="path618" />
<polygon
id="path186_1_"
style="fill:#FFFFFF;"
points="35.809,6.486 10.221,6.486 10.221,23.405 36.788,23.405 36.788,6.486 " />
<linearGradient
id="path186_2_"
gradientUnits="userSpaceOnUse"
x1="-104.5933"
y1="411.6699"
x2="-206.815"
y2="309.4482"
gradientTransform="matrix(0.1875 0 0 -0.1875 51.5 83.75)">
<stop
offset="0"
style="stop-color:#CCCCCC"
id="stop621" />
<stop
offset="1"
style="stop-color:#F0F0F0"
id="stop622" />
<a:midPointStop
offset="0"
style="stop-color:#CCCCCC"
id="midPointStop623" />
<a:midPointStop
offset="0.5"
style="stop-color:#CCCCCC"
id="midPointStop624" />
<a:midPointStop
offset="1"
style="stop-color:#F0F0F0"
id="midPointStop625" />
</linearGradient>
<polygon
id="path186"
style="fill:url(#path186_2_);"
points="35.809,6.486 10.221,6.486 10.221,23.405 36.788,23.405 36.788,6.486 " />
<path
style="fill:#FFFFFF;stroke:#FFFFFF;stroke-width:0.1875;"
d="M11.488,7.019c0,0.698,0,14.542,0,15.239c0.716,0,23.417,0,24.133,0c0-0.698,0-14.541,0-15.239 C34.904,7.019,12.204,7.019,11.488,7.019z"
id="path627" />
<linearGradient
id="XMLID_3_"
gradientUnits="userSpaceOnUse"
x1="34.5967"
y1="3.5967"
x2="18.4087"
y2="19.7847">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop629" />
<stop
offset="0.5506"
style="stop-color:#E6EDFF"
id="stop630" />
<stop
offset="1"
style="stop-color:#FFFFFF"
id="stop631" />
<a:midPointStop
offset="0"
style="stop-color:#FFFFFF"
id="midPointStop632" />
<a:midPointStop
offset="0.5"
style="stop-color:#FFFFFF"
id="midPointStop633" />
<a:midPointStop
offset="0.5506"
style="stop-color:#E6EDFF"
id="midPointStop634" />
<a:midPointStop
offset="0.5"
style="stop-color:#E6EDFF"
id="midPointStop635" />
<a:midPointStop
offset="1"
style="stop-color:#FFFFFF"
id="midPointStop636" />
</linearGradient>
<path
style="fill:url(#XMLID_3_);stroke:#FFFFFF;stroke-width:0.1875;"
d="M11.488,7.019c0,0.698,0,14.542,0,15.239c0.716,0,23.417,0,24.133,0c0-0.698,0-14.541,0-15.239 C34.904,7.019,12.204,7.019,11.488,7.019z"
id="path637" />
<linearGradient
id="path205_1_"
gradientUnits="userSpaceOnUse"
x1="-174.4409"
y1="300.0908"
x2="-108.8787"
y2="210.2074"
gradientTransform="matrix(0.1875 0 0 -0.1875 51.5 83.75)">
<stop
offset="0"
style="stop-color:#003399"
id="stop639" />
<stop
offset="0.2697"
style="stop-color:#0035ED"
id="stop640" />
<stop
offset="1"
style="stop-color:#57ADFF"
id="stop641" />
<a:midPointStop
offset="0"
style="stop-color:#003399"
id="midPointStop642" />
<a:midPointStop
offset="0.5"
style="stop-color:#003399"
id="midPointStop643" />
<a:midPointStop
offset="0.2697"
style="stop-color:#0035ED"
id="midPointStop644" />
<a:midPointStop
offset="0.5"
style="stop-color:#0035ED"
id="midPointStop645" />
<a:midPointStop
offset="1"
style="stop-color:#57ADFF"
id="midPointStop646" />
</linearGradient>
<rect
id="path205"
x="12.154"
y="26.479"
style="fill:url(#path205_1_);"
width="22.007"
height="13.978" />
<linearGradient
id="XMLID_4_"
gradientUnits="userSpaceOnUse"
x1="21.8687"
y1="25.1875"
x2="21.8687"
y2="44.6251">
<stop
offset="0"
style="stop-color:#DFDFDF"
id="stop649" />
<stop
offset="1"
style="stop-color:#7D7D99"
id="stop650" />
<a:midPointStop
offset="0"
style="stop-color:#DFDFDF"
id="midPointStop651" />
<a:midPointStop
offset="0.5"
style="stop-color:#DFDFDF"
id="midPointStop652" />
<a:midPointStop
offset="1"
style="stop-color:#7D7D99"
id="midPointStop653" />
</linearGradient>
<path
style="fill:url(#XMLID_4_);"
d="M13.244,27.021c-0.311,0-0.563,0.252-0.563,0.563v13.104c0,0.312,0.252,0.563,0.563,0.563h17.249 c0.311,0,0.563-0.251,0.563-0.563V27.583c0-0.311-0.252-0.563-0.563-0.563H13.244z M18.85,30.697c0,0.871,0,5.078,0,5.949 c-0.683,0-2.075,0-2.759,0c0-0.871,0-5.078,0-5.949C16.775,30.697,18.167,30.697,18.85,30.697z"
id="path654" />
<linearGradient
id="XMLID_5_"
gradientUnits="userSpaceOnUse"
x1="-158.0337"
y1="288.0684"
x2="-158.0337"
y2="231.3219"
gradientTransform="matrix(0.1875 0 0 -0.1875 51.5 83.75)">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop656" />
<stop
offset="0.6348"
style="stop-color:#CECEDB"
id="stop657" />
<stop
offset="0.8595"
style="stop-color:#B1B1C5"
id="stop658" />
<stop
offset="1"
style="stop-color:#FFFFFF"
id="stop659" />
<a:midPointStop
offset="0"
style="stop-color:#F0F0F0"
id="midPointStop660" />
<a:midPointStop
offset="0.5"
style="stop-color:#F0F0F0"
id="midPointStop661" />
<a:midPointStop
offset="0.6348"
style="stop-color:#CECEDB"
id="midPointStop662" />
<a:midPointStop
offset="0.5"
style="stop-color:#CECEDB"
id="midPointStop663" />
<a:midPointStop
offset="0.8595"
style="stop-color:#B1B1C5"
id="midPointStop664" />
<a:midPointStop
offset="0.5"
style="stop-color:#B1B1C5"
id="midPointStop665" />
<a:midPointStop
offset="1"
style="stop-color:#FFFFFF"
id="midPointStop666" />
</linearGradient>
<path
style="fill:url(#XMLID_5_);"
d="M13.244,27.583v13.104h17.249V27.583H13.244z M19.413,37.209h-3.884v-7.074h3.884V37.209z"
id="path667" />
<linearGradient
id="path228_1_"
gradientUnits="userSpaceOnUse"
x1="-68.1494"
y1="388.4561"
x2="-68.1494"
y2="404.6693"
gradientTransform="matrix(0.1875 0 0 -0.1875 51.5 83.75)">
<stop
offset="0"
style="stop-color:#3399FF"
id="stop669" />
<stop
offset="1"
style="stop-color:#000000"
id="stop670" />
<a:midPointStop
offset="0"
style="stop-color:#3399FF"
id="midPointStop671" />
<a:midPointStop
offset="0.5"
style="stop-color:#3399FF"
id="midPointStop672" />
<a:midPointStop
offset="1"
style="stop-color:#000000"
id="midPointStop673" />
</linearGradient>
<rect
id="path228"
x="37.83"
y="9.031"
style="fill:url(#path228_1_);"
width="1.784"
height="1.785" />
<polyline
id="_x3C_Slice_x3E_"
style="fill:none;"
points="0,48 0,0 48,0 48,48 " />
</g>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Some files were not shown because too many files have changed in this diff Show More