1024、最初の車線検出ネットワークLaneNetを構築するために連れて行ってください


ここに写真の説明を挿入


リソースの概要:

紙のダウンロードアドレス: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倍の結果を得ることができます。

1024、みなさん、おめでとうございます!あなたがそれを好きなら私にいいねをください、あなたのサポートは私の創造の最大の動機です!

おすすめ

転載: blog.csdn.net/wjinjie/article/details/108575549