# cheng_fei_vision **Repository Path**: fushuai0214/cheng_fei_vision ## Basic Information - **Project Name**: cheng_fei_vision - **Description**: 成飞狭窄微光环境下多余物清除机器人视觉部分 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-07-07 - **Last Updated**: 2024-07-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 双目识别定位系统 > 用于成飞狭窄微光环境多余物清除蛇形臂系统的识别定位视觉系统,双目相机安装于末端执行器处,目标是对多余物(按目前训练的模型为:铆钉、螺母、铝屑、长铆钉、螺栓5类)进行识别和定位。 > 2022.7.7 by 傅帅 > > 本项目涉及数据集制作和训练、YOLO目标检测、双目相机标定、双目视觉定位、数字图像处理算法、python工程实践等技术。且每部分的深度其实都比较浅,我也会全力以赴把大家教明白。各位如果认真去学去做,一定能收获很多。 > 2022.7.13 by 傅帅 ## 基本原理 * 识别部分使用~~yolov3~~目标检测网络,采用1000张标注好的图像进行训练,最终生成权重和配置文件在部署时使用。 * 为提升识别速度,需使用GPU加速,但原模块使用Opencv读入网络模型,折腾后发现很难使用CUDA加速。再加上之前配置训练环境的远程主机连不上,故最终将识别部分替换为yolov5,替换后识别算法速度从2HZ提升到近20HZ。 * ~~定位部分目前使用SGBM双目视觉匹配算法来生成视差图,再根据视差图生成点云,再根据识别结果在图像中的像素坐标查对应位置是否生成了合理的点云数据,以此进行定位。(不太稳定有可能近期会修改)~~ * 定位部分算法已经重新实现,原理为根据左右图识别框结果进行手动匹配对应关系,然后根据匹配结果使用双目测距基本几何原理对三维坐标进行计算。稳定性和精度都有明显提升,但对左右两图识别的准确度有一定要求。(原来的定位算法稳定性太差,建议用新的) * ~~此外任务书还要求环境信息提取,但此部分只做了一个直线检测和原始点云信息获取,并不能提供任何全局定位信息。但此条与工程部署无关,仅为了满足任务书需求。~~ * 经过协商,成飞最终要求提供对于舱体边角的角点检测和定位,来尝试对其他课题过低的精度进行反馈和修正。目前已实现了相关算法,但对参数较为敏感,需要在理解算法(不难)的基础上根据最终部署的环境进行调参。基本原理如下: * 对左右图分别进行特征点提取和直线检测,然后根据特征点和直线检测结果设计规则来筛选出角点,再对左右图筛选出的角点使用与定位算法类似的原理进行对应关系匹配和定位。 ## 源码结构简介 主程序由纯python编写,origin目录为陶一宁提供的原始程序,根目录下为笔者精简并重构后的程序,删掉了一些笔者认为与最终实际使用无关的内容。 ### 原始程序 > 原始程序如非特殊需求,应该是不再用碰的,当然大家感兴趣也可以去看看 `all_in_one.py`:原始主程序,识别定位点云都在里面 `all_in_one_for_test.py`:笔者在现场进行了一些调整和debug后用于初步测试 `stereo_config_200.py`:200万像素双目相机的标定数据,若新相机需重新标定需要根据情况修改 `ui_demo.py`:一个简单的tkinter UI,不重要 ### 重构后程序 > 基本对原始程序的所有模块进行了替换,具有更清晰的结构和更好的可读性,设计目标是用于最终部署。 `camera.py`:重构后的主程序,主循环持续运行目标检测和定位、角点识别和定位、接口通讯等功能。 `camera_single.py`:双目镜头损坏时用于单目测试的程序 `img_capture.py`:用于标定和训练时的图像采集 `my_detect.py`:用于使用与yolov5/detect.py类似的方式对模型进行调用 `server_test.py`:与上交通讯接口的本地测试 `stereo_config_200.py`:200万像素双目相机的标定数据,若新相机需重新标定需要根据情况修改;还包含了畸变校正算法 ## 需要做的工作 > 笔者在离开前会尽可能跑通对接和基本流程,后续工作主要是在新镜头和实际验证环境下的调参和精度提升 * 新镜头需要在matlab视觉工具箱进行标定 * 环境确定后需要在实际场景下重新进行拍照、标注、训练 * 理解新实现定位算法的原理(很简单),并结合最终环境进行调参 * 理解角点检测和定位算法的原理(定位和上一条原理一样),并结合最终环境进行调参 * 调试时一些无法预料的问题 ## Quick Start ### 基本环境 环境为windows系统,语言为纯python,推荐使用anaconda管理python环境,用vscode作为IDE 因为要做模型训练和部署,故若想在自己电脑上跑,最好有NV显卡。没有就不做CUDA相关部分,模型跑在CPU上也行,但会慢很多。 1. 安装anaconda(百度) 2. 打开anaconda prompt`conda create -n your_env_name python=3.8`(若使用老工程中的pcl库,需用3.6,所以还是用conda吧) 3. 无论哪个python版本,都`pip install opencv-python==4.5.3.56` 4. (可选 建议用到的时候再搞)在py3.6下安装pcl库(无法使用pip直接安装,笔者参考的[这篇blog](https://blog.csdn.net/weixin_44244190/article/details/124324121)安装成功) 5. 安装vsode(百度) 6. 安装git(百度) ### CUDA和Cudnn环境 CUDA可以认为是NVDIA的一个显卡并行计算驱动,Cudnn是为深度神经网络(dnn)的一个加速库。 1. CUDA和Cudnn安装 [WIN下CUDA和Cudnn安装](https://zhuanlan.zhihu.com/p/416712347) 2. 在[pytorch官网](https://pytorch.org/)根据自己的CUDA版本安装pytorch(最新的yolov5我跑的时候说不支持1.12.0,我就去找的previous version,装的时候anaconda最好用管理员模式启动) 3. 在[yolov5仓库](https://github.com/ultralytics/yolov5) clone工程并`pip install -r requirements.txt`安装requirements。 **此处注意默认安装的pytorch和torchvision可能与CUDA版本不对应,最好先去pytorch官网按对应指令安装** ### 工程中需要修改的部分 上述环境配置结束后,再拿到pt模型文件,即可运行目前的工程。在工程运行前,还需要修改几个文件路径。 1. 修改my_utils/my_detect.py中`weights = ROOT / "50l.pt"`为自己想用的权重文件 然后即可在anaconda prompt中conda activate 对应环境,直接用python运行camera.py了,注意程序一定在根目录下运行,有一些路径写成了相对路径 ## Further More ### 相机标定 双目相机标定通过matlab工具箱进行,标定的目的是获取双目相机的各种内外参数,[原理简介](https://www.jianshu.com/p/049e4aa35ddb) 1. 安装matlab(大家应该都有吧...没有问我要我去找找破解版) 2. 图片采样可使用`my_utils\img_capture.py`,原材料一般为40多张以不同角度拍摄标定板的双目照片,具体细节请参考matlab文档。 * 基本注意事项:标定板与镜头倾角应小于45度;各种角度都要有;板内栅格都要在双目图像内;光线应好一些让栅格尽可能清晰。不过就算拍的不好matlab也会自动reject。 3. 使用matlab->APP->Stereo Camera Calibrator->Add Images导入图片,标定板栅格尺寸为6mm,畸变选项部分勾选`Skew`、`3 Coefficients`和`Tangential Distortion`,标定后导出参数到Worspace即可。 * 对导出后的参数,可使用网上找的一个处理脚本,直接将有用部分生成为excel。 4. 更新对应参数到stereo_config_200.py ### yoloV5目标检测 YOLO是最为经典的目标检测模型,其发展已非常完善。本工程选用yolov5,其基本训练和部署非常简单直接。Quick Start中,我们已经安装好了yoloV5的基本环境,下面介绍如何进行目标检测模型的数据集采样、标注、训练: 1. 数据集的制作是整个目标检测模型最为重要的部分,对最终识别效果影响最大。拍照可使用脚本`my_utils\img_capture.py`。注意事项如下: * 拍照场景应尽可能覆盖所有需要识别的场景(种类、远近、分布情况等),除单目标外也应有大量各目标混合场景和少量无目标空镜场景。 * 建议总图片数目1000张(因为双目,其实只用拍一半),一定注意要尽可能覆盖所有场景 2. 使用标注工具进行标注,label格式为class cx cy w h,后四项经过了归一化。标注工具用陶一宁之前使用的YoloMark即可。 * Yolo_mark_compiled为陶一宁提供的在x86上编译好的版本,使用`Yolo_mark_compiled\x64\Release\yolo_mark.cmd`启动。 * 将0-1000.jpg放入`Yolo_mark_compiled\x64\Release\data\img`,启动`yolo_mark.cmd`即可进行标注。labels会在img文件夹生成。 * 快捷键:h-帮助;q-退出;0-9切换框类型;空格-下一张;右键-移动绘制完成的框;r-清除所选择的框;c-全部清空; * 标注时标注框应尽可能准确框出目标物体的外接矩形,可允许一定误差但绝不能过于随意 * 因标注工作量较大,可多人同时进行标注。注意切换到下一张图之后就会生成该图的文件,若不标注直接退出则文件为空。 3. 有了images和labels后,可参考YOLO中的README.txt或官方文档来进行训练,训练注意事项如下: * 可先用yolov5m训30轮看看效果,因为本项目训练场景就是测试场景,不会有过拟合泛化性能差之类的问题,所以对怎么训练应该没有太高要求 * 训练窗口貌似有时候会卡住,需要按一下Enter才能继续 * 测了一下用l基本也能10HZ运行,再大可能就不行了 ### 角点检测和定位算法调参 角点检测和定位算法分为特征点检测、直线检测、直线精简、角点筛选、角点匹配和定位几个部分。各部分的原理都不是很复杂,最好可以基本理解后再结合最终部署环境进行调参。 1. 应首先对特征点检测部分进行调试,尽量确保要提取的角点在多数情况下会被识别到。 2. 然后应可视化Canny边缘检测的结果,调参至尽量确保目标轮廓可以被检测出来 3. 最后调节直线检测算法的参数,保证检测的结果尽量少(减少干扰),且包含要识别角点的边线。 4. 自行实现的直线精简和角点筛选部分也有参数,可在前三个调节合适后,且理解算法基本原理后,再进行理解和调节 ``` python # 特征点提取 def goodFeaturesToTrack(image, # 输入图像(灰度图) maxCorners, # 提取出最大特征点数目 qualityLevel, # 角点的品质因子,越高越严格 minDistance) # 两特征点间最小距离[pix],超过则认为是一个 ``` [特征点检测参考](https://zhuanlan.zhihu.com/p/68571164)、[参数含义参考](https://jingyan.baidu.com/article/2c8c281d9d8e7f0008252a88.html) ``` python # 边缘提取和直线检测 def Canny(image, # 输入图像(灰度图) minval, # 梯度下阈值,越大对边缘要求越严格 maxval) # 上阈值同理 def HoughLinesP(image, # 输入图像(边缘检测结果二值图) rho, # 搜索步长(半径) theta, # 搜索步长(角度) threshold, # 参考霍夫变换原理,此值越高对直线要求越严格 minLineLength=None, # 线的最短长度[pix],短于此则忽略 maxLineGap=None) # 将两条有间隔的线连起来最大阈值 ``` [Canny参数调节](https://zhuanlan.zhihu.com/p/242929149)、[HoughLinesP参数调节](https://lihaiyu.blog.csdn.net/article/details/106397532?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-106397532-blog-74360141.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-106397532-blog-74360141.pc_relevant_aa&utm_relevant_index=1)