From 431712ad907a45a50ba3ca585c25f3ee1ff63df4 Mon Sep 17 00:00:00 2001 From: tink2123 Date: Fri, 22 Feb 2019 16:12:22 +0800 Subject: [PATCH] add train_loss and eval_result --- fluid/PaddleCV/yolov3/README.md | 24 +++++++++++++----- fluid/PaddleCV/yolov3/README_cn.md | 27 +++++++++++++++++---- fluid/PaddleCV/yolov3/image/train_loss.png | Bin 0 -> 17171 bytes 3 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 fluid/PaddleCV/yolov3/image/train_loss.png diff --git a/fluid/PaddleCV/yolov3/README.md b/fluid/PaddleCV/yolov3/README.md index e1f02734..2c78463f 100644 --- a/fluid/PaddleCV/yolov3/README.md +++ b/fluid/PaddleCV/yolov3/README.md @@ -99,8 +99,8 @@ To train the model, [cocoapi](https://github.com/cocodataset/cocoapi) is needed. Training result is shown as below:

-
-YOLOv3 +
+Train Loss

## Evaluation @@ -116,10 +116,22 @@ Evaluation is to evaluate the performance of a trained model. This sample provid - Set ```export CUDA_VISIBLE_DEVICES=0``` to specifiy one GPU to eval. Evalutaion result is shown as below: -

-
-YOLOv3 mAP -

+ +```text + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.370 + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.581 + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.401 + Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.236 + Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.403 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.480 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.297 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.450 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.466 + Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.309 + Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.500 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.586 + +``` ## Inference and Visualization diff --git a/fluid/PaddleCV/yolov3/README_cn.md b/fluid/PaddleCV/yolov3/README_cn.md index c764f099..96609be4 100644 --- a/fluid/PaddleCV/yolov3/README_cn.md +++ b/fluid/PaddleCV/yolov3/README_cn.md @@ -98,6 +98,11 @@ YOLOv3 的网络结构由基础特征提取网络、multi-scale特征融合层 * 采用momentum优化算法训练YOLOv3,momentum=0.9。 * 学习率采用warmup算法,前1000轮学习率从0.0线性增加至0.01。在400000,450000轮时使用0.1,0.1乘子进行学习率衰减,最大训练500000轮。 +下图为模型训练结果: +

+
+Train Loss +

## 模型评估 @@ -111,11 +116,23 @@ YOLOv3 的网络结构由基础特征提取网络、multi-scale特征融合层 - 通过设置export CUDA\_VISIBLE\_DEVICES=0指定单卡GPU评估。 -下图为模型评估结果: -

-
-YOLOv3 -

+模型评估结果: + +```text + Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.370 + Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.581 + Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.401 + Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.236 + Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.403 + Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.480 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.297 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.450 + Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.466 + Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.309 + Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.500 + Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.586 + +``` ## 模型推断及可视化 diff --git a/fluid/PaddleCV/yolov3/image/train_loss.png b/fluid/PaddleCV/yolov3/image/train_loss.png new file mode 100644 index 0000000000000000000000000000000000000000..f16728e95d781d996639a35b54a944e91af6b640 GIT binary patch literal 17171 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 l_aV