Skip to content

Latest commit

 

History

History
552 lines (384 loc) · 22.5 KB

File metadata and controls

552 lines (384 loc) · 22.5 KB

Data+Train+Evaluate+App 4in1 repo within the paper [中文版] [English]

License Repo size Code size GitHub forks GitHub stars commit

这是用于存储 基于YOLO网络的行人检测研究与应用 2020本科毕业设计 全部代码 的仓库。这个毕设项目的 4 个部分包括 数据集+YOLO训练+模型评估+网站应用 都在这个仓库里,并且代码编写和论文撰写工作全部由我一人完成。

如果你对这个项目的一些原理或具体细节感兴趣的话,可以查看我的论文 : 基于YOLO网络的行人检测研究与应用.pdf

下面仅仅是整个项目的工作流程和 repo 中代码文件的使用方法。

目录

1. Introduction

本项目基于 YOLOv3 对行人检测进行研究,包括 数据转换、 Keras-训练(keras-yolo3@qqwweee)和 模型评估。最后我还依据训练好的模型基于 Flask 构建了一个 Web App,实现对输入的实时视频流(摄像头)、静态图像或视频的行人检测结果的可视化。

对于整个项目,我使用的是 python 3.6,需要的包可以通过如下命令安装:

pip install -r requirements.txt

2. Dataset

选择后下载的共 4 个数据集: Microsoft 的 COCO 数据集、PASCAL 的 VOC 数据集、INRIA 行人数据集以及 Caltech 行人数据集,前 3 个用于训练和基础测试,Caltech 用于和其他算法模型比较。其中 COCO 和 VOC 包含多类别甚至多方向,只使用其中的 person 类的 目标检测 部分注释。而 Caltech 数据集仅用于比较,未多做研究,稍具体的操作将在 4. Model Evaluation 中说明。

2.1 Download

Microsoft COCO

官网: http://cocodataset.org/

下载 2017 版 约 19GB,下载链接:

训练集: http://images.cocodataset.org/zips/train2017.zip

验证集: http://images.cocodataset.org/zips/val2017.zip

训练集+验证集注释: http://images.cocodataset.org/annotations/annotations_trainval2017.zip (其中前缀为 instances 的 json 文件中包含目标检测的注释)

PASCAL VOC

官网: http://host.robots.ox.ac.uk:8080/pascal/VOC/

以下是 YOLO 原作者提供的下载链接,下载 07 和 12 版,大约 2.7GB。

wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar

解压:

tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar

解压后的文件夹中 ‘/JPEGImages’ 中是图片,‘/Annotations’ 中包含以 xml 文件存储的目标检测注释。

INRIA Person Dataset

官网: http://pascal.inrialpes.fr/data/human/ 无法访问了

下载地址:

  1. official link : ftp://ftp.inrialpes.fr/pub/lear/douze/data/INRIAPerson.tar 约 969 MB 无法访问

  2. Baidu Cloud Disk(中文) : https://pan.baidu.com/s/12TYw-8U9sxz9cUu2vxzvGQ password: jxqu

  3. Google Drive : https://drive.google.com/file/d/1wTxod2BhY_HUkEdDYRVSuw-nDuqrgCu7/view?usp=sharing

解压:

tar xf INRIAPerson.tar

解压后的文件夹中 ‘/Train’ 和 ‘/Test’ 文件夹分别包含训练集和测试集的图片和注释,而同目录下其余 4 个文件夹并未用到。

2.2 Data distribution & Convert annotation format

详见论文 # 2.2 整体划分及处理

2.3 Batch processing

对于 2. Data 文件夹中的脚本是分数据集编写的,所需的目录结构 📂​ 如下所示。

.
├─COCO
│  ├─annotations
│  ├─train2017
│  └─val2017
├─VOC
│  └─VOCdevkit
│      ├─VOC2007
│      └─VOC2012
├─INRIA
|  └─INRIAPerson
|      ├─Test
|      └─Train
├─coco_annotation.py
├─voc_annotation.py
└─INRIA_annotation.py

标注转换得到的 txt 文件是追加写入,所以脚本直接顺序执行即可。

python coco_annotation.py
python voc_annotation.py
python INRIA_annotation.py

PS: 脚本在转换格式的同时,会将图片整合到一个 data 文件夹,训练集和测试集的图片分别放在其下的 traintest 文件夹中。

综上,最终会在 2. Data 文件夹中添加的目录结构如下所示。

+
├─data
│  ├─train
│  └─test
├─train.txt
└─test.txt

3. YOLO Train

这部分代码几乎全部来源于 keras-yolo3@qqwweee

PS: job-batch32-95gpu4.sh 是我训练时在服务器上提交作业的脚本。仅作为纪念,不用在意 :)

3.1 Network & Loss

详见论文 # 3.3 YOLOv3网络 # 3.4 损失值(Loss)

3.2 Get Anchor

这一部分代码来自 keras-yolo3/kmeans.py@qqwweee,我仅仅只是加了一个可视化函数

在运行获得anchor的代码之前,你需要确保在 2.4 Batch processing 获得的存放真实边界框(Ground-Truth)数据的 train.txt 在当前目录下(3. Train)。

python anchor_kmeans.py

运行脚本后,会在 3. Train 文件夹中添加的目录结构如下所示。

+
├─Anchors-by-Kmeans.png
├─yolo_anchors.txt
└─kmeans.npy

Anchors-by-Kmeans.png 是K均值可视化图片。 yolo_anchors.txt 即是得到的anchors。 kmeans.npy 存储K均值的结果,如果你想改变可视化的效果就不用重复计算K均值了。

结果详见论文 # 3.5 先验框(Anchor)

3.3 Pretrained Weights

抄自 keras-yolo3@qqwweee/README.md

1. 从 YOLO 官网 上下载 YOLOv3 预训练权重文件 yolov3.weights (237 MB). 或者直接运行:

wget https://pjreddie.com/media/files/yolov3.weights

2. 将 Darknet 格式的 YOLO 模型权重(*.cfg+*.weights)转换成 Keras 格式的模型权重(*.h5)。

python convert_yolov3_weight_darkent2keras.py -w yolov3.cfg yolov3.weights yolo_weights.h5

3.4 Prepare files needed for training

1. 创建class文件(person_classes.txt), 每行一个类名, 所以只需要填一行: person。(仓库中有)

vi person_classes.txt

2. 创建模型文件夹(model_data),用来存放配置文件和预训练权重。(仓库中有)

mkdir model_data

3. 将 person_classes.txt, yolo_anchors.txt and yolo_weights.h5 移动到 model_data.

mv person_classes.txt yolo_anchors.txt yolo_weights.h5 ./model_data

3.5 True Train process

训练之前,需要把 2.4 Batch processing 得到的训练集(/data/train)和图片路径+注释文件(train.txt) 移动到当前目录下(3. Train

使用 keras-yolo3@qqwweee/train.py 的模型训练配置,只将保存模型轮次改为每10个epoch。

具体训练配置说明详见论文 # 3.6 训练(Train)

训练!!!

python train.py

我将训练好的模型权重上传到了百度网盘谷歌云盘,这是一个训练了 109 轮的模型权重。(235.4MB)

下载地址:

  1. Baidu Cloud Disk(中文) : https://pan.baidu.com/s/130J8c5B9RQILSDKAFKyK1A password: wmht

  2. Google Drive : https://drive.google.com/file/d/1zxcpjklHKQ6hULa8HmeKIQqnkH_h_NSI/view?usp=sharing

3.6 Loss curve plot

log 是在训练时用TensorBoard存储的。直接提取loss画图即可。

第一个参数是前50轮的log文件路径,第二个参数是50轮之后的log文件的路径。千万注意顺序!!!

python Tensorboard_log_loss_visualization.py \
    logs/batch32/events.out.tfevents.1586104689.r1cmpsrvs79-14ig0702 \
    logs/batch32/events.out.tfevents.1586671921.r1cmpsrvs79-14ig0702

我绘制的loss曲线详见论文 # 3.6 训练(Train)

4. Model Evaluation

在评估开始之前,你需要确保从 2.4 Batch processing 得到的测试集(/data/test)和图片路径+注释文件(test.txt)在当前目录下(4. Evaluate

当然,模型权重文件 (3.5 True Train process) 也需要在 4. Evaluate/model/ 文件夹中,默认的文件名是: trained_weights_final.h5

4.1 Basic metric

详见论文 # 4.4 评估标准及方法

testSet_eva.py的主函数调用的 evaluate() 有两个参数:

  1. IsVsImg: 它决定了是否把每个图片都画上预测框和真实框存储在(4. Evaluate/test_eval/vs/
  2. IsErrorMissingCorrect : 它决定了是否复制画有真实框和边界框的带有 漏检、误检、正确 的图片到一个新的位置,并用一个TXT文件(4. Evaluate/test_eval/ErrorMissingCorrect.txt)记录它们的信息。

如果你把它们都置为False,就仅仅只会在屏幕上打印和存储基础测试结果,而不会得到任何结果图片

默认情况下: IsVsImg=True,IsErrorMissingCorrect=True

程序会自动存储预测边界框结果,之后再次运行无需重复预测。

python testSet_eva.py

运行脚本后,会在 4. Evaluate 文件夹中添加的目录结构如下所示。

+
└─test_eval
   ├─correct
   │  └─...
   ├─error
   │  └─...
   ├─missing
   │  └─...
   ├─vs
   │  └─...
   ├─ErrorMissingCorrect.txt
   ├─Ground_Truth.npy
   ├─predict_bb.npy
   └─pre_bb_sec.npy

vs 文件夹中包含所有绘制了真实边界框(Ground-Truth)和预测边界框(predict bounding-box)的测试图片。

correct 是完全正确的图片的文件夹。error 是存在误检的图片的文件夹。missing 是存在漏检的图片的文件夹。ErrorMissingCorrect.txt 存储了漏检、误检、正确图片的信息,包括每张图片的 预测框数量,真实框数量,预测正确的数量。

Ground_Truth.npy 存储了真实边界框的信息,它有助于再次计算时避免重复提取真实边界框。predict_bb.npy 是预测边界框的结果文件,它有助于再次运行时避免重复的预测。

pre_bb_sec.npy 存储了每张图片的处理时间。

4.1.1 Model Detection speed

画运行时间统计图,参数(-p or -pre_bb_sec_file)是存储了每张图片的处理时间的文件路径('test_eval/pre_bb_sec.npy')。

python run_time_statistics.py -p test_eval/pre_bb_sec.npy

统计图见论文 # 4.5 测试结果与分析

4.1.2 Model Detection quality

具体结果及分析见论文 # 4.5 测试结果与分析

4.2 PR-curve

这部分的代码来自于 Object-Detection-Metrics@rafaelpadilla.

PS: 我只修改了绘图和存储路径(savePath)部分。

首先需要按 Object-Detection-Metrics/README.md#how-to-use-this-project@rafaelpadilla 要求准备真实边界框文件和检测边界框文件(score=0)。

python testSet_PR_AP_raw_bb_data.py

运行脚本后,会在 4. Evaluate 文件夹中添加的目录结构如下所示。

+
└─PRcurve_AP_raw_bb_data
   ├─gt
   │  └─...
   └─pre
      └─...

然后就可以绘制PR曲线并计算PASCAL-AP了。

python pascalvoc.py -gt ./PRcurve_AP_raw_bb_data/gt -det ./PRcurve_AP_raw_bb_data/pre -sp ./PR_AP_results

运行脚本后,会在 4. Evaluate 文件夹中添加的目录结构如下所示。

+
└─PR_AP_results
   ├─person.png
   └─results.txt

person.png 是PR曲线图。results.txt 是一些结果,其中包含计算得到的AP值。

PR曲线与AP见论文 # 4.5 测试结果与分析

4.3 Caltech MR-FPPI

官网: http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/

这部分参考自:https://blog.csdn.net/qq_33614902/article/details/82622561 中文 和 https://www.jianshu.com/p/6f3cf522d51b 中文

4.3.1 Extract images

下载地址: http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/datasets/USA/

测试集(set06-set10)包含5个集合,每个约1GB。

# download toolbox
git clone https://github.com/pdollar/toolbox pdollar_toolbox

# download extract/evaluation code
wget http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/code/code3.2.1.zip
mkdir code
unzip code3.2.1.zip -d code

# for video data
cd code
mkdir data-USA
cd data-USA
mkdir videos

将解压后的测试及文件夹(set06-set10)移动到 code/data-USA/videos

matlab 打开 code/dbExtract.m,在命令行中添加 Toolbox 路径。

addpath(genpath('../pdollar_toolbox'));

然后运行 code/dbExtract.m 即可在 code/data-USA/images 中得到测试图片。

4.3.2 predict BB for extracted images

python Caltech_predict_BB.py

运行脚本后,会在 4. Evaluate/code/data-USA/ 文件夹中添加的目录结构如下所示。

+
└─res
   └─YOLOv3
      ├─set06
      │  └─...
      ├─set07
      │  └─...
      ├─set08
      │  └─...
      ├─set09
      │  └─...
      └─set10
         └─...

set06~set10 是官方要求的预测结果文件夹。相对于图像的位置,存储具有相同名称的预测结果TXT文件,其中每行包含一个边界框。(每行的格式是:[x_min,y_min,width,height,score]

4.3.3 Evaluate by MR-FPPI

# download annotations
wget http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/datasets/USA/annotations.zip
unzip annotations.zip

annotations/ 移进 4. Evaluate/code/data-USA/

下载其它算法结果,链接: http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/datasets/USA/res

下载好后,也将这些结果移进 4. Evaluate/code/data-USA/res/

最后,运行 part_algo-not_pdf-dbEval.m。(我在这个文件里选择了一些算法并且使得它可以在没有 Ghostscript 和 pdfcrop 的情况下正常工作)

我绘制的MR-FPPI曲线见论文 # 4.5 测试结果与分析

4.4 Model Detection display

详见论文 # 4.6 检测效果展示

5. Web App

详见论文 # 第5章 基于Flask的行人检测应用设计

❗ 🔔 ❗ NOTE: 网站目前仅允许一个客户端访问!!!

5.1 Keras to Darknet

cd "keras2darknet_&_simpleEvaluate"

转换之前,需要先把训练得到的权重文件(trained_weights_final.h5)转整模型文件(trained_model_final.h5)。

当然,需要确保权重文件(3.5 True Train process)在 5. App/keras2darknet_&_simpleEvaluate/model/ 文件夹中,默认的文件名是: trained_weights_final.h5

python keras-yolo3_weights2model.py

运行脚本后,trained_model_final.h5 会出现在在 model/ 文件夹中。

现在就可以转换格式了, model/yolo-person.cfg 修改自 yolov3.cfg,仅仅修改了 anchors 和所有输出特征图最后一层卷积的 filters 以适合这个项目。

python keras2darknet.py

运行脚本后,可以在 model/ 文件夹中得到转换后的 Darknet 格式权重文件(yolov3-keras2darknet.weights)。

对转换后的 Darknet 格式权重文件做一些简单的测试。

将从 2.4 Batch processing 得到的测试集(/data/test)和图片路径+注释文件(test.txt)移进当前目录下(5. App/keras2darknet_&_simpleEvaluate/

python testSet_darknet-out-model_eva.py

testSet_darknet-out-model_eva.py4. Evaluate/testSet_eva.py 几乎完全相同。 唯一的区别是 testSet_darknet-out-model_eva.py 使用 yolov3_opencv_dnn_detect.py 预测边界框,但是它们的接口都是一样的。

对于转换后的 Darknet 格式权重文件的简单测试结果详见论文 # 5.1 应用简述,或者直接看下面的对比表格。

Test Images: 10693

speed: max=2.02s, min=0.98s, average=1.47s ≈ 0.68fps

quality:

At the level of 10693 images.

correct error missing Error&Missing
Keras 8234(77%) 1545(14%) 1798(17%) 884(8%)
Darknet 8206(77%) 1579(15%) 1840(17%) 932(9%)

At the level of bounding-box. Ground Truth: 16820, Predictions bounding-boxes: 15183, Good: 12101.

Precision Recall Error Rate Miss Rate
Keras 79.28% 72.29% 20.72% 27.72%
Darknet 79.70% 71.94% 20.30% 28.06%

5.2 Flask Web server

cd server

在运行之前,你需要确保从 5.1 Keras to Darknet 获得的模型权重文件在 5. App/server/model/ 文件夹中,默认文件名:yolov3-keras2darknet.weights

PS:

  1. 我也提供了 Keras 检测文件 keras_yolov3_detect.py。如果你想用 Keras 进行行人检测,请先确保从 3.5 True Train process 得到的模型权重文件在 5. App/server/model/ 文件夹中,默认文件名:trained_weights_final.h5 并将 config.ini 中的 detection_methoddarknet 修改为 keras
  2. 如果你想直接运行而不进行行人检测,请将 config.ini 中的 detect_persontrue 修改为 false

运行服务

python runserver.py

使用 IP:port(xx.xx.xx.xx:5000) 或者直接 localhost:5000 访问这个 web app。

PS: 如果你使用 IP:port 访问, 你可能需要添加你的 IPip_white_list.yml 中,或者直接将 config.ini 中的 use_ip_white_list 修改为 false

网站应用四种功能的详细介绍分析请见论文 # 第5章 基于Flask的行人检测应用设计

6. Summary

这个项目的代码和 README 前前后后加起来整理了两周。

本项目在基于 YOLOv3 对行人检测进行研究的时候,参考很多其他人的代码,在此深表谢意。无论是 数据转换、 Keras-训练 还是 模型评估网站应用,我都尽我所能做到最好了,并且它们一同构成了我这 3 个月的人生。

大学即将结束,我也将迎来新的人生,在这里祝自己前程似锦~~