# AI-Insects-Challenge
**Repository Path**: raycas2020/AI-Insects-Challenge
## Basic Information
- **Project Name**: AI-Insects-Challenge
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2020-03-31
- **Last Updated**: 2022-08-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AI-Insects-Challenge
[AI识虫练习赛](https://aistudio.baidu.com/aistudio/competition/detail/24)第二名代码分享
## 简介
本赛题是一个标准的目标检测任务,主要对纯色器皿中的七种虫子的位置和类别进行检测。本解决方案主要包含了两个模块,分别是YoloV3的目标检测模块,以及后置的SENet分类矫正模块。两个模块直接串联,先通过YoloV3得出检测框和分类结果,然后将检测框裁剪出来使用分类网络进一步矫正分类结果,最后通过一个改进的NMS方案得到最终结果。
注:本代码均使用paddlepaddle 1.6.1 的静态网络搭建
### 图像增广方案
- MixUp (前期训练有效提高,后期精调建议不用)
- 随机旋转图像
旋转从理论上来说很有用,但是旋转之后的真实box会变大,不再紧贴目标,尤其是45度旋转的时候,暂时没有找到更优的解决方案。前两天又看到opencv中貌似有类似的处理,回头试一下再改进。
- 随机色彩变换
亮度、对比度、饱和度等色彩相关变换
- 随机扩充
将图像外围扩大1-4倍,这样可以缩小原始的box,可以优化小目标的检测
- 随机裁剪
- 随机缩放 (这里的随机主要是缩放插值方法的随机)
- 随机翻转 (水平翻转、垂直翻转)
- 图片、真实框归一化处理
- 随机多尺度训练
每个batch输入不同size的图片,可以得到不同的语义特征,能加强训练效果
### 检测模块
- Detector — `YoloV3`
使用`YoloV3`作为本方案的目标检测器,`YoloV3`借鉴了许多一阶段和二阶段目标检测方法的优秀解决方案,如特征金字塔、多尺度预测、更优的BackBone等等,使其在一阶段目标检测算法中属于上乘之选。
- BackBone — `ResNet50-vd-dcn`
本方案中使用`ResNet50`作为骨干网络,替换原始的DarkNet53,同时选用第四个变种vd,保证信息的传递不丢失,最后根据[PaddleDetection](https://github.com/PaddlePaddle/PaddleDetection)的指导,添加了一层可变形卷积DCN,用于捕捉特征图中有物体的区域。
### 后置分类矫正模块
- Network — `SENet`
SENet 在卷积时会对每个特征图计算一个权重,以突出对结果增益高的特征图,从而进一步增强分类效果
- BackBone — `ResNet50`
- 输入
将gt_bbox图或者检测框的图抠出来作为网络的输入
- 输出
分类结果 + 分类置信度
### 后置改进NMS
1. 判断同类别的两个Box,如果`IOU`大于阈值,将两个Box的外接矩形作为输出Box,并选取二者之中Score大的作为最后的置信度;如果`IOU`小于阈值,两个Box均保留;
2. 重复1中的步骤,不过`IOU`计算方法和阈值替换一下,`IOU`计算方法更换为交集面积占两个Box的面积之比之中大的一个,主要过滤一个类别中的局部位置被重复检测,即大框包含小框,此时阈值尽量调整高一些,避免相隔太近的两个Box被过滤掉;
3. 剔除部分置信度得分过低的结果。
## 运行准备
### 关键环境
- Python == 3.6.8 (python2 运行会报找不到目录的错)
- paddlepaddle-gpu == 1.6.1
- opencv-python == 3.2.0.8
- numpy == 1.16.2
### 数据
- AI识虫检测数据
这里没有为大家准备数据,熟悉的人可以直接在AIStudio中拷贝数据。首先需要在项目中创建`data`目录,然后以老师给我们的数据为例,直接运行以下命令
```shell
!unzip -d insects_detection/data/ insects.zip
```
将数据集解压到本项目的`data`目录下即可。
- 分类矫正网络训练数据
在`data`目录下分别创建 `insect_cls/train` 和 `insect_cls/val`的目录,
AI识虫数据解压完成后,直接运行命令即可直接生成分类网络的训练数据和验证数据
```shell
python classification/generate_cls_data.py
```
### 预训练参数
本方案使用的预训练参数均来自百度paddlepaddle模型库
YoloV3预训练:[object365预训练参数](https://paddlemodels.bj.bcebos.com/object_detection/yolov3_r50vd_dcn.tar)
SENet预训练:[ImageNet预训练参数](https://paddle-imagenet-models-name.bj.bcebos.com/SE_ResNet50_vd_pretrained.tar)
将下载好的预训练参数解压到`pretrain_weights`下,分别形成 `pretrain_weights/yolov3_resnet50vd_dcn` 和 `pretrain_weights/se_resnet50_vd` 两个模型目录
### 模型参数
此处提供经过训练和进一步调整之后的参数,不一定完全训练充分了,有能力的同学可以尝试进一步训练。(下载地址为临时地址,不保证一直在线)。地址分别是 [YoloV3训练参数](http://47.103.216.113:8080/yolov3_resnet50vd_dcn_insects.zip) 和 [SENet训练参数](http://47.103.216.113:8080/se_resnet50_vd.zip)
将下载好的参数解压到 `models`文件夹,分别形成 `models/yolov3_resnet50vd_dcn` 和 `models/se_resnet50_vd` 两个目录
注:这里使用的都是Paddle的静态网络构建方式,所以对应的模型参数也都是静态网络才能读取的模型参数,如果需要将静态网络参数加载为动态网络参数,后续我会开源一个加载工具,目前正在优化中,敬请期待...
## 运行方式
相关参数都在对应的文件下,在直接运行前,可以查看相关参数,进行调整更改后运行。
- 训练YoloV3网络
直接运行`train_yolo.py`,训练时会将模型保存到 `models`文件夹下,如果需要在上述模型上继续训练,可以将参数中的`pretrain_weights`参数更改为上述训练好的参数,同时将 `ignore_weights`更改为空列表
```shell
python detection/train_yolo.py
```
- 评估和测试YoloV3
评估会直接输出`mAP`值,测试会输出一个`json`文件
```shell
# 评估
python detection/eval_yolo.py
# 测试
python detection/infer_yolo.py
```
- 训练SENet分类网络
相关说明跟检测网络相似,修改参数后,直接运行`train_cls.py`即可
```shell
python classification/train_cls.py
```
- 评估和测试SENet
说明同上,评估会直接输出准确率和损失。单独运行分类测试前,请先运行YoloV3的测试,因为此处测试会使用检测结果的`json`文件.
```shell
# 评估
python classification/eval_cls.py
# 测试
python classification/infer_cls.py
```
- End-to-End检测
可以在`run.py`中修改相关的执行参数,然后直接运行即可,得到最终的输出文件 `pred_results.json`
```shell
python run.py
```
## 结果
这里展示了一下本方案在验证集和测试集中的表现效果。(ps: 这里删除了一些比赛刷分用的代码,所以结果没有100)
| | YoloV3检测结果 | SENet分类结果 | 后置改进NMS处理 |
| ------ | -------------- | ------------- | --------------- |
| 验证集 | 95.3091 | 97.4154 | 99.9189 |
| 测试集 | 95.3675 | 95.5866 | 99.9810 |
另外,经过对测试集结果的对比,发现上述测试集检测结果中,检测出了测试集中的三个漏标数据,分别是测试集图片`2547.jpeg`、`2558.jpeg`、`3073.jpeg`。所以,此次数据集有不少漏标错标的情况,如果能矫正这些错误,也许能直接让模型预测出更好的结果。
## AIStudio项目分享
本项目在AIStudio中同样创建了分享,地址为 https://aistudio.baidu.com/aistudio/projectdetail/289616
该项目中包含运行所需的数据集,可通过提供的命令直接构建所需的文件和目录,
欢迎各位同学Star和Fork