Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱学习的小尤
PaddleOCR
提交
9d16c117
P
PaddleOCR
项目概览
爱学习的小尤
/
PaddleOCR
与 Fork 源项目一致
Fork自
PaddlePaddle / PaddleOCR
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleOCR
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9d16c117
编写于
7月 13, 2020
作者:
littletomatodonkey
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix cpp infer
上级
69a7a140
变更
10
展开全部
显示空白变更内容
内联
并排
Showing
10 changed file
with
115 addition
and
6734 deletion
+115
-6734
deploy/cpp_infer/include/ocr_det.h
deploy/cpp_infer/include/ocr_det.h
+9
-10
deploy/cpp_infer/include/ocr_rec.h
deploy/cpp_infer/include/ocr_rec.h
+6
-7
deploy/cpp_infer/include/postprocess_op.h
deploy/cpp_infer/include/postprocess_op.h
+13
-9
deploy/cpp_infer/readme.md
deploy/cpp_infer/readme.md
+36
-3
deploy/cpp_infer/src/main.cpp
deploy/cpp_infer/src/main.cpp
+1
-2
deploy/cpp_infer/src/ocr_det.cpp
deploy/cpp_infer/src/ocr_det.cpp
+1
-15
deploy/cpp_infer/src/postprocess_op.cpp
deploy/cpp_infer/src/postprocess_op.cpp
+44
-56
deploy/cpp_infer/tools/build.sh
deploy/cpp_infer/tools/build.sh
+4
-8
deploy/cpp_infer/tools/config.txt
deploy/cpp_infer/tools/config.txt
+1
-1
deploy/cpp_infer/tools/ppocr_keys_v1.txt
deploy/cpp_infer/tools/ppocr_keys_v1.txt
+0
-6623
未找到文件。
deploy/cpp_infer/include/ocr_det.h
浏览文件 @
9d16c117
...
...
@@ -36,16 +36,13 @@ namespace PaddleOCR {
class
DBDetector
{
public:
explicit
DBDetector
(
const
std
::
string
&
model_dir
,
const
bool
&
use_gpu
=
false
,
const
int
&
gpu_id
=
0
,
const
int
&
gpu_mem
=
4000
,
const
int
&
cpu_math_library_num_threads
=
4
,
const
int
&
max_side_len
=
960
,
const
double
&
det_db_thresh
=
0.3
,
const
double
&
det_db_box_thresh
=
0.5
,
const
double
&
det_db_unclip_ratio
=
2.0
,
const
bool
&
visualize
=
true
)
{
LoadModel
(
model_dir
);
explicit
DBDetector
(
const
std
::
string
&
model_dir
,
const
bool
&
use_gpu
,
const
int
&
gpu_id
,
const
int
&
gpu_mem
,
const
int
&
cpu_math_library_num_threads
,
const
int
&
max_side_len
,
const
double
&
det_db_thresh
,
const
double
&
det_db_box_thresh
,
const
double
&
det_db_unclip_ratio
,
const
bool
&
visualize
)
{
this
->
use_gpu_
=
use_gpu
;
this
->
gpu_id_
=
gpu_id
;
this
->
gpu_mem_
=
gpu_mem
;
...
...
@@ -58,6 +55,8 @@ public:
this
->
det_db_unclip_ratio_
=
det_db_unclip_ratio
;
this
->
visualize_
=
visualize
;
LoadModel
(
model_dir
);
}
// Load Paddle inference model
...
...
deploy/cpp_infer/include/ocr_rec.h
浏览文件 @
9d16c117
...
...
@@ -35,19 +35,18 @@ namespace PaddleOCR {
class
CRNNRecognizer
{
public:
explicit
CRNNRecognizer
(
const
std
::
string
&
model_dir
,
const
bool
&
use_gpu
=
false
,
const
int
&
gpu_id
=
0
,
const
int
&
gpu_mem
=
4000
,
const
int
&
cpu_math_library_num_threads
=
4
,
const
string
&
label_path
=
"./tools/ppocr_keys_v1.txt"
)
{
LoadModel
(
model_dir
);
explicit
CRNNRecognizer
(
const
std
::
string
&
model_dir
,
const
bool
&
use_gpu
,
const
int
&
gpu_id
,
const
int
&
gpu_mem
,
const
int
&
cpu_math_library_num_threads
,
const
string
&
label_path
)
{
this
->
use_gpu_
=
use_gpu
;
this
->
gpu_id_
=
gpu_id
;
this
->
gpu_mem_
=
gpu_mem
;
this
->
cpu_math_library_num_threads_
=
cpu_math_library_num_threads
;
this
->
label_list_
=
Utility
::
ReadDict
(
label_path
);
LoadModel
(
model_dir
);
}
// Load Paddle inference model
...
...
deploy/cpp_infer/include/postprocess_op.h
浏览文件 @
9d16c117
...
...
@@ -36,21 +36,21 @@ namespace PaddleOCR {
class
PostProcessor
{
public:
void
GetContourArea
(
float
**
box
,
float
unclip_ratio
,
float
&
distance
);
void
GetContourArea
(
const
std
::
vector
<
std
::
vector
<
float
>>
&
box
,
float
unclip_ratio
,
float
&
distance
);
cv
::
RotatedRect
UnClip
(
float
**
box
,
const
float
&
unclip_ratio
);
cv
::
RotatedRect
UnClip
(
std
::
vector
<
std
::
vector
<
float
>>
box
,
const
float
&
unclip_ratio
);
float
**
Mat2Vec
(
cv
::
Mat
mat
);
void
quickSort_vector
(
std
::
vector
<
std
::
vector
<
int
>>
&
box
,
int
l
,
int
r
,
int
axis
);
std
::
vector
<
std
::
vector
<
int
>>
order_points_c
lockwise
(
std
::
vector
<
std
::
vector
<
int
>>
pts
);
OrderPointsC
lockwise
(
std
::
vector
<
std
::
vector
<
int
>>
pts
);
float
**
GetMiniBoxes
(
cv
::
RotatedRect
box
,
float
&
ssid
);
std
::
vector
<
std
::
vector
<
float
>>
GetMiniBoxes
(
cv
::
RotatedRect
box
,
float
&
ssid
);
float
BoxScoreFast
(
float
**
box_array
,
cv
::
Mat
pred
);
float
BoxScoreFast
(
std
::
vector
<
std
::
vector
<
float
>>
box_array
,
cv
::
Mat
pred
);
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
BoxesFromBitmap
(
const
cv
::
Mat
pred
,
const
cv
::
Mat
bitmap
,
...
...
@@ -61,7 +61,11 @@ public:
float
ratio_h
,
float
ratio_w
,
cv
::
Mat
srcimg
);
private:
void
quickSort
(
float
**
s
,
int
l
,
int
r
);
static
bool
XsortInt
(
std
::
vector
<
int
>
a
,
std
::
vector
<
int
>
b
);
static
bool
XsortFp32
(
std
::
vector
<
float
>
a
,
std
::
vector
<
float
>
b
);
std
::
vector
<
std
::
vector
<
float
>>
Mat2Vector
(
cv
::
Mat
mat
);
inline
int
_max
(
int
a
,
int
b
)
{
return
a
>=
b
?
a
:
b
;
}
...
...
deploy/cpp_infer/readme.md
浏览文件 @
9d16c117
...
...
@@ -22,7 +22,7 @@ tar -xf 3.4.7.tar.gz
*
编译opencv,设置opencv源码路径(
`root_path`
)以及安装路径(
`install_path`
)。进入opencv源码路径下,按照下面的方式进行编译。
```
shell
root_path
=
/paddle/libs/opencv-3.4.7
root_path
=
your_opencv_root_path
install_path
=
${
root_path
}
/opencv3
rm
-rf
build
...
...
@@ -51,6 +51,9 @@ make -j
make
install
```
其中
`root_path`
为下载的opencv源码路径,
`install_path`
为opencv的安装路径,
`make install`
完成之后,会在该文件夹下生成opencv头文件和库文件,用于后面的OCR代码编译。
最终在安装路径下的文件结构如下所示。
```
...
...
@@ -62,8 +65,29 @@ opencv3/
|-- share
```
### 1.2 编译Paddle预测库
### 1.2 下载或者编译Paddle预测库
*
有2种方式获取Paddle预测库,下面进行详细介绍。
#### 1.2.1 直接下载安装
*
[
Paddle预测库官网
](
https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html
)
上提供了不同cuda版本的Linux预测库,可以直接下载使用。
*
如果cuda版本为cuda9.0,1.8.2版本的Paddle预测库可以从这里下载:
[
下载地址
](
https://paddle-inference-lib.bj.bcebos.com/1.8.2-gpu-cuda9-cudnn7-avx-mkl/fluid_inference.tgz
)
。
*
如果cuda版本为cuda10.0,1.8.2版本的Paddle预测库可以从这里下载:
[
下载地址
](
https://paddle-inference-lib.bj.bcebos.com/1.8.2-gpu-cuda10-cudnn7-avx-mkl/fluid_inference.tgz
)
。
*
更多版本的预测库可以在官网查看下载。
*
下载之后使用下面的方法解压
```
tar -xf fluid_inference.tgz
```
最终会在当前的文件夹中生成
`fluid_inference/`
的子文件夹。
#### 1.2.2 预测库源码编译
*
如果希望获取最新预测库特性,可以从Paddle github上克隆最新代码,源码编译预测库。
*
可以参考
[
Paddle预测库官网
](
https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html
)
的说明,从github上获取Paddle代码,然后进行编译,生成最新的预测库。使用git获取代码方法如下。
```
shell
...
...
@@ -80,7 +104,7 @@ cd build
cmake ..
\
-DWITH_CONTRIB
=
OFF
\
-DWITH_MKL
=
ON
\
-DWITH_MKLDNN
=
O
FF
\
-DWITH_MKLDNN
=
O
N
\
-DWITH_TESTING
=
OFF
\
-DCMAKE_BUILD_TYPE
=
Release
\
-DWITH_INFERENCE_API_TEST
=
OFF
\
...
...
@@ -132,6 +156,15 @@ inference/
sh tools/build.sh
```
具体地,
`tools/build.sh`
中内容如下。
```
shell
c
```
`OPENCV_DIR`
为opencv编译安装的地址;
`LIB_DIR`
为下载(
`fluid_inference`
文件夹)或者编译生成的Paddle预测库地址(
`build/fluid_inference_install_dir`
文件夹);
`CUDA_LIB_DIR`
为cuda库文件地址,在docker中;为
`/usr/local/cuda/lib64`
;
`CUDNN_LIB_DIR`
为cudnn库文件地址,在docker中为
`/usr/lib/x86_64-linux-gnu/`
。
*
编译完成之后,会在
`build`
文件夹下生成一个名为
`ocr_system`
的可执行文件。
...
...
deploy/cpp_infer/src/main.cpp
浏览文件 @
9d16c117
...
...
@@ -46,8 +46,6 @@ int main(int argc, char **argv) {
std
::
string
img_path
(
argv
[
2
]);
auto
start
=
std
::
chrono
::
system_clock
::
now
();
cv
::
Mat
srcimg
=
cv
::
imread
(
img_path
,
cv
::
IMREAD_COLOR
);
DBDetector
det
(
config
.
det_model_dir
,
config
.
use_gpu
,
config
.
gpu_id
,
...
...
@@ -59,6 +57,7 @@ int main(int argc, char **argv) {
config
.
gpu_mem
,
config
.
cpu_math_library_num_threads
,
config
.
char_list_file
);
auto
start
=
std
::
chrono
::
system_clock
::
now
();
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
boxes
;
det
.
Run
(
srcimg
,
boxes
);
...
...
deploy/cpp_infer/src/ocr_det.cpp
浏览文件 @
9d16c117
...
...
@@ -12,22 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "paddle_api.h"
#include "paddle_inference_api.h"
#include <chrono>
#include <iomanip>
#include <iostream>
#include <ostream>
#include <vector>
#include <cstring>
#include <fstream>
#include <numeric>
#include <include/ocr_det.h>
#include <stdlib.h>
namespace
PaddleOCR
{
...
...
deploy/cpp_infer/src/postprocess_op.cpp
浏览文件 @
9d16c117
...
...
@@ -16,8 +16,8 @@
namespace
PaddleOCR
{
void
PostProcessor
::
GetContourArea
(
float
**
box
,
float
unclip_ratio
,
float
&
distance
)
{
void
PostProcessor
::
GetContourArea
(
const
std
::
vector
<
std
::
vector
<
float
>>
&
box
,
float
unclip_ratio
,
float
&
distance
)
{
int
pts_num
=
4
;
float
area
=
0.0
f
;
float
dist
=
0.0
f
;
...
...
@@ -34,7 +34,8 @@ void PostProcessor::GetContourArea(float **box, float unclip_ratio,
distance
=
area
*
unclip_ratio
/
dist
;
}
cv
::
RotatedRect
PostProcessor
::
UnClip
(
float
**
box
,
const
float
&
unclip_ratio
)
{
cv
::
RotatedRect
PostProcessor
::
UnClip
(
std
::
vector
<
std
::
vector
<
float
>>
box
,
const
float
&
unclip_ratio
)
{
float
distance
=
1.0
;
GetContourArea
(
box
,
unclip_ratio
,
distance
);
...
...
@@ -74,53 +75,11 @@ float **PostProcessor::Mat2Vec(cv::Mat mat) {
return
array
;
}
void
PostProcessor
::
quickSort
(
float
**
s
,
int
l
,
int
r
)
{
if
(
l
<
r
)
{
int
i
=
l
,
j
=
r
;
float
x
=
s
[
l
][
0
];
float
*
xp
=
s
[
l
];
while
(
i
<
j
)
{
while
(
i
<
j
&&
s
[
j
][
0
]
>=
x
)
j
--
;
if
(
i
<
j
)
std
::
swap
(
s
[
i
++
],
s
[
j
]);
while
(
i
<
j
&&
s
[
i
][
0
]
<
x
)
i
++
;
if
(
i
<
j
)
std
::
swap
(
s
[
j
--
],
s
[
i
]);
}
s
[
i
]
=
xp
;
quickSort
(
s
,
l
,
i
-
1
);
quickSort
(
s
,
i
+
1
,
r
);
}
}
void
PostProcessor
::
quickSort_vector
(
std
::
vector
<
std
::
vector
<
int
>>
&
box
,
int
l
,
int
r
,
int
axis
)
{
if
(
l
<
r
)
{
int
i
=
l
,
j
=
r
;
int
x
=
box
[
l
][
axis
];
std
::
vector
<
int
>
xp
(
box
[
l
]);
while
(
i
<
j
)
{
while
(
i
<
j
&&
box
[
j
][
axis
]
>=
x
)
j
--
;
if
(
i
<
j
)
std
::
swap
(
box
[
i
++
],
box
[
j
]);
while
(
i
<
j
&&
box
[
i
][
axis
]
<
x
)
i
++
;
if
(
i
<
j
)
std
::
swap
(
box
[
j
--
],
box
[
i
]);
}
box
[
i
]
=
xp
;
quickSort_vector
(
box
,
l
,
i
-
1
,
axis
);
quickSort_vector
(
box
,
i
+
1
,
r
,
axis
);
}
}
std
::
vector
<
std
::
vector
<
int
>>
PostProcessor
::
order_points_c
lockwise
(
std
::
vector
<
std
::
vector
<
int
>>
pts
)
{
PostProcessor
::
OrderPointsC
lockwise
(
std
::
vector
<
std
::
vector
<
int
>>
pts
)
{
std
::
vector
<
std
::
vector
<
int
>>
box
=
pts
;
quickSort_vector
(
box
,
0
,
int
(
box
.
size
()
-
1
),
0
);
std
::
sort
(
box
.
begin
(),
box
.
end
(),
XsortInt
);
std
::
vector
<
std
::
vector
<
int
>>
leftmost
=
{
box
[
0
],
box
[
1
]};
std
::
vector
<
std
::
vector
<
int
>>
rightmost
=
{
box
[
2
],
box
[
3
]};
...
...
@@ -135,16 +94,44 @@ PostProcessor::order_points_clockwise(std::vector<std::vector<int>> pts) {
return
rect
;
}
float
**
PostProcessor
::
GetMiniBoxes
(
cv
::
RotatedRect
box
,
float
&
ssid
)
{
ssid
=
box
.
size
.
width
>=
box
.
size
.
height
?
box
.
size
.
height
:
box
.
size
.
width
;
std
::
vector
<
std
::
vector
<
float
>>
PostProcessor
::
Mat2Vector
(
cv
::
Mat
mat
)
{
std
::
vector
<
std
::
vector
<
float
>>
img_vec
;
std
::
vector
<
float
>
tmp
;
for
(
int
i
=
0
;
i
<
mat
.
rows
;
++
i
)
{
tmp
.
clear
();
for
(
int
j
=
0
;
j
<
mat
.
cols
;
++
j
)
{
tmp
.
push_back
(
mat
.
at
<
float
>
(
i
,
j
));
}
img_vec
.
push_back
(
tmp
);
}
return
img_vec
;
}
bool
PostProcessor
::
XsortFp32
(
std
::
vector
<
float
>
a
,
std
::
vector
<
float
>
b
)
{
if
(
a
[
0
]
!=
b
[
0
])
return
a
[
0
]
<
b
[
0
];
return
false
;
}
bool
PostProcessor
::
XsortInt
(
std
::
vector
<
int
>
a
,
std
::
vector
<
int
>
b
)
{
if
(
a
[
0
]
!=
b
[
0
])
return
a
[
0
]
<
b
[
0
];
return
false
;
}
std
::
vector
<
std
::
vector
<
float
>>
PostProcessor
::
GetMiniBoxes
(
cv
::
RotatedRect
box
,
float
&
ssid
)
{
ssid
=
std
::
max
(
box
.
size
.
width
,
box
.
size
.
height
);
cv
::
Mat
points
;
cv
::
boxPoints
(
box
,
points
);
// sorted box points
auto
array
=
Mat2Vec
(
points
);
quickSort
(
array
,
0
,
3
);
float
*
idx1
=
array
[
0
],
*
idx2
=
array
[
1
],
*
idx3
=
array
[
2
],
*
idx4
=
array
[
3
];
auto
array
=
Mat2Vector
(
points
);
std
::
sort
(
array
.
begin
(),
array
.
end
(),
XsortFp32
);
std
::
vector
<
float
>
idx1
=
array
[
0
],
idx2
=
array
[
1
],
idx3
=
array
[
2
],
idx4
=
array
[
3
];
if
(
array
[
3
][
1
]
<=
array
[
2
][
1
])
{
idx2
=
array
[
3
];
idx3
=
array
[
2
];
...
...
@@ -168,7 +155,8 @@ float **PostProcessor::GetMiniBoxes(cv::RotatedRect box, float &ssid) {
return
array
;
}
float
PostProcessor
::
BoxScoreFast
(
float
**
box_array
,
cv
::
Mat
pred
)
{
float
PostProcessor
::
BoxScoreFast
(
std
::
vector
<
std
::
vector
<
float
>>
box_array
,
cv
::
Mat
pred
)
{
auto
array
=
box_array
;
int
width
=
pred
.
cols
;
int
height
=
pred
.
rows
;
...
...
@@ -280,7 +268,7 @@ PostProcessor::FilterTagDetRes(std::vector<std::vector<std::vector<int>>> boxes,
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
root_points
;
for
(
int
n
=
0
;
n
<
boxes
.
size
();
n
++
)
{
boxes
[
n
]
=
order_points_c
lockwise
(
boxes
[
n
]);
boxes
[
n
]
=
OrderPointsC
lockwise
(
boxes
[
n
]);
for
(
int
m
=
0
;
m
<
boxes
[
0
].
size
();
m
++
)
{
boxes
[
n
][
m
][
0
]
/=
ratio_w
;
boxes
[
n
][
m
][
1
]
/=
ratio_h
;
...
...
deploy/cpp_infer/tools/build.sh
浏览文件 @
9d16c117
OPENCV_DIR
=
/paddle/libs/opencv-3.4.7/opencv3
LIB_DIR
=
/paddle/code/gry/Paddle/build/fluid_inference_install_dir/
CUDA_LIB_DIR
=
/usr/local/cuda/lib64
CUDNN_LIB_DIR
=
/usr/lib/x86_64-linux-gnu/
TENSORRT_ROOT_DIR
=
YOUR_TENSORRT_ROOT_DIR
OPENCV_DIR
=
your_opencv_dir
LIB_DIR
=
your_paddle_inference_dir
CUDA_LIB_DIR
=
your_cuda_lib_dir
CUDNN_LIB_DIR
=
/your_cudnn_lib_dir
BUILD_DIR
=
build
rm
-rf
${
BUILD_DIR
}
...
...
@@ -19,8 +18,5 @@ cmake .. \
-DOPENCV_DIR
=
${
OPENCV_DIR
}
\
-DCUDNN_LIB
=
${
CUDNN_LIB_DIR
}
\
-DCUDA_LIB
=
${
CUDA_LIB_DIR
}
\
-DTENSORRT_ROOT
=
YOUR_TENSORRT_ROOT_DIR
make
-j
deploy/cpp_infer/tools/config.txt
浏览文件 @
9d16c117
...
...
@@ -13,7 +13,7 @@ det_model_dir ./inference/det_db
# rec config
rec_model_dir ./inference/rec_crnn
char_list_file .
/too
ls/ppocr_keys_v1.txt
char_list_file .
./../ppocr/uti
ls/ppocr_keys_v1.txt
img_path ../../doc/imgs/11.jpg
# show the detection results
...
...
deploy/cpp_infer/tools/ppocr_keys_v1.txt
已删除
100644 → 0
浏览文件 @
69a7a140
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录