Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update_examples #806

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,28 +1,19 @@
# 安全帽检测

> 基于Paddlex2.0API开发

## 1.项目说明

在该项目中,主要向大家介绍如何使用目标检测来实现对安全帽的检测,涉及代码以及优化过程亦可用于其它目标检测任务等。

在施工现场,对于来往人员,以及工作人员而言,安全问题至关重要。而安全帽更是保障施工现场在场人员安全的第一防线,因此需要对场地中的人员进行安全提醒。当人员未佩戴安全帽进入施工场所时,人为监管耗时耗力,而且不易实时监管,过程繁琐、消耗人力且实时性较差。针对上述问题,希望通过**视频监控->目标检测->智能督导**的方式智能、高效的完成此任务:
在施工现场,现场往来和工作人员的安全问题极为重要,安全帽是保障现场人员安全的第一道防线。及时排查安全帽佩戴的规范性并给予提醒,可以大大降低施工安全隐患。但是人为监管耗时耗力、过程繁琐、消耗人力且实时性较差。

<div align="center">
<img src="./images/1.png" width = "320" />
<img src="./images/2.png" width = "320" /></div>
<img src="./images/1.png" width = "600" />
</div>


**业务难点:**

- **精度要求高** 由于涉及安全问题,需要精度非常高才能保证对施工场所人员的安全督导。需要专门针对此目标的检测算法进行优化,另外,还需要处理拍摄角度、光线不完全受控,安全帽显示不全、可能存在遮挡等情况。
- **小目标检测** 由于实际使用过程中,人员里镜头较远,因此需要模型对小目标的检测有较低的漏检率。

<div align="center">
<img src="./images/3.jpg" width = "1024" /></div>



- **精度要求高** 由于涉及安全问题,对模型精度有较高要求,除了专门针对此目标的检测算法进行优化外,还需要处理拍摄角度、光线不完全受控,安全帽显示不全、可能存在遮挡等情况。
- **小目标检测** 实际使用过程中,人员往往离镜头较远,因此需要模型对小目标的检测有较低的漏检率。

## 2.数据准备

Expand Down Expand Up @@ -202,4 +193,5 @@ paddlex --export_inference --model_dir=output/yolov3_darknet53/best_model --save
<img src="images/14.png" width = "1024" /></div>



* 感谢[蔡敬辉](https://github.com/cjh3020889729)同学对本案例的贡献
* 本项目数据来源于:[njvisionpower](https://github.com/njvisionpower/Safety-Helmet-Wearing-Dataset)整理收集的安全帽数据集,在此表达感谢。
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 6 additions & 6 deletions Paddle_Industry_Practice_Sample_Library/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@

| 行业 | 案例 |
| -------- | ------------------------------------------------------------ |
| 智慧城市 | [火灾烟雾检测](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Fire_and_Smoke_Detection) |
| 智慧城市 | [火灾烟雾检测](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Fire&Smoke_Detection) |
| 智慧城市 | [人流量统计](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Pedestrian_Detection_and_Tracking) |
| 智慧城市 | [车流量统计](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Vehicle_Detection_and_Tracking) |
| 智慧城市 | [安全帽检测](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Hemtle%20Detection) |
| 智慧城市 | [安全帽检测](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Hemtle_Detection) |
| 智慧城市 | [电子快递单信息提取](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Waybill_Information_Extraction) |
| 智能制造 | [工业指针型表计读数](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/meter_reader) |
| 智能制造 | [钢材缺陷检测](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/paddlex_steel_defect_seg-master) |
| 智能制造 | [钢筋计数](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/rebar_count) |
| 智能制造 | [机械手抓取](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/robot_grab) |
| 智能制造 | [工业指针型表计读数](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/meter_Reader) |
| 智能制造 | [钢材缺陷检测](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Steel_Detection) |
| 智能制造 | [钢筋计数](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Rebar_Count) |
| 智能制造 | [机械手抓取](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Robot_Grab) |
| 互联网 | [财报识别与关键字段抽取](https://github.com/PaddlePaddle/awesome-DeepLearning/tree/master/Paddle_Enterprise_CaseBook/Report_Recognition_and_Analysis) |

Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@

# 基于HRNet的模型优化
在项目中,我们采用HRNET作为钢板缺陷分割的模型。具体代码请参考[train.py](./train.py)。

运行如下代码开始训练模型(单机单卡):
Expand Down Expand Up @@ -116,4 +118,7 @@ train_transforms = T.Compose([
| -- | -- | -- | -- | -- | -- | -- | -- |
| HRNET | 150 | 800x128 | 16 | 0.01 | CrossEntropyLoss|RandomHorizontalFlip | 62.75%
| HRNET | 150 | 800x128 | 16 | 0.01 | CrossEntropyLoss+DiceLoss|RandomHorizontalFlip | 64.46%
| HRNET | 150 | 800x128 | 16 | 0.01 | CrossEntropyLoss+DiceLoss|RandomHorizontalFlip+RandomDistort | 64.46%
| HRNET | 150 | 800x128 | 16 | 0.01 | CrossEntropyLoss+DiceLoss|RandomCrop+RandomHorizontalFlip+RandomDistort+RandomBlur | 66.35%

可以看到,通过添加数据增强又上升了1.89%。

Original file line number Diff line number Diff line change
@@ -1,32 +1,21 @@
# 钢材缺陷检测项目案例
- [钢材缺陷检测项目案例](#钢材缺陷检测项目案例)
- [一、项目简介](#一项目简介)
- [二、 数据集分析](#二-数据集分析)
- [2.1 读取和分析文本数据](#21-读取和分析文本数据)
- [2.2 读取和分析图像数据](#22-读取和分析图像数据)
- [2.3 可视化数据集](#23-可视化数据集)
- [三、制作标准数据集](#三制作标准数据集)
- [3.1 PaddleX数据集格式说明](#31-paddlex数据集格式说明)
- [3.2 数据转换](#32-数据转换)
- [3.3 数据切分](#33-数据切分)
- [四、训练和验证](#四训练和验证)
- [4.1 基于HRNET进行优化](基于HRNet)
- [4.2 基于UNet进行优化](#42-模型预测)
- [五、部署](#五部署)
- [5.1 模型导出](#51-模型导出)
- [5.2 C#桌面部署](#52-c桌面部署)


## 一、项目简介
本项目来源于Kaggle上一个[钢材表面缺陷检测竞赛](https://www.kaggle.com/c/severstal-steel-defect-detection/overview),这也是一个非常好的将深度学习应用于传统工业材料检测的案例。本项目将使用百度飞桨[PaddleX](https://github.com/PaddlePaddle/PaddleX)深度学习算法套件进行开发,全流程剖析整个实现过程。
作为生产制造过程中必不可少的一步,物体表面缺陷检测广泛应用于工业领域,如:3C、半导体、电子、汽车、化工、医药、轻工、军工等行业。而钢材作为基础的工业材料,在出厂之前的检测更加严格。

针对上述场景,PaddleX提供可视化、自动化的AI质检方案,帮助企业提升生产效率,实现智能质检。


钢材是现代最重要的建筑材料之一。刚材结构建筑能够抵抗自然和人为磨损,这使得这种材料在世界各地随处可见。在所有钢材加工环节中,平板钢的生产工艺特别精细。从加热、轧制,再到干燥和切割,需要几台机器协同操作,其中一个重要环节就是利用高清摄像头捕获的图像对加工环节中的钢材进行缺陷自动检测。Kaggle上举办的这场钢材缺陷竞赛希望各位参赛者利用机器学习来改进钢板表面缺陷检测算法精度,提高钢铁生产自动化程度。
<div align="center">
<img src="./images/steel_demo.png" width = "300" />
<img src="./images/steel_demo.png" width = "800" />
</div>

## 二、 数据集分析

这个竞赛主要目的是定位和分类钢板表面缺陷,属于语义分割问题。对应的数据集可以从[Kaggle竞赛官网](https://www.kaggle.com/c/severstal-steel-defect-detection/data)下载,也可以从[ai studio](https://aistudio.baidu.com/aistudio/datasetdetail/12731?_=1634357183077)进行下载。下载下来后包含两个图像文件夹和两个标注文件:
本项目来源于Kaggle上一个[钢材表面缺陷检测竞赛](https://www.kaggle.com/c/severstal-steel-defect-detection/overview),这也是一个非常好的将深度学习应用于传统工业材料检测的案例。

这个竞赛主要目的是定位和分类钢板表面缺陷,属于语义分割问题。对应的数据集可以从[Kaggle竞赛官网](https://www.kaggle.com/c/severstal-steel-defect-detection/data)下载,下载下来后包含两个图像文件夹和两个标注文件:
<div align="center">
<img src="./images/dataset.png" width = "200" />
</div>
Expand All @@ -37,7 +26,7 @@
* **train.csv**:该文件中存储训练图像的缺陷标注,有4类缺陷,ClassId = [1, 2, 3, 4]
* **sample_submission.csv**:该文件是一个上传文件的样例,每个ImageID要有4行,每一行对应一类缺陷

对于竞赛项目来说,拿到数据后我们首先要做的就是先对数据集进行分析。下面我们按照文本和图像逐步来分析这个数据集。
拿到数据后我们首先要做的就是先对数据集进行分析。下面我们按照文本和图像逐步来分析这个数据集。

### 2.1 读取和分析文本数据
假设下载下来的数据集放在名为severstal的文件夹中,首先读取csv文本数据
Expand Down Expand Up @@ -399,13 +388,8 @@ for idx in idx_class_triple:
## 三、制作标准数据集

### 3.1 PaddleX数据集格式说明
从前面的数据分析中我们看到钢板图像的每个像素只属于1种缺陷类别(或者没缺陷),由于我们需要定位出钢板缺陷的精细区域,因此可以把这个任务看作是一个语义分割任务,即按照像素级别精度判断每个像素所属的缺陷类别。

接下来我们就可以使用语义分割算法进行训练和验证。本项目采用百度飞桨PaddleX算法套件来快速训练。PaddleX是飞桨全流程开发工具,集飞桨核心框架、模型库、工具及组件等深度学习开发所需全部能力于一身,打通深度学习开发全流程。简单来说,使用PaddleX有两个明显的好处:
* **快速验证算法模型**:无论是做工业项目还是参加类似Kaggle的竞赛,没有一个算法是通吃的,那么我们必然需要尝试很多不同的算法,这时候快速验证算法模型有效性就显得尤为重要。对于一个未知的深度学习任务来说,我们刚开始并不知道到底使用什么样的模型算法去处理才能得到一个比较好的基准值,这时候就需要有一个接口切换简单、实现快捷方便、算法功能齐全的算法库工具,能够让我们快速的去验证模型有效性,这里PaddleX就是这样一个比较好的工具,它包含了图像分类、分割、检测等常见的、实用的深度学习模型,而且接口进行了高度统一,我们可以使用它来快速的训练各个模型,并选取一个比较好的基准值。在这个基础上,我们再去进行算法优化。
* **模型快速部署**:对于真实的工业任务来说,不光要训练得到一个高精度的算法模型,还需要考虑部署的便捷性和有效性。很多模型尽管精度很高,但是由于采用了非常嵌套的动态图模型编写方式,如果将其直接静态图导出或者转成onnx往往会遇到问题,那么这时候必然需要算法工程师手动去修改模型,这对于真实项目来说会极大的增加项目开发难度,降低项目开发效率。使用PaddleX的好处在于,在PaddleX中的模型基本都已经被验证过了,能够在多种平台上进行落地部署,比如C++推理、手机移动端推理等,同时还给出了详细的部署教程,因此,选择PaddleX进行真实深度学习产品开发或者打比赛都是一个不错的选择。
从前面的数据分析中我们看到钢板图像的每个像素只属于1种缺陷类别(或者没缺陷),由于需要定位出钢板缺陷的精细区域,因此可以把这个任务看作是一个语义分割任务,即按照像素级别精度判断每个像素所属的缺陷类别。

**PaddleX安装方法**参考[官网](https://github.com/PaddlePaddle/PaddleX)。本项目使用PaddleX v2.0.0版本进行实现。

为了能够使用PaddleX进行语义分割训练,我们首先要对数据集格式进行转化。PaddleX语义分割算法[要求](https://github.com/PaddlePaddle/PaddleX/blob/release/2.0.0/docs/data/format/segmentation.md)数据集按照如下方式进行组织:

Expand Down Expand Up @@ -447,7 +431,6 @@ python prepare_dataset.py
```
这个文件用来指明当前到底有哪些像素标签值(本项目共4种缺陷,对应标签为1、2、3、4,这里的0标签表示背景)

转换完的数据集也可以直接从ai studio上进行[下载](https://aistudio.baidu.com/aistudio/datasetdetail/112904)。

### 3.3 数据切分
在模型进行训练时,我们需要划分训练集,验证集和测试集,可直接使用paddlex命令将数据集随机划分。本项目将训练集、验证集和测试集按照8.5:1:0.5的比例划分。 PaddleX中提供了简单易用的API,方便用户直接使用进行数据划分。具体命令如下:
Expand Down Expand Up @@ -486,3 +469,6 @@ paddlex --export_inference --model_dir=output/hrnet/best_model --save_dir=output
<div align="center">
<img src="./images/csharp.png" width = "800" />
</div>

* 感谢[佟兴宇](https://github.com/txyugood)、[钱彬](https://github.com/qianbin1989228)两位同学对于本案例的贡献。
* 示例图片引用说明:本项目中示例数据源于Kaggle[钢材表面缺陷检测竞赛](https://www.kaggle.com/c/severstal-steel-defect-detection/overview)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 精度优化
# 基于UNet的精度优化

本小节侧重展示在模型迭代过程中优化精度的思路,在本案例中,有些优化策略获得了精度收益,而有些没有。在其他质检场景中,可根据实际情况尝试这些优化策略。

Expand Down
4 changes: 2 additions & 2 deletions Paddle_Industry_Practice_Sample_Library/meter_reader/README.md
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ mkdir projects
cd projects
git clone https://github.com/PaddlePaddle/PaddleX.git
cd PaddleX
git checkout release/2.0.0
git checkout develop

```
### Step2: 下载PaddleX Manufature SDK
Expand Down Expand Up @@ -484,4 +484,4 @@ Meter 2: 6.21739101
在分割模型可视化的预测结果保存在`PaddleX\examples\meter_reader\deploy\cpp\meter_reader\out\build\x64-Release\output_seg`,可以点击进行查看:
| 表1可视化分割结果 | 表2可视化分割结果|
| -- | -- |
| ![](./images/20190822_168_06-30-17-09-33-217.jpg) | ![](20190822_168_06-30-17-09-33-213.jpg) |
| ![](./images/20190822_168_06-30-17-09-33-217.jpg) | ![](./images/20190822_168_06-30-17-09-33-213.jpg) |
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
2 changes: 1 addition & 1 deletion Paddle_Industry_Practice_Sample_Library/meter_reader/reader_infer.py
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ def erode(self, seg_results, erode_kernel):
eroded_results = seg_results
for i in range(len(seg_results)):
eroded_results[i]['label_map'] = cv2.erode(
seg_results[i]['label_map'], kernel)
seg_results[i]['label_map'].astype(np.uint8), kernel)
return eroded_results

def circle_to_rectangle(self, seg_results):
Expand Down
Empty file.
Empty file.
Diff not rendered.
Diff not rendered.
Loading