記事ディレクトリ
リソースの概要:
紙のダウンロードアドレス:https
://arxiv.org/abs/1802.05591 githubプロジェクトアドレス:https://github.com/MaybeShewill-CV/lanenet-lane-detection
LanNetデータ収集:https://pan.baidu.com/ s / 17dy1oaYKj5XruxAL38ggRw抽出コード:1024
LanNet紙の翻訳:レーンライン検出ネットワークのLaneNet
1.LaneNetアルゴリズムの詳細な説明
1.1LaneNetの概要
従来の車線検出方法は、色の特徴、構造テンサー、輪郭などの識別のために手動で抽出された特徴に依存しています。これらの特徴は、ハフ変換、さまざまな演算子、またはカルマンフィルターと組み合わせることもできます。レーンラインを特定した後、後処理技術を使用して誤検出をフィルタリングし、それらをグループ化して最終レーンを形成します。ただし、ロードシーンの変化により、これらの従来の方法では堅牢性の問題が発生しやすくなります。
更新されたメソッドは、ピクセルレベルのレーンセグメンテーション用にトレーニングされたディープラーニングモデルを利用します。ただし、これらの方法は、現在のレーンなど、事前定義された固定数のレーンの検出に限定されており、レーンの変更に対応できません。
これに基づいて、Davy Nevenらは2018年に新しい車線検出ネットワークLaneNetを提案しました。LaneNetは主に次の2つの貢献をしました:
- レーン検出の問題は、各レーンが独自のインスタンスを形成し、エンドツーエンドでトレーニングできるインスタンスセグメンテーションの問題になります。
- 与えられた入力画像の遠近法変換パラメータを学習するために、新しいネットワークH-Netが構築されます。遠近法変換は、傾斜した道路の車線にうまく適合し、堅牢性が低いという問題を克服できます。
1.2全体的な構造分析
著者は、エンドツーエンドの任意の数のレーンライン検出を実現するために、バイナリセグメンテーションネットワーク(レーンセグメンテーション)とインスタンスセグメンテーションネットワーク(レーン埋め込み)を含むマルチブランチネットワーク構造を提案します。具体的には、バイナリセグメンテーションネットワークはすべてのレーンラインピクセルを出力し、インスタンスセグメンテーションネットワークは出力レーンラインピクセルを異なるレーンラインインスタンスに配布します。全体的なネットワーク構造図は次のとおりです:
一方、データセットはH-Netネットワークに入力され、パースペクティブ変換パラメーターHマトリックスが学習されます。異なるレーンラインインスタンスのピクセルに対して、レーンラインフィッティングを実行して、上の図に示す連続したポイントのようなレーンラインを取得します。
1.3LaneNetネットワーク構造
LaneNetの全体的なネットワーク構造は次のとおりです。
バイナリセグメンテーションネットワーク
Lanenetの1つのブランチは、レーンラインピクセルを背景から分離するバイナリセグメンテーションネットワークです。対象カテゴリーは2種類(レーン/バックグラウンド)でアンバランスが大きいため、ENetを参照し、損失関数は標準のクロスエントロピー損失関数を使用します。
インスタンスセグメンテーションネットワーク
ブランチネットワークは、「識別損失関数を使用したセマンティックインスタンスセグメンテーション」を参照し、距離測定学習にワンショットベースの方法を使用し、この方法を、リアルタイム処理に使用できる標準のフィードフォワードニューラルネットワークに統合します。ブランチネットワークは、トレーニング後にレーンラインのピクセル距離を出力します。同じレーンに属するピクセルは近く、異なるレーンラインのピクセルは遠いという基本的な考え方に基づいて、クラスタリング損失関数を使用して各レーンラインをクラスター化します。
クラスター喪失機能
損失関数は次のとおりです。
[x] + = max(0、x)[x] _ + = max(0、x)[ x ]+=m a x (0 、x )
L total = L var + L dist L_ {total} = L_ {var} + L_ {dist} LT O 、T L=Lv a r+LD I S T
その中で、各パラメータは次のように表されます。
- C-レーンラインインスタンスの数を示します。
- N c N_c NC-各レーンラインインスタンスのピクセル数。
- uc u_c uC-各レーンラインインスタンスのピクセル中心。
- L var L_ {var} Lv a rそれは分散損失であり、彼の目的はクラス内の距離を縮めることです。
- L dist L_ {dist} LD I S T距離の損失です。その目的は、クラス間の距離(異なるレーンライン間の距離)を増やすことです。
ネットワーク構造図
LaneNetのアーキテクチャは、5つのステージで構成されるエンコーダ-デコーダネットワークENetに基づいています。最初の3つのステージは、2回ダウンサンプリングするエンコーダネットワークです。後の2つのステージは、2回アップサンプリングするデコーダネットワークです。
LaneNetは、このネットワークに基づいてデュアルブランチネットワークに変更されます。ENetのエンコーダーにはデコーダーよりも多くのパラメーターが含まれているため、2つのタスク間でエンコーダー全体を完全に共有すると、満足のいく結果が得られません。したがって、LaneNetは2つのブランチ間で最初の2つのステージ(1と2)のみを共有し、ENetエンコーダーのステージ3と完全なENetデコーダーを個々のブランチのバックボーンとして残します。セグメンテーションブランチの最後のレイヤーは、バイナリセグメンテーション用のシングルチャネルイメージを出力します。インスタンスセグメンテーションブランチの最後のレイヤーは、Nチャネルイメージを出力します。ここで、Nはインスタンスのディメンションです。各ブランチの損失項目は均等に重み付けされ、ネットワークを介して伝播されます。
1.4H-Netネットワーク構造
LaneNetネットワークの出力は、各レーンラインのピクセルセットです。従来の処理では、画像を鳥瞰図に変換し、2番目または3番目の多項式を使用してカーブしたレーンラインに合わせます。ただし、現在使用されている透視変換行列のパラメータは、通常は事前設定されており、変更されません。水平線の変動(上り坂や下り坂など)の影響を受けた車線のフィッティングは正確ではなく、堅牢性も良くありません。強い。したがって、著者は、パースペクティブ変換マトリックスのパラメーターHを学習するためのH-netモデルを提案します。
Hには6つの自由度があり、制約を適用するためにゼロが配置されます。つまり、水平線は変換中も水平のままです。
H-NETのネットワークアーキテクチャは小さく、3x3コンボリューション、BNレイヤー、およびReluの連続ブロックで構成されています。最大プーリングレイヤーを使用して次元を減らし、最後に2つの完全に接続されたレイヤーを追加します。完全なネットワーク構造を次の図に示します。
最後の完全に接続されたレイヤーのノード数は6であり、これはHマトリックスの6つのパラメーターに対応します。
1.5LaneNetパフォーマンスの利点
検出速度。Nvidia 1080Tiグラフィックカードでテストしたところ、512x512のカラー画像を検出するのに19ミリ秒かかったため、1秒あたり約50フレームを処理できます。
検出精度。LaneNetを3次多項式フィッティングおよびH-Netの変換マトリックスと組み合わせて使用することにより、検出精度はtuSimpleチャレンジで96.4%に達し、4位を獲得しました。これは1位とわずか0.5%の違いです。結果は下の表で見ることができます。
次に、LaneNetを実現するために手を取り合ってください
2.1プロジェクトの紹介
プロジェクトはgithubでオープンソース化されており、1.3kのスターを獲得しています。試してみたい学生はクローンを作成できます:https://github.com/MaybeShewill-CV/lanenet-lane-detection、開くことができない場合は、それを開くこともできますBaiduクラウドディスクからダウンロード:LaneNetデータ収集、抽出コード:1024
各部分のコード構造と機能は次のとおりです。
lanenet-lane-detection
├── config //配置文件
├── data //一些样例图片和曲线拟合参数文件
├── data_provider // 用于加载数据以及制作 tfrecords
├── lanenet_model
│ ├── lanenet.py //网络布局 inference/compute_loss/compute_acc
│ ├── lanenet_front_end.py // backbone 布局
│ ├── lanenet_back_end.py // 网络任务和Loss计算 inference/compute_loss
│ ├── lanenet_discriminative_loss.py //discriminative_loss实现
│ ├── lanenet_postprocess.py // 后处理操作,包括聚类和曲线拟合
├── model //保存模型的目录semantic_segmentation_zoo
├── semantic_segmentation_zoo // backbone 网络定义
│ ├── __init__.py
│ ├── vgg16_based_fcn.py //VGG backbone
│ └─+ mobilenet_v2_based_fcn.py //mobilenet_v2 backbone
│ └── cnn_basenet.py // 基础 block
├── tools //训练、测试主函数
│ ├── train_lanenet.py //训练
│ ├── test_lanenet.py //测试
│ └──+ evaluate_dataset.py // 数据集评测 accuracy
│ └── evaluate_lanenet_on_tusimple.py // 数据集检测结果保存
│ └── evaluate_model_utils.py // 评测相关函数 calculate_model_precision/calculate_model_fp/calculate_model_fn
│ └── generate_tusimple_dataset.py // 原始数据转换格式
├─+ showname.py //模型变量名查看
├─+ change_name.py //模型变量名修改
├─+ freeze_graph.py//生成pb文件
├─+ convert_weights.py//对权重进行转换,为了模型的预训练
└─+ convert_pb.py //生成pb文
2.2環境のセットアップ
オープンソースの作成者の説明によると、テスト環境は次のとおりです。
- ubuntu 16.04
- python3.5
- cuda-9.0
- cudnn-7.0
- GTX-1070 GPU
- tensorflow 1.12.0
私が使用する環境と構成は次のとおりです。
- ubuntu16.04システム
- PyCharm 2020
- python3.6
- tensorflow1.13.1-gpu
- 奇跡-10.0
- cudnn 7.6.4
- opencv4.0.0
- RTX 2070 GPU
試してみたい友達は、上記の2つの構成を参照するか、他のバージョンを自分で試すことができます。
2.3準備
自分でトレーニングしたい場合は、トレーニング用にTuSimpleデータセットをダウンロードできます。同様に、公式にトレーニングされたモデルを直接使用して、写真を入力し、テスト結果を確認することもできます。便宜上、ローカルテスト用にトレーニング済みモデルを直接ロードしましょう。
(1)TuSimpleデータセットをダウンロードします。トレーニングしない場合は、この手順をスキップできます。
(2)トレーニング済みモデルのダウンロード、ダウンロードリンク:LaneNetデータ収集、抽出コード:1024
ダウンロード後、次の図に示すように、モデルファイルtusimple_lanenetをプロジェクトディレクトリのモデルファイルに配置します。
2.4モデルテスト
環境の構成とモデルの展開が完了したら、テストできます。
(1)最初にTusSampleデータセットの画像をテストします
- 最初のステップは、元のプロジェクトディレクトリのデータファイルにMytestフォルダーを作成し、次の図に示すように、1.jpgなどのTusSampleデータセット内の画像を任意に選択することです。
- 2番目のステップは、PyCharmを使用してダウンロードしたプロジェクトを開くことです。環境を構成した後、次の図に示すように、ターミナルを開きます。
- 3番目のステップは、ターミナルに次のコマンドを入力してプログラムを実行することです。
python tools/test_lanenet.py --weights_path model/tusimple_lanenet/tusimple_lanenet.ckpt --image_path data/Mytest/1.jpg
最終的なレーンライン検出効果は次のとおりです。
(2)自分の写真をテストする
- 最初のステップは、次の図に示すように、撮影したレーンライン画像2.jpgを選択し、新しく作成したMytestフォルダーに配置することです。
2番目のステップは、ターミナルを開き、コマンドを入力して、プログラムを実行することです。
python tools/test_lanenet.py --weights_path model/tusimple_lanenet/tusimple_lanenet.ckpt --image_path data/Mytest/2.jpg
自分で撮った写真の検出結果は以下のとおりです。
テスト分析:
図から、自分の写真を検出すると、最終的な検出結果は実際の車線と完全に一致するものの、空中に伸びていることがわかります。
この状況の主な理由は、よりターゲットを絞ったモデルを取得するために、トレーニング用に独自のデータセットを作成しなかったことです。ここで使用したテストモデルはTuSimpleデータセットでトレーニングされているため、以前の1.jpgのように、TuSimpleで画像を非常によくテストします。
自分の写真をテストしてより良い結果を得たい場合は、自分のデータセットが必要です。より良い方法は次のとおりです。
- まず、TuSimpleデータセットでトレーニングし、取得したトレーニングモデルを事前トレーニングモデルとして使用します。この部分の作業はすでに完了しています。事前トレーニングモデルは直接ダウンロードできます。
- 次に、事前にトレーニングされたモデルに基づいて、自分で作成したデータセットをロードし、目的の効果が得られるまでトレーニングします。
この種の転移学習のアイデアを使用すると、多くの場合、半分の労力で2倍の結果を得ることができます。