单目相机减速带检测以及测距项目是一个计算机视觉领域的应用,旨在使用一个摄像头(单目相机)来识别道路上的减速带,并进一步估计车辆与减速带之间的距离。这样的系统对于智能驾驶辅助系统(ADAS)特别有用,因为它可以帮助驾驶员提前减速,避免碰撞或剧烈颠簸。
下面是一个典型的单目相机减速带检测和测距项目的组成部分:
1. 数据集准备
- 收集包含减速带的大量图像或视频片段,这些数据用于训练机器学习模型。
- 数据集应该多样化,包括不同天气条件、光照水平、减速带类型和视角的图像。
2. 目标检测模型训练
- 使用深度学习框架,如YOLOv5、SSD或Faster R-CNN,训练一个目标检测模型以识别减速带。
- 训练模型需要标注的数据,即在每张图像中标注减速带的位置。
3. 相机标定
- 为了准确地测量距离,必须先标定相机,以获取其内参数(如焦距、主点位置)和任何畸变参数。
- 标定通常使用带有已知几何图案(如棋盘格)的标定板完成。
4. 测距算法开发
- 开发算法来根据减速带在图像中的大小和相机的参数计算其距离。
- 可以采用三角法或透视投影法,其中已知减速带的实际尺寸是一个关键参数。
5. 系统集成与测试
- 将检测和测距模块整合到一个系统中,确保它们协同工作。
- 在各种条件下测试系统,包括不同的光线、角度和减速带类型,以评估其鲁棒性和准确性。
6. 实时处理
- 优化系统以实现实时处理,这对于车载应用至关重要。
- 可能需要硬件加速,如GPU或专用的计算机视觉处理器,以达到所需的帧率。
7. 用户界面与警报系统
- 设计用户界面,显示减速带的位置和距离信息。
- 如果减速带距离过近,可能需要触发警报系统,提醒驾驶员采取行动。
在实际应用中,单目相机减速带检测和测距项目可能还会涉及到一些挑战,例如减速带的多样性(形状、颜色、材质)、环境因素的影响(如阴影、雨雪等)以及相机运动的补偿等。因此,持续的改进和适应性是此类项目成功的关键。
一、相机标定(拍照+标定+去畸变)
相机标定在calibration.py里实现。目前不足:鱼眼相机去畸变有点问题,其他均正常。
使用方法:运行calibration.py,按照提示运行即可。请注意,本程序capture时会自动清空标定板图片文件夹(已修改为可选择是否清空)。先capture拍照,拍照数目可以在程序里预设;然后calibrate标定,不同类型相机的结果会自动写入不同config里。然后可以undistort去畸变。
标定板相关请参考我的博客:本程序使用的标定板是x方向奇数11个、y方向偶数8个、角点间距1cm的标定板,在程序里为calibration.py的:
board = Board(11,8,10) #col row width(mm)
把部分函数放入到了utils/calibrate下,供其他程序使用。新增了鸟瞰图,运行birdeye.py即可。
PS:鸟瞰图转换中,标定板平面坐标系的原点以左上角为基础,向左上平移了200mm。
二、单应矩阵标定
本着有啥用啥的原则,我直接用宿舍的瓷砖标定了哈哈哈(其实之前用外面的瓷砖标定过,但是相机太烂了拍不清,在宿舍放了几个标志物再标定的)。
单应矩阵至少需要四个点,用findHomography函数,这里有个坑了我一下午的坑:这个函数找到的H满足 $$ c[x,y,1]^T = H[u,v,1]^T $$ 其中,u,v是成像坐标系的点,x,y是地面坐标系的点。一定注意还有个c,因为H是八自由度的,最后得到转换后的坐标不是标准齐次坐标,还要手动转化为标准齐次坐标。
程序运行方法:运行getHomography.py以拍照、鼠标点击获得像素以及标定(大体是这样,我最后把像素坐标写死了),然后求解H;运行getDistance以实现运用获得的H点击像素之后测距(可能以后会删除,因为这个.py是用来测试测距的)。
三、目标检测
初步试了下用自己的数据集训练。建立了datasets文件夹,标注工具为labelimg。数据处理过程为:
1.将要标注的图片放到data/images里。
2.用labelimg标注,标注结果放到data/labels里。
3.进入yolo文件夹(否则路径不对),运行yolo文件夹下的data_process.py来划分数据,生成训练集等路径。
踩了以下坑,作个汇总以作为注意事项。
1.train.py的config我更改过。之前当使用预训练时,会报keyerror:"assets"的错误。(据我观察,这基本就是.pt文件路径不对的问题,请检查自己参数里的路径是否写对了)。
2.train.txt等等里面的路径最好还是写绝对路径,用os.getcwd和join拼接即可。
3.如果要用cpu训练,把utils/loss.py里面的780多行那几个device gpu:0务必改成cpu:0.
4.如果要使用预训练,请修改cfg/training/yolov7.yaml里的nc为对应数量。
5.训练前记得删除dataset文件夹里的cache!
6.yaml不要写汉语!!!会gbk错误