前言:
本文主要目的是实现在PINet车道线检测的代码中嵌入YOLOv8的目标检测模块,具体效果如图所示:
在学习和使用YOLOv8进行目标检测时,感觉可以和最近研究的车道线检测项目结合起来,形成一套如上图所示的视频效果。
其实将车道线检测和目标检测结合可以提供更全面的场景信息。车道线检测提供了关于道路结构和车辆行驶方向的信息,而目标检测可以检测到周围的车辆、行人、交通标志等物体。通过综合这些信息,可以更准确地理解道路环境,提高驾驶系统的感知能力,另外,可以增强驾驶系统的安全性。车道线检测可以帮助车辆保持在正确的车道内,避免偏离道路。目标检测可以检测到潜在的障碍物或危险情况,帮助驾驶系统及时做出反应,例如避让行人或刹车避免与其他车辆相撞。
在决策支持方面,车道线检测和目标检测的结合可以为驾驶系统提供更多的决策支持。通过分析车道线和周围目标的位置和状态,可以帮助驾驶系统做出更合理的行驶决策,例如选择合适的车道变道时机、保持安全距离等。
相关资料:
PINet车道线检测论文:https://arxiv.org/abs/2002.06604
官方代码:GitHub - koyeongmin/PINet
论文解读:http://t.csdnimg.cn/AOV91
论文复现过程:http://t.csdnimg.cn/Lhz6m
YOLOv8的部署与安装:http://t.csdnimg.cn/YrWNu
具体实现:
在所有必须的软件、代码、环境准备完成后,将YOLOv8模块(ultralytics-main)导入至PINet车道线检测的代码包中:
注意:要将其放入根目录下,右键将其标记为Sources Root,否则会检测不到ultralytics
新建python package,命名:YOLO_predicted_video,在其package下新建python文件,命名:YOLO_pre.py
导入所需要的包,写入以下代码:
import cv2
from ultralytics import YOLO
#############################
## YOLO
############################
def yolo_pre():
yolo=YOLO('./yolov8n.pt')
video_path='C:\\Users\\25055\\Desktop\\测试2.mp4'
cap = cv2.VideoCapture(video_path) # 创建一个 VideoCapture 对象,用于从视频文件中读取帧
# 获取视频帧的维度
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))
# 创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('C:\\Users\\25055\Desktop\\output.mp4', fourcc, 20.0, (frame_width, frame_height))
while cap.isOpened():
status, frame = cap.read() # 使用 cap.read() 从视频中读取每一帧
if not status:
break
result = yolo.predict(source=frame, save=True)
result = result[0]
anno_frame = result.plot()
#cv2.imshow('行人', anno_frame)
out.write(anno_frame)
# 注释的框架是通过调用 result.plot() 获得的,它会在框架上绘制边界框和标签。
# 带注释的框架使用 cv2.imshow() 窗口名称“行人”显示。
#if cv2.waitKey(1) & 0xFF == ord('q'):
#break
cap.release()
cv2.destroyAllWindows()
print('yolo识别完成')
video_yolo_path='C:\\Users\\25055\Desktop\\output.mp4'
return video_yolo_path
其中:
video_path='C:\\Users\\25055\\Desktop\\测试2.mp4'
便是我们要检测的视频,存放在桌面中。
out = cv2.VideoWriter('C:\\Users\\25055\Desktop\\output.mp4', fourcc, 20.0, (frame_width, frame_height))
将YOLO所检测完成的视频结果存储至'C:\\Users\\25055\Desktop\\output.mp4'文件中。
打开test.py文件:导入YOLO_pre中的yolo_pre模块
在开始测试之后输入以下代码:
video_path=yolo_pre()
在Parameters.py文件中,将mode设置为1。
test.py文件的cv2.VideoCapture()设置为video_path,即:
elif p.mode == 1: # 使用视频文件对模型进行测试
cap = cv2.VideoCapture(video_path)#通过cv2.VideoCapture打开视频文件
while(cap.isOpened()):
ret, frame = cap.read()
if not ret:
break
prevTime = time.time()
frame = cv2.resize(frame, (512,256))/255.0
frame = np.rollaxis(frame, axis=2, start=0)
_, _, ti = test(lane_agent, np.array([frame])) ##循环读取每一帧图像,将图像进行预处理后传递给test函数进行测试,并显示测试结果。
#计算FPS
curTime = time.time()
sec = curTime - prevTime
fps = 1/(sec)
s = "FPS : "+ str(fps)##同时,计算帧率并在图像上显示。
cv2.putText(ti[0], s, (0, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0))#FPS展示
cv2.imshow('frame',ti[0])
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
右键运行test.py文件。
结果展示:
yolo开始进行目标检测:
yolo检测结果:
开始进行车道线检测任务:
检测结果: