はじめての Google Open Images Dataset V6

# やりたいこと

* https://storage.googleapis.com/openimages/web/download.html からダウンロードできるデータセットの見方を知りたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/f5875c57-e8d3-4f2e-8c6f-2cd822f0ded4.png)

# 各データの概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/bc44d65e-027a-d2a7-99bb-8403f1e2f6b3.png)



## （１）Images

### 学習用データとして用いる画像ファイル（.jpg）の実体をダウンロードできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/2c1f3ae7-228b-89d6-740a-f9e7a2aba7b9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/90bf2ea2-b6e7-4401-dff1-819a6797a5aa.png)


## （２）Boxes

### oidv6-train-annotations-bbox.csv がダウンロードできる。ImageIDをキーとして、そのイメージに移りこんだ対象物のラベル名および、その対象物の位置を示す矩形領域（相対位置）が書かれている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/75f039c0-e967-d246-1acc-8070d39cfa1a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/2536c803-565b-a800-79c2-a510a4a4c79f.png)


## （３）Segmentations

### train-masks-0.zip などをダウンロードできる。これは「Imagesでダウンロードしたjpg写真」に重ねることで「対象物以外をマスキングする」ことができる画像である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/64d34bd0-2a85-6815-ca90-73a627dd401e.png)

たとえば、ImageIDが0000c4f95a9d5a54の場合。

### 0000c4f95a9d5a54.jpg

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/27c8f9dd-b748-ce8b-6166-cbcf658a0390.png)

ここで、train-masks-0 フォルダに含まれる 0000c4f95a9d5a54_m01226z_6491f7bc.png は、サッカーボール以外の領域をマスクする画像である。

### 0000c4f95a9d5a54_m01226z_6491f7bc.png

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/f1ac6ae3-5d63-9421-2b20-d6e02220e1c1.png)


### 重ね合わせると下記。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/15e89246-0479-bfc4-ccbc-e2e74ebaf3fd.png)


## （４）Relationships

### oidv6-train-annotations-vrd.csv をダウンロードできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/45fad8f0-8450-75fe-f0ab-b53136fa92a5.png)

ImageIDをキーとして、

```
ImageID,LabelName1,LabelName2,XMin1,XMax1,YMin1,YMax1,XMin2,XMax2,YMin2,YMax2,RelationshipLabel
000506542b3a9dd7,/m/03bt1vf,/m/019nj4,0.159326,0.407383,0.182617,0.999023,0.159326,0.407383,0.182617,0.999023,is
000506542b3a9dd7,/m/03bt1vf,/m/019nj4,0.709845,0.999352,0.234375,0.999023,0.709845,0.999352,0.234375,0.999023,is
000506542b3a9dd7,/m/03bt1vf,/m/02wzbmj,0.000000,0.150907,0.108398,0.999023,0.000000,0.150907,0.108398,0.999023,is
000506542b3a9dd7,/m/03bt1vf,/m/02wzbmj,0.159326,0.407383,0.182617,0.999023,0.159326,0.407383,0.182617,0.999023,is
000506542b3a9dd7,/m/03bt1vf,/m/02wzbmj,0.709845,0.999352,0.234375,0.999023,0.709845,0.999352,0.234375,0.999023,is
00083be471c81e1b,/m/03bt1vf,/m/083mg,0.149565,0.646087,0.075625,0.979375,0.149565,0.646087,0.075625,0.979375,is
00083be471c81e1b,/m/03bt1vf,/m/083mg,0.424348,0.847826,0.087500,0.923750,0.424348,0.847826,0.087500,0.923750,is
000ac95750ac7399,/m/04yx4,/m/019nj4,0.049375,0.560625,0.084270,0.999064,0.049375,0.560625,0.084270,0.999064,is
000ac95750ac7399,/m/04yx4,/m/019nj4,0.485625,0.658750,0.496255,0.999064,0.485625,0.658750,0.496255,0.999064,is
000ac95750ac7399,/m/04yx4,/m/02wzbmj,0.049375,0.560625,0.084270,0.999064,0.049375,0.560625,0.084270,0.999064,is
000ac95750ac7399,/m/04yx4,/m/02wzbmj,0.485625,0.658750,0.496255,0.999064,0.485625,0.658750,0.496255,0.999064,is
000d1d89a1939a18,/m/01bl7v,/m/015c4z,0.337500,0.417500,0.482109,0.838983,0.337500,0.417500,0.482109,0.838983,is
000d1d89a1939a18,/m/01bl7v,/m/019nj4,0.484375,0.591250,0.044256,0.387947,0.484375,0.591250,0.044256,0.387947,is

```
のようなデータが確認できる。

## （５）Localized narratives

https://google.github.io/localized-narratives/

へリンクする。利用方法は未調査のため不明。

## （６）Image labels

### train-annotations-human-imagelabels-boxable.csv がダウンロードできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/1032ad7a-2d6f-bba5-c5ef-c2fb5e18ba03.png)

下記のようなデータが格納されている。

```
ImageID,Source,LabelName,Confidence
000002b66c9c498e,verification,/m/014j1m,0
000002b66c9c498e,verification,/m/014sv8,1
000002b66c9c498e,verification,/m/01599,0
```

たとえば、
000fe11025f2e246.jpg
の場合。

### ImageID: 000fe11025f2e246
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/14b8a683-dca8-1051-2ffd-abb39fc37e64.png)


### この写真に対する各ラベルの名称と信頼性
```
ImageID             Source                      LabelName    Name             Confidence
000fe11025f2e246    crowdsource-verification    /m/0199g     Bicycle          1
000fe11025f2e246    crowdsource-verification    /m/07jdr     Train            0
000fe11025f2e246    verification                /m/015qff    Traffic light    0
000fe11025f2e246    verification                /m/018p4k    Cart             0
000fe11025f2e246    verification                /m/01bjv     Bus              0
000fe11025f2e246    verification                /m/01g317    Person           1
000fe11025f2e246    verification                /m/01knjb    Billboard        0
000fe11025f2e246    verification                /m/01mqdt    Traffic sign     0
000fe11025f2e246    verification                /m/01prls    Land vehicle     1
000fe11025f2e246    verification                /m/04_sv     Motorcycle       1
000fe11025f2e246    verification                /m/07j7r     Tree             1
000fe11025f2e246    verification                /m/07yv9     Vehicle          1
000fe11025f2e246    verification                /m/083wq     Wheel            1
000fe11025f2e246    verification                /m/0cgh4     Building         0
000fe11025f2e246    verification                /m/0k4j      Car              1
000fe11025f2e246    verification                /m/0pcr      Alpaca           0
000fe11025f2e246    verification                /m/0pg52     Taxi             0
000fe11025f2e246    verification                /m/0zvk5     Helmet           0

```

Confidenceが1なのは

* Bicycle
* Person

など。


Confidenceが0なのは

* Alpaca
* Taxi

など。

すなわち
「この写真には、自転車や人が写っていることは信頼できるが、アルパカやタクシーが写っていることは信頼できない」となる。



## （７）Image IDs 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/c4561744-7b23-804e-6056-bf2d1bb92536.png)

### train-images-boxable-with-rotation.csv をダウンロードできる。

ImageIDをキーとして

```
ImageID,Subset,OriginalURL,OriginalLandingURL,License,AuthorProfileURL,Author,Title,OriginalSize,OriginalMD5,Thumbnail300KURL,Rotation
```

といったデータが保存されているが、用途の詳細は未調査のため不明。


## （８）Metadata

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/4f291876-6872-e5fb-282e-f2c47cca82a9.png)

### Class Names
class-descriptions-boxable.csv がダウンロードできる。

```
/m/011k07,Tortoise
/m/011q46kg,Container
/m/012074,Magpie

.....以下省略

```


### Relationship names
oidv6-relationships-description.csv がダウンロードできる。

```
at,at
holds,holds
wears,wears
surf,surf

.....以下省略

```

### Attribute names
oidv6-attributes-description.csv　がダウンロードできる。

```
/m/02gy9n,Transparent
/m/05z87,Plastic
/m/0dnr7,(made of)Textile
/m/04lbp,(made of)Leather
/m/083vt,Wooden
/m/02wzbmj,Stand
/m/083mg,Walk
/m/06h7j,Run
/m/0by3w,Jump
/m/015c4z,Sit
/m/051_dmw,Lay
/m/019nj4,Smile
/m/0463cq4,Cry
/m/015lz1,Sing
/m/01lhf,Talk

```


### Relationship triplets
oidv6-relationship-triplets.csv がダウンロードできる。

```
LabelName1,LabelName2,RelationshipLabel
/m/03bt1vf,/m/02wzbmj,is
/m/01y9k5,/m/083vt,is
/m/04yx4,/m/0jyfg,wears
/m/02p5f1q,/m/02vqfm,contain

.....以下省略


```


### Segmentation Classes
https://storage.googleapis.com/openimages/v5/classes-segmentation.txt へのリンク。


# 画像データをダウンロードする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/c1cb349e-b5b7-b7ee-cca0-d76bf864ae0b.png)

下記に記載のとおり、AWSのCLIにてダウンロードできる。
https://github.com/cvdfoundation/open-images-dataset#download-images-with-bounding-boxes-annotations
事前にawscliをインストールしておく。

## awscliのインストール手順
CentOSの場合： https://qiita.com/kenichiro-yamato/items/039ba9a9867e177e67f0
Windowsの場合： https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/35fad54f-2a3e-4006-1005-0c0b312d7d09.png)

まずは下記コマンドにて、train_0.tar.gz をダウンロードする。

```
aws s3 --no-sign-request cp s3://open-images-dataset/tar/train_0.tar.gz .
```


## 画像データの構成

ダウンロードしたアーカイブを解凍すると、フォルダ内にjpgファイルが保存されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/27f32a89-7b1b-2eec-66d7-701c5ae0f1cd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/87d278bf-6ccf-f017-41c3-db540678633d.png)


ここでは例として

```
0000e8b36676338b.jpg
```
に着目する。

### ImageID: 0000e8b36676338b

ImageIDは、画像を一意に識別できるIDである。
ファイル名がImageIDになっている。

### 縦横ピクセル width: 1024px height: 685px

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/0a1c2257-07c4-84cb-85b5-33688b2f0438.png)



## 何の写真なのか？を調べる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/76bfbc46-9f49-3717-a7f2-6d8f56d07a5b.png)

Metadata の ClassNames からダウンロードできるファイル

```
class-descriptions-boxable.csv
```

を参照すると、

```
/m/01prls,Land vehicle
```

という記載がある。つまり「Land vehicle」（陸上車両）の写真である。
ここで、

### /m/01prls

は、LabelName（ラベルネーム）と呼ばれる識別子である。

## ImageIDに紐づくLabelName（ラベルネーム）を求める方法

ImageIDとLabelNameの対応は、

```
oidv6-train-annotations-bbox.csv
```

に記載されている。
BoxesのTrainからダウンロードできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/4018073e-3727-a9f6-ec03-6d165d0c87b8.png)

このCSVをImageIDで検索すれば、LabelNameが求まる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/979bf608-4a73-bec4-f36a-d4820a756318.png)

つまり

```
ImageID:0000e8b36676338b は LabelName:/m/01prls なので Land vehicle
```

となる。

# oidv6-train-annotations-bbox.csv の詳細

さらに詳細を見ていくと、下記の記載がある。

```
ImageID: 0000e8b36676338b
Source: xclick
LabelName: /m/01prls
Confidence: 1
XMin: 0.07
XMax: 0.89375
YMin: 0.139122
YMax: 0.835668
IsOccluded: 0
IsTruncated: 0
IsGroupOf: 0
IsDepiction: 0
IsInside: 0
XClick1X: 0.431875
XClick2X: 0.07
XClick3X: 0.36875
XClick4X: 0.89375
XClick1Y: 0.139122
XClick2Y: 0.641457
XClick3Y: 0.835668
XClick4Y: 0.449113
```


各数値からピクセル位置を計算する。

```
W:1024
H:685
```

```
column    rate       w, h    px
--------------------------------
XMin      0.07       1024    72
XMax      0.89375    1024    915
YMin      0.139122    685    95
YMax      0.835668    685    572
XClick1X  0.431875   1024    442
XClick2X  0.07       1024    72
XClick3X  0.36875    1024    378
XClick4X  0.89375    1024    915
XClick1Y  0.139122    685    95
XClick2Y  0.641457    685    439
XClick3Y  0.835668    685    572
XClick4Y  0.449113    685    308

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/b33b4eda-d32a-70fe-3167-e4fab2dd446b.png)


算出したピクセル位置を画像にプロットすると下記のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/3b038748-1a31-a51a-5ecf-566b255fceb4.png)

これらの数値は「写真全体における、陸上車両が占める相対位置（領域）」を示す。
陸上車両を学習させるためのデータとして利用するには、背景の芝生や樹木と車両を区別する必要があるため。


# 画像領域識別プログラムの実装例

例として「ある画像データと共に、4点の座標をピクセル値で与えた場合に、その領域をマークする（あるいは切り抜く）」というプログラムの実装を考える。
その場合、関数に与えるべき4点の座標は下記の値になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/b6ca9446-7da3-c8f6-d57f-c67776b278cd.png)

つまり、下記の4つの値

top: 95px
left: 72px
bottom: 572px
right: 915px

を渡すことで、画像内の特定矩形領域を認識できる。
ブラウザ上で表現する場合の実装（HTML, CSS, JavaScript）は、たとえば下記のようになる。

変数boxに各値が入っているならば、

```javascript
                $('#' + id).css('top', box.top);
                $('#' + id).css('left', box.left);
                $('#' + id).css('width', box.width);
                $('#' + id).css('height', box.height);
```
ここで、

```javascript
$('#' + id)
```

は、

```css
position: absolute;
```

などで重ねる「領域特定用のdivタグ」などを示す。
width = right - left;
height = bottom - top;
で求める。

この実装にて、元画像のimgタグに対して、div領域を重ねることで、
「写真全体において、陸上車両の部分のみを囲む（陸上車両の部分にのみdivを重ねてborderをつける）」
などの処理を実現できる。



# 一枚の写真に複数の車両が存在する場合

つぎに、
ImageID:000c10e0af86b52d
に着目する。

width: 1024px
height: 768px

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/9e32b61c-3f07-a3ad-acd8-a72aab94382f.png)

この写真のように、複数の車両が写っている画像において、
各車両を識別する矩形データがどのように格納されているかを見る。

下記ファイルから該当データを抽出する。

oidv6-train-annotations-bbox.csv
class-descriptions-boxable.csv


ClassNamesは下記。

```
/m/01g317,Person
/m/04_sv,Motorcycle
/m/083wq,Wheel
/m/0h9mv,Tire
```










Person

```
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
000c10e0af86b52d    /m/01g317    Person
```

Motorcycle

```
000c10e0af86b52d    /m/04_sv    Motorcycle
000c10e0af86b52d    /m/04_sv    Motorcycle
```


Wheel

```
000c10e0af86b52d    /m/083wq    Wheel
000c10e0af86b52d    /m/083wq    Wheel
000c10e0af86b52d    /m/083wq    Wheel
000c10e0af86b52d    /m/083wq    Wheel
000c10e0af86b52d    /m/083wq    Wheel
```

Tire

```
000c10e0af86b52d    /m/0h9mv    Tire
000c10e0af86b52d    /m/0h9mv    Tire
000c10e0af86b52d    /m/0h9mv    Tire
000c10e0af86b52d    /m/0h9mv    Tire
000c10e0af86b52d    /m/0h9mv    Tire
```

今回は
Motorcycle
に着目し
2台の位置を特定できているか？
を確かめる。

### 1台目

```
column    rate    w, h    px
-------------------------------
XMin    0.2375    1024    243 
XMax    0.486875  1024    499 
YMin    0.445      768    342 
YMax    0.639167   768    491 

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/7531d86c-54d2-3991-c174-1661f111ab58.png)

以上のとおり、白いMotorcycleの領域を特定できている。

### 2台目

```
column    rate        w, h    px
-----------------------------------
XMin      0.456875    1024    468 
XMax      0.83875     1024    859 
YMin      0.445        768    342 
YMax      0.789167     768    606 
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/335af9c5-40ec-a3df-eaf9-35385b6e7989.png)




以上のとおり、灰色のMotorcycleの領域を特定できている。


# まとめ

グーグルは
Open Images Dataset V6
https://storage.googleapis.com/openimages/web/index.html
にてデータセットを公開している（2020年11月時点）。
今後も公開データは増えて内容も充実していくだろう。

しかし、それを使いこなすためのノウハウ、すなわち
「そのデータをダウンロードして、具体的に、どのように使うのか？　何に役立つのか？」
については、各人での試行錯誤が必要となる。

特に、LAMPでのWebサービス実装をメインとしている（私のような）サーバサイドエンジニアは、
「機械学習の世界で前提とされている知識」が乏しいため、
教師データを構成する各値が「何を表すのか？」が分からなかった。
今回、各値を手作業で調べながら関連性を確かめていくことで、その全容が少しずつ見えてきた。
今後はダウンロードしたデータをDBに突っ込んで（それはサーバサイドエンジニアがもっとも得意とする領域）、
CSVやTSVをRDBにすることでより扱いやすくしたり、Web画面を実装してAPIでデータを呼び出せるようにしたり、
などの作業を進めながら、本来の目的である「機械学習モデルの実装（python, Tensorflow, Keras）にも着手していく予定。