1

機械学習とスタックオーバーフローの新人。画像からの照明方向推定の機械学習?

最近、オブジェクトの反射に基づいて光源の方向を推定する機械学習アルゴリズムを作成しようとしています。 これは複雑な問題かもしれないことは知っています。そのため、最初のステップとして、私は可能な限り単純化しようとしました。

私はまず、問題を回帰問題から分類問題に変更しました。光源はオブジェクトの左側にあります。光源はオブジェクトの右側にあります。 私はまた、私のデータセットに対して1つの角度だけを変えています。私の質問の

ショートバージョン:

  • が、機械学習で、このようなことを行うことが可能であることを、あなたと思いますか? (私の経験は実際にはあまりにも限定されています)
  • もしそうなら、あなたにとってより適したニューラルネットワークは何でしょうか? CNN? R-CNN? LSTM? SVM?
  • このタスクを完了するためのパイプラインは何ですか?

私は現在、[10,60]/[120,170]と金属反射のある球との間のランダムなXの角度を取る指向性ライトを使用してデータセットを作成し、ラベル付けしています。ここでの例である:

https://imgur.com/a/FxNewレーベル:0(左側)

https://imgur.com/a/9KFhiレーベル:

  • 画像:前処理1(右側)

は64x64画像にリサイズされます

  • RGBからグレースケール形式に変換されます。機械学習のために
  • 、私は現在でtensorflow畳み込みニューラルネットワークを使用しています:ラベル

    として入力および0/1として64×64のグレースケール画像のデータをラベル、

    バランス
    • 10000サイズのフィルタを用いて

    • 3畳み込み層[16,32,64] [5,5] RELU

    • 3プールサイズを有する層[2,2]とストライド[2,2]
    • マイネットワークは単純に学習されていない:1024個の隠しニューロンとドロップアウト(レート= 0.4)2個の出力ニューロンの問題については(各クラスの1)ソフトマックス

    とRELU

  • 1緻密層と
  • 1緻密層データが何であっても、レイヤー数、オプティマイザ、学習率など、どのような結果であっても、ランダムな結果が得られることが正確に示されています...私の出力は[0.5,0.5]の2つのクラス間で平均です。

    私の推測では、問題は私の予想よりも複雑で、私の予測は私の予測であるべきことのヒントではなく、オブジェクト上の反射ドットを検出するネットワークを訓練すべきですオブジェクトの中心とドットの間の向きを使用します。私は正しい?

    畳み込みレイヤーは位置を考慮していないため、畳み込み部分では、球体が常に同じであるため、すべての画像が同じパターンになります。常に同じことが検出され、明るい領域が移動したことは考慮されません。あなたはこの問題を解決するためにどのネットワークを使用することができるのかアドバイスしていますか?

    私は本当にこの種の仕事にどのように取り組むべきかに関する警告をしています。 私はまだ機械学習にはまだまだ慣れていて、私のマシンよりも多くのことを学んでいることを覚えておいてください。

    ありがとう。

  • 答えて

    0

    機械学習でこのようなことができると思いますか?

    絶対に。そして、あなたはCNNモデルを正しく選択しました。これはこのタスクに最適です。私の推測では、問題は私のデータは私の予測はどうあるべきかの良いヒントを与え、私はむしろドットでの反射を検出し、ネットワークを訓練する必要があることないことを、私が最初に考えたよりも複雑であるということです

    オブジェクトの中心とドットの間の向きを使用します。私は正しい?

    いいえ、CNNは生のピクセルからかなりよく分類されています。それは注意を払うべきものを理解するべきです。

    あなたはこの問題を解決するためにどのネットワークを使用できるかアドバイスしていますか?

    完全なコードを入力するとうれしいです。画像前処理のバグ、データの誤表示、ハイパーパラメータ(学習率、初期化など)の選択肢の誤り、間違った消失機能など、学習しない理由はたくさんあります。という簡単なバグがあります。

    私が説明したCNNのアーキテクチャに基づいて、すぐに提案する何を:あなたはその多くのフィルタを持っていないので、

    • 5x5フィルタサイズは、おそらく大きすぎます。 3x3を試して、フィルタの数を少し増やしてください(例: 32 - 64 - 64
    • CONV - CONV - CONV - POOL - POOL - POLLではなく、CONV - POLL - CONV - POLL - CONV - POOLを使用することを前提としています。念のため。
    • おそらく、あなたのFC層にはそれほど多くのニューロンは必要ありません。あなたは2つのクラスとかなり類似したイメージを持っています! 1024256としてください。
    • 現時点ではオーバーフィットはありませんので、今のところドロップアウトを無効にしてください:keep_probability=1.0
    • 初期化と学習率に注意してください。ログスケールで異なる値を試してください(例: learning_rate = 0.1, 0.01, 0.001と学習パターンが変わるかどうかを確認してください。
    +0

    大変ありがとうございました。あなたの助けを大変ありがとうございました。私の答えを見て、データが誤っているのは問題でした。私はそれについて非常に気が気ですが、hehe that hes how hehe。また、あなたのヒントをありがとう、それは私のネットワークを洗練させるのに役立ちました。幸運とあなたを参照してください –

    +0

    @MarcRavaine素晴らしい!このバグについては気にしないでください。すべてのエンジニアが、特にAPIが新しくよく知られていないときに起こります。 – Maxim

    1

    彼の答えはありがとう@Maxim。私のネットワークを改善するだけでなく、私の問題を解決するのに非常に役立ち、助けになりました。

    彼は私にこの問題を指摘しました。データが誤っていると指摘しました。

    私はデータのラベル付けについてはかなり確信していましたが、とにかく検証しました。問題があった

    ...

    私はそれは多分、他の気付かないtensorflowのユーザーを助けることができるので、ここで答えを書く: あなたはそれを指定せずに tf.string_input_producer を使用する場合、デフォルトは次のとおりです。 "シャッフル= True "はファイル名のキューをシャッフルします。

    私は画像のラベルと.pngフォルダに.csvファイルを使用しているので、ラベルは1から10000の順に読み込まれますが、.pngファイルはランダムに読み込まれます。

    私はそれについて非常に気が気になりますが、それはあなたがheheを学ぶ方法です。