ブログ名

第2回トッピング識別AIブログ アノテーション作業

概要

機械学習を行うにはまずデータセット(教師データ)を準備しなければなりません。機械学習を実際に活用するには、トッピング識別AI同様に多くのケースで公開しているデータセットだけでは解決できないため、自分でデータセットを用意する必要がある。機械学習に使うデータは画像のままでは学習には使えない、学習を行うためにはそれらの画像に意味付け(アノテーション)をする必要があります。

今回は、機械学習で必須となるデータセットアノテーション方法の詳細についてです。

アノテーション作業

トッピングの種類

今回のアノテーションの種類は以下になります。

  • かまぼこ
  • 天ぷら
  • 天かす
  • エビ天
  • 生卵の黄身
  • 温玉
  • ゆで卵
  • かき揚
  • ねぎ
  • 牛肉
  • のり
  • わかめ
  • おろし大根
  • 油揚げ
  • すだち
  • レモン
  • かつおぶし

計17種類になります。

VIAツールの使い方

トッピング識別AIのアノテーションはVIA使用します。

f:id:iTD_GRP:20191125231611p:plain

まず最初に画像ファイルをVIAに追加します。 Add Filesをクリックし使う画像を選択すると画像名のリストと以下のように右側に画像が表示されます。

f:id:iTD_GRP:20191125231544p:plain

次にクラスの種類を選択できるようにします。 attribute nameのところにクラスの名前を入力して+をクリックして追加します。 attribute のタイプは5種類あります。

  • text
    Stringで種類を指定するタイプ。 指定する方法がStringのため毎回種類の名前を変えることができる。
  • checkbox
    種類を設定し、指定する際に選択するタイプ。複数選択が可能。
  • radio
    checkbox同様だが一つしか選択できない。
  • image
    画像付きのradio。
  • dropdown
    種類を設定し、指定する際に複数の選択項目から一つ選択。

今回のアノテーションはdropdownが最適です。 radioでもできますが種類が多々存在する場合指定の時、 選択領域が広がり過ぎてしまいます。

アノテーションの仕方

f:id:iTD_GRP:20191125231723p:plain

アノテーションは簡単です!

画像内で長押しして領域を囲い、dropdownから選択するだけです。 後は地道な作業を繰り返すだけです。

難しい画像の例題

画像をアノテーションしてるとたまに囲うのが困難な画像が出てきます。 例えば以下のような画像。 f:id:iTD_GRP:20191125231758p:plain

この上の画像のようにネギが散らばってる場合細かく一つ一つ囲う必要はありません。一つ一つ囲っていたら時間がいくらあっても足りません、このような場合はまとめて全部囲ってしまいましょう。

f:id:iTD_GRP:20191125231830p:plain

セーブロード、エクスポート、インポート

セーブロード

セーブとロードはProject->Save,Loadで行えます。 ファイル形式は.jsonでデータは大きく3つに分かれていて以下のようになる。

  • _via_settings プロジェックトの設定
  • _via_img_metadata 各画像の要素と領域
  • _via_attributes 種類の設定

セーブはエクスポートと違いプロジェクトの設定などがちゃんと保存されます。 作業を中断する際はセーブしたほうがいいですね。

エクスポート

エクスポートは3種類選択肢がありjson, csv, cocoがあります。

  • json
    データ構造は各画像ファイルごとに分かれており領域と種類はその各画像のdictionaryに記されている。
{
  "000001.jpg95377": {
    "filename": "000001.jpg",
    "size": 95377,
    "regions": [
      {
        "shape_attributes": {
          "name": "rect",
          "x": 410,
          "y": 353,
          "width": 202,
          "height": 162
        },
        "region_attributes": {
          "category": "namatamagonokimi"
        }
      }
}
  • csv
    csvのデータ構造は安易式ではなくセーブしたjsonから変換した感じになっている。データを手入力で変えたい場合効果的だと思います。 f:id:iTD_GRP:20191125231853p:plain

  • coco
    データ構造が大きく5つinfo, images, annotations, licenses, categoriesに分類されている。構造が独特で、まずimagesに各画像詳細とidを割り振る、後categoriesの領域の種類にもidを振ります。そしてannotationsで画像と種類の番号を指定して領域を示しています。

{
  "info": {
    "year": 2019,
    "version": "1",
    "description": "Exported using VGG Image Annotator (http://www.robots.ox.ac.uk/~vgg/software/via/)",
    "contributor": "",
    "url": "http://www.robots.ox.ac.uk/~vgg/software/via/",
    "date_created": "Sat Oct 12 2019 19:50:34 GMT+0900 (日本標準時)"
  },
  "images": [
    {
      "id": 0,
      "width": 1080,
      "height": 810,
      "file_name": "000001.jpg",
      "license": 1,
      "date_captured": ""
    }
  ],
  "annotations": [
    {
      "id": 0,
      "image_id": "0",
      "category_id": 2,
      "segmentation": [405,351,611,351,611,519,405,519],
      "area": 34608,
      "bbox": [405,351,206,168],
      "iscrowd": 0
    },
    {
      "id": 1,
      "image_id": "0",
      "category_id": 1,
      "segmentation": [191,156,929,156,929,666,191,666],
      "area": 376380,
      "bbox": [191,156,738,510],
      "iscrowd": 0
    }
  ],
  "licenses": [
    {
      "id": 1,
      "name": "Unknown",
      "url": ""
    }
  ],
  "categories": [
    {
      "id": 1,
      "name": "negi",
      "supercategory": "category"
    },
    {
      "id": 2,
      "name": "namatamago ",
      "supercategory": "category"
    }
  ]
}

インポート

インポートはAnnotationsの項目から簡単にインポートができます。 しかし、インポートした際にattribute typeがtextになり、 cocoにエクスポートする場合はcategoriesが消えてしまうため注意が必要です。

最後に

アノテーションは長くて辛い作業です。しかし、機械学習を行うためには教師データは欠かせません。 それでもデータセットを無料で公開してる機関があることに尊敬しますね。






COCO フォーマットについて補足

COCO dataset とは

reveltb のあるぺージ(ikath cocoapi)によると

COCO datasetとは物体検出やセマンティックセグメンテーション、キャプション(画像の説明文)がされているデータセットで、 他のデータセットと比べて豊富なアノテーションが提供されているのが特徴です。

COCO datasetは公開されている有名なデータセットで主に機械学習によく使われています。 有名なデータセットだからこそ様々なプロジェクトやリポジトリでも使用されており、 これらをデータ構造を知っておくべきだと思います。

COCO のフォーマット

COCOは.json形式になっており、データ構造が大きく5つinfo, images, annotations, licenses, categoriesに分類されています。

info

文字通りこのデータセットについての情報を記載しているセクションです。

"info": {
    "year": 2019,
    "version": "1",
    "description": "Exported using VGG Image Annotator (http://www.robots.ox.ac.uk/~vgg/software/via/)",
    "contributor": "",
    "url": "http://www.robots.ox.ac.uk/~vgg/software/via/",
    "date_created": "Sun Oct 06 2019 00:55:33 GMT+0900 (日本標準時)"
  },

自作した場合は他の情報を記載することも可能です。

licenses

licensesは画像の著作について記載してるセクションです。

"licenses": [
    {
        "url": "http://creativecommons.org/licenses/by-nc-sa/2.0/",
        "id": 1,
        "name": "Attribution-NonCommercial-ShareAlike License"
    },
    {
        "url": "http://creativecommons.org/licenses/by-nc/2.0/",
        "id": 2,
        "name": "Attribution-NonCommercial License"
    },
    ...
]

images

imagesは各画像のリストが記載されているセクションです。 このセクションでは各画像の情報が記載されていて、各画像には特有のidが振られている。 後ほど、annotationsで使用します。

  "images": [
    {
      "id": 0,
      "width": 1080,
      "height": 810,
      "file_name": "000001.jpg",
      "license": 1,
      "date_captured": ""
    }
  ]

annotations

COCO datasetには5種類のアノテーションが存在するが、 このブログでは今回使用するObject Detectionに付いて説明します。

"annotations": [
    {
      "id": 0,
      "image_id": "0",
      "category_id": 1,
      "segmentation": [329,320,549,320,549,640,329,640],
      "area": 70400,
      "bbox": [329,320,220,320],
      "iscrowd": 0
    }
]

annotationsにも各領域にidが振られます。 その次のimage_idが先ほどの各画像のidを示しています。 category_idは設定した各種類のidのことで次に説明します。

機械学習が主に使用するのはこの二つsegmentationとbbox、意味付けの重要なところです。

  • segmentationはpolygonのリストで、複数の点の座標で表しています。[x1,y1,x2,y2,...]
  • bboxはbounding box の略で言葉通りのこのアノテーションを囲ってる枠のこと。 フォーマットは右から[x座標、y座標、横、縦]で表しています。

iscrowdはそのアノテーションが集合体かどうか表すものです。

f:id:iTD_GRP:20191126223452j:plain

segmentationとbboxの例 黄色い線はsegmentationを表し、赤い線はbboxを表している。

categories

最後はcategoriesです。 領域の種類を表すためにあります。

  "categories": [
    {
      "id": 1,
      "name": "negi",
      "supercategory": "category"
    },
]

これも先ほどと同じようにidが振られていてannotationsで使います。 nameはそのidの名前です。 supercategoryは属性の名前です。

目次へ戻る