Add 'labelImg/' from commit 'b33f965b6d14c14f1e46b247f1bf346e03f2e950'
git-subtree-dir: labelImg git-subtree-mainline: dbe80aca780253f6ee1e5a2f8686407ca179e921 git-subtree-split: b33f965b6d14c14f1e46b247f1bf346e03f2e950
8
labelImg/.github/no-response.yml
vendored
Normal 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
@ -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
@ -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.*
|
||||
3
labelImg/CONTRIBUTING.rst
Normal 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
@ -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
@ -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
@ -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
@ -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
@ -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
12
labelImg/build-tools/.gitignore
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
*.spec
|
||||
build
|
||||
dist
|
||||
pyinstaller
|
||||
python-2.*
|
||||
pywin32*
|
||||
virtual-wine
|
||||
venv_wine
|
||||
PyQt4-*
|
||||
lxml-*
|
||||
windows_v*
|
||||
linux_v*
|
||||
35
labelImg/build-tools/README.md
Normal 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
|
||||
```
|
||||
30
labelImg/build-tools/build-for-macos.sh
Executable 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'
|
||||
17
labelImg/build-tools/build-for-pypi.sh
Executable 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
|
||||
24
labelImg/build-tools/build-ubuntu-binary.sh
Executable 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
|
||||
32
labelImg/build-tools/build-windows-binary.sh
Executable 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
|
||||
53
labelImg/build-tools/envsetup.sh
Executable 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
|
||||
|
||||
13
labelImg/build-tools/run-in-container.sh
Executable 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
|
||||
|
||||
15
labelImg/data/predefined_classes.txt
Executable file
@ -0,0 +1,15 @@
|
||||
dog
|
||||
person
|
||||
cat
|
||||
tv
|
||||
car
|
||||
meatballs
|
||||
marinara sauce
|
||||
tomato soup
|
||||
chicken noodle soup
|
||||
french onion soup
|
||||
chicken breast
|
||||
ribs
|
||||
pulled pork
|
||||
hamburger
|
||||
cavity
|
||||
BIN
labelImg/demo/demo.jpg
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
labelImg/demo/demo3.jpg
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
labelImg/demo/demo4.png
Normal file
|
After Width: | Height: | Size: 2.7 MiB |
BIN
labelImg/demo/demo5.png
Normal file
|
After Width: | Height: | Size: 3.1 MiB |
7
labelImg/issue_template.md
Normal 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
2
labelImg/libs/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
__version_info__ = ('1', '8', '6')
|
||||
__version__ = '.'.join(__version_info__)
|
||||
748
labelImg/libs/canvas.py
Normal 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
|
||||
37
labelImg/libs/colorDialog.py
Normal 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
@ -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)
|
||||
20
labelImg/libs/constants.py
Normal 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'
|
||||
135
labelImg/libs/create_ml_io.py
Normal 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
|
||||
27
labelImg/libs/default_label_combobox.py
Normal 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)
|
||||
28
labelImg/libs/hashableQListWidgetItem.py
Normal 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))
|
||||
95
labelImg/libs/labelDialog.py
Normal 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
@ -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)
|
||||
33
labelImg/libs/lightWidget.py
Normal 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)
|
||||
171
labelImg/libs/pascal_voc_io.py
Normal 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
@ -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
@ -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
|
||||
78
labelImg/libs/stringBundle.py
Normal 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
@ -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
@ -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
@ -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
@ -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)
|
||||
26
labelImg/libs/zoomWidget.py
Normal 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)
|
||||
197
labelImg/readme/README.jp.rst
Normal 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 を送ってください。
|
||||
195
labelImg/readme/README.zh.rst
Normal 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-- | 縮小影像 |
|
||||
+--------------------+--------------------------------------------+
|
||||
| ↑→↓← | 移動所選的物件區塊 |
|
||||
+--------------------+--------------------------------------------+
|
||||
|
||||
如何貢獻
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
歡迎上傳程式碼直接貢獻
|
||||
BIN
labelImg/readme/images/label-studio-1-6-player-screenshot.png
Normal file
|
After Width: | Height: | Size: 4.3 MiB |
BIN
labelImg/readme/images/labelimg.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
2
labelImg/requirements/requirements-linux-python3.txt
Normal file
@ -0,0 +1,2 @@
|
||||
pyqt5==5.14.1
|
||||
lxml==4.9.1
|
||||
43
labelImg/resources.qrc
Normal 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>
|
||||
BIN
labelImg/resources/icons/app.icns
Normal file
BIN
labelImg/resources/icons/app.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
30
labelImg/resources/icons/app.svg
Normal 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 |
BIN
labelImg/resources/icons/cancel.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
labelImg/resources/icons/close.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
labelImg/resources/icons/color.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
labelImg/resources/icons/color_line.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
labelImg/resources/icons/copy.png
Normal file
|
After Width: | Height: | Size: 646 B |
BIN
labelImg/resources/icons/delete.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
labelImg/resources/icons/done.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
400
labelImg/resources/icons/done.svg
Normal 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
|
||||
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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 |
BIN
labelImg/resources/icons/edit.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
labelImg/resources/icons/expert1.png
Normal file
|
After Width: | Height: | Size: 278 B |
BIN
labelImg/resources/icons/expert2.png
Normal file
|
After Width: | Height: | Size: 335 B |
BIN
labelImg/resources/icons/eye.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
labelImg/resources/icons/feBlend-icon.png
Normal file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
labelImg/resources/icons/file.png
Normal file
|
After Width: | Height: | Size: 765 B |
BIN
labelImg/resources/icons/fit-width.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
labelImg/resources/icons/fit-window.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
labelImg/resources/icons/fit.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
labelImg/resources/icons/format_createml.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
labelImg/resources/icons/format_voc.png
Normal file
|
After Width: | Height: | Size: 786 B |
BIN
labelImg/resources/icons/format_yolo.png
Normal file
|
After Width: | Height: | Size: 675 B |
BIN
labelImg/resources/icons/help.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
labelImg/resources/icons/labels.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
819
labelImg/resources/icons/labels.svg
Normal 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
|
||||
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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 |
112
labelImg/resources/icons/light_brighten.svg
Normal 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 |
BIN
labelImg/resources/icons/light_darken.png
Normal file
|
After Width: | Height: | Size: 487 B |
52
labelImg/resources/icons/light_darken.svg
Normal 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 |
BIN
labelImg/resources/icons/light_lighten.png
Normal file
|
After Width: | Height: | Size: 477 B |
BIN
labelImg/resources/icons/light_reset.png
Normal file
|
After Width: | Height: | Size: 587 B |
84
labelImg/resources/icons/light_reset.svg
Normal 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 |
BIN
labelImg/resources/icons/new.png
Normal file
|
After Width: | Height: | Size: 977 B |
BIN
labelImg/resources/icons/next.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
labelImg/resources/icons/objects.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
labelImg/resources/icons/open.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
577
labelImg/resources/icons/open.svg
Normal 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 |
BIN
labelImg/resources/icons/prev.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
labelImg/resources/icons/quit.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
labelImg/resources/icons/resetall.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
labelImg/resources/icons/save-as.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
1358
labelImg/resources/icons/save-as.svg
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
labelImg/resources/icons/save.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
679
labelImg/resources/icons/save.svg
Normal 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
|
||||
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</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 |
BIN
labelImg/resources/icons/undo-cross.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
labelImg/resources/icons/undo.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
labelImg/resources/icons/verify.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
labelImg/resources/icons/zoom-in.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
labelImg/resources/icons/zoom-out.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |