Kaggleに挑戦-11
積み残しが多すぎるけど、1つづつクリヤ―するぞ、と意気込んでみる。
今日(12月22日)の課題:KITTIの画像とラベルを読み込んで、画像に、2D bounding boxを表示する。
1.作業環境の確認
2.パッケージ・モジュール等のimport
3.train imageの読み込み
4.読みこんだ画像の表示
5.labelの読み込み
6.読み込んだlabelの表示
7.2D bounding boxの描画
8.2D bounding boxの画像への表示
9.まとめ
10.次のステップ
さて、どこまで進むことができるか。(今日は日曜日だもんな)
1.作業環境の確認
・Anaconda環境(パッケージ類は今年の10月くらいに全てアップデートしたつもり:windows10)
・Jupyter notebook(Python 3)
2. パッケージ・モジュール等のimport
機械学習で使いそうなものを列挙しようとしたが、従来の機械学習は、画像そのものを扱うことが少ないのと、自分が使いこなせていないのでやめた。
結局、画像処理で使っているtensorflowとkerasとmatplotlib等が中心となる。
import tensorflow
import keras
from keras.preprocessing.image import load_img, img_to_array
import numpy as np
from matplotlib import pyplot as plt
3.train imageの読み込み
デスクトップに置いた画像ファイルの中の1枚’000067.png’を読み込む。
train_image_path = path + '/Desktop/kitti_single/training/image_2/000067.png'
img = load_img(train_image_path)
ここで'path'は、Desktopまでのpathです。
画素数は、次のコマンドで読みとれる。
width, height = load_img(train_image_path).size
画総数は、(1242, 375)である。
4.読み込んだ画像の表示
plt.imshow(img)
5.labelの読み込み
上記画像に対応するlabelを読み込む
train_label_path = path + '/Desktop/kitti_single/training/label_2/000067.txt'
テキストファイル'000067.txt'をダブルクリックすると、メモ帳には、次のように表示される。
Car 0.00 0 -1.45 671.83 174.30 702.61 195.46 1.32 1.48 4.44 5.12 1.44 47.66 -1.34
Truck 0.04 2 2.20 0.00 73.11 444.03 270.73 4.02 2.60 16.79 -10.24 2.07 23.13 1.79
Car 0.00 0 -1.45 704.82 171.69 744.06 200.12 1.42 1.56 4.16 6.09 1.38 38.29 -1.29
Car 0.00 0 -1.13 427.15 179.96 600.34 281.01 1.45 1.59 3.44 -1.52 1.59 12.32 -1.26
Car 0.00 0 -0.79 76.38 181.99 384.72 306.19 1.51 1.61 4.31 -5.57 1.67 11.21 -1.24
Car 0.00 2 1.84 478.81 182.19 515.67 207.52 1.44 1.35 3.23 -6.77 2.02 43.40 1.69
Tram 0.00 2 1.23 591.57 158.36 651.13 188.67 3.46 2.57 14.66 1.16 1.90 89.80 1.24
DontCare -1 -1 -10 793.66 159.06 950.02 172.41 -1 -1 -1 -1000 -1000 -1000 -10
DontCare -1 -1 -10 1026.40 159.19 1239.95 177.41 -1 -1 -1 -1000 -1000 -1000 -10
3種類の読み込み方がある・
df = open(train_label_path).read():データ全体が読み込まれ、構造がわかりにくい。
'Car 0.00 0 -1.45 671.83 174.30 702.61 195.46 1.32 1.48 4.44 5.12 1.44 47.66 -1.34\nTruck 0.04 2 2.20 0.00 73.11 444.03 270.73 4.02 2.60 16.79 -10.24 2.07 23.13 1.79\nCar 0.00 0 -1.45 704.82 171.69 744.06 200.12 1.42 1.56 4.16 6.09 1.38 38.29 -1.29\nCar 0.00 0 -1.13 427.15 179.96 600.34 281.01 1.45 1.59 3.44 -1.52 1.59 12.32 -1.26\nCar 0.00 0 -0.79 76.38 181.99 384.72 306.19 1.51 1.61 4.31 -5.57 1.67 11.21 -1.24\nCar 0.00 2 1.84 478.81 182.19 515.67 207.52 1.44 1.35 3.23 -6.77 2.02 43.40 1.69\nTram 0.00 2 1.23 591.57 158.36 651.13 188.67 3.46 2.57 14.66 1.16 1.90 89.80 1.24\nDontCare -1 -1 -10 793.66 159.06 950.02 172.41 -1 -1 -1 -1000 -1000 -1000 -10\nDontCare -1 -1 -10 1026.40 159.19 1239.95 177.41 -1 -1 -1 -1000 -1000 -1000 -10\n'
df = open(train_label_path).readline():最初の1行だけが読み込まれる。
'Car 0.00 0 -1.45 671.83 174.30 702.61 195.46 1.32 1.48 4.44 5.12 1.44 47.66 -1.34\n'
df = open(train_label_path).readlines():すべての行が読み込まれ、1行づつ配列に入る
['Car 0.00 0 -1.45 671.83 174.30 702.61 195.46 1.32 1.48 4.44 5.12 1.44 47.66 -1.34\n',
'Truck 0.04 2 2.20 0.00 73.11 444.03 270.73 4.02 2.60 16.79 -10.24 2.07 23.13 1.79\n',
'Car 0.00 0 -1.45 704.82 171.69 744.06 200.12 1.42 1.56 4.16 6.09 1.38 38.29 -1.29\n',
'Car 0.00 0 -1.13 427.15 179.96 600.34 281.01 1.45 1.59 3.44 -1.52 1.59 12.32 -1.26\n',
'Car 0.00 0 -0.79 76.38 181.99 384.72 306.19 1.51 1.61 4.31 -5.57 1.67 11.21 -1.24\n',
'Car 0.00 2 1.84 478.81 182.19 515.67 207.52 1.44 1.35 3.23 -6.77 2.02 43.40 1.69\n',
'Tram 0.00 2 1.23 591.57 158.36 651.13 188.67 3.46 2.57 14.66 1.16 1.90 89.80 1.24\n',
'DontCare -1 -1 -10 793.66 159.06 950.02 172.41 -1 -1 -1 -1000 -1000 -1000 -10\n',
'DontCare -1 -1 -10 1026.40 159.19 1239.95 177.41 -1 -1 -1 -1000 -1000 -1000 -10\n']
df = open(train_label_path).readlines()
df[2:4]:これで、3行目と4行目が表示される。
['Car 0.00 0 -1.45 704.82 171.69 744.06 200.12 1.42 1.56 4.16 6.09 1.38 38.29 -1.29\n',
'Car 0.00 0 -1.13 427.15 179.96 600.34 281.01 1.45 1.59 3.44 -1.52 1.59 12.32 -1.26\n']
df = open(train_label_path).readline()
df = df.strip().split(' '):これで、スペースで区切られた各要素が、配列に入る
['Car',
'0.00',
'0',
'-1.45',
'671.83',
'174.30',
'702.61',
'195.46',
'1.32',
'1.48',
'4.44',
'5.12',
'1.44',
'47.66',
'-1.34']
df = open(train_label_path).readline()
df = df.strip().split(' ')
df[0],df[4],df[5],df[6],df[7]
('Car', '671.83', '174.30', '702.61', '195.46'):こんな感じで、2D bbxの位置情報が引き出せる。
ここまでをまとめると、
①df = open(train_label_path).read()は、ファイルを丸ごと読み込む。
②df = open(train_label_path).readline()は、1行だけ読み込む。
➂df = open(train_label_path).readlines()は、ファイル内の全行を読み込む。
④df = df.strip().split(' ')は、空白の区切りをとって、コンマで区切るもの。strip()は、両端の空白を除くもののようだが、ここで必要なものかどうか確認する。
⑤ファイル内の全行を読み込んで、いったん、配列かリストに入れてしまってから、必要なデータだけ取り出せるようになれば、1つのlabelデータを読み込んだことになる。
⑥これを、labelの全データについて行うことができれば、教師データをつくる準備ができたことになる。
⑦教師データのlabelにするためには、誤差計算のところとか、モデル全体を十分理解することが必要となる。よって、先は長い。
*積み残しは、12月24日に行う予定。
・積み残し課題:いろいろあるが、まずは、読み取った2D bounding boxの情報から、画像上に、2D bboxを描くこと。
つづく