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* |