# 16-小新队 **Repository Path**: openeuler2020/team-1878343640 ## Basic Information - **Project Name**: 16-小新队 - **Description**: TOPIC_ID:16, TEAM_ID:1878343640, TEAM_NAME:小新队. - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2020-12-28 - **Last Updated**: 2024-10-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 16-小新队 #### 介绍 TOPIC_ID: 16, TEAM_ID: 1878343640, TEAM_NAME:小新队.   本项目是为OpenCV提供一种基于3D点云数据的车辆检测方法,本项目采用原始模型是[Point-based 3D Single Stage Object Detector](https://arxiv.org/abs/2002.10187) (3DSSD)模型。   该模型具有以下特点:3DSSD模型是一种轻量级、高效的基于点的三维单级物体探测器,在精度和效率之间取得了很好的平衡。为了减少庞大的计算成本,放弃了现有的基于点的方法中的上采样层和细化阶段。在下采样过程中,利用融合采样策略,以实现对代表性较弱点的检测。设计了一个包含候选生成层、无锚回归头和三维中心度分配策略的精致盒预测网络,以满足精度和速度的要求。   原始模型推理精度:3DSSD模型在KITTI数据集(3,769个测试样本)验证结果准确率达到**91.71%(简单),80.44%(困难)** | Easy AP | Moderate AP | Hard AP | | :-----: | :---------: | :-----: | | 91.71 | 83.30 | 80.44 |   但是,该模型使用的基础推理框架为tensorflow,目前OpenCV中的DNN模块并不能直接加载并推理该模型。因此,我们的主要工作就是让该模型适配OpenCV中的DNN模块并且得到一个好的推理表现。 目前,我们在原有模型的基础上得到了适配 opencv 4.5.1的两个模型,并且在输入相同的情况下,预测的结果和原模型的结果完全相同,**保证了模型的准确率仍为91.71%(简单),80.44%(困难)** #### 开发流程 * 转换模型格式。OpenCV中的DNN模块只是一个推理工具,因此,我们将模型中loss计算以及前向传播的相关部分删除,并将预训练模型的相关参数冻结下来成为常量,将原本的ckpt模型转换为OpenCV可以加载的pb模型。 * 初步优化模型。我们认真查看了模型的节点,将推理过程中计算结果恒为常量的数个节点合并,减少了无效计算并简化了模型。 * 自定义实现custom layer。通过尝试加载模型并且阅读OpenCV中的dnn模块源码,发现3DSSD模型中有很多OpenCV还未实现的节点(例如 "FPS" "QBPD" "FPSD"),并且在OpenCV已经实现的节点中存在着很多功能不全或者有差异的节点。这些节点都需要我们自定义实现custom layer注册到DNN模块。最终成功加载模型进行模型推理。 * 再次优化模型。首先我们通过优化部分节点的算法实现将模型提速了1/5(2.5s/张->2s/张**8core@1.6GHz**)。接着我们尝试减小推理时采样点的个数,最终发现在在采样减半的情况下,推理**准确率几乎不变**而**速度快了一倍**(0.7~1s/张,**8core@1.6GHz**)。我们分别提交了这两个模型满足不同的需求。 * 模型推理结果后处理。我们从结果中筛选出符合条件的3D框,并通过校准文件将其投影生成2D框。 * 结果可视化。分别在图片和点云图中可视化结果。 #### 模型结构 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0331/214100_7edeb933_8490565.png "framework.png") #### 环境要求 * Python 3.7 * OpenCV 4.5.1 * Cmake 3.16.5 * g++ 5.4 * Openerluer (模型推理) #### 目录结构 ``` . |--Model (3DSSD模型) |--3dssd-4096.pb (原模型,推理一张图片需1.9~2s) |--3dssd-2048.pb (减小输出版本模型,推理一张图片需0.7~1s) |--src (推理、数据处理等代码) |--data (py文件,进行数据预处理和结果整理) |--core (Cpp文件,利用opencv进行模型推理) |--opencvCustomOps (opencv自定义网络层) |--vis (可视化部分,需在Windows环境下使用) |--data (数据集,本仓库包含4个样例) |--calib (校准文件) |--image (2D图片) |--point (3D点云文件) |--pre_data (预处理后的点云文件,供模型推理) |--aft_data (模型推理结果,结果为预测的100个3D框以及对应的分数) |--label (整理后结果,选出分数合格的3D框并将其转化为2D框以供可视化) |--pred (ground_truth) |--list.txt (要处理的文件的编号) ``` #### 模型推理 ##### 环境准备 (1)安装OpenCV4.5.1 (必须使用最新opencv版本) 和 conda(若已安装可跳过,[安装教程](https://gitee.com/openeuler2020/team-1878343640/blob/master/opencv%E3%80%81conda%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B.md)) (2)clone仓库并搭建数据处理所需要的python环境 ``` git clone https://gitee.com/openeuler2020/team-1878343640.git conda create -n 3dssd python=3.7 source activate 3dssd ``` 进入仓库目录并按照需求下载python第三方库 ``` cd team-1878343640 pip install -r requirements_linux.txt ``` (3)编译生成推理所需的可执行文件 ``` bash compile.sh ``` ##### 数据准备及推理过程 (1)在list.txt中输入要处理图片的序号 例如: ![image-20210327211201669](img/list_example.png) (2)数据预处理,将点云文件根据图片和校准文件进行预处理,将预处理后的点云放入data/pre_data文件夹中 ``` python src/data/data_preprocessor.py ``` 运行成功结果: (3)进行模型推理,模型输出存入data/aft_data文件夹中 参数 0 表示使用准确率较高的模型推理 ``` ./src/core/main 0 ``` or 参数1 表示使用速度较快的模型推理 ``` ./src/core/main 1 ``` 运行成功结果: (4)模型推理并测试推理时间 ``` time ./src/core/main 0 ``` or ``` time ./src/core/main 1 ``` (4)结果后处理,将结果转化为3D框和2D框存入data/label文件夹中以供可视化 ``` python src/data/result_processor.py ``` 运行成功结果: #### 可视化(**建议在本地运行**) ##### 安装教程 (1)克隆仓库 ``` git clone https://gitee.com/openeuler2020/team-1878343640.git cd team-1878343640 ``` (2)安装python环境(第三方库mayavi可能安装失败,可能需要先安装别的依赖,建议使用者多次尝试) ``` conda create -n 3dssd python=3.7 activate 3dssd pip install -r requirements_win.txt ``` ##### 使用说明 (1)将data/label中的结果(之前在openeuler系统中推理生成的)下载到Windows中,并放入对应文件夹(data/label)(若未进行推理,可直接使用仓库中推断好的部分结果可直接进行可视化) (2)运行src/vis/show.py进行可视化,运行时需输入参数ind(例:5012)指定可视化的点云和图片 ``` python src/vis/show.py --ind 5012 ``` 加入-p参数可以与真实值进行对比 ``` python src/vis/show.py --ind 5012 -p ``` 运行成功结果: ##### 参考文献 [1] Yang Z , Sun Y , Liu S , et al. 3DSSD: Point-based 3D Single Stage Object Detector[J]. 2020 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2020.