【PINet车道线检测】代码复现过程

《Key Points Estimation and Point Instance Segmentation Approach for Lane Detection》

论文:https://arxiv.org/abs/2002.06604

代码:GitHub - koyeongmin/PINet

论文解读:http://t.csdnimg.cn/AOV91

这是篇关于自动驾驶中车道检测技术的研究论文,标题为“Key Points Estimation and Point Instance Segmentation Approach for Lane Detection”,作者包括Yeongmin Ko、Younkwan Lee、Shoaib Azam、Farzeen Munir、Moongu JeonWitold Pedrycz。论文提出了一种名为Point Instance Network (PINet)的车道检测方法,该方法基于关键点估计和实例分割方法。

摘要:

        基于关键点检测和实例分割技术提出一个Point Instance Network(PINet)来检测车道线。网络中包含几个同时训练的stacked hourglass networks,可裁切后不用再训练直接使用来减小模型运算量。自动驾驶的感知技术需要适应各种环境,车道检测是自动驾驶中的一个重要感知模块,需要考虑交通线的数量和目标系统的计算能力,PINet通过堆叠的沙漏网络(hourglass networks)进行训练,可以根据目标环境的计算能力选择模型大小,PINet将预测关键点的聚类问题视为实例分割问题,可以处理不同数量的交通线,网络可适应不同数量的车道线,在公共车道检测数据集TuSimple和Culane上,PINet实现了竞争性的准确性和低误报率。

复现过程

下载代码

首先详细阅读改论文的Github源码,在Code中下载代码压缩包。

将代码使用Pycharm打开,

下载数据集

使用TuSimple数据集:https://pan.baidu.com/s/19xbtMDtznqHOjS9kp30Acw?pwd=a5DA 
提取码:a5DA 

注意:下载的TuSimple数据集中仅使用了test_set和train_set,并且在test_set中缺少test_label.json文件需要从官方网站https://www.kaggle.com/datasets/manideep1108/tusimple?resource=download中下载,

下载之后将其解压进test_set文件夹中。

在代码的根目录下新建文件夹命名为:TuSimple

目录结构如下:

 TuSimple文件目录要按照以下结构:

Tusimple||----train_set/                |------||------|----clips/            |------|------||------|------|----some_clip/|------|------|----...||------|----label_data_0313.json      |------|----label_data_0531.json      |------|----label_data_0601.json      ||----test_set/               |------||------|----clips/|------|------||------|------|----some_clip/|------|------|----...||------|----test_label.json           |------|----test_tasks_0627.json      

Test测试

在一切准备就绪时,我们先进行测试代码,作者已提供经过训练的模型640_tensor(0.2298)_lane_detection_network.pkl,它保存在“savefile”目录中。可以运行“test.py”进行测试。

在进行测试之前,我们需要根据自己想要测试的文件类型来选择测试模式:


模式0:在测试集上可视化结果
模式1:在给定的视频上运行模型。如果要使用此模式,在“test.py”的第 63 行输入视频路径
模式2:在给定图像上运行模型。如果要使用此模式,在“test.py”的第 82 行输入图像路径
模式3:在整个测试集上测试模型,并将结果保存为json文件。

在“parameters.py”文件中的第 22 行mode更改模式。

代码如下:

    if p.mode == 0 : # 使用测试数据集对模型进行测试for _, _, _, test_image in loader.Generate():_, _, ti = test(lane_agent, np.array([test_image]))cv2.imshow("test", ti[0])cv2.waitKey(0) elif p.mode == 1: # 使用视频文件对模型进行测试cap = cv2.VideoCapture("C:\\Users\\25055\Desktop\\1.mp4")#通过cv2.VideoCapture打开视频文件while(cap.isOpened()):ret, frame = cap.read()prevTime = time.time()frame = cv2.resize(frame, (512,256))/255.0frame = np.rollaxis(frame, axis=2, start=0)_, _, ti = test(lane_agent, np.array([frame])) ##循环读取每一帧图像,将图像进行预处理后传递给test函数进行测试,并显示测试结果。curTime = time.time()sec = curTime - prevTimefps = 1/(sec)s = "FPS : "+ str(fps)##同时,计算帧率并在图像上显示。cv2.putText(ti[0], s, (0, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0))cv2.imshow('frame',ti[0])if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()elif p.mode == 2: # 使用单张图片对模型进行测试test_image = cv2.imread(p.test_root_url+"clips/0530/1492626047222176976_0/23.jpg")test_image = cv2.resize(test_image, (512,256))/255.0test_image = np.rollaxis(test_image, axis=2, start=0)_, _, ti = test(lane_agent, np.array([test_image]))cv2.imshow("test", ti[0])cv2.waitKey(0)   elif p.mode == 3: #进行评估操作print("evaluate")evaluation(loader, lane_agent)#evaluation函数对数据集进行评估

如果要使用其他经过训练的模型,只需更改以下 2 行:

# In "parameters.py"
line 13 : model_path = "<你自己训练好的网络模型>/"
# In "test.py"
line 42 : lane_agent.load_weights(<>, "tensor(<>)")

由于数据集过大,本次测试先使用作者已经提供好的网络模型。在选择好测试模式视频路径后,开始进行测试:

测试结果:

作者训练好的网络模型效果还是比较好的。

由于视频测试效果在本平台展示不出,故不做展示。

训练自己的网络模型

如果要从头开始训练,在“parameters.py”中将第 13 行设为空白,然后运行“train.py”即可;

“train.py”将保存样本结果图像(在“test_result/”中)、训练模型(在“savefile/”中)和某些阈值(0.3、0.5、0.7)的评估结果。

首先展示一下训练模型的过程:

在运行代码之前,需要在终端运行

python -m visdom.server

目的是进入 python 终端,激活服务器,下载相关脚本文件。

当出现:

即代表激活成功,此时点击网络端口进入网页,查看在训练网络模型时损失函数的曲线。

运行train.py

此时,运行窗口不断输出信息。

在 http://localhost:8097端口事实展示训练时损失值曲线:

与此同时,在目录端savefile会自动保存好训练好的模型(每100step保存一次),test_result文件中会自动保存训练时用来测试的图片结果。

 

(前几轮的效果并不明显)

 由于数据集过大,训练过程复杂,需要的时间过长,所以不建议完全跑完整个数据集,使用作者已提供的训练好的模型即可。

代码详解

  1. 导入所需的库:
    import cv2
    import torch
    import visdom
    import agent
    import numpy as np
    from data_loader import Generator
    from parameters import Parameters
    import test
    import evaluation
    

  2. 创建一个名为Parameters的对象实例 p,该对象包含一些模型训练的超参数:
    p = Parameters()
    

  3. 定义一个名为Training的函数,用于执行训练过程:
    def Training():
    

  4. 创建一个visdom对象用于可视化训练过程中的损失值,并设置一个窗口用于显示损失曲线:
        vis = visdom.Visdom()loss_window = vis.line(X=torch.zeros((1,)).cpu(),Y=torch.zeros((1)).cpu(),opts=dict(xlabel='epoch',ylabel='Loss',title='Training Loss',legend=['Loss']))
    

  5. 创建一个Generator对象实例 loader,用于生成训练数据:
        loader = Generator()
    

  6. 根据模型路径是否为空,创建一个代理模型实例 lane_agent,并加载权重(如果有):
        if p.model_path == "":lane_agent = agent.Agent()else:lane_agent = agent.Agent()lane_agent.load_weights(4235, "tensor(0.2127)")
    

  7. 打印设置GPU模式的提示信息(如果可用):
        print('Setup GPU mode')if torch.cuda.is_available():lane_agent.cuda()
    

  8. 初始化步数 step 为0,并开始迭代训练过程的每个周期 epoch
        step = 0for epoch in range(p.n_epoch):
    

  9. 设置代理模型为训练模式:
            lane_agent.training_mode()
    

  10. 使用数据生成器 loader.Generate() 获取输入、目标车道、目标高度和测试图像,并进行训练:
            for inputs, target_lanes, target_h, test_image in loader.Generate():# trainingprint("epoch : " + str(epoch))print("step : " + str(step))loss_p = lane_agent.train(inputs, target_lanes, target_h, epoch, lane_agent)loss_p = loss_p.cpu().data
    

  11. 如果步数 step 是50的倍数,将损失值添加到可视化窗口中:
                if step%50 == 0:vis.line(X=torch.ones((1, 1)).cpu() * int(step/50),Y=torch.Tensor([loss_p]).unsqueeze(0).cpu(),win=loss_window,update='append')
    

  12. 如果步数 step 是100的倍数,保存模型,并进行测试:
                if step%100 == 0:lane_agent.save_model(int(step/100), loss_p)testing(lane_agent, test_image, step, loss_p)
    

  13. 如果当前步数大于700,000,则跳出训练循环:
            if int(step)>700000:break
    

  14. 定义一个名为 testing 的函数,用于执行测试过程:
    def testing(lane_agent, test_image, step, loss):
    

  15. 将代理模型设置为评估模式:
        lane_agent.evaluate_mode()
    

  16. 使用测试图像进行测试,并保存测试结果图像:
        _, _, ti = test.test(lane_agent, np.array([test_image]))cv2.imwrite('test_result/result_'+str(step)+'_'+str(loss)+'.png', ti[0])
    

  17. 将代理模型设置回训练模式:
        lane_agent.training_mode()
    

    train.py代码主要是一个训练循环,其中包含了模型的初始化、数据加载、训练和测试等步骤。训练过程中使用了可视化工具visdom来实时显示训练损失,并保存模型和测试结果图像。同时,还包含了评估模型性能的步骤。具体的模型结构、数据生成器和评估函数等实现细节在其他py文件中。

遇到的问题

在遇到报错时一定要保证该代码所需的包和模块已下载。

一、在进行Test测试时,出现以下错误:

出现以下错误的原因有以下几种:

1.opencv和opencv-contrib-python 两者的版本不匹配

2.opencv和opencv-contrib-python 的版本过高或者过低

3.python的版本过高,一般使用python3.8版本,本人一开始使用的3.10版本会一直出现报错

4.图片的路径不正确,也是一种常见的错误

二、在进行Train训练时,出现以下错误:

1.当出现ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接的错误时,可能是因为环境并没有安装visdom模块,所以导致计算机拒绝连接。

在python终端输入:

pip install visdom

 安装之后会显示:

Successfully built visdom torchfile
Installing collected packages: jsonpointer, websocket-client, torchfile, jsonpatch, visdom
Successfully installed jsonpatch-1.32 jsonpointer-2.1 torchfile-0.1.0 visdom-0.1.8.9 websocket-client-0.58.0

每次运行时都要进行激活操作:

python -m visdom.server

2.出现类型输入错误

通过解读错误这个错误TypeError: 'float' object cannot be interpreted as an integer

发现是类型错误。

具体纠正如下:

test.py:192行——两个p.grid_y加上int,强制转换,int(p.grid_y)。agent.py:245、246、247行:缩进有问题,调整跟244行一样即可。parameters.py:58、59、60行:grid_y、grid_x前加int。agent.py在所有出现self.p.grid_y和self.p.grid_x的地方全都加上int

具体是什么原因导致的还不清楚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第50天 | 123.买卖股票的最佳时机III ,188.买卖股票的最佳时机IV

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 123.买卖股票的最佳时机III 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 思…

如何本地部署1Panel面板

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

PTA一笔画

作者 张志梅 单位 青岛大学 小丁最近迷恋上一个游戏&#xff0c;传说中的“一笔画”游戏。 那么什么是一笔画&#xff1f;如下图&#xff0c;顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中&#xff0c;笔不能离开纸&#xff0c;且笔所画过的线不能重复…

Springboot和Spring Cloud版本对应

Spring在不断地升级&#xff0c;各个版本存在一些不兼容的地方&#xff0c;为了避免出现问题&#xff0c;最好注意使用正确的版本。 官网的对应关系&#xff1a;https://start.spring.io/actuator/info 如下图&#xff1a; 下面附一下创建项目的工具&#xff1a; Spring官方…

代码随想录算法训练营第53天 | 1143.最长公共子序列 ,1035.不相交的线 ,53. 最大子序和

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 1143.最长公共子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-common-subsequence/description/ 思路&…

13|连接数据库:通过链和代理查询鲜花信息

新的数据库查询范式 提出问题&#xff1a;用户用自然语言提出一个问题&#xff0c;例如“去年的总销售额是多少&#xff1f;”。LLM 理解并转译&#xff1a;LLM 首先会解析这个问题&#xff0c;理解其背后的意图和所需的信息。接着&#xff0c;模型会根据解析的内容&#xff0c…

2024年零基础转行软件测试真的可以吗?“我“该如何做?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 零基础的学生&…

博图西门子HMI下载报错—缺少面板映像,下载失败解决办法

一、报错展示 二、解决过程 1、第一种&#xff1a; 在安装博图(V17)时&#xff0c;需要下载各类软件&#xff0c;这时钩选全部能够选择的软件。然后进行下载。但是在这里我遇到了下载软件时&#xff0c;无法选择红框中的文件。那么就需要单独去西门子官网下载。 2、第二种&am…

MQ之Spring AMQP学习

Spring AMQP学习 Spring AMQP AMQP是Advanced Message Queuing Protocol的缩写。AMQP是用于在应用程序之间传递消息的开放标准&#xff0c;该协议与语言和平台无关&#xff0c;更符合微服务中独立性的要求。 Spring AMQP是基于AMQP协议定义的一套API规范&#xff0c;提供了模…

微信小程序接口请求出错:request:fail url not in domain list:xxxxx

一、微信小程序后台和开发者工具配的不一样导致了这个错误 先说结论&#xff1a; 开发者工具配置了https://www.xxx.cn/prod-api/ 微信后台配置了 https://www.xxx.cn 一、最开始 开发者工具配置了https://www.xxx.cn:7500 微信后台配置了 https://www.xxx.cn 报错:reques…

关系数据库:关系数据结构基础与概念解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

外包2月,技术倒退警钟长鸣。。。。。

曾经的我&#xff0c;作为一名大专生&#xff0c;在湖南某软件公司从事功能测试工作近四年。日复一日的工作让我陷入舒适区&#xff0c;不思进取。直到今年8月&#xff0c;我才意识到自己的技术停滞不前&#xff0c;女友的离开更是让我痛定思痛&#xff0c;决定改变现状&#x…

极速下载,轻松管理—互联网下载管理器(IDM)全面评测 万物皆可下的Internet Download Manager

在当今信息爆炸的时代&#xff0c;我们每天都在从互联网上下载各种资源&#xff0c;如文档、音乐、视频等。而一个高效、实用的下载工具对于提高我们的工作效率和生活品质至关重要。今天&#xff0c;我将为大家详细介绍一款备受好评的下载神器 — 互联网下载管理器&#xff08;…

详细教---用Django封装写好的模型

本次我们要用自己写好的热销词条爬虫代码来演示如何用Django把我们写好的模型封装。 第一步&#xff1a;代码准备 热搜词条搜集代码&#xff1a; import requests from lxml import etreeurl "https://tophub.today/n/KqndgxeLl9" headers{User-Agent: Mozilla/5.…

HarmonyOS NEXT应用开发之搜索页一镜到底案例

介绍 本示例介绍使用bindContentCover、transition、animateTo实现一镜到底转场动画&#xff0c;常用于首页搜索框点击进入搜索页场景。 效果图预览 使用说明 点击首页搜索框跳转到搜索页面显式一镜到底转场动画 实现思路 通过点击首页搜索框改变bindContentCover全屏模态…

企业专业化管理金字塔:技能进阶与案例分析

在纷繁复杂的企业管理领域中&#xff0c;一套行之有效的管理技能体系对于企业的稳健发展至关重要。本文将深入探讨企业专业化管理金字塔的五个层次&#xff1a;基本的管理技能、业务操作管理技能、组织管理技能、组织开发技能以及管理转变技能&#xff0c;并结合实际案例&#…

Linux 文件系统:C语言接口、系统接口

目录 一、文件接口 二、感性理解Linux系统下“一切皆文件” 三、C语言文件接口 1、fopen 2、当前路径 3、fwrite、fprintf、fputs 4、fgets 模拟实现cat命令 5、fscanf 五、系统接口 1、open系统调用 2、write系统调用 例&#xff1a;O_WRONLY 例&#xff1a;O_WR…

类和对象-2

文章目录 默认成员函数构造函数默认构造函数析构函数不同生命周期的构造、析构函数的执行顺序 默认成员函数 在c中&#xff0c;每个类里面都有六个默认成员函数。即便这个类什么都没有&#xff0c;也就是空类&#xff0c;也会有这六个成员函数。这些函数的存在极大的简化了代码…

洛谷_P5143 攀爬者_python写法

P5143 攀爬者 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 知识点&#xff1a; Python lambda&#xff08;匿名函数&#xff09; | 菜鸟教程 (runoob.com) import mathn int(input()) data [] for i in range(n):l list(map(int,input().split()))data.append(l)data.so…

网络简略总结

目录 一、三次握手 四次挥手 1、三次握手:为了建立长链接进行交互即建立一个会话,使用http/https协议 2、四次挥手是一个断开连接释放服务器资源的过程 3、如果已经建立了连接,但是客户端突然出现故障了怎么办? 4、谁可以中断连接?客户端还是服务端还是都可以? 5、…