An End-to-End Traffic Visibility Regression Algorithm 文章通过训练搜集得到的真实道路图像数据集(Actual Road dense image Dataset, ARD),通过专业的能见度计和多人标注,获得可靠的能见度标签数据集。构建网络,进行训练,获得了较好的能见度识别网络。网络包括特征提取、多尺度映射、特征融合、非线性输出(回归范围为[0,1],需要经过(0,0),(1,1)改用修改的sigmoid函数,相较于ReLU更好)。结构如下 
 
我认为红框位置与之相应的参数不匹配,在Feature Extraction部分Reshape之后得到的特征图大小为4124 124。紧接着接了一个卷积层Conv,显示输入是3128 128 第二处红框,MaxPool的kernel设置为88,特征图没有进行padding,到全连接层的输入变为64 117*117,参数不对应 """
    Based on the ideas of the below paper, using PyTorch to build TVRNet.
    Reference: Qin H, Qin H. An end-to-end traffic visibility regression algorithm[J]. IEEE Access, 2021, 10: 25448-25454.
    @weishuo
""" 
import  torch
from  torch import  nn
import  math
class  Inception ( nn. Module) : 
    def  __init__ ( self,  in_planes,  out_planes) : 
        super ( Inception,  self) . __init__( ) 
        self. conv1 =  nn. Conv2d( in_planes,  out_planes,  kernel_size= 1 ,  padding= 0 ) 
        self. conv3 =  nn. Conv2d( in_planes,  out_planes,  kernel_size= 3 ,  padding= 1 ) 
        self. conv5 =  nn. Conv2d( in_planes,  out_planes,  kernel_size= 5 ,  padding= 2 ) 
        self. conv7 =  nn. Conv2d( in_planes,  out_planes,  kernel_size= 7 ,  padding= 3 ) 
    def  forward ( self,  x) : 
        out_1 =  self. conv1( x) 
        out_3 =  self. conv3( x) 
        out_5 =  self. conv5( x) 
        out_7 =  self. conv7( x) 
        out =  torch. cat( ( out_1,  out_3,  out_5,  out_7) ,  dim= 1 ) 
        return  out
def  modify_sigmoid ( x) : 
    return  1  /  ( 1  +  torch. exp( - 10 * ( x- 0.5 ) ) ) 
class  TVRNet ( nn. Module) : 
    def  __init__ ( self,  in_planes,  out_planes) : 
        super ( TVRNet,  self) . __init__( ) 
        
        self. FeatureExtraction_onestep =  nn. Sequential( nn. Conv2d( in_planes,  20 ,  kernel_size= 5 ,  padding= 0 ) , 
                                                       nn. ReLU( inplace= True ) , ) 
        self. FeatureExtraction_maxpool =  nn. MaxPool2d( ( 5 ,  1 ) ) 
        self. MultiScaleMapping =  nn. Sequential( Inception( 4 ,  16 ) , 
                                               nn. ReLU( inplace= True ) , 
                                               nn. MaxPool2d( kernel_size= 8 ) ) 
        self. FeatureIntegration =  nn. Sequential( nn. Linear( 46656 ,  100 ) , 
                                                nn. ReLU( inplace= True ) , 
                                                nn. Dropout( 0.4 ) , 
                                                nn. Linear( 100 ,  out_planes) ) 
        self. NonLinearRegression =  modify_sigmoid
    def  forward ( self,  x) : 
        x =  self. FeatureExtraction_onestep( x) 
        x =  x. view( ( x. shape[ 0 ] ,  1 ,  x. shape[ 1 ] ,  - 1 ) ) 
        x =  self. FeatureExtraction_maxpool( x) 
        x =  x. view( x. shape[ 0 ] ,  x. shape[ 2 ] ,  int ( math. sqrt( x. shape[ 3 ] ) ) ,  int ( math. sqrt( x. shape[ 3 ] ) ) ) 
        
        x =  self. MultiScaleMapping( x) 
        
        x =  x. view( x. shape[ 0 ] ,  - 1 ) 
        x =  self. FeatureIntegration( x) 
        out =  self. NonLinearRegression( x) 
        return  out
if  __name__ ==  '__main__' : 
    a =  torch. randn( 1 , 3 , 224 , 224 ) 
    net =  TVRNet( 3 , 3 ) 
    b =  net( a) 
    print ( b. shape)