finish 1st draft of documentation

This commit is contained in:
Martin Baeuml
2011-05-12 15:18:52 +02:00
parent cba6f6ecf2
commit 9d4077a204
10 changed files with 589 additions and 26 deletions
+4 -1
View File
@@ -12,7 +12,7 @@ PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest deploy
help:
@echo "Please use \`make <target>' where <target> is one of"
@@ -33,6 +33,9 @@ help:
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
deploy: html
cp -r _build/html/* ~baeuml/www/labeltool/doc
clean:
-rm -rf $(BUILDDIR)/*
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

+75
View File
@@ -1,6 +1,81 @@
===
API
===
.. todo:: Actually document the code, so that this is not just a bunch of method names.
annotationmodel
===============
.. automodule:: annotationmodel
.. autoclass:: AnnotationModel
:members:
:undoc-members:
.. autoclass:: ModelItem
:members:
:undoc-members:
.. autoclass:: RootModelItem
:members:
:undoc-members:
.. autoclass:: FileModelItem
:members:
:undoc-members:
.. autoclass:: ImageFileModelItem
:members:
:undoc-members:
.. autoclass:: VideoFileModelItem
:members:
:undoc-members:
.. autoclass:: FrameModelItem
:members:
:undoc-members:
.. autoclass:: AnnotationModelItem
:members:
:undoc-members:
.. autoclass:: KeyValueModelItem
:members:
:undoc-members:
annotationscene
===============
.. automodule:: annotationscene
.. autoclass:: AnnotationScene
:members:
:undoc-members:
items
=====
.. automodule:: items
.. _AnnotationGraphicsItem:
.. autoclass:: AnnotationGraphicsItem
:members:
:undoc-members:
.. autoclass:: PointItem
:members:
:undoc-members:
.. autoclass:: RectItem
:members:
:undoc-members:
.. .. autoclass:: PolygonItem
:members:
.. autoclass:: PointItemInserter
:members:
:undoc-members:
.. autoclass:: RectItemInserter
:members:
:undoc-members:
.. autoclass:: PolygonItemInserter
:members:
:undoc-members:
+45 -17
View File
@@ -31,47 +31,75 @@ The label tool provides support for a range of standard shape label (for example
In order for the label tool to correctly visualize these labels, the labels have to follow
a convention, which the keys are for `x`- and `y`-coordinates, `width` and `height` and so on.
The following types are supported out of the box
The following types are supported out of the box, i.e. corresponding visualization items
and inserters will be avaible in the default configuration.
Point
.....
::
{
type: "point",
x: 10,
y: 20,
"type": "point",
"x": 10,
"y": 20,
}
Rect
....
::
{
type: "rect",
x: 10,
y: 20,
width: 20,
height: 20,
"type": "rect",
"x": 10,
"y": 20,
"width": 20,
"height": 20,
}
Polygon
.......
::
{
type: "polygon",
xn: "10;20;30",
yn: "20;30;40",
"type": "polygon",
"xn": "10;20;30",
"yn": "20;30;40",
}
User defined labels
-------------------
For many cases, it might suffice to use the predefined labels. But as
In most cases, it will not be sufficient for your labeling need to stick to those simple types. Or
your might want to add further information. Since each label is just a set of key-value pairs, this
is easily possible. For example, by adding an additional ``class`` key, denoting that these points
are the left and right eye, respectively::
{
"type": "point",
"class": "left_eye",
x: 50, y: 40,
}
{
"type": "point",
"class": "right_eye",
x: 70, y: 40,
}
Of course, you can also change the type::
{
"type": "triangle",
"x1": 10,
"y1": 20,
"x2": 30,
"y2": 20,
"x3": 20,
"y3": 30,
}
However, if you do this you will need to tell the label tool in the
configuration how to display this type as well. See section
:doc:`Configuration` on how to do that.
Representation is not storage
@@ -83,6 +111,6 @@ The label tool does not have *the one* in which way to store the labels. Again,
there are some default formats with which the label tool can deal out of the box (one of
which will be a yaml file, which resembles the textual representation above). However,
you are free to define your own loading and saving routines for your labels (see ***). This
allows you for example to support legacy third-party label formats without the need to convert
allows you for example to support legacy third-party label formats without the need of converting
them first.
+218
View File
@@ -0,0 +1,218 @@
# -*- coding: utf-8 -*-
#
# Labeltool documentation build configuration file, created by
# sphinx-quickstart on Mon May 9 18:08:02 2011.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('..'))
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.todo']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Labeltool'
copyright = u'2011, cv:hci lab, Institute for Anthropomatics, Karlsruhe Institute of Technology'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.1'
# The full version, including alpha/beta/rc tags.
release = '0.1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# -- Options for HTML output ---------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'nature'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'Labeltooldoc'
# todo extension
todo_include_todos = True
# -- Options for LaTeX output --------------------------------------------------
# The paper size ('letter' or 'a4').
#latex_paper_size = 'letter'
# The font size ('10pt', '11pt' or '12pt').
#latex_font_size = '10pt'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'Labeltool.tex', u'Labeltool Documentation',
u'cv:hci lab, Institute for Anthropomatics, Karlsruhe Institute of Technology', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Additional stuff for the LaTeX preamble.
#latex_preamble = ''
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output --------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'labeltool', u'Labeltool Documentation',
[u'cv:hci lab'], 1)
]
+37 -1
View File
@@ -14,17 +14,53 @@ This is a list of all available settings.
LABELS
------
Default::
(
("Rect", {"type": "rect"}),
("Point", {"type": "point"}),
("Polygon", {"type": "polygon"}),
)
List of labels. This will be used to construct the button area from which the user can select to be created
labels. The second tuple entry is expected to be a python dictionary, which contains at least the key `type`.
All other keys are optional, but are directly used for the newly created label. A value can also be a list.
In this case, the button area displays another list of options for the key as defined in the list. Example::
(
("Rect", {"type": "rect", "class": "head", "id": ["Martin", "Mika", "Boris"]}),
)
Note two things here. First, the comma at the end of the first tuple is mandatory. Otherwise the outer tuple
will not be recognized as one (it will be only parentheses around an object, which will alone not be translated
into a tuple object. Second, the key `head` does not contain a list as value. That means, that this key-value
pair will be used directly as such in a newly created label. For the key `id` the user can choose from the
given list, and only the chosen value will be used for the newly created label.
.. _ITEMS:
ITEMS
-----
Default::
{
"rect": 'items.RectItem',
"point": 'items.PointItem',
"polygon": 'items.PolygonItem',
}
Mapping from `type` to the visualization item. The values need to be python callables that create
a new visualization item. They don't neccessarily need to be subclasses of `AnnotationGraphicsItem`.
Nevertheless, the constructor of any subclass of `AnnotationGraphicItem` is of course a python callable
that creates a new visualization item.
.. _HOTKEYS:
HOTKEYS
-------
Default:: `()` (Empty tuple)
Default:: ``()`` (Empty tuple)
Hold a list of hotkeys for the label inserting. Example::
+72 -7
View File
@@ -1,3 +1,6 @@
.. highlight:: python
===========
First Steps
===========
@@ -5,7 +8,7 @@ In this section, you will learn with a simple example, how to load labels and wr
The full configuration options will be covered in the next section :doc:`configuration`.
Using the default configuration
-------------------------------
===============================
The easiest way to start is using a supported label format, and supported label types only. In this case
we just need to start the label tool and supply the label file on the command line::
@@ -14,18 +17,80 @@ we just need to start the label tool and supply the label file on the command li
Let's take look at the example label file::
image1.jpg type rect x 50 y 80 z 20 type rect x 50 y 80 z 20
image1.jpg type rect x 50 y 80 width 20 height 20 type rect x 50 y 80 width 20 height 80
image2.jpg type point x 70 y 80
We have labeled two images, with two rectangles in image1 and one point in image 2. Since we did not launch
the label tool with a custom configuration, the standard visualizations for rect and point will be used.
the label tool with a custom configuration, the standard visualizations for rect and point will be used. The
label tool displays the two given image, and draw two rectangle at the labeled position in image1, and a
point in image2.
Writing a custom configuration
------------------------------
==============================
The configuration file is a python module where the module-level variables represent the settings. The
two most important variable are
most important variables are
* ITEMS:
* LABELS: This defines which new labels can be created interactively by the users.
* :ref:`ITEMS`: This defines how a given label is visualized by the label tool.
* :ref:`LABELS`: This defines *which* new labels can be created interactively by the user.
* :ref:`INSERTERS`: This defines *how* new labels are created by the user.
We start with a quick example::
ITEMS = {
'rect': 'items.RectItem',
'point': 'items.PointItem',
'bbox': 'items.RectItem',
}
LABELS = (
("Rect", {"type": "rect",
"class": "head",
"id": ["Martin", "Mika"]}),
("Bounding Box", {"type": "bbox",
"class": "body",
"id": ["Martin", "Mika"]}),
)
In ``ITEMS`` we specify that all labels of type ``rect`` will be visualized by the class ``items.RectItem``
(which is one of the predefined visualization items that comes with the label tool). All labels of type
``point`` will be visualized by ``items.PointItem``. Note that we can use any type basically. The type
``bbox`` will also be visualized by a ``items.RectItem``.
In ``LABELS`` we defined which `new` labels the user can create with the label tool. The variable is
expected to be a list/tuple of tuples. Each of the inner tuples contains first a description of the
label (this will be on the button displayed to the user), and the a description of the label to be
created. In our case, we create a label of type ``rect`` if the user hits the ``Rect`` button. Further,
the newly created label will have the class ``head`` (which is fixed), and the user can choose between
one of the ids from the given list.
Similarly, the user now can create Bounding Box labels of type ``bbox`` with class ``body``.
There is a difference between the visualization items and the way the labels are created by the user
interactively. For example, the label tool does *not* know out of the box how to create a label of
type ``bbox``. We have to explicitly specify how to insert this type. We can do this by setting
the ``INSERTERS`` variable::
INSERTERS = {
'rect': 'items.inserters.RectItemInserter',
'bbox': 'items.inserters.RectItemInserter',
}
The ``RectItemInserter`` lets the user draw a rectangle with the mouse, and then sets the ``x``,
``y``, ``width`` and ``height`` members of the label accordingly. By mapping the type ``bbox``
to ``RectItemInserter``, the user will be able to draw a rectangle each time a new Bounding Box
label is created. Note that we also have to add the ``RectItemInserter`` for the type ``rect``
as well (which would also be in the default configuration) due to the fact that we override
the ``INSERTERS`` variable completely. Otherwise the label tool would not know anymore, how
to insert labels of type ``rect``.
In order to extend the default configuration and avoid overriding the default values, you can
first import the default configuration and then append your custom mappings (remember that
the configuration is a python module, you can basically execute any valid python code)::
from conf.default_configuration import INSERTERS
INSERTERS['bbox'] = 'items.inserters.RectItemInserter'
You can now continue by reading about :doc:`all available configuration options <configuration>`,
how to write your own :doc:`visualization items <items>` or how to write :doc:`custom inserters <inserters>`.
+5
View File
@@ -1,3 +1,8 @@
.. image:: _static/sloth.gif
:width: 350px
:align: right
:alt: sloth
========================================
Welcome to the label tool documentation!
========================================
+5
View File
@@ -1,3 +1,8 @@
=========
Inserters
=========
Inserters are used for creating new labels interactively. When the users selects a label type in the button area,
the corresponding inserter for the label type (as defined in the :ref:`configuration`).
.. todo:: Write this. It's pretty similar to the items section.
+128
View File
@@ -1,2 +1,130 @@
.. highlight:: python
=====
Items
=====
Visualization items are reponsible for bringing the labels to the users screen. The
visualization in the label tool is object based, i.e. for each label the label
tool creates a item object that is responsible for drawing the label.
Predefined items
================
The label tool comes with a few predefined visualization items:
- ``items.PointItem``
Draws a point. Expects the label to have keys ``x`` and ``y`` with the coordinates as values.
- ``items.RectItem``
Draws a rectangle. Expects the label to have keys ``x``, ``y``, ``width`` and ``height``.
- ``items.PolygonItem``
Draws a rectangle. Expects the label to have keys ``xn`` and ``yn``, which are ``;``-separated
lists of point coordinates.
The predefined items can be used in different ways. If you give the class name in
the configuration, the constructor will be called for initializing the item. However,
you can also create and instance of the item, configure for example the color, and then
use this instance in the configuration. The predefined items have their ``__call__`` operator
overloaded and will function as a factory creating new items similar to the current instance.
You can make use of this in the configuration to for example specify the color of the
created rectangles, maybe even different kinds for different label types::
# this your custom configuration module
RedRectItem = items.RectItem()
RedRectItem.setColor(Qt.Red)
GreenRectItem = items.RectItem()
GreenRectItem.setColor(Qt.Green)
ITEMS = {
"rect" : RedRectItem,
"head" : GreenRectItem,
}
Write your own visualization item
=================================
The base class for all visualization item is the :ref:`AnnotationGraphicsItem <AnnotationGraphicsItem>` class. In
order to write a new visualization item, you need to subclass this class and implement
a few functions.
The easiest way to visualize your label is by using some of the existing Qt graphics items. You can initialize
it in the constructor and be done::
class MyRectItem(AnnotationGraphicsItem):
def __init__(self, index, data):
# Call the base class constructor. This will make the label
# data available in self.data
AnnotationGraphicsItem.__init__(self, index, data)
# Create a new rect item and add it as child item.
# This defines what will be displayed for this label, since the
# AnnotationGraphicsItem base class itself does not display anything.
x, y, width, height = map(float, (self.data['x'], self.data['y'],
self.data['width'], self.data['height']))
self.rect_ = QGraphicsRectItem(x, y, width, height, self)
For advanced usage, for example allowing the label to be moved by the mouse, we need to
do some more. First, we need to allow the item to be selectable and movable. In the constructor
set the graphics items flags to allow interactive modfications of the item::
self.setFlags(QGraphicsItem.ItemIsSelectable | \
QGraphicsItem.ItemIsMovable | \
QGraphicsItem.ItemSendsGeometryChanges | \
QGraphicsItem.ItemSendsScenePositionChanges)
Then we catch the notifications about item changes by overriding ``ìtemChange``. We especially need
to inform the model about the modification::
def itemChange(self, change, value):
if change == QGraphicsItem.ItemScenePositionHasChanged:
self.updateModel()
return AnnotationGraphicsItem.itemChange(self, change, value)
def updateModel(self):
rect = QRectF(self.scenePos(), self.rect_.size())
self.data['x'] = rect.topLeft().x()
self.data['y'] = rect.topLeft().y()
self.data['width'] = float(rect.width())
self.data['height'] = float(rect.height())
self.index().model().setData(self.index(), QVariant(self.data), DataRole)
For even more advanced usage, such as drawing your own shapes, catching keys etc., please consult
Qt's `QGraphicsItem documentation`_.
.. _QGraphicsItem documentation: http://doc.trolltech.com/latest/qgraphicsitem.html
Factorize your custom visualization item
========================================
The predefined items are implemented in such a way so that they can be used as template
to create new, similar items. In order to implement something similar for your own
visualization items, you need to overload your classes ``__call__`` operator and
return a new visualization item with all properties cloned that you would like
to clone.
Example::
class MyRectItem(AnnotationGraphicsItem):
def __init__(self, index, data):
AnnotationGraphicsItem.__init__(self, index, data)
self.color_ = Qt.Red
def setColor(self, color):
self.color_ = color
def __call__(self, index, data):
newitem = MyRectItem(index, data)
newitem.setColor(self.color_)
return newitem
You can see that the ``__call__`` operator takes the same arguments as the constructor.
In its implementation it first creates a new visualization item, and then sets the
color to the same as its own before returning the new item.