セマンティック分割車線検出(版tensorflow)Lanenet

亜麻 

  ネットワークの端、からなる二Lanenet + hNETをネットワークモデル、車線区分のLanenet完全なインスタンスは、hNETを予測するための小規模なネットワーク構造は、すべてのレーンラインに属する変換行列Hを用いて、行列Hを変換でありますピクセル改造

 

 

 

 

画素のセマンティクス分割マルチタスクモデル車線分割線のクラスタリング最近完了したインスタンスを使用して、ベクトル表現を組み合わせます。

 

 

       解体の例としては、(バイナリ画素について区画線または背景に属する画素を決定する)入力画像枝セマンティックセグメンテーションを分割する責任セマンティックセグメンテーション及びクラスタリングのタスクに分割され、画素の分岐は、埋め込まれた埋め込みは分割することができ、前記しましたレーンラインが得られ訓練ベクトルをクラスタリングするために、異なるレーン例への分離後に得られました。最後に、MeanShiftクラスタリングアルゴリズム二つのブランチを用いた結果は、結果の例は、セグメント化を得ます。

      レーン例を与えるときに、パラメータの説明は、ライン毎に行う必要があり、このパラメータ曲線フィッティングアルゴリズム記載されているように、従来のフィッティングアルゴリズムは、三次多項式、スプライン、クロソイド曲線を有します。フィッティングを作るために、通常は鳥瞰図画像の後に、フィットの品質を向上させ、その後、逆元の画像に変換するために。

       1.セマンティックセグメンテーション

        二値化結果のセグメンテーションマップを出力訓練、白色区画線、背景の黒の代表を表します。

       メインモデル、主な考慮事項以下の点を設計する場合:

       1)ラベルlabel構築する場合、オクルージョン処理のため、ラインに接続されて各レーンに対応する画素行に属することができます。利点は、車線ラインがブロックされていることであったとしても、ネットワークがまだ車線位置を予測しました。

       2)試料の不均一な分布の問題を解決するために、クロスエントロピーを用いた損失は、(画素が区画線に属する重み付け損失の有界逆クラスの重みを使用して、はるかに少ない背景に属するピクセル以外)です。

         W 、C 、L 、A 、S 、S = 1 、L N C + P C L A S S   

         ここで、pは、全体的なサンプルに対応するカテゴリの確率が表示され、cがスーパーパラメータです。

コードの表示

       部門の2例
       分割分岐レーンが別々のレーンピクセル、我々は支店網を埋め込むレーンインスタンスを訓練し(ピクセルが車線を所有し、このリターンは、知っていることです)のために、認識を得るために、我々はワンショットに基づいています遠隔学習を測る行う方法、方法を簡単に、標準的なフィードフォワードニューラルネットワークに統合されたリアルタイム処理のために使用することができます。従来、この戦略は基づいているのに対し、クラスタリング、画素から車線区画線を埋め込むトレーニング出力分岐インスタンス、自宅周辺の同じレーンからのピクセルを使用して損失関数は、各車線のクラスタリングによって得ることができます。

       次のように大雑把に動作します:

       戦闘を行うための力で二つの鎖があり、分散の急増は、(プルが遠く、閾値ΔVが引き始めたよりも、このアクションの前提があまりにも遠くに埋め込むれるアクティブ)各レーンラインプルの方向を埋め込むことを意味するために主に起因しています、別のユニットが距離用語であり、(このアクションの作動プッシュ前提がプッシュに、閾値ΔDに近い、近すぎるあなたにクラスタ中心から2つの車線のラインである)可能な限りとして車線の2種類を作ることです。次のように総損失関数L最終的な式は次のとおり

 

コードの表示

 

クラスタリング

クラスタリングは、治療後に見られることができ、前のステップEmbedding_branch既に良いクラスタリング特徴ベクトルを提供し、任意のクラスタリングアルゴリズムを使用して特徴ベクトルは、セグメント化されたターゲット・インスタンスを完了するために使用されてもよいです。

终止聚类的条件是:车道聚类(即各车道线间间距)中心间距离>δd,每个类(每条车道线)中包含的车道线像素离该车道线距离<δv  设置 δd > 6δv为迭代终止条件,使上述的loss做迭代。

 网络架构

  基于ENet的encoder-deconder模型,ENet由5个stage组成,其中stage2和stage3基本相同,stage1,2,3属于encoder,stage4,5属于decoder。 

Lanenet网络共享前面两个stage1,2,并将stage3和后面的decoder层作为各自的分支进行训练。其中语义分割分支输出单通道的图像W*H*2。embedding分支输出N通道的图像W*H*N。两个分支的loss权重相同。

 

 

 

 用H-NET做车道线曲线拟合
lanenet网络输出的是每条车道线的像素集合。常规处理是将图像转为鸟瞰图,这么做的目的就是为了做曲线拟合时弯曲的车道能用2次或3次多项式拟合(拟合起来简单些)。但变换矩阵H只被计算一次,所有图片使用相同变换矩阵,导致地平面(山地,丘陵)变化下的误差。

为了解决这个问题,需要训练一个可以预测变换矩阵H的神经网络HNet,网络输入是图片,输出是变换矩阵H:

 

通过置0对转置矩阵进行约束,即水平线在变换下保持水平。(坐标y的变换不受坐标x的影响)

意思就是通过H-Net网络学习得到的变换矩阵参数适用性更好,转置矩阵H只有6个参数,HNet输出一个6维向量,HNet由6层普通卷积网络和一层全连接层构成。

曲线拟合 

通过坐标y去重新预测坐标x的过程:

。对于包含N个像素点的车道线,每个像素点pi=[xi,yi,1]TPpi=[xi,yi,1]T∈P, 首先使用 H-Net 的预测输出 H 对其进行坐标变换:

 P=HPP′=HP

  • 随后使用 最小二乘法对 3d 多项式的参数进行拟合:

                                    w=(YTY)1YTxw=(YTY)−1YTx′

  •  根据拟合出的参数 w=[α,β,γ]Tw=[α,β,γ]T 预测出 xixi′∗

                                  xi=αy2+βy+γxi′∗=αy′2+βy′+γ

  •  最后将 xixi′∗ 投影回去:

                                     pi=H1pi

拟合函数

Loss=1/NNi=1(xixi)2

 

模型网络设置(帧率达50fps)

LaneNet

Dataset : Tusimple embedding维度是4(输出4通道),δv=0.5,δd=3,输入图像resize到512x256,采用Adam优化器,batchsize=8,学习率=5e-4;

H-Net

Dataset : Tusimple,3阶多项式,输入图像128x64,Adam优化器,batchsize=10,学习率=5e-5;

评估标准:

accuracy=2/(1/recall+1/precision)

recall=|P1G1|/|G1|     # 统计GT中车道线分对的概率

precision=|P0G0|/|G0| # 统计GT中背景分对的概率

设定 G1 代表 GT二值图里像素值为 1 部分的集合,P1 表示检测结果为 1 的集合。

View Code

fp=(|P1||P1G1|)/|P1|   # 统计Pre中的车道线误检率

View Code

fn=(|G1||P1G1|)/|G1| # 统计GT车道线中漏检率

View Code

相关试验:

 1.替换Backbone为moblilenet_v2

 2.调整embedding维度

 3.预处理方式调整

 4.上采样方式替换

 5.学习率衰减方式

 6.反卷积卷积核尺寸调整

代码结构:

lanenet_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文

 

おすすめ

転載: www.cnblogs.com/jimchen1218/p/11811958.html