提交 bd97b39c 编写于 作者: W wanghaoshuang

Fix som issues:

1. Remove unused  arguments.
2. Refine doc.
3. Change 'device' to 'use_gpu'.
上级 f67e732f

[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"
```
......@@ -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: disable
# yapf: enable
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 "\nTime: %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 "\nTime: %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()
......@@ -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: disable
add_arg('use_gpu', bool, True, "Whether use GPU to eval.")
# yapf: enable
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()
......
......@@ -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.
先完成此消息的编辑!
想要评论请 注册