车道线分割项目记录-Discriminative_loss

2024-03-16 03:50

本文主要是介绍车道线分割项目记录-Discriminative_loss,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

 一、损失函数原理

1. L_var

2. L_dist

二、代码


 一、损失函数原理

 主要是看明白了每个符号代表的意思就能明白了。

1. L_var

L_var是方差损失,也就是一条车道线的像素点之间的方差越小越好。上面的式子中,前面两个求和以及1/C,1/N,就是为了平均这个损失值,取所有的车道线,再取所有的像素点,计算完了对所有车道线以及所有像素点求均值。其中C就是车道线数量,N_c就是对应车道线所包含的像素点数量

后半部分的[x]_+,这个式子就是取max(0, x),因为损失值最小是0,因此如果里面的数小于0了,结果就是0。

再往里,||a-b||,这个就是求距离了,是二范数,也就是求个欧式距离。二者之间的距离如果比设定的像素点相似度阈值\delta _v,比如设为0.5,比这个还小,那么就认为他们确定属于一条线了,结果就是没有损失,就是0。如果比阈值大,就是有损失。

这样应该就能看明白第一个式子了,就是取一条车道线对应的所有像素点的均值\mu _c,然后用预测的属于这条车道线的所有像素点x_i,和均值计算距离,再减去阈值作为损失,如果距离很大,就有损失,距离小于设定的阈值,就没损失。就可以了。

2. L_dist

L_dist是距离损失,也就是两个车道线之间的距离,这个距离应该越大越好,因此,对距离取个负号,就变成了越小越好,就符合损失函数的特征了。上面式子的前一部分,也是用来求均值的,因为我们是要对两两之间求距离,也就是说,假如我们有3根车道线,分别为0,1,2,那么计算距离的时候,是计算了0-1  0-2  1-0   1-2   2-1  2-0之间的距离,正反都算了,因此总共算了C(C-1)这么多次。后半段式子里面的\delta _d,就是我们设定的两条线的距离阈值,比如设为3,要是比这个距离小,比如是1.2,那就有损失,要是两条线距离很大,是8,那说明已经很好了,就没损失了。

至于下面的alpha和beta,就是权重因子。假如距离损失一算,是4,5,6这么大的数,而方差损失一算,是0.04,0.03这么大的数,数量级不一样,那么就需要调整了,通过权重因子,把他们调整到同一个数量级。回归损失没有用到,就不说了。

二、代码

代码这里需要注意的是,计算过程中不要用a += b这种形式,而是要用a = a+b,否则无法求导。

def Discriminative_Loss(self, instance_label, embedding_out, delta_v=0.5, delta_d=3.0):# 一张一张地算embd_dim = embedding_out.shape[1]batch_size = embedding_out.shape[0]L_var = torch.tensor(0, dtype=embedding_out.dtype, device=embedding_out.device)L_dist = torch.tensor(0, dtype=embedding_out.dtype, device=embedding_out.device)for i in range(batch_size):# 对于每一条车道线,每个像素都有4维的embedding,因此,均值也是4维的img = embedding_out[i]label = instance_label[i]# 那么四条车道线,对应四个均值,就是4*4的,如果embedding是5维,那四条车道线的均值就是4*5的。labels = torch.unique(label)labels = labels[labels != 0]  # 1,2,3,4centroid_means = []for lane in labels:# 取出对于这条车道线,有像素的那些点的Maskmask = (label == lane)# 根据mask,取出点,每个点是4维的embeddingmasked_img = img[:, mask]mean_lane = torch.mean(masked_img, dim=1)centroid_means.append(mean_lane)# m个embedding后的像素点都减去均值(4,1),在第0个维度求范数,就会消去第0个维度,得到m个值L_var = L_var + torch.mean(F.relu((torch.norm(masked_img - mean_lane.reshape(embd_dim, 1), dim=0)) - delta_v) ** 2) / len(labels)# 堆叠起来,就得到了(num_lanes, embedding_dim)的四条车道线的均值,利用这个去求范数centroid_means = torch.stack(centroid_means)if len(labels) > 1:# 比如车道线4条,embedding 维度是5的话,前面堆叠之后的shape就是(4,5)# 变成2个,一个是(4,1,5),一个是(1,4,5)# 这样对这两个相减,在“5”这个维度上求范数,消去这个维度,得到的就是(4,4)的范数结果# 第i行第j列代表第i个线对第j个线求的范数,因此对角线是0,上下两部分对称c = len(labels)centroid_means1 = centroid_means.reshape(-1, 1, embd_dim)centroid_means2 = centroid_means.reshape(1, -1, embd_dim)dist = torch.norm(centroid_means1 - centroid_means2, dim=2)dist =dist+ torch.eye(c, dtype=dist.dtype, device=dist.device) * delta_d# 对角线加上delta_d,再按照公式求即可L_dist = L_dist + torch.sum((F.relu(-dist + delta_d) ** 2) / (c * (c - 1) * 2))L_var =L_var / batch_sizeL_dist =L_dist / batch_sizereturn L_var, L_dist

这篇关于车道线分割项目记录-Discriminative_loss的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814200

相关文章

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Jenkins中自动化部署Spring Boot项目的全过程

《Jenkins中自动化部署SpringBoot项目的全过程》:本文主要介绍如何使用Jenkins从Git仓库拉取SpringBoot项目并进行自动化部署,通过配置Jenkins任务,实现项目的... 目录准备工作启动 Jenkins配置 Jenkins创建及配置任务源码管理构建触发器构建构建后操作构建任务

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的