Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
models
提交
bd97b39c
M
models
项目概览
PaddlePaddle
/
models
1 年多 前同步成功
通知
226
Star
6828
Fork
2962
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
602
列表
看板
标记
里程碑
合并请求
255
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
models
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
602
Issue
602
列表
看板
标记
里程碑
合并请求
255
合并请求
255
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
bd97b39c
编写于
4月 11, 2018
作者:
W
wanghaoshuang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix som issues:
1. Remove unused arguments. 2. Refine doc. 3. Change 'device' to 'use_gpu'.
上级
f67e732f
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
77 addition
and
59 deletion
+77
-59
fluid/ocr_recognition/README.md
fluid/ocr_recognition/README.md
+27
-18
fluid/ocr_recognition/ctc_train.py
fluid/ocr_recognition/ctc_train.py
+26
-22
fluid/ocr_recognition/eval.py
fluid/ocr_recognition/eval.py
+13
-11
fluid/ocr_recognition/images/train.jpg
fluid/ocr_recognition/images/train.jpg
+0
-0
fluid/ocr_recognition/inference.py
fluid/ocr_recognition/inference.py
+11
-8
未找到文件。
fluid/ocr_recognition/README.md
浏览文件 @
bd97b39c
[toc]
运行本目录下的程序示例需要使用PaddlePaddle
v0.11.0
版本。如果您的PaddlePaddle安装版本低于此要求,请按照安装文档中的说明更新PaddlePaddle安装版本。
运行本目录下的程序示例需要使用PaddlePaddle
develop最新
版本。如果您的PaddlePaddle安装版本低于此要求,请按照安装文档中的说明更新PaddlePaddle安装版本。
# Optical Character Recognition
...
...
@@ -108,22 +108,16 @@ data/test_images/00003.jpg
#### 1.2 训练
Train on one GPU with defalut trainning data
:
使用默认数据在GPU单卡上训练
:
```
env CUDA_VISIABLE_DEVICES=0 python ctc_train.py \
--device=0 \
--parallel=False \
--batch_size=32
env CUDA_VISIABLE_DEVICES=0 python ctc_train.py
```
Train on multi-GPU with defalut trainning data
:
使用默认数据在GPU多卡上训练
:
```
env CUDA_VISIABLE_DEVICES=0,1,2,3 python ctc_train.py \
--device=0 \
--parallel=True \
--batch_size=128
env CUDA_VISIABLE_DEVICES=0,1,2,3 python ctc_train.py --parallel=True
```
执行
`python ctc_train.py --help`
可查看更多使用方式和参数详细说明。
...
...
@@ -137,7 +131,7 @@ env CUDA_VISIABLE_DEVICES=0,1,2,3 python ctc_train.py \
### 1.3
Evaluate
### 1.3
评估
通过以下命令调用评估脚本用指定数据集对模型进行评估:
...
...
@@ -146,25 +140,40 @@ env CUDA_VISIBLE_DEVICE=0 python eval.py \
--model_path="./models/model_0" \
--input_images_dir="./eval_data/images/" \
--input_images_list="./eval_data/eval_list\" \
--device 0
```
执行
`python ctc_train.py --help`
可查看参数详细说明。
### 1.4
Inference
### 1.4
预测
Read image path from stdin and inference
:
从标准输入读取一张图片的路径,并对齐进行预测
:
```
env CUDA_VISIBLE_DEVICE=0 python inference.py \
--model_path
models/model_00044_15000
--model_path
="models/model_00044_15000"
```
Read image path from list file and inference:
执行上述命令进行预测的效果如下:
```
----------- Configuration Arguments -----------
use_gpu: True
input_images_dir: None
input_images_list: None
model_path: /home/work/models/fluid/ocr_recognition/models/model_00052_15000
------------------------------------------------
Init model from: /home/work/models/fluid/ocr_recognition/models/model_00052_15000.
Please input the path of image: /home/work/models/fluid/ocr_recognition/data/test_images/00001_0060.jpg
result: [3298 2371 4233 6514 2378 3298 2363]
Please input the path of image: /home/work/models/fluid/ocr_recognition/data/test_images/00001_0429.jpg
result: [2067 2067 8187 8477 5027 7191 2431 1462]
```
从文件中批量读取图片路径,并对其进行预测:
```
env CUDA_VISIBLE_DEVICE=0 python inference.py \
--model_path=
models/model_00044_15000
\
--model_path=
"models/model_00044_15000"
\
--input_images_list="data/test.list"
```
fluid/ocr_recognition/ctc_train.py
浏览文件 @
bd97b39c
...
...
@@ -21,12 +21,9 @@ add_arg('save_model_dir', str, "./models", "The directory the model to be s
add_arg
(
'init_model'
,
str
,
None
,
"The init model file of directory."
)
add_arg
(
'learning_rate'
,
float
,
1.0e-3
,
"Learning rate."
)
add_arg
(
'l2'
,
float
,
0.0004
,
"L2 regularizer."
)
add_arg
(
'max_clip'
,
float
,
10.0
,
"Max clip threshold."
)
add_arg
(
'min_clip'
,
float
,
-
10.0
,
"Min clip threshold."
)
add_arg
(
'momentum'
,
float
,
0.9
,
"Momentum."
)
add_arg
(
'rnn_hidden_size'
,
int
,
200
,
"Hidden size of rnn layers."
)
add_arg
(
'device'
,
int
,
0
,
"Device id.'-1' means running on CPU"
"while '0' means GPU-0."
)
add_arg
(
'use_gpu'
,
bool
,
True
,
"Whether use GPU to train."
)
add_arg
(
'min_average_window'
,
int
,
10000
,
"Min average window."
)
add_arg
(
'max_average_window'
,
int
,
15625
,
"Max average window. It is proposed to be set as the number of minibatch in a pass."
)
add_arg
(
'average_window'
,
float
,
0.15
,
"Average window."
)
...
...
@@ -41,31 +38,33 @@ add_arg('test_list', str, None, "The list file of training images."
"None means using the default test_list file of reader."
)
add_arg
(
'num_classes'
,
int
,
None
,
"The number of classes."
"None means using the default num_classes from reader."
)
# yapf:
dis
able
# yapf:
en
able
def
train
(
args
,
data_reader
=
ctc_reader
):
"""OCR CTC training"""
num_classes
=
data_reader
.
num_classes
()
if
args
.
num_classes
is
None
else
args
.
num_classes
num_classes
=
data_reader
.
num_classes
(
)
if
args
.
num_classes
is
None
else
args
.
num_classes
data_shape
=
data_reader
.
data_shape
()
# define network
images
=
fluid
.
layers
.
data
(
name
=
'pixel'
,
shape
=
data_shape
,
dtype
=
'float32'
)
label
=
fluid
.
layers
.
data
(
name
=
'label'
,
shape
=
[
1
],
dtype
=
'int32'
,
lod_level
=
1
)
sum_cost
,
error_evaluator
,
inference_program
,
model_average
=
ctc_train_net
(
images
,
label
,
args
,
num_classes
)
label
=
fluid
.
layers
.
data
(
name
=
'label'
,
shape
=
[
1
],
dtype
=
'int32'
,
lod_level
=
1
)
sum_cost
,
error_evaluator
,
inference_program
,
model_average
=
ctc_train_net
(
images
,
label
,
args
,
num_classes
)
# data reader
train_reader
=
data_reader
.
train
(
args
.
batch_size
,
train_images_dir
=
args
.
train_images
,
train_list_file
=
args
.
train_list
)
args
.
batch_size
,
train_images_dir
=
args
.
train_images
,
train_list_file
=
args
.
train_list
)
test_reader
=
data_reader
.
test
(
test_images_dir
=
args
.
test_images
,
test_list_file
=
args
.
test_list
)
test_images_dir
=
args
.
test_images
,
test_list_file
=
args
.
test_list
)
# prepare environment
place
=
fluid
.
CPUPlace
()
if
args
.
device
>=
0
:
place
=
fluid
.
CUDAPlace
(
args
.
device
)
if
args
.
use_gpu
:
place
=
fluid
.
CUDAPlace
(
0
)
exe
=
fluid
.
Executor
(
place
)
exe
.
run
(
fluid
.
default_startup_program
())
...
...
@@ -74,8 +73,8 @@ def train(args, data_reader=ctc_reader):
model_dir
=
args
.
init_model
model_file_name
=
None
if
not
os
.
path
.
isdir
(
args
.
init_model
):
model_dir
=
os
.
path
.
dirname
(
args
.
init_model
)
model_file_name
=
os
.
path
.
basename
(
args
.
init_model
)
model_dir
=
os
.
path
.
dirname
(
args
.
init_model
)
model_file_name
=
os
.
path
.
basename
(
args
.
init_model
)
fluid
.
io
.
load_params
(
exe
,
dirname
=
model_dir
,
filename
=
model_file_name
)
print
"Init model from: %s."
%
args
.
init_model
...
...
@@ -95,15 +94,17 @@ def train(args, data_reader=ctc_reader):
# training log
if
batch_id
%
args
.
log_period
==
0
:
print
"
\n
Time: %s; Pass[%d]-batch[%d]; Avg Warp-CTC loss: %s; Avg seq error: %s."
%
(
time
.
time
(),
pass_id
,
batch_id
,
total_loss
/
(
batch_id
*
args
.
batch_size
),
total_seq_error
/
(
batch_id
*
args
.
batch_size
))
time
.
time
(),
pass_id
,
batch_id
,
total_loss
/
(
batch_id
*
args
.
batch_size
),
total_seq_error
/
(
batch_id
*
args
.
batch_size
))
sys
.
stdout
.
flush
()
# evaluate
if
batch_id
%
args
.
eval_period
==
0
:
with
model_average
.
apply
(
exe
):
error_evaluator
.
reset
(
exe
)
for
data
in
test_reader
():
exe
.
run
(
inference_program
,
feed
=
get_feeder_data
(
data
,
place
))
exe
.
run
(
inference_program
,
feed
=
get_feeder_data
(
data
,
place
))
_
,
test_seq_error
=
error_evaluator
.
eval
(
exe
)
print
"
\n
Time: %s; Pass[%d]-batch[%d]; Test seq error: %s.
\n
"
%
(
...
...
@@ -112,8 +113,10 @@ def train(args, data_reader=ctc_reader):
if
batch_id
%
args
.
save_model_period
==
0
:
with
model_average
.
apply
(
exe
):
filename
=
"model_%05d_%d"
%
(
pass_id
,
batch_id
)
fluid
.
io
.
save_params
(
exe
,
dirname
=
args
.
save_model_dir
,
filename
=
filename
)
print
"Saved model to: %s/%s."
%
(
args
.
save_model_dir
,
filename
)
fluid
.
io
.
save_params
(
exe
,
dirname
=
args
.
save_model_dir
,
filename
=
filename
)
print
"Saved model to: %s/%s."
%
(
args
.
save_model_dir
,
filename
)
batch_id
+=
1
...
...
@@ -123,5 +126,6 @@ def main():
print_arguments
(
args
)
train
(
args
,
data_reader
=
ctc_reader
)
if
__name__
==
"__main__"
:
main
()
fluid/ocr_recognition/eval.py
浏览文件 @
bd97b39c
...
...
@@ -14,8 +14,8 @@ add_arg = functools.partial(add_arguments, argparser=parser)
add_arg
(
'model_path'
,
str
,
None
,
"The model path to be used for inference."
)
add_arg
(
'input_images_dir'
,
str
,
None
,
"The directory of images."
)
add_arg
(
'input_images_list'
,
str
,
None
,
"The list file of images."
)
add_arg
(
'
device'
,
int
,
0
,
"Device id.'-1' means running on CPU
"
)
# yapf:
dis
able
add_arg
(
'
use_gpu'
,
bool
,
True
,
"Whether use GPU to eval.
"
)
# yapf:
en
able
def
evaluate
(
args
,
eval
=
ctc_eval
,
data_reader
=
ctc_reader
):
...
...
@@ -29,12 +29,14 @@ def evaluate(args, eval=ctc_eval, data_reader=ctc_reader):
evaluator
,
cost
=
eval
(
images
,
label
,
num_classes
)
# data reader
test_reader
=
data_reader
.
test
(
test_images_dir
=
args
.
input_images_dir
,
test_list_file
=
args
.
input_images_list
)
test_reader
=
data_reader
.
test
(
test_images_dir
=
args
.
input_images_dir
,
test_list_file
=
args
.
input_images_list
)
# prepare environment
place
=
fluid
.
CPUPlace
()
if
args
.
device
>=
0
:
place
=
fluid
.
CUDAPlace
(
args
.
device
)
if
use_gpu
:
place
=
fluid
.
CUDAPlace
(
0
)
exe
=
fluid
.
Executor
(
place
)
exe
.
run
(
fluid
.
default_startup_program
())
...
...
@@ -43,8 +45,8 @@ def evaluate(args, eval=ctc_eval, data_reader=ctc_reader):
model_dir
=
args
.
model_path
model_file_name
=
None
if
not
os
.
path
.
isdir
(
args
.
model_path
):
model_dir
=
os
.
path
.
dirname
(
args
.
model_path
)
model_file_name
=
os
.
path
.
basename
(
args
.
model_path
)
model_dir
=
os
.
path
.
dirname
(
args
.
model_path
)
model_file_name
=
os
.
path
.
basename
(
args
.
model_path
)
fluid
.
io
.
load_params
(
exe
,
dirname
=
model_dir
,
filename
=
model_file_name
)
print
"Init model from: %s."
%
args
.
model_path
...
...
@@ -52,11 +54,11 @@ def evaluate(args, eval=ctc_eval, data_reader=ctc_reader):
count
=
0
for
data
in
test_reader
():
count
+=
1
exe
.
run
(
fluid
.
default_main_program
(),
feed
=
get_feeder_data
(
data
,
place
))
exe
.
run
(
fluid
.
default_main_program
(),
feed
=
get_feeder_data
(
data
,
place
))
avg_distance
,
avg_seq_error
=
evaluator
.
eval
(
exe
)
print
"Read %d samples; avg_distance: %s; avg_seq_error: %s"
%
(
count
,
avg_distance
,
avg_seq_error
)
print
"Read %d samples; avg_distance: %s; avg_seq_error: %s"
%
(
count
,
avg_distance
,
avg_seq_error
)
def
main
():
args
=
parser
.
parse_args
()
...
...
fluid/ocr_recognition/images/train.jpg
0 → 100644
浏览文件 @
bd97b39c
30.2 KB
fluid/ocr_recognition/inference.py
浏览文件 @
bd97b39c
...
...
@@ -14,8 +14,9 @@ add_arg = functools.partial(add_arguments, argparser=parser)
add_arg
(
'model_path'
,
str
,
None
,
"The model path to be used for inference."
)
add_arg
(
'input_images_dir'
,
str
,
None
,
"The directory of images."
)
add_arg
(
'input_images_list'
,
str
,
None
,
"The list file of images."
)
add_arg
(
'device'
,
int
,
0
,
"Device id.'-1' means running on CPU"
)
# yapf: disable
add_arg
(
'use_gpu'
,
bool
,
True
,
"Whether use GPU to infer."
)
# yapf: enable
def
inference
(
args
,
infer
=
ctc_infer
,
data_reader
=
ctc_reader
):
"""OCR inference"""
...
...
@@ -25,11 +26,13 @@ def inference(args, infer=ctc_infer, data_reader=ctc_reader):
images
=
fluid
.
layers
.
data
(
name
=
'pixel'
,
shape
=
data_shape
,
dtype
=
'float32'
)
sequence
=
infer
(
images
,
num_classes
)
# data reader
infer_reader
=
data_reader
.
inference
(
infer_images_dir
=
args
.
input_images_dir
,
infer_list_file
=
args
.
input_images_list
)
infer_reader
=
data_reader
.
inference
(
infer_images_dir
=
args
.
input_images_dir
,
infer_list_file
=
args
.
input_images_list
)
# prepare environment
place
=
fluid
.
CPUPlace
()
if
args
.
device
>=
0
:
place
=
fluid
.
CUDAPlace
(
args
.
device
)
if
use_gpu
:
place
=
fluid
.
CUDAPlace
(
0
)
exe
=
fluid
.
Executor
(
place
)
exe
.
run
(
fluid
.
default_startup_program
())
...
...
@@ -38,12 +41,11 @@ def inference(args, infer=ctc_infer, data_reader=ctc_reader):
model_dir
=
args
.
model_path
model_file_name
=
None
if
not
os
.
path
.
isdir
(
args
.
model_path
):
model_dir
=
os
.
path
.
dirname
(
args
.
model_path
)
model_file_name
=
os
.
path
.
basename
(
args
.
model_path
)
model_dir
=
os
.
path
.
dirname
(
args
.
model_path
)
model_file_name
=
os
.
path
.
basename
(
args
.
model_path
)
fluid
.
io
.
load_params
(
exe
,
dirname
=
model_dir
,
filename
=
model_file_name
)
print
"Init model from: %s."
%
args
.
model_path
for
data
in
infer_reader
():
result
=
exe
.
run
(
fluid
.
default_main_program
(),
feed
=
get_feeder_data
(
...
...
@@ -58,5 +60,6 @@ def main():
print_arguments
(
args
)
inference
(
args
,
data_reader
=
ctc_reader
)
if
__name__
==
"__main__"
:
main
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录