# 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框。
* 结果可视化。分别在图片和点云图中可视化结果。
#### 模型结构

#### 环境要求
* 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中输入要处理图片的序号 例如:

(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.