base on Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation). <h1 align="center"> <img src="labelme/icons/icon-256.png" width="200" height="200"><br/>labelme </h1> <h4 align="center"> Image Polygonal Annotation with Python </h4> <div align="center"> <a href="https://pypi.python.org/pypi/labelme"><img src="https://img.shields.io/pypi/v/labelme.svg"></a> <!-- <a href="https://pypi.org/project/labelme"><img src="https://img.shields.io/pypi/pyversions/labelme.svg"></a> --> <a href="https://github.com/wkentaro/labelme/actions"><img src="https://github.com/wkentaro/labelme/actions/workflows/ci.yml/badge.svg?branch=main&event=push"></a> <a href="https://discord.com/invite/uAjxGcJm83"><img src="https://dcbadge.limes.pink/api/server/uAjxGcJm83?style=flat"></a> </div> <div align="center"> <a href="#installation"><b>Installation</b></a> | <a href="#usage"><b>Usage</b></a> | <a href="#examples"><b>Examples</b></a> <!-- | <a href="https://github.com/wkentaro/labelme/discussions"><b>Community</b></a> --> <!-- | <a href="https://www.youtube.com/playlist?list=PLI6LvFw0iflh3o33YYnVIfOpaO0hc5Dzw"><b>Youtube FAQ</b></a> --> </div> <br/> <div align="center"> <img src="examples/instance_segmentation/.readme/annotation.jpg" width="70%"> </div> ## Description Labelme is a graphical image annotation tool inspired by <http://labelme.csail.mit.edu>. It is written in Python and uses Qt for its graphical interface. <img src="examples/instance_segmentation/data_dataset_voc/JPEGImages/2011_000006.jpg" width="19%" /> <img src="examples/instance_segmentation/data_dataset_voc/SegmentationClass/2011_000006.png" width="19%" /> <img src="examples/instance_segmentation/data_dataset_voc/SegmentationClassVisualization/2011_000006.jpg" width="19%" /> <img src="examples/instance_segmentation/data_dataset_voc/SegmentationObject/2011_000006.png" width="19%" /> <img src="examples/instance_segmentation/data_dataset_voc/SegmentationObjectVisualization/2011_000006.jpg" width="19%" /> <i>VOC dataset example of instance segmentation.</i> <img src="examples/semantic_segmentation/.readme/annotation.jpg" width="30%" /> <img src="examples/bbox_detection/.readme/annotation.jpg" width="30%" /> <img src="examples/classification/.readme/annotation_cat.jpg" width="35%" /> <i>Other examples (semantic segmentation, bbox detection, and classification).</i> <img src="https://user-images.githubusercontent.com/4310419/47907116-85667800-de82-11e8-83d0-b9f4eb33268f.gif" width="30%" /> <img src="https://user-images.githubusercontent.com/4310419/47922172-57972880-deae-11e8-84f8-e4324a7c856a.gif" width="30%" /> <img src="https://user-images.githubusercontent.com/14256482/46932075-92145f00-d080-11e8-8d09-2162070ae57c.png" width="32%" /> <i>Various primitives (polygon, rectangle, circle, line, and point).</i> ## Features - [x] Image annotation for polygon, rectangle, circle, line and point. ([tutorial](examples/tutorial)) - [x] Image flag annotation for classification and cleaning. ([#166](https://github.com/wkentaro/labelme/pull/166)) - [x] Video annotation. ([video annotation](examples/video_annotation)) - [x] GUI customization (predefined labels / flags, auto-saving, label validation, etc). ([#144](https://github.com/wkentaro/labelme/pull/144)) - [x] Exporting VOC-format dataset for semantic/instance segmentation. ([semantic segmentation](examples/semantic_segmentation), [instance segmentation](examples/instance_segmentation)) - [x] Exporting COCO-format dataset for instance segmentation. ([instance segmentation](examples/instance_segmentation)) ## Installation There are 3 options to install labelme: ### Option 1: Using pip For more detail, check ["Install Labelme using Terminal"](https://www.labelme.io/docs/install-labelme-terminal) ```bash pip install labelme # To install the latest version from GitHub: # pip install git+https://github.com/wkentaro/labelme.git ``` ### Option 2: Using standalone executable (Easiest) If you're willing to invest in the convenience of simple installation without any dependencies (Python, Qt), you can download the standalone executable from ["Install Labelme as App"](https://www.labelme.io/docs/install-labelme-app). It's a one-time payment for lifetime access, and it helps us to maintain this project. ### Option 3: Using a package manager in each Linux distribution In some Linux distributions, you can install labelme via their package managers (e.g., apt, pacman). The following systems are currently available: [![Packaging status](https://repology.org/badge/vertical-allrepos/labelme.svg)](https://repology.org/project/labelme/versions) ## Usage Run `labelme --help` for detail. The annotations are saved as a [JSON](http://www.json.org/) file. ```bash labelme # just open gui # tutorial (single image example) cd examples/tutorial labelme apc2016_obj3.jpg # specify image file labelme apc2016_obj3.jpg -O apc2016_obj3.json # close window after the save labelme apc2016_obj3.jpg --nodata # not include image data but relative image path in JSON file labelme apc2016_obj3.jpg \ --labels highland_6539_self_stick_notes,mead_index_cards,kong_air_dog_squeakair_tennis_ball # specify label list # semantic segmentation example cd examples/semantic_segmentation labelme data_annotated/ # Open directory to annotate all images in it labelme data_annotated/ --labels labels.txt # specify label list with a file ``` ### Command Line Arguments - `--output` specifies the location that annotations will be written to. If the location ends with .json, a single annotation will be written to this file. Only one image can be annotated if a location is specified with .json. If the location does not end with .json, the program will assume it is a directory. Annotations will be stored in this directory with a name that corresponds to the image that the annotation was made on. - The first time you run labelme, it will create a config file in `~/.labelmerc`. You can edit this file and the changes will be applied the next time that you launch labelme. If you would prefer to use a config file from another location, you can specify this file with the `--config` flag. - Without the `--nosortlabels` flag, the program will list labels in alphabetical order. When the program is run with this flag, it will display labels in the order that they are provided. - Flags are assigned to an entire image. [Example](examples/classification) - Labels are assigned to a single polygon. [Example](examples/bbox_detection) ### FAQ - **How to convert JSON file to numpy array?** See [examples/tutorial](examples/tutorial#convert-to-dataset). - **How to load label PNG file?** See [examples/tutorial](examples/tutorial#how-to-load-label-png-file). - **How to get annotations for semantic segmentation?** See [examples/semantic_segmentation](examples/semantic_segmentation). - **How to get annotations for instance segmentation?** See [examples/instance_segmentation](examples/instance_segmentation). ## Examples * [Image Classification](examples/classification) * [Bounding Box Detection](examples/bbox_detection) * [Semantic Segmentation](examples/semantic_segmentation) * [Instance Segmentation](examples/instance_segmentation) * [Video Annotation](examples/video_annotation) ## How to build standalone executable ```bash LABELME_PATH=./labelme OSAM_PATH=$(python -c 'import os, osam; print(os.path.dirname(osam.__file__))') pyinstaller labelme/labelme/__main__.py \ --name=Labelme \ --windowed \ --noconfirm \ --specpath=build \ --add-data=$(OSAM_PATH)/_models/yoloworld/clip/bpe_simple_vocab_16e6.txt.gz:osam/_models/yoloworld/clip \ --add-data=$(LABELME_PATH)/config/default_config.yaml:labelme/config \ --add-data=$(LABELME_PATH)/icons/*:labelme/icons \ --add-data=$(LABELME_PATH)/translate/*:translate \ --icon=$(LABELME_PATH)/icons/icon-256.png \ --onedir ``` ## Acknowledgement This repo is the fork of [mpitid/pylabelme](https://github.com/mpitid/pylabelme). ", Assign "at most 3 tags" to the expected json: {"id":"3333","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"