Giter Club home page Giter Club logo

paddlepaddle / paddleocr Goto Github PK

View Code? Open in Web Editor NEW
41.2K 435.0 7.5K 346.9 MB

Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)

License: Apache License 2.0

Python 73.38% Makefile 0.24% C++ 15.25% Shell 6.22% CMake 0.51% Dockerfile 0.09% Java 3.10% Cython 0.07% C 0.42% Cuda 0.43% HTML 0.01% JavaScript 0.18% C# 0.09%
ocr crnn ocrlite db chineseocr

paddleocr's Introduction

English | 简体中文 | हिन्दी | 日本語 | 한국인 | Pу́сский язы́к

Chat

简介

PaddleOCR 旨在打造一套丰富、领先、且实用的 OCR 工具库,助力开发者训练出更好的模型,并应用落地。

🚀 社区

PaddleOCR 由 PMC 监督。Issues 和 PRs 将在尽力的基础上进行审查。欲了解 PaddlePaddle 社区的完整概况,请访问 community

⚠️注意:Issues模块仅用来报告程序🐞Bug,其余提问请移步Discussions模块提问。如所提Issue不是Bug,会被移到Discussions模块,敬请谅解。

📣 近期更新

  • 🔥2024.7 添加 PaddleOCR 算法模型挑战赛冠军方案

  • 💥2024.6.27 飞桨低代码开发工具 PaddleX 3.0 重磅更新!

    • 低代码开发范式:支持 OCR 模型全流程低代码开发,提供 Python API,支持用户自定义串联模型;
    • 多硬件训推支持:支持英伟达 GPU、昆仑芯、昇腾和寒武纪等多种硬件进行模型训练与推理。PaddleOCR支持的模型见 模型列表
  • 📚直播和OCR实战打卡营预告:《PP-ChatOCRv2赋能金融报告信息智能化抽取,新金融效率再升级》课程上线,破解复杂版面、表格识别、信息抽取OCR解析难题,直播时间:6月6日(周四)19:00。并于6月11日启动【政务采购合同信息抽取】实战打卡营。报名链接:https://www.wjx.top/vm/eBcYmqO.aspx?udsid=197406

  • 🔥2024.5.10 上线星河零代码产线(OCR 相关):全面覆盖了以下四大 OCR 核心任务,提供极便捷的 Badcase 分析和实用的在线体验:

    同时采用了 全新的场景任务开发范式 ,将模型统一汇聚,实现训练部署的零代码开发,并支持在线服务化部署和导出离线服务化部署包。

  • 🔥2023.8.7 发布 PaddleOCR release/2.7

    • 发布PP-OCRv4,提供 mobile 和 server 两种模型
      • PP-OCRv4-mobile:速度可比情况下,中文场景效果相比于 PP-OCRv3 再提升 4.5%,英文场景提升 10%,80 语种多语言模型平均识别准确率提升 8%以上
      • PP-OCRv4-server:发布了目前精度最高的 OCR 模型,中英文场景上检测模型精度提升 4.9%, 识别模型精度提升 2% 可参考快速开始 一行命令快速使用,同时也可在飞桨 AI 套件(PaddleX)中的通用 OCR 产业方案中低代码完成模型训练、推理、高性能部署全流程
  • 🔨2022.11 新增实现4 种前沿算法:文本检测 DRRG, 文本识别 RFL, 文本超分Text Telescope,公式识别CAN

  • 2022.10 优化JS 版 PP-OCRv3 模型:模型大小仅 4.3M,预测速度提升 8 倍,配套 web demo 开箱即用

  • 💥 直播回放:PaddleOCR 研发团队详解 PP-StructureV2 优化策略。微信扫描下方二维码,关注公众号并填写问卷后进入官方交流群,获取直播回放链接与 20G 重磅 OCR 学习大礼包(内含 PDF 转 Word 应用程序、10 种垂类模型、《动手学 OCR》电子书等)

  • 🔥2022.8.24 发布 PaddleOCR release/2.6

    • 发布PP-StructureV2,系统功能性能全面升级,适配中文场景,新增支持版面复原,支持一行命令完成 PDF 转 Word
    • 版面分析模型优化:模型存储减少 95%,速度提升 11 倍,平均 CPU 耗时仅需 41ms;
    • 表格识别模型优化:设计 3 大优化策略,预测耗时不变情况下,模型精度提升 6%;
    • 关键信息抽取模型优化:设计视觉无关模型结构,语义实体识别精度提升 2.8%,关系抽取精度提升 9.1%。
  • 🔥2022.8 发布 OCR 场景应用集合:包含数码管、液晶屏、车牌、高精度 SVTR 模型、手写体识别等9 个垂类模型,覆盖通用,制造、金融、交通行业的主要 OCR 垂类应用。

更多

🌟 特性

支持多种 OCR 相关前沿算法,在此基础上打造产业级特色模型PP-OCRPP-StructurePP-ChatOCRv2,并打通数据生产、模型训练、压缩、预测部署全流程。

上述内容的使用方法建议从文档教程中的快速开始体验

⚡ 快速开始

📖 技术交流合作

📚《动手学 OCR》电子书

🛠️ PP-OCR 系列模型列表(更新中)

模型简介 模型名称 推荐场景 检测模型 方向分类器 识别模型
中英文超轻量 PP-OCRv4 模型(15.8M) ch_PP-OCRv4_xx 移动端&服务器端 推理模型 / 训练模型 推理模型 / 训练模型 推理模型 / 训练模型
中英文超轻量 PP-OCRv3 模型(16.2M) ch_PP-OCRv3_xx 移动端&服务器端 推理模型 / 训练模型 推理模型 / 训练模型 推理模型 / 训练模型
英文超轻量 PP-OCRv3 模型(13.4M) en_PP-OCRv3_xx 移动端&服务器端 推理模型 / 训练模型 推理模型 / 训练模型 推理模型 / 训练模型

PaddleOCR 场景应用模型

行业 类别 亮点 文档说明 模型下载
制造 数码管识别 数码管数据合成、漏识别调优 光功率计数码管字符识别 下载链接
金融 通用表单识别 多模态通用表单结构化提取 多模态表单识别 下载链接
交通 车牌识别 多角度图像处理、轻量模型、端侧部署 轻量级车牌识别 下载链接
  • 更多制造、金融、交通行业的主要 OCR 垂类应用模型(如电表、液晶屏、高精度 SVTR 模型等),可参考场景应用模型下载

📖 文档教程

👀 效果展示 more

PP-OCRv3 中文模型
PP-OCRv3 英文模型
PP-OCRv3 多语言模型
PP-Structure 文档分析
  • 版面分析+表格识别
  • SER(语义实体识别)
  • RE(关系提取)

许可证书

本项目的发布受Apache 2.0 license许可认证。

paddleocr's People

Contributors

an1018 avatar andyjiang1116 avatar beyondyourself avatar bjjwwang avatar cuicheng01 avatar d-danielyang avatar d2623587501 avatar dyning avatar evezerest avatar greatv avatar hysunflower avatar intsigstephon avatar jethong avatar jiaxiao243 avatar ldoublev avatar littletomatodonkey avatar misspenguin avatar peterh0323 avatar smilelite avatar tingquangao avatar tink2123 avatar topdu avatar wangjingyeye avatar wei-jl avatar weisy11 avatar wenmuzhou avatar whjdark avatar xmy0916 avatar zhangxinnan avatar zhiminzhang0830 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

paddleocr's Issues

超轻量模型训练数据

请问超轻量模型的训练数据(中英文数字)是公开的数据集么,还是私有数据集,可以共享么,谢谢

got an unexpected keyword argument 'gradient_clip'

python tools/export_model.py -c configs/det/det_db_mv3.yml -o Global.checkpoints="./output/best_accuracy" Global.save_inference_dir="./inference/det/"

paddlepaddle-gpu只能用这个版本1.7.2.post97吗?
目前是paddlepaddle-gpu 1.8.0.post107

使用rec_chinese_lite_train.yml配置文件训练中文数据集效果不好

我更改了rec_chinese_lite_train.yml配置文件的内容,如下:

Global:
  algorithm: CRNN
  use_gpu: true
  epoch_num: 300
  log_smooth_window: 20
  print_batch_step: 10
  save_model_dir: ./output/rec_CRNN
  save_epoch_step: 3
  eval_batch_step: 2000
  train_batch_size_per_card: 160
  test_batch_size_per_card: 160
  image_shape: [3, 32, 320]
  max_text_length: 25
  character_type: ch
  character_dict_path: ./ppocr/utils/18548.txt
  loss_type: ctc
  reader_yml: ./configs/rec/rec_chinese_reader_csv.yml
  pretrain_weights: ./pretrain_models/rec_mv3_none_bilstm_ctc/best_accuracy
  checkpoints:
  save_inference_dir:
Architecture:
  function: ppocr.modeling.architectures.rec_model,RecModel

Backbone:
  function: ppocr.modeling.backbones.rec_mobilenet_v3,MobileNetV3
  scale: 0.5
  model_name: small

Head:
  function: ppocr.modeling.heads.rec_ctc_head,CTCPredict
  encoder_type: rnn
  SeqRNN:
    hidden_size: 48
    
Loss:
  function: ppocr.modeling.losses.rec_ctc_loss,CTCLoss

Optimizer:
  function: ppocr.optimizer,AdamDecay
  base_lr: 0.0005
  beta1: 0.9
  beta2: 0.999

其实只更改了epoch_num,batch_size,character_dict_path,reader_yml,pretrain_weights这几处,但是迭代了100轮左右,现在的train acc只有0.2左右。我的字符集有18000多个,请问这个轻量级的网络目前来看是不是欠拟合了?因为我发现如果我换成resnet50作为backbone,网络可以训练的不错

Segmentation fault (core dumped)

您好,follow detection.md文档进行ocr训练时,运行训练命令遇到了以下问题,特来请教。
通过FLAGS_selected_gpus 指定显卡 和 修改train.py里面的place = fluid.CUDAPlace(3) if use_gpu else fluid.CPUPlace()运行训练都会出现这个问题。
运行use_gpu=False也出现了下面的问题。
FLAGS_selected_gpus=3 && python3 tools/train.py -c configs/det/det_mv3_db.yml -o Optimizer.base_lr=0.0001
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
2020-05-18 09:29:29,797-INFO: {'Architecture': {'function': 'ppocr.modeling.architectures.det_model,DetModel'}, 'TestReader': {'reader_function': 'ppocr.data.det.dataset_traversal,EvalTestReader', 'single_img_path': None, 'img_set_dir': './train_data/icdar2015/text_localization/', 'label_file_path': './train_data/icdar2015/text_localization/test_icdar2015_label.txt', 'test_image_shape': [736, 1280], 'process_function': 'ppocr.data.det.db_process,DBProcessTest', 'do_eval': True}, 'Backbone': {'function': 'ppocr.modeling.backbones.det_mobilenet_v3,MobileNetV3', 'model_name': 'large', 'scale': 0.5}, 'Head': {'k': 50, 'function': 'ppocr.modeling.heads.det_db_head,DBHead', 'inner_channels': 96, 'model_name': 'large', 'out_channels': 2}, 'Optimizer': {'beta1': 0.9, 'function': 'ppocr.optimizer,AdamDecay', 'base_lr': 0.0001, 'beta2': 0.999}, 'EvalReader': {'test_image_shape': [736, 1280], 'reader_function': 'ppocr.data.det.dataset_traversal,EvalTestReader', 'img_set_dir': './train_data/icdar2015/text_localization/', 'process_function': 'ppocr.data.det.db_process,DBProcessTest', 'label_file_path': './train_data/icdar2015/text_localization/test_icdar2015_label.txt'}, 'Loss': {'function': 'ppocr.modeling.losses.det_db_loss,DBLoss', 'balance_loss': True, 'beta': 10, 'alpha': 5, 'ohem_ratio': 3, 'main_loss_type': 'DiceLoss'}, 'TrainReader': {'reader_function': 'ppocr.data.det.dataset_traversal,TrainReader', 'num_workers': 8, 'img_set_dir': './train_data/icdar2015/text_localization/', 'process_function': 'ppocr.data.det.db_process,DBProcessTrain', 'label_file_path': './train_data/icdar2015/text_localization/train_icdar2015_label.txt'}, 'PostProcess': {'unclip_ratio': 1.5, 'max_candidates': 1000, 'function': 'ppocr.postprocess.db_postprocess,DBPostProcess', 'thresh': 0.3, 'box_thresh': 0.7}, 'Global': {'save_epoch_step': 200, 'save_inference_dir': None, 'eval_batch_step': 5000, 'log_smooth_window': 20, 'algorithm': 'DB', 'epoch_num': 1200, 'use_gpu': True, 'train_batch_size_per_card': 16, 'image_shape': [3, 640, 640], 'save_model_dir': './output/det_db/', 'save_res_path': './output/det_db/predicts_db.txt', 'checkpoints': None, 'pretrain_weights': './pretrain_models/MobileNetV3_large_x0_5_pretrained/', 'test_batch_size_per_card': 16, 'reader_yml': './configs/det/det_db_icdar15_reader.yml', 'print_batch_step': 2}}
3 640 640
3 640 640
import ujson error: No module named 'ujson' use json
2020-05-18 09:29:33,067-INFO: places would be ommited when DataLoader is not iterable
W0518 09:29:33.928460 5607 device_context.cc:237] Please NOTE: device: 3, CUDA Capability: 75, Driver API Version: 10.2, Runtime API Version: 10.0
W0518 09:29:33.932370 5607 device_context.cc:245] device: 3, cuDNN Version: 7.5.
W0518 09:29:33.932396 5607 device_context.cc:271] WARNING: device: 3. The installed Paddle is compiled with CUDNN 7.6, but CUDNN version in your machine is 7.5, which may cause serious incompatible bug. Please recompile or reinstall Paddle with compatible CUDNN version.
2020-05-18 09:29:35,015-INFO: Loading parameters from ./pretrain_models/MobileNetV3_large_x0_5_pretrained/...
2020-05-18 09:29:35,015-WARNING: ./pretrain_models/MobileNetV3_large_x0_5_pretrained/.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ]
2020-05-18 09:29:35,015-WARNING: ./pretrain_models/MobileNetV3_large_x0_5_pretrained/.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ]
2020-05-18 09:29:35,206-INFO: Finish initing model from ./pretrain_models/MobileNetV3_large_x0_5_pretrained/
I0518 09:29:35.251972 5607 parallel_executor.cc:440] The Program will be executed on CUDA using ParallelExecutor, 8 cards are used, so 8 programs are executed in parallel.
W0518 09:29:48.223284 5607 init.cc:209] Warning: PaddlePaddle catches a failure signal, it may not work properly
W0518 09:29:48.223331 5607 init.cc:211] You could check whether you killed PaddlePaddle thread/process accidentally or report the case to PaddlePaddle
W0518 09:29:48.223345 5607 init.cc:214] The detail failure signal is:

predict_system.py --det_algorithm EAST

Traceback (most recent call last):
File "/projects/python/PaddleOCR/tools/infer/predict_system.py", line 115, in
dt_boxes, rec_res = text_sys(img)
File "/projects/python/PaddleOCR/tools/infer/predict_system.py", line 67, in call
dt_boxes, elapse = self.text_detector(img)
File "/projects/python/PaddleOCR/tools/infer/predict_det.py", line 143, in call
outs_dict['f_geo'] = outputs[1]
IndexError: list index out of range

报错

Traceback (most recent call last):
File "tools/infer/predict_system.py", line 15, in
import utility
File "PaddleOCR/tools/infer/utility.py", line 17, in
from ppocr.utils.utility import initial_logger
ModuleNotFoundError: No module named 'ppocr'

导出识别模型时都是 KeyError: 'predict'

paddlepaddle-gpu 1.7.2.post107
PaddleOCR 3b40c32

python tools/export_model.py -c configs/rec/rec_r34_vd_tps_bilstm_attn.yml -o Global.checkpoints="./output/rec/rec_r34_vd_tps_bilstm_attn/best_accuracy" Global.save_inference_dir="./inference/rec/rec_r34_vd_tps_bilstm_attn"

python tools/export_model.py -c configs/rec/rec_mv3_tps_bilstm_attn.yml -o Global.checkpoints="./output/rec/rec_mv3_tps_bilstm_attn/best_accuracy" Global.save_inference_dir="./inference/rec/rec_mv3_tps_bilstm_attn"

Traceback (most recent call last):
  File "tools/export_model.py", line 94, in <module>
    main()
  File "tools/export_model.py", line 68, in main
    config, eval_program, startup_prog)
  File "PaddleOCR\tools\program.py", line 193, in build_export
    image, outputs = model(mode='export')
  File "PaddleOCR\ppocr\modeling\architectures\rec_model.py", line 112
, in __call__
    predict = predicts['predict']
KeyError: 'predict'

rec_r34_vd_tps_bilstm_attn模型转inference模型失败,请问是什么问题?

运行命令:
python3 tools/export_model.py -c configs/rec/rec_r34_vd_tps_bilstm_attn.yml -o Global.checkpoints=./ch_lite/rec_r34_vd_tps_bilstm_attn/best_accuracy Global.save_inference_dir=./inference_model/rec_r34/

出现报错:
Traceback (most recent call last):
File "tools/export_model.py", line 93, in
main()
File "tools/export_model.py", line 67, in main
config, eval_program, startup_prog)
File "/root/PaddleOCR-develop/tools/program.py", line 193, in build_export
image, outputs = model(mode='export')
File "/root/PaddleOCR-develop/ppocr/modeling/architectures/rec_model.py", line 112, in call
predict = predicts['predict']
KeyError: 'predict'

PaddlePaddle CPU版本,det_mv3_db.yml中use_gpu修改为false后仍报错

(PaddlePaddle) xx@MacBook-Pro PaddleOCR % python3 tools/train.py -c configs/det/det_mv3_db.yml
2020-05-17 10:05:23,320-INFO: {'Global': {'algorithm': 'DB', 'use_gpu': False, 'epoch_num': 1200, 'log_smooth_window': 20, 'print_batch_step': 2, 'save_model_dir': './output/det_db/', 'save_epoch_step': 200, 'eval_batch_step': 5000, 'train_batch_size_per_card': 16, 'test_batch_size_per_card': 16, 'image_shape': [3, 640, 640], 'reader_yml': './configs/det/det_db_icdar15_reader.yml', 'pretrain_weights': './pretrain_models/MobileNetV3_large_x0_5_pretrained/', 'checkpoints': None, 'save_res_path': './output/det_db/predicts_db.txt', 'save_inference_dir': None}, 'Architecture': {'function': 'ppocr.modeling.architectures.det_model,DetModel'}, 'Backbone': {'function': 'ppocr.modeling.backbones.det_mobilenet_v3,MobileNetV3', 'scale': 0.5, 'model_name': 'large'}, 'Head': {'function': 'ppocr.modeling.heads.det_db_head,DBHead', 'model_name': 'large', 'k': 50, 'inner_channels': 96, 'out_channels': 2}, 'Loss': {'function': 'ppocr.modeling.losses.det_db_loss,DBLoss', 'balance_loss': True, 'main_loss_type': 'DiceLoss', 'alpha': 5, 'beta': 10, 'ohem_ratio': 3}, 'Optimizer': {'function': 'ppocr.optimizer,AdamDecay', 'base_lr': 0.001, 'beta1': 0.9, 'beta2': 0.999}, 'PostProcess': {'function': 'ppocr.postprocess.db_postprocess,DBPostProcess', 'thresh': 0.3, 'box_thresh': 0.7, 'max_candidates': 1000, 'unclip_ratio': 1.5}, 'TrainReader': {'reader_function': 'ppocr.data.det.dataset_traversal,TrainReader', 'process_function': 'ppocr.data.det.db_process,DBProcessTrain', 'num_workers': 8, 'img_set_dir': './train_data/icdar2015/text_localization/', 'label_file_path': './train_data/icdar2015/text_localization/train_icdar2015_label.txt'}, 'EvalReader': {'reader_function': 'ppocr.data.det.dataset_traversal,EvalTestReader', 'process_function': 'ppocr.data.det.db_process,DBProcessTest', 'img_set_dir': './train_data/icdar2015/text_localization/', 'label_file_path': './train_data/icdar2015/text_localization/test_icdar2015_label.txt', 'test_image_shape': [736, 1280]}, 'TestReader': {'reader_function': 'ppocr.data.det.dataset_traversal,EvalTestReader', 'process_function': 'ppocr.data.det.db_process,DBProcessTest', 'single_img_path': None, 'img_set_dir': './train_data/icdar2015/text_localization/', 'label_file_path': './train_data/icdar2015/text_localization/test_icdar2015_label.txt', 'test_image_shape': [736, 1280], 'do_eval': True}}
2020-05-17 10:05:23,321-ERROR: Config use_gpu cannot be set as true while you are using paddlepaddle cpu version !
Please try:
1. Install paddlepaddle-gpu to run model on GPU
2. Set use_gpu as false in config file to run model on CPU

使用rec_r34_vd_tps_bilstm_ctc模型预测失败,请问如何解决?

开发环境:
win10,conda安装paddlepaddle=1.8。
已经成功生成model和params文件,只是部署预测的时候出了错。

运行predict_system的时候报错如下:
Traceback (most recent call last):
File "E:/jiajun LUO/OCR/PaddleOCR-develop/tools/infer/predict_system.py", line 121, in
dt_boxes, rec_res = text_sys(img)
File "E:/jiajun LUO/OCR/PaddleOCR-develop/tools/infer/predict_system.py", line 81, in call
rec_res, elapse = self.text_recognizer(img_crop_list)
File "E:\jiajun LUO\OCR\PaddleOCR-develop\tools\infer\predict_rec.py", line 81, in call
self.predictor.zero_copy_run()
paddle.fluid.core_avx.EnforceNotMet:


C++ Call Stacks (More useful to developers):

Windows not support stack backtrace yet.


Python Call Stacks (More useful to users):

File "F:\Anaconda3\envs\paddle\lib\site-packages\paddle\fluid\framework.py", line 2610, in append_op
attrs=kwargs.get("attrs", None))
File "F:\Anaconda3\envs\paddle\lib\site-packages\paddle\fluid\layer_helper.py", line 43, in append_op
return self.main_program.current_block().append_op(*args, **kwargs)
File "F:\Anaconda3\envs\paddle\lib\site-packages\paddle\fluid\layers\nn.py", line 13779, in grid_sampler
helper.append_op(type='grid_sampler', inputs=ipts, outputs={'Output': out})
File "E:\jiajun LUO\OCR\PaddleOCR-develop\ppocr\modeling\stns\tps.py", line 259, in call
batch_I_r = layers.grid_sampler(x=image, grid=batch_P_prime)
File "E:\jiajun LUO\OCR\PaddleOCR-develop\ppocr\modeling\architectures\rec_model.py", line 98, in call
inputs = self.tps(image)
File "E:\jiajun LUO\OCR\PaddleOCR-develop\tools\program.py", line 198, in build_export
image, outputs = model(mode='export')
File "E:/jiajun LUO/OCR/PaddleOCR-develop/tools/export_model.py", line 68, in main
config, eval_program, startup_prog)
File "E:/jiajun LUO/OCR/PaddleOCR-develop/tools/export_model.py", line 94, in
main()


Error Message Summary:

InvalidArgumentError: Input(X) dims[3] and Input(Grid) dims[2] should be equal, but received X dimension3 != Grid dimension2
[Hint: Expected grid_dims[2] == x_dims[3], but received grid_dims[2]:100 != x_dims[3]:382.] at (D:\1.8.0cpu2\paddle\paddle\fluid\operators\grid_sampler_op.cc:72)
[operator < grid_sampler > error]

检测模型转inference模型,'use_gpu': False,但仍然转换失败

你好,在检测模型转inference模型时,已修改det_mv3_db.yml 中'use_gpu': False,但仍然报错,如下所示:
python tools/export_model.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./ch_lite/det_mv3_db/best_accuracy Global.save_inference_dir=./inference_model/det_db/
2020-05-19 10:29:59,237-INFO: {'Global': {'algorithm': 'DB', 'use_gpu': False, 'epoch_num': 1200, 'log_smooth_window': 20, 'print_batch_step': 2, 'save_model_dir': './output/det_db/', 'save_epoch_step': 200, 'eval_batch_step': 5000, 'train_batch_size_per_card': 16, 'test_batch_size_per_card': 16, 'image_shape': [3, 640, 640], 'reader_yml': './configs/det/det_db_icdar15_reader.yml', 'pretrain_weights': './pretrain_models/MobileNetV3_large_x0_5_pretrained/', 'checkpoints': './ch_lite/det_mv3_db/best_accuracy', 'save_res_path': './output/det_db/predicts_db.txt', 'save_inference_dir': './inference_model/det_db/'}, 'Architecture': {'function': 'ppocr.modeling.architectures.det_model,DetModel'}, 'Backbone': {'function': 'ppocr.modeling.backbones.det_mobilenet_v3,MobileNetV3', 'scale': 0.5, 'model_name': 'large'}, 'Head': {'function': 'ppocr.modeling.heads.det_db_head,DBHead', 'model_name': 'large', 'k': 50, 'inner_channels': 96, 'out_channels': 2}, 'Loss': {'function': 'ppocr.modeling.losses.det_db_loss,DBLoss', 'balance_loss': True, 'main_loss_type': 'DiceLoss', 'alpha': 5, 'beta': 10, 'ohem_ratio': 3}, 'Optimizer': {'function': 'ppocr.optimizer,AdamDecay', 'base_lr': 0.001, 'beta1': 0.9, 'beta2': 0.999}, 'PostProcess': {'function': 'ppocr.postprocess.db_postprocess,DBPostProcess', 'thresh': 0.3, 'box_thresh': 0.7, 'max_candidates': 1000, 'unclip_ratio': 1.5}, 'TrainReader': {'reader_function': 'ppocr.data.det.dataset_traversal,TrainReader', 'process_function': 'ppocr.data.det.db_process,DBProcessTrain', 'num_workers': 8, 'img_set_dir': './train_data/icdar2015/text_localization/', 'label_file_path': './train_data/icdar2015/text_localization/train_icdar2015_label.txt'}, 'EvalReader': {'reader_function': 'ppocr.data.det.dataset_traversal,EvalTestReader', 'process_function': 'ppocr.data.det.db_process,DBProcessTest', 'img_set_dir': './train_data/icdar2015/text_localization/', 'label_file_path': './train_data/icdar2015/text_localization/test_icdar2015_label.txt', 'test_image_shape': [736, 1280]}, 'TestReader': {'reader_function': 'ppocr.data.det.dataset_traversal,EvalTestReader', 'process_function': 'ppocr.data.det.db_process,DBProcessTest', 'single_img_path': None, 'img_set_dir': './train_data/icdar2015/text_localization/', 'label_file_path': './train_data/icdar2015/text_localization/test_icdar2015_label.txt', 'test_image_shape': [736, 1280], 'do_eval': True}}
2020-05-19 10:29:59,238-ERROR: Config use_gpu cannot be set as true while you are using paddlepaddle cpu version !
Please try:
1. Install paddlepaddle-gpu to run model on GPU
2. Set use_gpu as false in config file to run model on CPU

ValueError: all the input array dimensions except for the concatenation axis must match exactly

运行 python3 tools/eval.py 出现如下错误
2020-05-21 09:38:02,350-INFO: Finish initing model from ./output/det_db/iter_epoch_1600
2020-05-21 09:38:04,318-INFO: test tackling num:8
Traceback (most recent call last):
File "tools/eval.py", line 101, in
main()
File "tools/eval.py", line 80, in main
metrics = eval_det_run(exe, config, eval_info_dict, "eval")
File "/paddle/PaddleOCR/tools/eval_utils/eval_det_utils.py", line 126, in eval_det_run
cal_det_res(exe, config, eval_info_dict)
File "/paddle/PaddleOCR/tools/eval_utils/eval_det_utils.py", line 59, in cal_det_res
img_list = np.concatenate(img_list, axis=0)
ValueError: all the input array dimensions except for the concatenation axis must match exactly

SRN

想问下SRN什么时候能开源?

中文模型

感谢大佬分享,太强了
请问现在提供的中文模型只有inference.md中的两种吗?

Error: Failed to find dynamic library: libcublas.so ( libcublas.so: cannot open shared object file: No such file or directory )

您好,按照文档操作出现如下错误
运行环境 docker-ubuntu 18.04 + cuda10.0 + python3.6.9 + paddle-gpu(1.7.2.post97)
运行命令 export PYTHONPATH=. && python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/det/" --rec_model_dir="./inference/rec/"

出现如下错误
Error: Failed to find dynamic library: libcublas.so ( libcublas.so: cannot open shared object file: No such file or directory )
Please specify its path correctly using following ways:
Method. set environment variable LD_LIBRARY_PATH on Linux or DYLD_LIBRARY_PATH on Mac OS.
For instance, issue command: export LD_LIBRARY_PATH=...
Note: After Mac OS 10.11, using the DYLD_LIBRARY_PATH is impossible unless System Integrity Protection (SIP) is disabled. at (/paddle/paddle/fluid/platform/dynload/dynamic_loader.cc:177)

竖排文字的处理

您好,感谢您分享这么好的工作。想请教一下,因为CRNN这种只能处理水平的文字,PaddleOCR是如何处理竖排文字的呢?多谢!

使用训练好的识别模型进行预测, 报错

你好, 非常感谢您的项目, 很棒! 我先后跑了检测和识别模型, 当识别模型训练完毕之后, 打算进行单张图片的预测, 因此执行提供的命令, python3 tools/infer_rec.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints=./output/rec_CRNN/best_accuracy TestReader.infer_img=./doc/imgs_word/word_1.jpg, 但是发生了下面的报错, 可以麻烦帮我看一下原因吗?感谢

2020-05-15 23:06:04,952-INFO: {'Global': {'algorithm': 'CRNN', 'use_gpu': True, 'epoch_num': 3000, 'log_smooth_window': 20, 'print_batch_step': 10, 'save_model_dir': './output/rec_CRNN', 'save_epoch_step': 3, 'eval_batch_step': 2000, 'train_batch_size_per_card': 256, 'test_batch_size_per_card': 256, 'image_shape': [3, 32, 100], 'max_text_length': 25, 'character_type': 'ch', 'character_dict_path': './ppocr/utils/ppocr_keys_v1.txt', 'loss_type': 'ctc', 'reader_yml': './configs/rec/rec_chinese_reader.yml', 'pretrain_weights': './pretrain_models/CRNN/best_accuracy', 'checkpoints': './output/rec_CRNN/best_accuracy', 'save_inference_dir': None}, 'Architecture': {'function': 'ppocr.modeling.architectures.rec_model,RecModel'}, 'Backbone': {'function': 'ppocr.modeling.backbones.rec_mobilenet_v3,MobileNetV3', 'scale': 0.5, 'model_name': 'small'}, 'Head': {'function': 'ppocr.modeling.heads.rec_ctc_head,CTCPredict', 'encoder_type': 'rnn', 'SeqRNN': {'hidden_size': 48}}, 'Loss': {'function': 'ppocr.modeling.losses.rec_ctc_loss,CTCLoss'}, 'Optimizer': {'function': 'ppocr.optimizer,AdamDecay', 'base_lr': 0.0005, 'beta1': 0.9, 'beta2': 0.999}, 'TrainReader': {'reader_function': 'ppocr.data.rec.dataset_traversal,SimpleReader', 'num_workers': 8, 'img_set_dir': './train_data', 'label_file_path': './train_data/rec_gt_train.txt'}, 'EvalReader': {'reader_function': 'ppocr.data.rec.dataset_traversal,SimpleReader', 'img_set_dir': './train_data', 'label_file_path': './train_data/rec_gt_test.txt'}, 'TestReader': {'reader_function': 'ppocr.data.rec.dataset_traversal,SimpleReader', 'infer_img': './doc/imgs_word/word_1.jpg'}} W0515 23:06:05.985396 31885 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 10.1, Runtime API Version: 9.0 W0515 23:06:05.989531 31885 device_context.cc:245] device: 0, cuDNN Version: 7.3. Traceback (most recent call last): File "tools/infer_rec.py", line 130, in <module> main() File "tools/infer_rec.py", line 79, in main init_model(config, eval_prog, exe) File "/home/aistudio/ppocr/utils/save_load.py", line 114, in init_model fluid.load(program, path, exe) File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/io.py", line 1740, in load v.name, parameter_file_name) AssertionError: Can not find [conv11_se_1_offset] in model file [./output/rec_CRNN/best_accuracy.pdparams]

DB文本检测模型推理有问题

python3 tools/export_model.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./ch_lite/det_mv3_db/best_accuracy Global.save_inference_dir=./inference_model/det_db/

image

安装imgaug库一直失败,是什么原因呢?

running build_ext
building 'imagecodecs._aec' extension
creating build/temp.linux-x86_64-3.6
creating build/temp.linux-x86_64-3.6/imagecodecs
gcc -pthread -B /root/anaconda3/envs/pp/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iimagecodecs -I/root/anaconda3/envs/pp/include/python3.6m -I/root/anaconda3/envs/pp/lib/python3.6/site-packages/numpy/core/include -c imagecodecs/_aec.c -o build/temp.linux-x86_64-3.6/imagecodecs/_aec.o
In file included from /root/anaconda3/envs/pp/lib/python3.6/site-packages/numpy/core/include/numpy/ndarraytypes.h:1832:0,
                 from /root/anaconda3/envs/pp/lib/python3.6/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,
                 from /root/anaconda3/envs/pp/lib/python3.6/site-packages/numpy/core/include/numpy/arrayobject.h:4,
                 from imagecodecs/_aec.c:598:
/root/anaconda3/envs/pp/lib/python3.6/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning "Using deprecated NumPy API, disable it with " "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
 #warning "Using deprecated NumPy API, disable it with " \
  ^
imagecodecs/_aec.c:602:20: fatal error: libaec.h: No such file or directory
compilation terminated.
error: command 'gcc' failed with exit status 1

lr decay

训练crnn,应该在哪里设置lr decay呢

program.py

Traceback (most recent call last):
File "train.py", line 112, in
FLAGS = parser.parse_args()
File "/paddle/paddle/program.py", line 49, in parse_args
args.opt = self._parse_opt(args.opt)
File "/paddle/paddle/program.py", line 58, in _parse_opt
k, v = s.split('=')
ValueError: need more than 1 value to unpack

训练集标注的问题

请教一个问题,对于文字检测阶段,在对图片进行标注的时候,有的文字区域离得比较远,语义上也属于两个部分;但是也有排版离得远但是语义上属于同一部分的,在标注的时候应该怎么标注呢?是不管离得远近语义一直就框在一起还是,只以距离衡量?
如果用人的思维考虑语义的话,可能会引入噪声,模型难收敛、或者预测结果不稳定;
如果只是以距离作为指标的话,在下游任务对相同语义的两个或者几个部分,合并起来比较困难。如果只是用规则来合并的话,那就对检测和识别(也可能加入纠错)阶段的准确率要求很高。
请教一下,有什么好的思路呢?

windows使用超轻量模型字典解析错误

windows使用超轻量模型预测结果不正确,调试代码发现字典解析错误,在character.py文件line 37 中line = line.decode('utf-8').strip("\n"),由于没有删除“/r”在windows中使用时字典解析错误,

inference error

image
谢改db_postprocess.py 131行后入下图132行所示:
image
运行后,报错信息如下:
image
谢改db_postprocess.py 47行后入下图48行所示:
image
再次运行后,报错信息如下:
image

Segmentation fault (core dumped)

您好,运行训练命令遇到了以下问题,特来请教。
通过FLAGS_selected_gpus 指定显卡 和 修改train.py里面的place = fluid.CUDAPlace(3) if use_gpu else fluid.CPUPlace()运行训练都会出现这个问题。
运行use_gpu=False也出现了下面的问题。
FLAGS_selected_gpus=3 && python3 tools/train.py -c configs/det/det_mv3_db.yml -o Optimizer.base_lr=0.0001
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
2020-05-18 09:29:29,797-INFO: {'Architecture': {'function': 'ppocr.modeling.architectures.det_model,DetModel'}, 'TestReader': {'reader_function': 'ppocr.data.det.dataset_traversal,EvalTestReader', 'single_img_path': None, 'img_set_dir': './train_data/icdar2015/text_localization/', 'label_file_path': './train_data/icdar2015/text_localization/test_icdar2015_label.txt', 'test_image_shape': [736, 1280], 'process_function': 'ppocr.data.det.db_process,DBProcessTest', 'do_eval': True}, 'Backbone': {'function': 'ppocr.modeling.backbones.det_mobilenet_v3,MobileNetV3', 'model_name': 'large', 'scale': 0.5}, 'Head': {'k': 50, 'function': 'ppocr.modeling.heads.det_db_head,DBHead', 'inner_channels': 96, 'model_name': 'large', 'out_channels': 2}, 'Optimizer': {'beta1': 0.9, 'function': 'ppocr.optimizer,AdamDecay', 'base_lr': 0.0001, 'beta2': 0.999}, 'EvalReader': {'test_image_shape': [736, 1280], 'reader_function': 'ppocr.data.det.dataset_traversal,EvalTestReader', 'img_set_dir': './train_data/icdar2015/text_localization/', 'process_function': 'ppocr.data.det.db_process,DBProcessTest', 'label_file_path': './train_data/icdar2015/text_localization/test_icdar2015_label.txt'}, 'Loss': {'function': 'ppocr.modeling.losses.det_db_loss,DBLoss', 'balance_loss': True, 'beta': 10, 'alpha': 5, 'ohem_ratio': 3, 'main_loss_type': 'DiceLoss'}, 'TrainReader': {'reader_function': 'ppocr.data.det.dataset_traversal,TrainReader', 'num_workers': 8, 'img_set_dir': './train_data/icdar2015/text_localization/', 'process_function': 'ppocr.data.det.db_process,DBProcessTrain', 'label_file_path': './train_data/icdar2015/text_localization/train_icdar2015_label.txt'}, 'PostProcess': {'unclip_ratio': 1.5, 'max_candidates': 1000, 'function': 'ppocr.postprocess.db_postprocess,DBPostProcess', 'thresh': 0.3, 'box_thresh': 0.7}, 'Global': {'save_epoch_step': 200, 'save_inference_dir': None, 'eval_batch_step': 5000, 'log_smooth_window': 20, 'algorithm': 'DB', 'epoch_num': 1200, 'use_gpu': True, 'train_batch_size_per_card': 16, 'image_shape': [3, 640, 640], 'save_model_dir': './output/det_db/', 'save_res_path': './output/det_db/predicts_db.txt', 'checkpoints': None, 'pretrain_weights': './pretrain_models/MobileNetV3_large_x0_5_pretrained/', 'test_batch_size_per_card': 16, 'reader_yml': './configs/det/det_db_icdar15_reader.yml', 'print_batch_step': 2}}
3 640 640
3 640 640
import ujson error: No module named 'ujson' use json
2020-05-18 09:29:33,067-INFO: places would be ommited when DataLoader is not iterable
W0518 09:29:33.928460 5607 device_context.cc:237] Please NOTE: device: 3, CUDA Capability: 75, Driver API Version: 10.2, Runtime API Version: 10.0
W0518 09:29:33.932370 5607 device_context.cc:245] device: 3, cuDNN Version: 7.5.
W0518 09:29:33.932396 5607 device_context.cc:271] WARNING: device: 3. The installed Paddle is compiled with CUDNN 7.6, but CUDNN version in your machine is 7.5, which may cause serious incompatible bug. Please recompile or reinstall Paddle with compatible CUDNN version.
2020-05-18 09:29:35,015-INFO: Loading parameters from ./pretrain_models/MobileNetV3_large_x0_5_pretrained/...
2020-05-18 09:29:35,015-WARNING: ./pretrain_models/MobileNetV3_large_x0_5_pretrained/.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ]
2020-05-18 09:29:35,015-WARNING: ./pretrain_models/MobileNetV3_large_x0_5_pretrained/.pdparams not found, try to load model file saved with [ save_params, save_persistables, save_vars ]
2020-05-18 09:29:35,206-INFO: Finish initing model from ./pretrain_models/MobileNetV3_large_x0_5_pretrained/
I0518 09:29:35.251972 5607 parallel_executor.cc:440] The Program will be executed on CUDA using ParallelExecutor, 8 cards are used, so 8 programs are executed in parallel.
W0518 09:29:48.223284 5607 init.cc:209] Warning: PaddlePaddle catches a failure signal, it may not work properly
W0518 09:29:48.223331 5607 init.cc:211] You could check whether you killed PaddlePaddle thread/process accidentally or report the case to PaddlePaddle
W0518 09:29:48.223345 5607 init.cc:214] The detail failure signal is:

关于paddleOCR的推理速度

平台:AI-studio
GPU:v100
被推理的图片大小:150k、1920*1080

使用GPU:约6秒
使用CPU:约8秒

请教:如何提升推理速度?

请问想换文档内列出的其他模型怎么换?

inference里的是model和params
其他模型下载下来是best_accuracy.pdmodel这种格式,改名报错
Error: Getting 'tensor_desc' is not supported by the type of var double_buffer_0. at (D:\1.7.2\paddle\paddle\fluid\framework\var_desc.cc:209)

config中的algorithm参数

在学习过程中,我注意到train.py中判断了一下算法参数algorithm是否在已有范围内,之后就找不到哪里使用了这个参数
我想知道代码是怎么实现选择不同的算法的,求大佬们指点

GPU一直没用上

我安装了 paddlepaddle-gpu==1.7.2.post97,但是运行时报错:
Traceback (most recent call last):
File "tools/infer/predict_system.py", line 116, in
dt_boxes, rec_res = text_sys(img)
File "tools/infer/predict_system.py", line 67, in call
dt_boxes, elapse = self.text_detector(img)
File "/home/import/gh/project/PaddleOCR-develop/tools/infer/predict_det.py", line 109, in call
self.predictor.zero_copy_run()
paddle.fluid.core_avx.EnforceNotMet:


C++ Call Stacks (More useful to developers):

0 std::string paddle::platform::GetTraceBackString<char const*>(char const*&&, char const*, int)
1 paddle::platform::EnforceNotMet::EnforceNotMet(std::__exception_ptr::exception_ptr, char const*, int)
2 cudnnActivationStruct* paddle::platform::ScopedActivationDescriptor::descriptor(std::string const&, double)
3 paddle::operators::CUDNNConvFusionOpKernel::Compute(paddle::framework::ExecutionContext const&) const
4 std::_Function_handler<void (paddle::framework::ExecutionContext const&), paddle::framework::OpKernelRegistrarFunctor<paddle::platform::CUDAPlace, false, 0ul, paddle::operators::CUDNNConvFusionOpKernel, paddle::operators::CUDNNConvFusionOpKernel >::operator()(char const*, char const*, int) const::{lambda(paddle::framework::ExecutionContext const&)#1}>::_M_invoke(std::_Any_data const&, paddle::framework::ExecutionContext const&)
5 paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, paddle::platform::Place const&, paddle::framework::RuntimeContext*) const
6 paddle::framework::OperatorWithKernel::RunImpl(paddle::framework::Scope const&, paddle::platform::Place const&) const
7 paddle::framework::OperatorBase::Run(paddle::framework::Scope const&, paddle::platform::Place const&)
8 paddle::framework::NaiveExecutor::Run()
9 paddle::AnalysisPredictor::ZeroCopyRun()


Python Call Stacks (More useful to users):

File "/root/miniconda3/envs/ocrpy36/lib/python3.6/site-packages/paddle/fluid/framework.py", line 2525, in append_op
attrs=kwargs.get("attrs", None))
File "/root/miniconda3/envs/ocrpy36/lib/python3.6/site-packages/paddle/fluid/layer_helper.py", line 43, in append_op
return self.main_program.current_block().append_op(*args, **kwargs)
File "/root/miniconda3/envs/ocrpy36/lib/python3.6/site-packages/paddle/fluid/layers/nn.py", line 1405, in conv2d
"data_format": data_format,
File "/paddle/PaddleOCR/github/PaddleOCR/ppocr/modeling/backbones/det_mobilenet_v3.py", line 153, in conv_bn_layer
bias_attr=False)
File "/paddle/PaddleOCR/github/PaddleOCR/ppocr/modeling/backbones/det_mobilenet_v3.py", line 98, in call
name='conv1')
File "/paddle/PaddleOCR/github/PaddleOCR/ppocr/modeling/architectures/det_model.py", line 111, in call
conv_feas = self.backbone(image)
File "/paddle/PaddleOCR/github/PaddleOCR/tools/program.py", line 193, in build_export
image, outputs = model(mode='export')
File "tools/export_model.py", line 67, in main
config, eval_program, startup_prog)
File "tools/export_model.py", line 93, in
main()


Error Message Summary:

Error: An error occurred here. There is no accurate error hint for this error yet. We are continuously in the process of increasing hint for this kind of error check. It would be helpful if you could inform us of how this conversion went by opening a github issue. And we will resolve it with high priority.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.