Skip to content


Repository files navigation

Spatial CNN for Traffic Lane Detection


Xingang Pan, Jianping Shi, Ping Luo, Xiaogang Wang, Xiaoou Tang. "Spatial As Deep: Spatial CNN for Traffic Scene Understanding", AAAI2018

This code is modified from fb.resnet.torch.


Demo video is available here.

  • Spatial CNN enables explicit and effective spatial information propagation between neurons in the same layer of a CNN.
  • It is extremly effective in cases where objects have strong shape priors like the long thin continuous property of lane lines.
    VGG16+SCNN outperforms ResNet101 on lane detection.


  • Torch, please follow the installation instructions at fb.resnet.torch.
  • Matlab (for tools/prob2lines), version R2014a or later.
  • Opencv (for tools/lane_evaluation), version 2.4.8 (later 2.4.x should also work).
  • Hardware: For testing, GPU with 3G memory suffices. For training, we recommend 4xGPU with 12G memory.

Before Start

  1. Clone the SCNN repository

    git clone

    We'll call the directory that you cloned SCNN as $SCNN_ROOT

  2. Download CULane dataset

    mkdir -p data/CULane
    cd data/CULane

    Download CULane dataset and extract here. (Note: If you have downloaded the dataset before 16th April 2018, please update the raw annotations of train&val set as described in the dataset website.)
    You should have structure like this:

    $SCNN_ROOT/data/CULane/driver_xx_xxframe    # data folders x6
    $SCNN_ROOT/data/CULane/laneseg_label_w16    # lane segmentation labels
    $SCNN_ROOT/data/CULane/list                 # data lists


  1. Download our pre-trained models to ./experiments/pretrained

    cd $SCNN_ROOT/experiments/pretrained

    Download our best performed model here.

  2. Run test script

    cd $SCNN_ROOT
    sh ./experiments/

    Testing results (probability map of lane markings) are saved in experiments/predicts/ by default.

  3. Get curve line from probability map

    cd tools/prob2lines
    matlab -nodisplay -r "main;exit"  # or you may simply run main.m from matlab interface

    The generated line coordinates would be saved in tools/prob2lines/output/ by default.

  4. Calculate precision, recall, and F-measure

    cd $SCNN_ROOT/tools/lane_evaluation
    sh   # it may take over 30min to evaluate

    Note: evaluate each scenario separately while evaluate the whole. You may use calTotal.m to calculate overall performance from all senarios.
    By now, you should be able to reproduce our result in the paper.


  1. Download VGG16 pretrained on ImageNet
    cd $SCNN_ROOT/experiments/models
    Download VGG16 model here and move it to $SCNN_ROOT/experiments/models/vgg.
  2. Generate SCNN model
    th SCNN-gen.lua
    The generated model will be saved in ./vgg_SCNN_DULR9_w9 by default.
  3. Training SCNN
    cd $SCNN_ROOT
    sh ./experiments/
    The training process should start and trained models would be saved in $SCNN_ROOT/experiments/models/vgg_SCNN_DULR_w9 by default.
    Then you can test the trained model following the Testing steps above. If your model position or name is changed, remember to set them to yours accordingly.

Other Implementations

Tensorflow implementation reproduced by cardwing:
[new!] Pytorch implementation reproduced by voldemortX:

Citing SCNN or CULane

  author = {Xingang Pan, Jianping Shi, Ping Luo, Xiaogang Wang, and Xiaoou Tang},  
  title = {Spatial As Deep: Spatial CNN for Traffic Scene Understanding},  
  booktitle = {AAAI Conference on Artificial Intelligence (AAAI)},  
  month = {February},  
  year = {2018}  


Most work for building CULane dataset is done by Xiaohang Zhan, Jun Li, and Xudong Cao. We thank them for their helpful contribution.