今週のKaggle-Wed:Severstal : Steel Defect Detection
(過去のコンペ):鋼板表面の欠陥検出:欠陥が存在する場所を検出し、その欠陥の種類を分類することを目的とするもの。
*今日は、鋼板表面のマスク作成に関するコードについて学ぶ。
・今からやろうと思っているのは、あるグランドマスターさんの、マスク作成・表示コードを自分のnotebookで動作させながら学ぶことである。
・自分のjupyter notebookでプログラムを動かしてみた。
・いくつかエラーが発生したが、train.csvのImageId_ClassIdがImageIdとClassIdに分離されたこと以外は、本質的な問題はなく、比較的容易に解決した。
・欠陥領域をマスキングした鋼板表面の画像が出力されることが確認できた。
・主要ツールは、numpy, pandas, cv2, matplotlib.pyplotなど一般的なものであった。
・GitHubに掲載されているrle2maskと似ている。
・各コードの動作と書式の対応関係がわかってくると、なんとなくわかったような気がしてくる。
*rle2maskの要点が、やっと、わかったような気がする。
・EncodedPixelsは、start座標とlengthだから、これを、start座標とend座標(start座標+length)に変換する。
・1枚の画像のすべての欠陥について、この、start座標とend座標の組をつくる。
・すべてのstart座標とend座標の間を、1次元配列中で、特定の値、たとえば整数1に置き換えてから、2次元配列にreshapeする。このとき、reshape.Tとすれば、目的のマスクが得られる。
・だいたい、こんな感じかな。
*肝は、1次元配列で必要な処理をしてから、2次元配列に戻すということだな。
・これは、物事を進めるための良い方法だな。
・複雑な系も、より単純な系に置き換えてやれば、考えやすくなるということだな。
・ふむふむ。
・コンペ期間中に、このマスクの作り方を検討しているときは、ややこしくて、ようやくそれらしきものができて喜んでいたが、単純化して考える、ということには思い至らなかった。
・複雑なものは、そのままでは、拡張とか一般化とかするのは難しいのだ。
・要素に分解して、単純化すればするほど、考えやすくなるということか。
・気になっていたarray[0: :2]やarray[1: :2]は、array[0:][ : :2]やarray[1:][ : :2]と同じらしいが、マニュアル等での確認は、できていない。
*[ : : : ]
これは、NumPy配列のスライシング機能でした。
[start:stop:step]で、startからstopまで、step毎に抜き出す、ということ。
[0: :2]は、1番目から終わりまで、2つごとに、抜き出すということ。
[1: :2]は、2番目から終わりまで、2つごとに、抜き出すということ。
だから、starts = [0: :2]、lengths = [1: :2]となるのか。
・いやあ、初心者だということがバレバレですね。
*そうそう、終了したコンペだから、上位入賞者のコメントがある。それを読めば、全体像がわかり、上位に近づく方法も学べる。
・そうでもないかな。
・トップ10%以内の人達は、もう、殆ど同じレベルにあるようだ。
・その中でも、トップ10人に入るような人たちは、さらなる違いをもたらすために、いろいろなレベルでアンサンブルの手法を用いている。
・ImageNetで学習した重みをもつ画像分類のモデルのどれを使うかではなく、複数のモデルで予測した値の平均をとったり、モデルごとに分類のしきい値を変えたりしているようだ。
・data augmentationでも、どの方法を使うのがよいか、どう組み合わせるのがよいかなど、だれにもわからない。やってみないとわからない。基本的には、互いに独立なデータの数は多ければ多いほど良いわけで、何をしたらダメということではなく、どれだけのことを試したかが、スコアのわずかな違いを生み出しているのではないだろうか。
・画像サイズも、自分でも先週経験したが、画素数が多ければ多いほど良いということはなかった。画素数が少ないと良くないのも経験している。適切なところがあるのだろう。大きな画素数が使えない場合は、もとの画像を、分割して使うのもよさそうだ。拡大縮小が効果ありなら、寸断するのもありかもしれない。そうなると、用意されているコードを駆使するだけでは足りず、自分で目的とする機能を持った関数を作らないといけないかもしれない。作らないといけないのではなく、作ればよいのだ。
・自分で必要な機能をもつ関数を作れるようになりたいものだ。fastaiのビデオ講義では、関数の元のコードを頻繁に参照して、関数の機能を説明していた。元のコードを参照して理解できるようになれば、新しい機能をもつ関数を自分で書けるようになるかもしれない。
・Deep Style Transferを使っていて思うのだが、自分が予想したような画像にならないことが多い。それは、ヒトが感じる色や形状と、DNNモデルが感じる色や形状とは違うのかもしれないし、そもそも、内部でどのような処理が行われているのかを理解できていないだけなのかもしれない。
・マスクも、示し方によって学習の効果が違ってくるかもしれない。領域を白抜きにするのか、黒く塗りつぶすのか、外周を線で囲むのか、さて、DNNは、どれを好むのでしょうか。思い通りにプログラムできれば、こんなことも、やってみて、確かめれば良いだけのことだ。早く、プログラミングを、習得しよう。マスクの作り方は、すぐにでもできそうな気がしてきたが、最初から最後まで動くプログラムを作ってしまわないと、その効果を確かめることができないな。
*雑談になってしまったかもしれない。
*明日のことは、明日考えよう。
つづく