AI_ML_DL’s diary

人工知能、機械学習、ディープラーニングの日記

Kaggleに挑戦-11

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)

f:id:AI_ML_DL:20191222123156p:plain

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を描くこと。

 

つづく

 

f:id:AI_ML_DL:20191222085637p:plain

style 053

f:id:AI_ML_DL:20191222085744p:plain

DeepDream