728x90
반응형

 

 

 

COCO Keypoint 데이터 세트를 만들기 위해 아래와 같은 툴을 사용 할 수 있다.

 

 

 

 

1.  Supervisely 

 

회원 가입 후, 프로젝트를 생성하여 사진을 불러와 주석을 달 수 있다. 

 

먼저 박스를 쳤을 때 포즈 모델이 어떻게 구성될건지 정의해주는 작업이 필요하다. 

 

 

웹 기반으로 되어있으며, 포즈모델 이외에도 다양한 라벨링 작업을 수행 할 수 있다. 

 

 

깃허브

https://github.com/supervisely/supervisely

 

supervisely/supervisely

AI for everyone! :tada: Neural networks, tools and a library we use in Supervisely - supervisely/supervisely

github.com

 

 

자세한 사용법은 아래 링크에 소개되어있다.

https://docs.supervise.ly/annotation/images/

 

Images - Supervisely

Images Images panel shows all images of current dataset. Overview Total number of images in dataset Filter of images Preview picture File name Number of annotations Last modification date (i.e. modification of annotation) Attach new tag to an image Downloa

docs.supervise.ly

 

 

 

 

 

 

 

 

 

 

 

2. Visipedia 

 

이건 이미 주석이 달려있는  COCO  데이터세트의 json 을 불러와서 Annotation 을 수정하는 툴이다. 

json에 있는 url 로부터 파일을 불러오고, Mongo DB를 연결하여 수정된 주석들을 반영하여 json을 생성한다. 

 

  • Load and visualize a COCO style dataset
  • Edit Class Labels
  • Edit Bounding Boxes
  • Edit Keypoints
  • Export a COCO style dataet
  • Bounding Box Tasks for Amazon Mechanical Turk

새로운 이미지를 COCO 데이터세트에 포함하고 싶다면,

대충 포즈 모델을 하나 돌려서 그 새로운 이미지에 대한 키포인트를 얻어서

Visipedia 를 이용하여 조금씩 수정하여 Annotation 하는 것도 방법이 되겠다. 

 

 

 

 

 

 

COCO 데이터 세트에서 Pose Model 생성을 위한 Annotation 목록은 다음과 같다. 

 

  • image_id
  • file_name
  • keypoints 
  • is_crowd
  • num_keypoint
  • bbox

 

여기서 중요한 것은 keypoints 가 (17 x 3) 으로 되어있는데, x, y, v 를 의미하며, 특히나 v 의 의미는 다음과 같다. 

v = 0 : not labeled (x = y = 0)

v = 1 : labeled but not visible 

v = 2 : labeled and visible 

 

 

 

 

 

 

사용법은 깃허브를 참조하도록 한다. 

 

깃허브 

https://github.com/visipedia/annotation_tools

 

visipedia/annotation_tools

Visipedia Annotation Tools. Contribute to visipedia/annotation_tools development by creating an account on GitHub.

github.com

 

 

간략히 설명하자면

몽고디비를 설치하고, 실행한 뒤에 위 깃허브 소스를 받아 디비와 연결하고

json 파일을 통해 이미지 및 키포인트 주석 정보들을 로드하고 실행하여 웹에서 수정하는 것이다. 

 

말이 길었네.

 

아래와 같다. 

 

 

Visipedia 사용법

 

1. 우분투에서 몽고 디비 설치

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

 

Install MongoDB Community Edition on Ubuntu — MongoDB Manual

 

docs.mongodb.com

 

1-1. 몽고 디비 파일 설치 

$ wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -

 

1-2. 우분투 16.04 인 경우 아래와 같이 몽고 디비를 위한 list file 생성 

$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list

 

1-3. 업데이트

$ sudo apt-get update

 

1-4, 몽고 디비 설치 

$ sudo apt-get install -y mongodb-enterprise

 

1-5. 필요한 패키지 설치

$ sudo apt-get install libcurl3 libgssapi-krb5-2 libkrb5-dbg libldap-2.4-2 libpcap0.8 libsasl2-2 snmp openssl

 

 

몽고 디비 설치 완료 ! 

그 다음 반드시 먼저 몽고 디비를 실행해주고, Annotation Tool 을 설치하여 실행한다. 

 

 

 

 

2. 몽고 디비 실행

$ sudo service mongod start

 

3. 소스 다운로드 

$ git clone https://github.com/visipedia/annotation_tools.git
$ cd annotation_tools

 

3-1. 필요 패키지 설치

$ pip install -r requirements.txt

 

4. 실행 

$ python run.py --port 8008

 

실행하면 아래와 같이 에러가 뜨는 경우 몽고 디비를 실행하지 않아서 생기는 에러이다. 

$ python run.py --port 8008
 * Serving Flask app "annotation_tools.annotation_tools" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8008/ (Press CTRL+C to quit)
127.0.0.1 - - [21/Aug/2019 14:42:42] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Aug/2019 14:45:03] "GET /edit_image HTTP/1.1" 404 -
127.0.0.1 - - [21/Aug/2019 14:45:03] "GET /favicon.ico HTTP/1.1" 404 -
[2019-08-21 14:45:19,505] ERROR in app: Exception on /edit_image/100238 [GET]
Traceback (most recent call last):
  File "/home/seohee/.local/lib/python3.5/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/seohee/.local/lib/python3.5/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/seohee/.local/lib/python3.5/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/seohee/.local/lib/python3.5/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/seohee/.local/lib/python3.5/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/seohee/.local/lib/python3.5/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/seohee/docker/annotation_tools/annotation_tools/annotation_tools.py", line 46, in edit_image
    image = mongo.db.image.find_one_or_404({'id' : image_id})
  File "/home/seohee/.local/lib/python3.5/site-packages/flask_pymongo/wrappers.py", line 114, in find_one_or_404
    found = self.find_one(*args, **kwargs)
  File "/home/seohee/.local/lib/python3.5/site-packages/pymongo/collection.py", line 1269, in find_one
    for result in cursor.limit(-1):
  File "/home/seohee/.local/lib/python3.5/site-packages/pymongo/cursor.py", line 1225, in next
    if len(self.__data) or self._refresh():
  File "/home/seohee/.local/lib/python3.5/site-packages/pymongo/cursor.py", line 1117, in _refresh
    self.__session = self.__collection.database.client._ensure_session()
  File "/home/seohee/.local/lib/python3.5/site-packages/pymongo/mongo_client.py", line 1598, in _ensure_session
    return self.__start_session(True, causal_consistency=False)
  File "/home/seohee/.local/lib/python3.5/site-packages/pymongo/mongo_client.py", line 1551, in __start_session
    server_session = self._get_server_session()
  File "/home/seohee/.local/lib/python3.5/site-packages/pymongo/mongo_client.py", line 1584, in _get_server_session
    return self._topology.get_server_session()
  File "/home/seohee/.local/lib/python3.5/site-packages/pymongo/topology.py", line 429, in get_server_session
    None)
  File "/home/seohee/.local/lib/python3.5/site-packages/pymongo/topology.py", line 200, in _select_servers_loop
    self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused

 

 

제대로 실행할 경우 다음과 같이 뜬다. 

$ python run.py --port 8008
 * Serving Flask app "annotation_tools.annotation_tools" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8008/ (Press CTRL+C to quit)
127.0.0.1 - - [21/Aug/2019 15:00:39] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/Aug/2019 15:00:59] "GET /edit_image/100238 HTTP/1.1" 200 -
127.0.0.1 - - [21/Aug/2019 15:00:59] "GET /static/css/leaflet/leaflet.css HTTP/1.1" 200 -
127.0.0.1 - - [21/Aug/2019 15:00:59] "GET /static/css/leaflet.draw/leaflet.draw.css HTTP/1.1" 200 -
127.0.0.1 - - [21/Aug/2019 15:01:34] "POST /annotations/save HTTP/1.1" 200 -
127.0.0.1 - - [21/Aug/2019 15:01:53] "GET /edit_task/?start=0&end=100 HTTP/1.1" 200 -
127.0.0.1 - - [21/Aug/2019 15:01:53] "GET /edit_image/1000 HTTP/1.1" 200 -
127.0.0.1 - - [21/Aug/2019 15:01:59] "POST /annotations/save HTTP/1.1" 200 -
127.0.0.1 - - [21/Aug/2019 15:01:59] "GET /edit_image/100238 HTTP/1.1" 200 -

...

 

 

5. (COCO 데이터 세트 주석 파일이 있다면 생략) COCO 데이터 세트 주석 다운로드

$ cd ~/Downloads
$ wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip
$ unzip annotations_trainval2017.zip

 

6. 디비와 데이터 세트 연결 

$ python -m annotation_tools.db_dataset_utils --action load \
--dataset ~/Downloads/annotations/person_keypoints_val2017.json \
--normalize

 

그럼 다음과 같이 연결된다. val2017 데이터 세트를 열었기 때문에 5000장만 열었다. 

Loading Dataset
Inserting 1 categories
	WARNING: Adding keypoint styles to category: person
Successfully inserted 1 categories
Inserting 5000 images
Successfully inserted 5000 images
Inserting 11004 annotations
Successfully inserted 11004 annotations
Inserting 8 licenses
Successfully inserted 8 licenses

 

 

7. 웹에서 확인

 

COCO 이미지 번호 100238 에 대한 사진 확인 

http://localhost:8008/edit_image/100238

 

0부터 100까지의 사진 확인 

http://localhost:8008/edit_task/?start=0&end=100

 

카테고리 ID  = 1 에 대한 사진 확인 (사람만 확인)

http://localhost:8008/edit_task/?category_id=1 to edit all images that have annotations whose category_id=1

 

 

 

위와 같이 주석을 수정할 수 있고, 존재하는 사진에 주석을 새로 추가 할 수도 있다. 

 

 

 

 

연결을 종료하고 싶다면, 디비와의 연결을 해제하고 몽고 디비 실행했던 것을 종료한다. 

 

8. 디비 연결 해제

$ python -m annotation_tools.db_dataset_utils --action drop

 

해제가 정상적으로 된 경우 다음과 같이 뜬다. 

Dropping the dataset collections.

 

9. 몽고 디비 종료

$ sudo service mongod stop

 

9-1. (필요시) 몽고 디비 재시작

$ sudo service mongod restart
728x90
반응형