MicrosoftのCommon Objects in Contextデータセット(通称MS COCO dataset)は、Microsoft が提供しているアノテーション付きの画像のデータセットで、MS COCO datasetに対して、MSCOCO APIを使ってアクセスします。
MS COCO datasetのダウンロード
「MS COCO dataset」は、次のようにしてデータをダウンロードします。
wget -q http://images.cocodataset.org/zips/train2017.zip wget -q http://images.cocodataset.org/zips/val2017.zip wget -q http://images.cocodataset.org/annotations/annotations_trainval2017.zip unzip train2017.zip val2017.zip annotations_trainval2017.zip
ダウンロードして解凍すると、以下のフォルダ構造になります。
F:\MSCOCO
├─annotations
│      captions_train2017.json
│      captions_val2017.json
│      instances_train2017.json
│      instances_val2017.json
│      person_keypoints_train2017.json
│      person_keypoints_val2017.json
│      
├─train2017
│      000000000009.jpg
│      000000000025.jpg
│      000000000030.jpg
│      000000000034.jpg
│      ・・・
│      000000581921.jpg
│      000000581929.jpg
│        
└─val2017
        000000000139.jpg
        000000000285.jpg
        000000000632.jpg
        000000000724.jpg
   ・・・
MSCOCO API のインストール
MSCOCO API のPythonライブラリを次のようにインストールします。
# pycocotools のビルドに Cython が必要 pip install cython pip install pycocotools
MSCOCO API を使ったMS COCO datasetアクセススクリプトの作成
MS COCO datasetアクセススクリプト「MsCocoAccess.py」を作成します。MS COCO datasetのカテゴリ を「banana」にしてデータセットを取得しました。
- 43-73行目で画像を指定して、その画像に関するアノテーション情報を取得して、画像に重ねて表示します。
- 77-108行目で画像を指定して、その画像に関するアノテーション情報を取得して、アノテーション情報からbboxとcategoryを取得して、画像に重ねて表示します。77-85行目では、フォルダに保存されている画像をインデックス化し、85行目で1回だけルールさせているだけで、インデックス化した情報は使用していません。
MsCocoAccess.py
import os
from pathlib import Path
from pycocotools.coco import COCO
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
json_path = "F:\\MSCOCO\\annotations\\instances_val2017.json"
img_path = "F:\\MSCOCO\\val2017"
# load coco data
coco = COCO(annotation_file=json_path)
print("\n************1**********\n");
# 指定したカテゴリに対応するカテゴリ ID を取得する。
print(coco.getCatIds(catNms=["banana"]))
# 指定した上位カテゴリに属するカテゴリ ID を取得する。
print(coco.getCatIds(supNms=["food"])) 
print("\n***********2***********\n");
# カテゴリ ID の一覧を取得する。
cat_ids = coco.getCatIds(catNms=["banana"])
# 指定したカテゴリ ID の物体がすべて存在する画像の ID 一覧を取得する。
img_ids = coco.getImgIds(catIds=cat_ids)
print(img_ids)
print("\n***********3***********\n");
# 指定した画像 ID の情報を取得する。
imgs = coco.loadImgs(577539)
from pprint import pprint
pprint(imgs)
print("\n***********4***********\n");
# 指定した 画像 ID に対応するアノテーション ID を取得する。
anno_ids = coco.getAnnIds(269314)
print(anno_ids)  
print("\n***********5**********\n");
# 指定した 画像 ID に対応するアノテーション ID を取得する。
anno_ids = coco.getAnnIds(577539)
print(anno_ids)
annos = coco.loadAnns(anno_ids[2])
from pprint import pprint
pprint(annos)
img_id = 577539
# 指定した画像 ID に対応する画像の情報を取得する。
img_info, = coco.loadImgs(img_id)
img_path = Path("F:\\MSCOCO\\val2017") / img_info["file_name"]
print(img_path) 
# 指定した 画像 ID に対応するアノテーション ID を取得する。
anno_ids = coco.getAnnIds(img_id)
# 指定したアノテーション ID に対応するアノテーションの情報を取得する。
annos = coco.loadAnns(anno_ids)
# 画像を読み込む。
img = plt.imread(img_path)
# 画像を描画する。
plt.imshow(img)
# アノテーション結果を描画する。
coco.showAnns(annos)
plt.show()
print("\n***********6***********\n");
# get all image index info
ids = list(sorted(coco.imgs.keys()))
print("number of images: {}".format(len(ids)))
# get all coco class labels
coco_classes = dict([(v["id"], v["name"]) for k, v in coco.cats.items()])
#  Traverse the first three images
for img_id in ids[:1]:
    #  Obtain the corresponding image id All of the annotations idx Information
    ann_ids = coco.getAnnIds(577539)
    #  according to annotations idx Information get all annotation information
    targets = coco.loadAnns(ann_ids)
    # get image file name
    path = coco.loadImgs(img_id)[0]['file_name']
    print("image file name: {}".format(path))
    # read image
    img = Image.open(os.path.join(img_path)).convert('RGB')
    draw = ImageDraw.Draw(img)
    # draw box to image
    for target in targets:
        x, y, w, h = target["bbox"]
        x1, y1, x2, y2 = x, y, int(x + w), int(y + h)
        draw.rectangle((x1, y1, x2, y2))
        draw.text((x1, y1), coco_classes[target["category_id"]])
    # show image
    plt.imshow(img)
    plt.show()
MSCOCO API を使ったMS COCO datasetアクセススクリプトの実行
作成したMS COCO datasetアクセススクリプト「MsCocoAccess.py」を実行すると、次のメッセージを出力します。
G:\Python38\python.exe F:/MSCOCO/MsCocoAccess.py
loading annotations into memory...
Done (t=0.67s)
creating index...
index created!
************1**********
[52]
[52, 53, 54, 55, 56, 57, 58, 59, 60, 61]
***********2***********
[269314, 577539, 575500, 480275, 407574, 40471, 331799, 2587, 161820, 348708, 457262, 453708, 3661, 356428, 346707, 312406, 271471, 163951, 459887, 78959, 560256, 28809, 8844, 128658, 378515, 219283, 581781, 189078, 66706, 548506, 119452, 236721, 389812, 527029, 272566, 66231, 114871, 246968, 509131, 13004, 59598, 491216, 535253, 479448, 279769, 313562, 429281, 474854, 465129, 69356, 112378, 63740, 425226, 90891, 371472, 191761, 147740, 79651, 349480, 17714, 550714, 290619, 521540, 571718, 58705, 499031, 489305, 139099, 192871, 352618, 227187, 480122, 12667, 6012, 190853, 193926, 465806, 322959, 37777, 466835, 530836, 298396, 441247, 482719, 293794, 113589, 468925, 326082, 158660, 185802, 294350, 173008, 437205, 415194, 74209, 575970, 50149, 165351, 188906, 125936, 376307, 439290, 139260]
***********3***********
[{'coco_url': 'http://images.cocodataset.org/val2017/000000577539.jpg',
  'date_captured': '2013-11-19 21:39:18',
  'file_name': '000000577539.jpg',
  'flickr_url': 'http://farm4.staticflickr.com/3494/3850219428_10c4b01c88_z.jpg',
  'height': 334,
  'id': 577539,
  'license': 4,
  'width': 500}]
***********4***********
[51951, 1042088]
***********5**********
[718033, 1696885, 1904146, 1904550, 2160325]
[{'area': 2222.2498000000005,
  'bbox': [249.85, 181.31, 78.94, 45.12],
  'category_id': 52,
  'id': 1904146,
  'image_id': 577539,
  'iscrowd': 0,
  'segmentation': [[271.54,
                    181.31,
                    267.2,
                    196.93,
                    255.92,
                    203.0,
                    249.85,
                    214.28,
                    255.92,
                    226.43,
                    328.79,
                    222.09,
                    317.52,
                    190.86,
                    307.97,
                    200.4,
                    276.74,
                    182.18]]}]
F:\MSCOCO\val2017\000000577539.jpg
***********6***********
number of images: 5000
image file name: 000000000139.jpg
Process finished with exit code 0
指定した 画像 ID「577539」 に対応するアノテーション情報すべてをshowAnns関数で可視化します。
指定した 画像 ID「577539」に対応するbboxとcategoryを視覚化します。
COCO dataset カテゴリ一覧
91種類あるCOCO dataset カテゴリを次に示します。
| id | supercategory | name | 
|---|---|---|
| 1 | person | person | 
| 2 | vehicle | bicycle | 
| 3 | vehicle | car | 
| 4 | vehicle | motorcycle | 
| 5 | vehicle | airplane | 
| 6 | vehicle | bus | 
| 7 | vehicle | train | 
| 8 | vehicle | truck | 
| 9 | vehicle | boat | 
| 10 | outdoor | traffic light | 
| 11 | outdoor | fire hydrant | 
| 12 | outdoor | street sign* | 
| 13 | outdoor | stop sign | 
| 14 | outdoor | parking meter | 
| 15 | outdoor | bench | 
| 16 | animal | bird | 
| 17 | animal | cat | 
| 18 | animal | dog | 
| 19 | animal | horse | 
| 20 | animal | sheep | 
| 21 | animal | cow | 
| 22 | animal | elephant | 
| 23 | animal | bear | 
| 24 | animal | zebra | 
| 25 | animal | giraffe | 
| 26 | animal | hat* | 
| 27 | accessory | backpack | 
| 28 | accessory | umbrella | 
| 29 | accessory | shoe* | 
| 30 | accessory | eye glasses* | 
| 31 | accessory | handbag | 
| 32 | accessory | tie | 
| 33 | accessory | suitcase | 
| 34 | sports | frisbee | 
| 35 | sports | skis | 
| 36 | sports | snowboard | 
| 37 | sports | sports ball | 
| 38 | sports | kite | 
| 39 | sports | baseball bat | 
| 40 | sports | baseball glove | 
| 41 | sports | skateboard | 
| 42 | sports | surfboard | 
| 43 | sports | tennis racket | 
| 44 | kitchen | bottle | 
| 45 | kitchen | plate* | 
| 46 | kitchen | wine glass | 
| 47 | kitchen | cup | 
| 48 | kitchen | fork | 
| 49 | kitchen | knife | 
| 50 | kitchen | spoon | 
| 51 | kitchen | bowl | 
| 52 | food | banana | 
| 53 | food | apple | 
| 54 | food | sandwich | 
| 55 | food | orange | 
| 56 | food | broccoli | 
| 57 | food | carrot | 
| 58 | food | hot dog | 
| 59 | food | pizza | 
| 60 | food | donut | 
| 61 | food | cake | 
| 62 | furniture | chair | 
| 63 | furniture | couch | 
| 64 | furniture | potted plant | 
| 65 | furniture | bed | 
| 66 | furniture | mirror* | 
| 67 | furniture | dining table | 
| 68 | furniture | window* | 
| 69 | furniture | desk* | 
| 70 | furniture | toilet | 
| 71 | furniture | door* | 
| 72 | electronic | tv | 
| 73 | electronic | laptop | 
| 74 | electronic | mouse | 
| 75 | electronic | remote | 
| 76 | electronic | keyboard | 
| 77 | electronic | cell phone | 
| 78 | appliance | microwave | 
| 79 | appliance | oven | 
| 80 | appliance | toaster | 
| 81 | appliance | sink | 
| 82 | appliance | refrigerator | 
| 83 | appliance | blender* | 
| 84 | indoor | book | 
| 85 | indoor | clock | 
| 86 | indoor | vase | 
| 87 | indoor | scissors | 
| 88 | indoor | teddy bear | 
| 89 | indoor | hair drier | 
| 90 | indoor | toothbrush | 
| 91 | indoor | hair brush* | 
 
											
				
