今更ながら、データの確認の話
データの shape さえ分かっていれば中身は見なくてもネットは組めるし、教師データとの突き合わせであとは勝手に学習されてなにがしかの結果は出てくるんですが、一応データを見るところもやっておく。
このシリーズで扱っているデータは、某コンペのゴルフ場検出という例題で、 landsat-8 の 7 channel 画像というもので、format は tiff なんだが、普通に viewer で見ようとするとみんな固まってくれる。
最悪 C で手で loader 書くかとフォーマット調べてて、なんだこれ?フォーマット壊れてね?ってしばらく悩んだが、od -h を hexdump の替わりに使ってはダメだったというオチでした。
去年はこの辺でやる気が8割方尽きた。
結局、散々探し回って scikit-image でなら以下のようにして読めるのでした。
#! /usr/bin/env python
import sys
from skimage import io
import matplotlib.pyplot as plt
im = io.imread(sys.argv[1])
print(im.shape, im.dtype)
print(im.max(), im.min())
io.imshow(im[:,:,0])
io.show()
7 channel あるので、rgb 仮定した普通の viewer じゃ表示させられないので、以下のようにして並べてみるとなんとなく構造が見えてくる。
#! /usr/bin/env python
import sys
from skimage import io
import matplotlib.pyplot as plt
import cv2
import numpy as np
im = io.imread(sys.argv[1])
mean = im.mean()
im20 = np.ones(im[:,:,0].shape, im[:,:,0].dtype)
im20 *= mean
print(im20.shape, im20.dtype)
im21 = cv2.hconcat([im[:,:,0], im[:,:,1], im[:,:,2], im[:,:,3]])
im22 = cv2.hconcat([im[:,:,4], im[:,:,5], im[:,:,6], im20])
im2 = cv2.vconcat([im21, im22])
io.imshow(im2)
io.show()
去年参考にした資料
- http://rs.aoyaman.com/seminar/about3.html
- https://blog.esrij.com/2013/07/12/landsat-8-dc99/
- http://redd.ffpri.affrc.go.jp/pub_db/course_materials/_img/2013_basic/2013_basic_chap06.pdf
発掘された去年の読解メモ
hexdump
による先頭部分
0000000 49 49 2a 00 08 00 00 00 0c 00 00 01 03 00 01 00
0000010 00 00 20 00 00 00 01 01 03 00 01 00 00 00 20 00
0000020 00 00 02 01 03 00 07 00 00 00 9e 00 00 00 03 01
0000030 03 00 01 00 00 00 01 00 00 00 06 01 03 00 01 00
0000040 00 00 01 00 00 00 11 01 04 00 08 00 00 00 cc 00
0000050 00 00 15 01 03 00 01 00 00 00 07 00 00 00 16 01
0000060 03 00 01 00 00 00 04 00 00 00 17 01 04 00 08 00
0000070 00 00 ac 00 00 00 1c 01 03 00 01 00 00 00 01 00
0000080 00 00 52 01 03 00 06 00 00 00 ec 00 00 00 53 01
0000090 03 00 07 00 00 00 f8 00 00 00 00 00 00 00 40 00
00000a0 40 00 40 00 40 00 40 00 40 00 40 00 00 1c 00 00
先頭が 4949
なのでリトルエンディアン。後続は 2a00
と 08000000
で
tiffのフォーマット通り。続く 0c00
はタグが12個あることを示している。
各タグは12byteあるので
00 01 03 00 01 00 00 00 20 00 00 00
01 01 03 00 01 00 00 00 20 00 00 00
02 01 03 00 07 00 00 00 9e 00 00 00
03 01 03 00 01 00 00 00 01 00 00 00
06 01 03 00 01 00 00 00 01 00 00 00
11 01 04 00 08 00 00 00 cc 00 00 00
15 01 03 00 01 00 00 00 07 00 00 00
16 01 03 00 01 00 00 00 04 00 00 00
17 01 04 00 08 00 00 00 ac 00 00 00
1c 01 03 00 01 00 00 00 01 00 00 00
52 01 03 00 06 00 00 00 ec 00 00 00
53 01 03 00 07 00 00 00 f8 00 00 00
のように並んでいる。タグ構造は2+2+4+4byteで、エンディアンを考慮すると先頭3行は
0100h, 0003h, 00000001h, 00000020h
0101h, 0003h, 00000001h, 00000020h
0102h, 0003h, 00000007h, 0000009eh
となる。これらが順にイメージの幅と高さ、色深度でshortで表現されており(0003h)幅と高さは(即値で)20h=32、色深度の方は7layerあって9ehに実体がある。
000009eh から読み進めれば
40 00 40 00 40 00 40 00 40 00 40 00 40 00
があり、エンディアン考慮して 0040h がbit数で、64bitすなわち8byte整数であるとわかる。