Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
wangsen
paddle_dbnet
Commits
b0ae6728
Commit
b0ae6728
authored
Dec 13, 2020
by
LDOUBLEV
Browse files
delete lite,slim, iosdemo and android demo of dyrgaph branch for now
parent
2735e9e3
Changes
107
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
0 additions
and
2335 deletions
+0
-2335
deploy/android_demo/app/src/main/cpp/ocr_db_post_process.h
deploy/android_demo/app/src/main/cpp/ocr_db_post_process.h
+0
-17
deploy/android_demo/app/src/main/cpp/ocr_ppredictor.cpp
deploy/android_demo/app/src/main/cpp/ocr_ppredictor.cpp
+0
-186
deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h
deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h
+0
-112
deploy/android_demo/app/src/main/cpp/ppredictor.cpp
deploy/android_demo/app/src/main/cpp/ppredictor.cpp
+0
-70
deploy/android_demo/app/src/main/cpp/ppredictor.h
deploy/android_demo/app/src/main/cpp/ppredictor.h
+0
-74
deploy/android_demo/app/src/main/cpp/predictor_input.cpp
deploy/android_demo/app/src/main/cpp/predictor_input.cpp
+0
-29
deploy/android_demo/app/src/main/cpp/predictor_input.h
deploy/android_demo/app/src/main/cpp/predictor_input.h
+0
-28
deploy/android_demo/app/src/main/cpp/predictor_output.cpp
deploy/android_demo/app/src/main/cpp/predictor_output.cpp
+0
-27
deploy/android_demo/app/src/main/cpp/predictor_output.h
deploy/android_demo/app/src/main/cpp/predictor_output.h
+0
-35
deploy/android_demo/app/src/main/cpp/preprocess.cpp
deploy/android_demo/app/src/main/cpp/preprocess.cpp
+0
-84
deploy/android_demo/app/src/main/cpp/preprocess.h
deploy/android_demo/app/src/main/cpp/preprocess.h
+0
-14
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java
...idu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java
+0
-128
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java
...ain/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java
+0
-473
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java
...ain/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java
+0
-157
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java
...va/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java
+0
-100
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OcrResultModel.java
...n/java/com/baidu/paddle/lite/demo/ocr/OcrResultModel.java
+0
-52
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java
...c/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java
+0
-355
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java
...java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java
+0
-201
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Utils.java
...p/src/main/java/com/baidu/paddle/lite/demo/ocr/Utils.java
+0
-159
deploy/android_demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
.../app/src/main/res/drawable-v24/ic_launcher_foreground.xml
+0
-34
No files found.
deploy/android_demo/app/src/main/cpp/ocr_db_post_process.h
deleted
100644 → 0
View file @
2735e9e3
//
// Created by fujiayi on 2020/7/2.
//
#pragma once
#include <vector>
#include <opencv2/opencv.hpp>
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
boxes_from_bitmap
(
const
cv
::
Mat
&
pred
,
const
cv
::
Mat
&
bitmap
);
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
filter_tag_det_res
(
const
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
&
o_boxes
,
float
ratio_h
,
float
ratio_w
,
const
cv
::
Mat
&
srcimg
);
\ No newline at end of file
deploy/android_demo/app/src/main/cpp/ocr_ppredictor.cpp
deleted
100644 → 0
View file @
2735e9e3
//
// Created by fujiayi on 2020/7/1.
//
#include "ocr_ppredictor.h"
#include "preprocess.h"
#include "common.h"
#include "ocr_db_post_process.h"
#include "ocr_crnn_process.h"
namespace
ppredictor
{
OCR_PPredictor
::
OCR_PPredictor
(
const
OCR_Config
&
config
)
:
_config
(
config
)
{
}
int
OCR_PPredictor
::
init
(
const
std
::
string
&
det_model_content
,
const
std
::
string
&
rec_model_content
)
{
_det_predictor
=
std
::
unique_ptr
<
PPredictor
>
(
new
PPredictor
{
_config
.
thread_num
,
NET_OCR
,
_config
.
mode
});
_det_predictor
->
init_nb
(
det_model_content
);
_rec_predictor
=
std
::
unique_ptr
<
PPredictor
>
(
new
PPredictor
{
_config
.
thread_num
,
NET_OCR_INTERNAL
,
_config
.
mode
});
_rec_predictor
->
init_nb
(
rec_model_content
);
return
RETURN_OK
;
}
int
OCR_PPredictor
::
init_from_file
(
const
std
::
string
&
det_model_path
,
const
std
::
string
&
rec_model_path
){
_det_predictor
=
std
::
unique_ptr
<
PPredictor
>
(
new
PPredictor
{
_config
.
thread_num
,
NET_OCR
,
_config
.
mode
});
_det_predictor
->
init_from_file
(
det_model_path
);
_rec_predictor
=
std
::
unique_ptr
<
PPredictor
>
(
new
PPredictor
{
_config
.
thread_num
,
NET_OCR_INTERNAL
,
_config
.
mode
});
_rec_predictor
->
init_from_file
(
rec_model_path
);
return
RETURN_OK
;
}
/**
* for debug use, show result of First Step
* @param filter_boxes
* @param boxes
* @param srcimg
*/
static
void
visual_img
(
const
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
&
filter_boxes
,
const
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
&
boxes
,
const
cv
::
Mat
&
srcimg
)
{
// visualization
cv
::
Point
rook_points
[
filter_boxes
.
size
()][
4
];
for
(
int
n
=
0
;
n
<
filter_boxes
.
size
();
n
++
)
{
for
(
int
m
=
0
;
m
<
filter_boxes
[
0
].
size
();
m
++
)
{
rook_points
[
n
][
m
]
=
cv
::
Point
(
int
(
filter_boxes
[
n
][
m
][
0
]),
int
(
filter_boxes
[
n
][
m
][
1
]));
}
}
cv
::
Mat
img_vis
;
srcimg
.
copyTo
(
img_vis
);
for
(
int
n
=
0
;
n
<
boxes
.
size
();
n
++
)
{
const
cv
::
Point
*
ppt
[
1
]
=
{
rook_points
[
n
]};
int
npt
[]
=
{
4
};
cv
::
polylines
(
img_vis
,
ppt
,
npt
,
1
,
1
,
CV_RGB
(
0
,
255
,
0
),
2
,
8
,
0
);
}
// 调试用,自行替换需要修改的路径
cv
::
imwrite
(
"/sdcard/1/vis.png"
,
img_vis
);
}
std
::
vector
<
OCRPredictResult
>
OCR_PPredictor
::
infer_ocr
(
const
std
::
vector
<
int64_t
>
&
dims
,
const
float
*
input_data
,
int
input_len
,
int
net_flag
,
cv
::
Mat
&
origin
)
{
PredictorInput
input
=
_det_predictor
->
get_first_input
();
input
.
set_dims
(
dims
);
input
.
set_data
(
input_data
,
input_len
);
std
::
vector
<
PredictorOutput
>
results
=
_det_predictor
->
infer
();
PredictorOutput
&
res
=
results
.
at
(
0
);
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
filtered_box
=
calc_filtered_boxes
(
res
.
get_float_data
(),
res
.
get_size
(),
(
int
)
dims
[
2
],
(
int
)
dims
[
3
],
origin
);
LOGI
(
"Filter_box size %ld"
,
filtered_box
.
size
());
return
infer_rec
(
filtered_box
,
origin
);
}
std
::
vector
<
OCRPredictResult
>
OCR_PPredictor
::
infer_rec
(
const
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
&
boxes
,
const
cv
::
Mat
&
origin_img
)
{
std
::
vector
<
float
>
mean
=
{
0.5
f
,
0.5
f
,
0.5
f
};
std
::
vector
<
float
>
scale
=
{
1
/
0.5
f
,
1
/
0.5
f
,
1
/
0.5
f
};
std
::
vector
<
int64_t
>
dims
=
{
1
,
3
,
0
,
0
};
std
::
vector
<
OCRPredictResult
>
ocr_results
;
PredictorInput
input
=
_rec_predictor
->
get_first_input
();
for
(
auto
bp
=
boxes
.
crbegin
();
bp
!=
boxes
.
crend
();
++
bp
)
{
const
std
::
vector
<
std
::
vector
<
int
>>
&
box
=
*
bp
;
cv
::
Mat
crop_img
=
get_rotate_crop_image
(
origin_img
,
box
);
float
wh_ratio
=
float
(
crop_img
.
cols
)
/
float
(
crop_img
.
rows
);
cv
::
Mat
input_image
=
crnn_resize_img
(
crop_img
,
wh_ratio
);
input_image
.
convertTo
(
input_image
,
CV_32FC3
,
1
/
255.0
f
);
const
float
*
dimg
=
reinterpret_cast
<
const
float
*>
(
input_image
.
data
);
int
input_size
=
input_image
.
rows
*
input_image
.
cols
;
dims
[
2
]
=
input_image
.
rows
;
dims
[
3
]
=
input_image
.
cols
;
input
.
set_dims
(
dims
);
neon_mean_scale
(
dimg
,
input
.
get_mutable_float_data
(),
input_size
,
mean
,
scale
);
std
::
vector
<
PredictorOutput
>
results
=
_rec_predictor
->
infer
();
OCRPredictResult
res
;
res
.
word_index
=
postprocess_rec_word_index
(
results
.
at
(
0
));
if
(
res
.
word_index
.
empty
())
{
continue
;
}
res
.
score
=
postprocess_rec_score
(
results
.
at
(
1
));
res
.
points
=
box
;
ocr_results
.
emplace_back
(
std
::
move
(
res
));
}
LOGI
(
"ocr_results finished %lu"
,
ocr_results
.
size
());
return
ocr_results
;
}
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
OCR_PPredictor
::
calc_filtered_boxes
(
const
float
*
pred
,
int
pred_size
,
int
output_height
,
int
output_width
,
const
cv
::
Mat
&
origin
)
{
const
double
threshold
=
0.3
;
const
double
maxvalue
=
1
;
cv
::
Mat
pred_map
=
cv
::
Mat
::
zeros
(
output_height
,
output_width
,
CV_32F
);
memcpy
(
pred_map
.
data
,
pred
,
pred_size
*
sizeof
(
float
));
cv
::
Mat
cbuf_map
;
pred_map
.
convertTo
(
cbuf_map
,
CV_8UC1
);
cv
::
Mat
bit_map
;
cv
::
threshold
(
cbuf_map
,
bit_map
,
threshold
,
maxvalue
,
cv
::
THRESH_BINARY
);
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
boxes
=
boxes_from_bitmap
(
pred_map
,
bit_map
);
float
ratio_h
=
output_height
*
1.0
f
/
origin
.
rows
;
float
ratio_w
=
output_width
*
1.0
f
/
origin
.
cols
;
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
filter_boxes
=
filter_tag_det_res
(
boxes
,
ratio_h
,
ratio_w
,
origin
);
return
filter_boxes
;
}
std
::
vector
<
int
>
OCR_PPredictor
::
postprocess_rec_word_index
(
const
PredictorOutput
&
res
)
{
const
int
*
rec_idx
=
res
.
get_int_data
();
const
std
::
vector
<
std
::
vector
<
uint64_t
>>
rec_idx_lod
=
res
.
get_lod
();
std
::
vector
<
int
>
pred_idx
;
for
(
int
n
=
int
(
rec_idx_lod
[
0
][
0
]);
n
<
int
(
rec_idx_lod
[
0
][
1
]
*
2
);
n
+=
2
)
{
pred_idx
.
emplace_back
(
rec_idx
[
n
]);
}
return
pred_idx
;
}
float
OCR_PPredictor
::
postprocess_rec_score
(
const
PredictorOutput
&
res
)
{
const
float
*
predict_batch
=
res
.
get_float_data
();
const
std
::
vector
<
int64_t
>
predict_shape
=
res
.
get_shape
();
const
std
::
vector
<
std
::
vector
<
uint64_t
>>
predict_lod
=
res
.
get_lod
();
int
blank
=
predict_shape
[
1
];
float
score
=
0.
f
;
int
count
=
0
;
for
(
int
n
=
predict_lod
[
0
][
0
];
n
<
predict_lod
[
0
][
1
]
-
1
;
n
++
)
{
int
argmax_idx
=
argmax
(
predict_batch
+
n
*
predict_shape
[
1
],
predict_batch
+
(
n
+
1
)
*
predict_shape
[
1
]);
float
max_value
=
predict_batch
[
n
*
predict_shape
[
1
]
+
argmax_idx
];
if
(
blank
-
1
-
argmax_idx
>
1e-5
)
{
score
+=
max_value
;
count
+=
1
;
}
}
if
(
count
==
0
)
{
LOGE
(
"calc score count 0"
);
}
else
{
score
/=
count
;
}
LOGI
(
"calc score: %f"
,
score
);
return
score
;
}
NET_TYPE
OCR_PPredictor
::
get_net_flag
()
const
{
return
NET_OCR
;
}
}
\ No newline at end of file
deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h
deleted
100644 → 0
View file @
2735e9e3
//
// Created by fujiayi on 2020/7/1.
//
#pragma once
#include <string>
#include <opencv2/opencv.hpp>
#include <paddle_api.h>
#include "ppredictor.h"
namespace
ppredictor
{
/**
* Config
*/
struct
OCR_Config
{
int
thread_num
=
4
;
// Thread num
paddle
::
lite_api
::
PowerMode
mode
=
paddle
::
lite_api
::
LITE_POWER_HIGH
;
// PaddleLite Mode
};
/**
* PolyGone Result
*/
struct
OCRPredictResult
{
std
::
vector
<
int
>
word_index
;
std
::
vector
<
std
::
vector
<
int
>>
points
;
float
score
;
};
/**
* OCR there are 2 models
* 1. First model(det),select polygones to show where are the texts
* 2. crop from the origin images, use these polygones to infer
*/
class
OCR_PPredictor
:
public
PPredictor_Interface
{
public:
OCR_PPredictor
(
const
OCR_Config
&
config
);
virtual
~
OCR_PPredictor
()
{
}
/**
* 初始化二个模型的Predictor
* @param det_model_content
* @param rec_model_content
* @return
*/
int
init
(
const
std
::
string
&
det_model_content
,
const
std
::
string
&
rec_model_content
);
int
init_from_file
(
const
std
::
string
&
det_model_path
,
const
std
::
string
&
rec_model_path
);
/**
* Return OCR result
* @param dims
* @param input_data
* @param input_len
* @param net_flag
* @param origin
* @return
*/
virtual
std
::
vector
<
OCRPredictResult
>
infer_ocr
(
const
std
::
vector
<
int64_t
>
&
dims
,
const
float
*
input_data
,
int
input_len
,
int
net_flag
,
cv
::
Mat
&
origin
);
virtual
NET_TYPE
get_net_flag
()
const
;
private:
/**
* calcul Polygone from the result image of first model
* @param pred
* @param output_height
* @param output_width
* @param origin
* @return
*/
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
calc_filtered_boxes
(
const
float
*
pred
,
int
pred_size
,
int
output_height
,
int
output_width
,
const
cv
::
Mat
&
origin
);
/**
* infer for second model
*
* @param boxes
* @param origin
* @return
*/
std
::
vector
<
OCRPredictResult
>
infer_rec
(
const
std
::
vector
<
std
::
vector
<
std
::
vector
<
int
>>>
&
boxes
,
const
cv
::
Mat
&
origin
);
/**
* Postprocess or sencod model to extract text
* @param res
* @return
*/
std
::
vector
<
int
>
postprocess_rec_word_index
(
const
PredictorOutput
&
res
);
/**
* calculate confidence of second model text result
* @param res
* @return
*/
float
postprocess_rec_score
(
const
PredictorOutput
&
res
);
std
::
unique_ptr
<
PPredictor
>
_det_predictor
;
std
::
unique_ptr
<
PPredictor
>
_rec_predictor
;
OCR_Config
_config
;
};
}
deploy/android_demo/app/src/main/cpp/ppredictor.cpp
deleted
100644 → 0
View file @
2735e9e3
#include "ppredictor.h"
#include "common.h"
namespace
ppredictor
{
PPredictor
::
PPredictor
(
int
thread_num
,
int
net_flag
,
paddle
::
lite_api
::
PowerMode
mode
)
:
_thread_num
(
thread_num
),
_net_flag
(
net_flag
),
_mode
(
mode
)
{
}
int
PPredictor
::
init_nb
(
const
std
::
string
&
model_content
)
{
paddle
::
lite_api
::
MobileConfig
config
;
config
.
set_model_from_buffer
(
model_content
);
return
_init
(
config
);
}
int
PPredictor
::
init_from_file
(
const
std
::
string
&
model_content
){
paddle
::
lite_api
::
MobileConfig
config
;
config
.
set_model_from_file
(
model_content
);
return
_init
(
config
);
}
template
<
typename
ConfigT
>
int
PPredictor
::
_init
(
ConfigT
&
config
)
{
config
.
set_threads
(
_thread_num
);
config
.
set_power_mode
(
_mode
);
_predictor
=
paddle
::
lite_api
::
CreatePaddlePredictor
(
config
);
LOGI
(
"paddle instance created"
);
return
RETURN_OK
;
}
PredictorInput
PPredictor
::
get_input
(
int
index
)
{
PredictorInput
input
{
_predictor
->
GetInput
(
index
),
index
,
_net_flag
};
_is_input_get
=
true
;
return
input
;
}
std
::
vector
<
PredictorInput
>
PPredictor
::
get_inputs
(
int
num
)
{
std
::
vector
<
PredictorInput
>
results
;
for
(
int
i
=
0
;
i
<
num
;
i
++
)
{
results
.
emplace_back
(
get_input
(
i
));
}
return
results
;
}
PredictorInput
PPredictor
::
get_first_input
()
{
return
get_input
(
0
);
}
std
::
vector
<
PredictorOutput
>
PPredictor
::
infer
()
{
LOGI
(
"infer Run start %d"
,
_net_flag
);
std
::
vector
<
PredictorOutput
>
results
;
if
(
!
_is_input_get
)
{
return
results
;
}
_predictor
->
Run
();
LOGI
(
"infer Run end"
);
for
(
int
i
=
0
;
i
<
_predictor
->
GetOutputNames
().
size
();
i
++
)
{
std
::
unique_ptr
<
const
paddle
::
lite_api
::
Tensor
>
output_tensor
=
_predictor
->
GetOutput
(
i
);
LOGI
(
"output tensor[%d] size %ld"
,
i
,
product
(
output_tensor
->
shape
()));
PredictorOutput
result
{
std
::
move
(
output_tensor
),
i
,
_net_flag
};
results
.
emplace_back
(
std
::
move
(
result
));
}
return
results
;
}
NET_TYPE
PPredictor
::
get_net_flag
()
const
{
return
(
NET_TYPE
)
_net_flag
;
}
}
\ No newline at end of file
deploy/android_demo/app/src/main/cpp/ppredictor.h
deleted
100644 → 0
View file @
2735e9e3
#pragma once
#include "paddle_api.h"
#include "predictor_input.h"
#include "predictor_output.h"
namespace
ppredictor
{
/**
* PaddleLite Preditor Common Interface
*/
class
PPredictor_Interface
{
public:
virtual
~
PPredictor_Interface
()
{
}
virtual
NET_TYPE
get_net_flag
()
const
=
0
;
};
/**
* Common Predictor
*/
class
PPredictor
:
public
PPredictor_Interface
{
public:
PPredictor
(
int
thread_num
,
int
net_flag
=
0
,
paddle
::
lite_api
::
PowerMode
mode
=
paddle
::
lite_api
::
LITE_POWER_HIGH
);
virtual
~
PPredictor
()
{
}
/**
* init paddlitelite opt model,nb format ,or use ini_paddle
* @param model_content
* @return 0
*/
virtual
int
init_nb
(
const
std
::
string
&
model_content
);
virtual
int
init_from_file
(
const
std
::
string
&
model_content
);
std
::
vector
<
PredictorOutput
>
infer
();
std
::
shared_ptr
<
paddle
::
lite_api
::
PaddlePredictor
>
get_predictor
()
{
return
_predictor
;
}
virtual
std
::
vector
<
PredictorInput
>
get_inputs
(
int
num
);
virtual
PredictorInput
get_input
(
int
index
);
virtual
PredictorInput
get_first_input
();
virtual
NET_TYPE
get_net_flag
()
const
;
protected:
template
<
typename
ConfigT
>
int
_init
(
ConfigT
&
config
);
private:
int
_thread_num
;
paddle
::
lite_api
::
PowerMode
_mode
;
std
::
shared_ptr
<
paddle
::
lite_api
::
PaddlePredictor
>
_predictor
;
bool
_is_input_get
=
false
;
int
_net_flag
;
};
}
deploy/android_demo/app/src/main/cpp/predictor_input.cpp
deleted
100644 → 0
View file @
2735e9e3
#include "predictor_input.h"
namespace
ppredictor
{
void
PredictorInput
::
set_dims
(
std
::
vector
<
int64_t
>
dims
)
{
// yolov3
if
(
_net_flag
==
101
&&
_index
==
1
)
{
_tensor
->
Resize
({
1
,
2
});
_tensor
->
mutable_data
<
int
>
()[
0
]
=
(
int
)
dims
.
at
(
2
);
_tensor
->
mutable_data
<
int
>
()[
1
]
=
(
int
)
dims
.
at
(
3
);
}
else
{
_tensor
->
Resize
(
dims
);
}
_is_dims_set
=
true
;
}
float
*
PredictorInput
::
get_mutable_float_data
()
{
if
(
!
_is_dims_set
)
{
LOGE
(
"PredictorInput::set_dims is not called"
);
}
return
_tensor
->
mutable_data
<
float
>
();
}
void
PredictorInput
::
set_data
(
const
float
*
input_data
,
int
input_float_len
)
{
float
*
input_raw_data
=
get_mutable_float_data
();
memcpy
(
input_raw_data
,
input_data
,
input_float_len
*
sizeof
(
float
));
}
}
\ No newline at end of file
deploy/android_demo/app/src/main/cpp/predictor_input.h
deleted
100644 → 0
View file @
2735e9e3
#pragma once
#include <paddle_api.h>
#include <vector>
#include "common.h"
namespace
ppredictor
{
class
PredictorInput
{
public:
PredictorInput
(
std
::
unique_ptr
<
paddle
::
lite_api
::
Tensor
>
&&
tensor
,
int
index
,
int
net_flag
)
:
_tensor
(
std
::
move
(
tensor
)),
_index
(
index
),
_net_flag
(
net_flag
)
{
}
void
set_dims
(
std
::
vector
<
int64_t
>
dims
);
float
*
get_mutable_float_data
();
void
set_data
(
const
float
*
input_data
,
int
input_float_len
);
private:
std
::
unique_ptr
<
paddle
::
lite_api
::
Tensor
>
_tensor
;
bool
_is_dims_set
=
false
;
int
_index
;
int
_net_flag
;
};
}
deploy/android_demo/app/src/main/cpp/predictor_output.cpp
deleted
100644 → 0
View file @
2735e9e3
#include "predictor_output.h"
namespace
ppredictor
{
const
float
*
PredictorOutput
::
get_float_data
()
const
{
return
_tensor
->
data
<
float
>
();
}
const
int
*
PredictorOutput
::
get_int_data
()
const
{
return
_tensor
->
data
<
int
>
();
}
const
std
::
vector
<
std
::
vector
<
uint64_t
>>
PredictorOutput
::
get_lod
()
const
{
return
_tensor
->
lod
();
}
int64_t
PredictorOutput
::
get_size
()
const
{
if
(
_net_flag
==
NET_OCR
)
{
return
_tensor
->
shape
().
at
(
2
)
*
_tensor
->
shape
().
at
(
3
);
}
else
{
return
product
(
_tensor
->
shape
());
}
}
const
std
::
vector
<
int64_t
>
PredictorOutput
::
get_shape
()
const
{
return
_tensor
->
shape
();
}
}
\ No newline at end of file
deploy/android_demo/app/src/main/cpp/predictor_output.h
deleted
100644 → 0
View file @
2735e9e3
#pragma once
#include <paddle_api.h>
#include <vector>
#include "common.h"
namespace
ppredictor
{
class
PredictorOutput
{
public:
PredictorOutput
(){
}
PredictorOutput
(
std
::
unique_ptr
<
const
paddle
::
lite_api
::
Tensor
>
&&
tensor
,
int
index
,
int
net_flag
)
:
_tensor
(
std
::
move
(
tensor
)),
_index
(
index
),
_net_flag
(
net_flag
)
{
}
const
float
*
get_float_data
()
const
;
const
int
*
get_int_data
()
const
;
int64_t
get_size
()
const
;
const
std
::
vector
<
std
::
vector
<
uint64_t
>>
get_lod
()
const
;
const
std
::
vector
<
int64_t
>
get_shape
()
const
;
std
::
vector
<
float
>
data
;
// return float, or use data_int
std
::
vector
<
int
>
data_int
;
// several layers return int ,or use data
std
::
vector
<
int64_t
>
shape
;
// PaddleLite output shape
std
::
vector
<
std
::
vector
<
uint64_t
>>
lod
;
// PaddleLite output lod
private:
std
::
unique_ptr
<
const
paddle
::
lite_api
::
Tensor
>
_tensor
;
int
_index
;
int
_net_flag
;
};
}
deploy/android_demo/app/src/main/cpp/preprocess.cpp
deleted
100644 → 0
View file @
2735e9e3
#include "preprocess.h"
#include <android/bitmap.h>
cv
::
Mat
bitmap_to_cv_mat
(
JNIEnv
*
env
,
jobject
bitmap
)
{
AndroidBitmapInfo
info
;
int
result
=
AndroidBitmap_getInfo
(
env
,
bitmap
,
&
info
);
if
(
result
!=
ANDROID_BITMAP_RESULT_SUCCESS
)
{
LOGE
(
"AndroidBitmap_getInfo failed, result: %d"
,
result
);
return
cv
::
Mat
{};
}
if
(
info
.
format
!=
ANDROID_BITMAP_FORMAT_RGBA_8888
)
{
LOGE
(
"Bitmap format is not RGBA_8888 !"
);
return
cv
::
Mat
{};
}
unsigned
char
*
srcData
=
NULL
;
AndroidBitmap_lockPixels
(
env
,
bitmap
,
(
void
**
)
&
srcData
);
cv
::
Mat
mat
=
cv
::
Mat
::
zeros
(
info
.
height
,
info
.
width
,
CV_8UC4
);
memcpy
(
mat
.
data
,
srcData
,
info
.
height
*
info
.
width
*
4
);
AndroidBitmap_unlockPixels
(
env
,
bitmap
);
cv
::
cvtColor
(
mat
,
mat
,
cv
::
COLOR_RGBA2BGR
);
/**
if (!cv::imwrite("/sdcard/1/copy.jpg", mat)){
LOGE("Write image failed " );
}
*/
return
mat
;
}
cv
::
Mat
resize_img
(
const
cv
::
Mat
&
img
,
int
height
,
int
width
){
if
(
img
.
rows
==
height
&&
img
.
cols
==
width
){
return
img
;
}
cv
::
Mat
new_img
;
cv
::
resize
(
img
,
new_img
,
cv
::
Size
(
height
,
width
));
return
new_img
;
}
// fill tensor with mean and scale and trans layout: nhwc -> nchw, neon speed up
void
neon_mean_scale
(
const
float
*
din
,
float
*
dout
,
int
size
,
const
std
::
vector
<
float
>&
mean
,
const
std
::
vector
<
float
>&
scale
)
{
if
(
mean
.
size
()
!=
3
||
scale
.
size
()
!=
3
)
{
LOGE
(
"[ERROR] mean or scale size must equal to 3"
);
return
;
}
float32x4_t
vmean0
=
vdupq_n_f32
(
mean
[
0
]);
float32x4_t
vmean1
=
vdupq_n_f32
(
mean
[
1
]);
float32x4_t
vmean2
=
vdupq_n_f32
(
mean
[
2
]);
float32x4_t
vscale0
=
vdupq_n_f32
(
scale
[
0
]);
float32x4_t
vscale1
=
vdupq_n_f32
(
scale
[
1
]);
float32x4_t
vscale2
=
vdupq_n_f32
(
scale
[
2
]);
float
*
dout_c0
=
dout
;
float
*
dout_c1
=
dout
+
size
;
float
*
dout_c2
=
dout
+
size
*
2
;
int
i
=
0
;
for
(;
i
<
size
-
3
;
i
+=
4
)
{
float32x4x3_t
vin3
=
vld3q_f32
(
din
);
float32x4_t
vsub0
=
vsubq_f32
(
vin3
.
val
[
0
],
vmean0
);
float32x4_t
vsub1
=
vsubq_f32
(
vin3
.
val
[
1
],
vmean1
);
float32x4_t
vsub2
=
vsubq_f32
(
vin3
.
val
[
2
],
vmean2
);
float32x4_t
vs0
=
vmulq_f32
(
vsub0
,
vscale0
);
float32x4_t
vs1
=
vmulq_f32
(
vsub1
,
vscale1
);
float32x4_t
vs2
=
vmulq_f32
(
vsub2
,
vscale2
);
vst1q_f32
(
dout_c0
,
vs0
);
vst1q_f32
(
dout_c1
,
vs1
);
vst1q_f32
(
dout_c2
,
vs2
);
din
+=
12
;
dout_c0
+=
4
;
dout_c1
+=
4
;
dout_c2
+=
4
;
}
for
(;
i
<
size
;
i
++
)
{
*
(
dout_c0
++
)
=
(
*
(
din
++
)
-
mean
[
0
])
*
scale
[
0
];
*
(
dout_c1
++
)
=
(
*
(
din
++
)
-
mean
[
1
])
*
scale
[
1
];
*
(
dout_c2
++
)
=
(
*
(
din
++
)
-
mean
[
2
])
*
scale
[
2
];
}
}
\ No newline at end of file
deploy/android_demo/app/src/main/cpp/preprocess.h
deleted
100644 → 0
View file @
2735e9e3
#pragma once
#include <jni.h>
#include <opencv2/opencv.hpp>
#include "common.h"
cv
::
Mat
bitmap_to_cv_mat
(
JNIEnv
*
env
,
jobject
bitmap
);
cv
::
Mat
resize_img
(
const
cv
::
Mat
&
img
,
int
height
,
int
width
);
void
neon_mean_scale
(
const
float
*
din
,
float
*
dout
,
int
size
,
const
std
::
vector
<
float
>&
mean
,
const
std
::
vector
<
float
>&
scale
);
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java
deleted
100644 → 0
View file @
2735e9e3
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
com.baidu.paddle.lite.demo.ocr
;
import
android.content.res.Configuration
;
import
android.os.Bundle
;
import
android.preference.PreferenceActivity
;
import
android.view.MenuInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
androidx.annotation.LayoutRes
;
import
androidx.annotation.Nullable
;
import
androidx.appcompat.app.ActionBar
;
import
androidx.appcompat.app.AppCompatDelegate
;
import
androidx.appcompat.widget.Toolbar
;
/**
* A {@link PreferenceActivity} which implements and proxies the necessary calls
* to be used with AppCompat.
* <p>
* This technique can be used with an {@link android.app.Activity} class, not just
* {@link PreferenceActivity}.
*/
public
abstract
class
AppCompatPreferenceActivity
extends
PreferenceActivity
{
private
AppCompatDelegate
mDelegate
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
getDelegate
().
installViewFactory
();
getDelegate
().
onCreate
(
savedInstanceState
);
super
.
onCreate
(
savedInstanceState
);
}
@Override
protected
void
onPostCreate
(
Bundle
savedInstanceState
)
{
super
.
onPostCreate
(
savedInstanceState
);
getDelegate
().
onPostCreate
(
savedInstanceState
);
}
public
ActionBar
getSupportActionBar
()
{
return
getDelegate
().
getSupportActionBar
();
}
public
void
setSupportActionBar
(
@Nullable
Toolbar
toolbar
)
{
getDelegate
().
setSupportActionBar
(
toolbar
);
}
@Override
public
MenuInflater
getMenuInflater
()
{
return
getDelegate
().
getMenuInflater
();
}
@Override
public
void
setContentView
(
@LayoutRes
int
layoutResID
)
{
getDelegate
().
setContentView
(
layoutResID
);
}
@Override
public
void
setContentView
(
View
view
)
{
getDelegate
().
setContentView
(
view
);
}
@Override
public
void
setContentView
(
View
view
,
ViewGroup
.
LayoutParams
params
)
{
getDelegate
().
setContentView
(
view
,
params
);
}
@Override
public
void
addContentView
(
View
view
,
ViewGroup
.
LayoutParams
params
)
{
getDelegate
().
addContentView
(
view
,
params
);
}
@Override
protected
void
onPostResume
()
{
super
.
onPostResume
();
getDelegate
().
onPostResume
();
}
@Override
protected
void
onTitleChanged
(
CharSequence
title
,
int
color
)
{
super
.
onTitleChanged
(
title
,
color
);
getDelegate
().
setTitle
(
title
);
}
@Override
public
void
onConfigurationChanged
(
Configuration
newConfig
)
{
super
.
onConfigurationChanged
(
newConfig
);
getDelegate
().
onConfigurationChanged
(
newConfig
);
}
@Override
protected
void
onStop
()
{
super
.
onStop
();
getDelegate
().
onStop
();
}
@Override
protected
void
onDestroy
()
{
super
.
onDestroy
();
getDelegate
().
onDestroy
();
}
public
void
invalidateOptionsMenu
()
{
getDelegate
().
invalidateOptionsMenu
();
}
private
AppCompatDelegate
getDelegate
()
{
if
(
mDelegate
==
null
)
{
mDelegate
=
AppCompatDelegate
.
create
(
this
,
null
);
}
return
mDelegate
;
}
}
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java
deleted
100644 → 0
View file @
2735e9e3
package
com.baidu.paddle.lite.demo.ocr
;
import
android.Manifest
;
import
android.app.ProgressDialog
;
import
android.content.ContentResolver
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.content.SharedPreferences
;
import
android.content.pm.PackageManager
;
import
android.database.Cursor
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.media.ExifInterface
;
import
android.net.Uri
;
import
android.os.Bundle
;
import
android.os.Environment
;
import
android.os.Handler
;
import
android.os.HandlerThread
;
import
android.os.Message
;
import
android.preference.PreferenceManager
;
import
android.provider.MediaStore
;
import
android.text.method.ScrollingMovementMethod
;
import
android.util.Log
;
import
android.view.Menu
;
import
android.view.MenuInflater
;
import
android.view.MenuItem
;
import
android.widget.ImageView
;
import
android.widget.TextView
;
import
android.widget.Toast
;
import
androidx.annotation.NonNull
;
import
androidx.appcompat.app.AppCompatActivity
;
import
androidx.core.app.ActivityCompat
;
import
androidx.core.content.ContextCompat
;
import
androidx.core.content.FileProvider
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
public
class
MainActivity
extends
AppCompatActivity
{
private
static
final
String
TAG
=
MainActivity
.
class
.
getSimpleName
();
public
static
final
int
OPEN_GALLERY_REQUEST_CODE
=
0
;
public
static
final
int
TAKE_PHOTO_REQUEST_CODE
=
1
;
public
static
final
int
REQUEST_LOAD_MODEL
=
0
;
public
static
final
int
REQUEST_RUN_MODEL
=
1
;
public
static
final
int
RESPONSE_LOAD_MODEL_SUCCESSED
=
0
;
public
static
final
int
RESPONSE_LOAD_MODEL_FAILED
=
1
;
public
static
final
int
RESPONSE_RUN_MODEL_SUCCESSED
=
2
;
public
static
final
int
RESPONSE_RUN_MODEL_FAILED
=
3
;
protected
ProgressDialog
pbLoadModel
=
null
;
protected
ProgressDialog
pbRunModel
=
null
;
protected
Handler
receiver
=
null
;
// Receive messages from worker thread
protected
Handler
sender
=
null
;
// Send command to worker thread
protected
HandlerThread
worker
=
null
;
// Worker thread to load&run model
// UI components of object detection
protected
TextView
tvInputSetting
;
protected
ImageView
ivInputImage
;
protected
TextView
tvOutputResult
;
protected
TextView
tvInferenceTime
;
// Model settings of object detection
protected
String
modelPath
=
""
;
protected
String
labelPath
=
""
;
protected
String
imagePath
=
""
;
protected
int
cpuThreadNum
=
1
;
protected
String
cpuPowerMode
=
""
;
protected
String
inputColorFormat
=
""
;
protected
long
[]
inputShape
=
new
long
[]{};
protected
float
[]
inputMean
=
new
float
[]{};
protected
float
[]
inputStd
=
new
float
[]{};
protected
float
scoreThreshold
=
0.1f
;
private
String
currentPhotoPath
;
protected
Predictor
predictor
=
new
Predictor
();
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_main
);
// Clear all setting items to avoid app crashing due to the incorrect settings
SharedPreferences
sharedPreferences
=
PreferenceManager
.
getDefaultSharedPreferences
(
this
);
SharedPreferences
.
Editor
editor
=
sharedPreferences
.
edit
();
editor
.
clear
();
editor
.
commit
();
// Prepare the worker thread for mode loading and inference
receiver
=
new
Handler
()
{
@Override
public
void
handleMessage
(
Message
msg
)
{
switch
(
msg
.
what
)
{
case
RESPONSE_LOAD_MODEL_SUCCESSED:
pbLoadModel
.
dismiss
();
onLoadModelSuccessed
();
break
;
case
RESPONSE_LOAD_MODEL_FAILED:
pbLoadModel
.
dismiss
();
Toast
.
makeText
(
MainActivity
.
this
,
"Load model failed!"
,
Toast
.
LENGTH_SHORT
).
show
();
onLoadModelFailed
();
break
;
case
RESPONSE_RUN_MODEL_SUCCESSED:
pbRunModel
.
dismiss
();
onRunModelSuccessed
();
break
;
case
RESPONSE_RUN_MODEL_FAILED:
pbRunModel
.
dismiss
();
Toast
.
makeText
(
MainActivity
.
this
,
"Run model failed!"
,
Toast
.
LENGTH_SHORT
).
show
();
onRunModelFailed
();
break
;
default
:
break
;
}
}
};
worker
=
new
HandlerThread
(
"Predictor Worker"
);
worker
.
start
();
sender
=
new
Handler
(
worker
.
getLooper
())
{
public
void
handleMessage
(
Message
msg
)
{
switch
(
msg
.
what
)
{
case
REQUEST_LOAD_MODEL:
// Load model and reload test image
if
(
onLoadModel
())
{
receiver
.
sendEmptyMessage
(
RESPONSE_LOAD_MODEL_SUCCESSED
);
}
else
{
receiver
.
sendEmptyMessage
(
RESPONSE_LOAD_MODEL_FAILED
);
}
break
;
case
REQUEST_RUN_MODEL:
// Run model if model is loaded
if
(
onRunModel
())
{
receiver
.
sendEmptyMessage
(
RESPONSE_RUN_MODEL_SUCCESSED
);
}
else
{
receiver
.
sendEmptyMessage
(
RESPONSE_RUN_MODEL_FAILED
);
}
break
;
default
:
break
;
}
}
};
// Setup the UI components
tvInputSetting
=
findViewById
(
R
.
id
.
tv_input_setting
);
ivInputImage
=
findViewById
(
R
.
id
.
iv_input_image
);
tvInferenceTime
=
findViewById
(
R
.
id
.
tv_inference_time
);
tvOutputResult
=
findViewById
(
R
.
id
.
tv_output_result
);
tvInputSetting
.
setMovementMethod
(
ScrollingMovementMethod
.
getInstance
());
tvOutputResult
.
setMovementMethod
(
ScrollingMovementMethod
.
getInstance
());
}
@Override
protected
void
onResume
()
{
super
.
onResume
();
SharedPreferences
sharedPreferences
=
PreferenceManager
.
getDefaultSharedPreferences
(
this
);
boolean
settingsChanged
=
false
;
String
model_path
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
MODEL_PATH_KEY
),
getString
(
R
.
string
.
MODEL_PATH_DEFAULT
));
String
label_path
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
LABEL_PATH_KEY
),
getString
(
R
.
string
.
LABEL_PATH_DEFAULT
));
String
image_path
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
IMAGE_PATH_KEY
),
getString
(
R
.
string
.
IMAGE_PATH_DEFAULT
));
settingsChanged
|=
!
model_path
.
equalsIgnoreCase
(
modelPath
);
settingsChanged
|=
!
label_path
.
equalsIgnoreCase
(
labelPath
);
settingsChanged
|=
!
image_path
.
equalsIgnoreCase
(
imagePath
);
int
cpu_thread_num
=
Integer
.
parseInt
(
sharedPreferences
.
getString
(
getString
(
R
.
string
.
CPU_THREAD_NUM_KEY
),
getString
(
R
.
string
.
CPU_THREAD_NUM_DEFAULT
)));
settingsChanged
|=
cpu_thread_num
!=
cpuThreadNum
;
String
cpu_power_mode
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
CPU_POWER_MODE_KEY
),
getString
(
R
.
string
.
CPU_POWER_MODE_DEFAULT
));
settingsChanged
|=
!
cpu_power_mode
.
equalsIgnoreCase
(
cpuPowerMode
);
String
input_color_format
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
INPUT_COLOR_FORMAT_KEY
),
getString
(
R
.
string
.
INPUT_COLOR_FORMAT_DEFAULT
));
settingsChanged
|=
!
input_color_format
.
equalsIgnoreCase
(
inputColorFormat
);
long
[]
input_shape
=
Utils
.
parseLongsFromString
(
sharedPreferences
.
getString
(
getString
(
R
.
string
.
INPUT_SHAPE_KEY
),
getString
(
R
.
string
.
INPUT_SHAPE_DEFAULT
)),
","
);
float
[]
input_mean
=
Utils
.
parseFloatsFromString
(
sharedPreferences
.
getString
(
getString
(
R
.
string
.
INPUT_MEAN_KEY
),
getString
(
R
.
string
.
INPUT_MEAN_DEFAULT
)),
","
);
float
[]
input_std
=
Utils
.
parseFloatsFromString
(
sharedPreferences
.
getString
(
getString
(
R
.
string
.
INPUT_STD_KEY
)
,
getString
(
R
.
string
.
INPUT_STD_DEFAULT
)),
","
);
settingsChanged
|=
input_shape
.
length
!=
inputShape
.
length
;
settingsChanged
|=
input_mean
.
length
!=
inputMean
.
length
;
settingsChanged
|=
input_std
.
length
!=
inputStd
.
length
;
if
(!
settingsChanged
)
{
for
(
int
i
=
0
;
i
<
input_shape
.
length
;
i
++)
{
settingsChanged
|=
input_shape
[
i
]
!=
inputShape
[
i
];
}
for
(
int
i
=
0
;
i
<
input_mean
.
length
;
i
++)
{
settingsChanged
|=
input_mean
[
i
]
!=
inputMean
[
i
];
}
for
(
int
i
=
0
;
i
<
input_std
.
length
;
i
++)
{
settingsChanged
|=
input_std
[
i
]
!=
inputStd
[
i
];
}
}
float
score_threshold
=
Float
.
parseFloat
(
sharedPreferences
.
getString
(
getString
(
R
.
string
.
SCORE_THRESHOLD_KEY
),
getString
(
R
.
string
.
SCORE_THRESHOLD_DEFAULT
)));
settingsChanged
|=
scoreThreshold
!=
score_threshold
;
if
(
settingsChanged
)
{
modelPath
=
model_path
;
labelPath
=
label_path
;
imagePath
=
image_path
;
cpuThreadNum
=
cpu_thread_num
;
cpuPowerMode
=
cpu_power_mode
;
inputColorFormat
=
input_color_format
;
inputShape
=
input_shape
;
inputMean
=
input_mean
;
inputStd
=
input_std
;
scoreThreshold
=
score_threshold
;
// Update UI
tvInputSetting
.
setText
(
"Model: "
+
modelPath
.
substring
(
modelPath
.
lastIndexOf
(
"/"
)
+
1
)
+
"\n"
+
"CPU"
+
" Thread Num: "
+
Integer
.
toString
(
cpuThreadNum
)
+
"\n"
+
"CPU Power Mode: "
+
cpuPowerMode
);
tvInputSetting
.
scrollTo
(
0
,
0
);
// Reload model if configure has been changed
loadModel
();
}
}
public
void
loadModel
()
{
pbLoadModel
=
ProgressDialog
.
show
(
this
,
""
,
"Loading model..."
,
false
,
false
);
sender
.
sendEmptyMessage
(
REQUEST_LOAD_MODEL
);
}
public
void
runModel
()
{
pbRunModel
=
ProgressDialog
.
show
(
this
,
""
,
"Running model..."
,
false
,
false
);
sender
.
sendEmptyMessage
(
REQUEST_RUN_MODEL
);
}
public
boolean
onLoadModel
()
{
return
predictor
.
init
(
MainActivity
.
this
,
modelPath
,
labelPath
,
cpuThreadNum
,
cpuPowerMode
,
inputColorFormat
,
inputShape
,
inputMean
,
inputStd
,
scoreThreshold
);
}
public
boolean
onRunModel
()
{
return
predictor
.
isLoaded
()
&&
predictor
.
runModel
();
}
public
void
onLoadModelSuccessed
()
{
// Load test image from path and run model
try
{
if
(
imagePath
.
isEmpty
())
{
return
;
}
Bitmap
image
=
null
;
// Read test image file from custom path if the first character of mode path is '/', otherwise read test
// image file from assets
if
(!
imagePath
.
substring
(
0
,
1
).
equals
(
"/"
))
{
InputStream
imageStream
=
getAssets
().
open
(
imagePath
);
image
=
BitmapFactory
.
decodeStream
(
imageStream
);
}
else
{
if
(!
new
File
(
imagePath
).
exists
())
{
return
;
}
image
=
BitmapFactory
.
decodeFile
(
imagePath
);
}
if
(
image
!=
null
&&
predictor
.
isLoaded
())
{
predictor
.
setInputImage
(
image
);
runModel
();
}
}
catch
(
IOException
e
)
{
Toast
.
makeText
(
MainActivity
.
this
,
"Load image failed!"
,
Toast
.
LENGTH_SHORT
).
show
();
e
.
printStackTrace
();
}
}
public
void
onLoadModelFailed
()
{
}
public
void
onRunModelSuccessed
()
{
// Obtain results and update UI
tvInferenceTime
.
setText
(
"Inference time: "
+
predictor
.
inferenceTime
()
+
" ms"
);
Bitmap
outputImage
=
predictor
.
outputImage
();
if
(
outputImage
!=
null
)
{
ivInputImage
.
setImageBitmap
(
outputImage
);
}
tvOutputResult
.
setText
(
predictor
.
outputResult
());
tvOutputResult
.
scrollTo
(
0
,
0
);
}
public
void
onRunModelFailed
()
{
}
public
void
onImageChanged
(
Bitmap
image
)
{
// Rerun model if users pick test image from gallery or camera
if
(
image
!=
null
&&
predictor
.
isLoaded
())
{
predictor
.
setInputImage
(
image
);
runModel
();
}
}
public
void
onSettingsClicked
()
{
startActivity
(
new
Intent
(
MainActivity
.
this
,
SettingsActivity
.
class
));
}
@Override
public
boolean
onCreateOptionsMenu
(
Menu
menu
)
{
MenuInflater
inflater
=
getMenuInflater
();
inflater
.
inflate
(
R
.
menu
.
menu_action_options
,
menu
);
return
true
;
}
public
boolean
onPrepareOptionsMenu
(
Menu
menu
)
{
boolean
isLoaded
=
predictor
.
isLoaded
();
menu
.
findItem
(
R
.
id
.
open_gallery
).
setEnabled
(
isLoaded
);
menu
.
findItem
(
R
.
id
.
take_photo
).
setEnabled
(
isLoaded
);
return
super
.
onPrepareOptionsMenu
(
menu
);
}
@Override
public
boolean
onOptionsItemSelected
(
MenuItem
item
)
{
switch
(
item
.
getItemId
())
{
case
android
.
R
.
id
.
home
:
finish
();
break
;
case
R
.
id
.
open_gallery
:
if
(
requestAllPermissions
())
{
openGallery
();
}
break
;
case
R
.
id
.
take_photo
:
if
(
requestAllPermissions
())
{
takePhoto
();
}
break
;
case
R
.
id
.
settings
:
if
(
requestAllPermissions
())
{
// Make sure we have SDCard r&w permissions to load model from SDCard
onSettingsClicked
();
}
break
;
}
return
super
.
onOptionsItemSelected
(
item
);
}
@Override
public
void
onRequestPermissionsResult
(
int
requestCode
,
@NonNull
String
[]
permissions
,
@NonNull
int
[]
grantResults
)
{
super
.
onRequestPermissionsResult
(
requestCode
,
permissions
,
grantResults
);
if
(
grantResults
[
0
]
!=
PackageManager
.
PERMISSION_GRANTED
||
grantResults
[
1
]
!=
PackageManager
.
PERMISSION_GRANTED
)
{
Toast
.
makeText
(
this
,
"Permission Denied"
,
Toast
.
LENGTH_SHORT
).
show
();
}
}
private
boolean
requestAllPermissions
()
{
if
(
ContextCompat
.
checkSelfPermission
(
this
,
Manifest
.
permission
.
WRITE_EXTERNAL_STORAGE
)
!=
PackageManager
.
PERMISSION_GRANTED
||
ContextCompat
.
checkSelfPermission
(
this
,
Manifest
.
permission
.
CAMERA
)
!=
PackageManager
.
PERMISSION_GRANTED
)
{
ActivityCompat
.
requestPermissions
(
this
,
new
String
[]{
Manifest
.
permission
.
WRITE_EXTERNAL_STORAGE
,
Manifest
.
permission
.
CAMERA
},
0
);
return
false
;
}
return
true
;
}
private
void
openGallery
()
{
Intent
intent
=
new
Intent
(
Intent
.
ACTION_PICK
,
null
);
intent
.
setDataAndType
(
MediaStore
.
Images
.
Media
.
EXTERNAL_CONTENT_URI
,
"image/*"
);
startActivityForResult
(
intent
,
OPEN_GALLERY_REQUEST_CODE
);
}
private
void
takePhoto
()
{
Intent
takePictureIntent
=
new
Intent
(
MediaStore
.
ACTION_IMAGE_CAPTURE
);
// Ensure that there's a camera activity to handle the intent
if
(
takePictureIntent
.
resolveActivity
(
getPackageManager
())
!=
null
)
{
// Create the File where the photo should go
File
photoFile
=
null
;
try
{
photoFile
=
createImageFile
();
}
catch
(
IOException
ex
)
{
Log
.
e
(
"MainActitity"
,
ex
.
getMessage
(),
ex
);
Toast
.
makeText
(
MainActivity
.
this
,
"Create Camera temp file failed: "
+
ex
.
getMessage
(),
Toast
.
LENGTH_SHORT
).
show
();
}
// Continue only if the File was successfully created
if
(
photoFile
!=
null
)
{
Log
.
i
(
TAG
,
"FILEPATH "
+
getExternalFilesDir
(
"Pictures"
).
getAbsolutePath
());
Uri
photoURI
=
FileProvider
.
getUriForFile
(
this
,
"com.baidu.paddle.lite.demo.ocr.fileprovider"
,
photoFile
);
currentPhotoPath
=
photoFile
.
getAbsolutePath
();
takePictureIntent
.
putExtra
(
MediaStore
.
EXTRA_OUTPUT
,
photoURI
);
startActivityForResult
(
takePictureIntent
,
TAKE_PHOTO_REQUEST_CODE
);
Log
.
i
(
TAG
,
"startActivityForResult finished"
);
}
}
}
private
File
createImageFile
()
throws
IOException
{
// Create an image file name
String
timeStamp
=
new
SimpleDateFormat
(
"yyyyMMdd_HHmmss"
).
format
(
new
Date
());
String
imageFileName
=
"JPEG_"
+
timeStamp
+
"_"
;
File
storageDir
=
getExternalFilesDir
(
Environment
.
DIRECTORY_PICTURES
);
File
image
=
File
.
createTempFile
(
imageFileName
,
/* prefix */
".bmp"
,
/* suffix */
storageDir
/* directory */
);
return
image
;
}
@Override
protected
void
onActivityResult
(
int
requestCode
,
int
resultCode
,
Intent
data
)
{
super
.
onActivityResult
(
requestCode
,
resultCode
,
data
);
if
(
resultCode
==
RESULT_OK
)
{
switch
(
requestCode
)
{
case
OPEN_GALLERY_REQUEST_CODE:
if
(
data
==
null
)
{
break
;
}
try
{
ContentResolver
resolver
=
getContentResolver
();
Uri
uri
=
data
.
getData
();
Bitmap
image
=
MediaStore
.
Images
.
Media
.
getBitmap
(
resolver
,
uri
);
String
[]
proj
=
{
MediaStore
.
Images
.
Media
.
DATA
};
Cursor
cursor
=
managedQuery
(
uri
,
proj
,
null
,
null
,
null
);
cursor
.
moveToFirst
();
onImageChanged
(
image
);
}
catch
(
IOException
e
)
{
Log
.
e
(
TAG
,
e
.
toString
());
}
break
;
case
TAKE_PHOTO_REQUEST_CODE:
if
(
currentPhotoPath
!=
null
)
{
ExifInterface
exif
=
null
;
try
{
exif
=
new
ExifInterface
(
currentPhotoPath
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
int
orientation
=
exif
.
getAttributeInt
(
ExifInterface
.
TAG_ORIENTATION
,
ExifInterface
.
ORIENTATION_UNDEFINED
);
Log
.
i
(
TAG
,
"rotation "
+
orientation
);
Bitmap
image
=
BitmapFactory
.
decodeFile
(
currentPhotoPath
);
image
=
Utils
.
rotateBitmap
(
image
,
orientation
);
onImageChanged
(
image
);
}
else
{
Log
.
e
(
TAG
,
"currentPhotoPath is null"
);
}
break
;
default
:
break
;
}
}
}
@Override
protected
void
onDestroy
()
{
if
(
predictor
!=
null
)
{
predictor
.
releaseModel
();
}
worker
.
quit
();
super
.
onDestroy
();
}
}
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java
deleted
100644 → 0
View file @
2735e9e3
package
com.baidu.paddle.lite.demo.ocr
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.os.Build
;
import
android.os.Bundle
;
import
android.os.Handler
;
import
android.os.HandlerThread
;
import
android.os.Message
;
import
android.util.Log
;
import
android.view.View
;
import
android.widget.Button
;
import
android.widget.ImageView
;
import
android.widget.TextView
;
import
android.widget.Toast
;
import
androidx.appcompat.app.AppCompatActivity
;
import
java.io.IOException
;
import
java.io.InputStream
;
public
class
MiniActivity
extends
AppCompatActivity
{
public
static
final
int
REQUEST_LOAD_MODEL
=
0
;
public
static
final
int
REQUEST_RUN_MODEL
=
1
;
public
static
final
int
REQUEST_UNLOAD_MODEL
=
2
;
public
static
final
int
RESPONSE_LOAD_MODEL_SUCCESSED
=
0
;
public
static
final
int
RESPONSE_LOAD_MODEL_FAILED
=
1
;
public
static
final
int
RESPONSE_RUN_MODEL_SUCCESSED
=
2
;
public
static
final
int
RESPONSE_RUN_MODEL_FAILED
=
3
;
private
static
final
String
TAG
=
"MiniActivity"
;
protected
Handler
receiver
=
null
;
// Receive messages from worker thread
protected
Handler
sender
=
null
;
// Send command to worker thread
protected
HandlerThread
worker
=
null
;
// Worker thread to load&run model
protected
volatile
Predictor
predictor
=
null
;
private
String
assetModelDirPath
=
"models/ocr_v1_for_cpu"
;
private
String
assetlabelFilePath
=
"labels/ppocr_keys_v1.txt"
;
private
Button
button
;
private
ImageView
imageView
;
// image result
private
TextView
textView
;
// text result
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_mini
);
Log
.
i
(
TAG
,
"SHOW in Logcat"
);
// Prepare the worker thread for mode loading and inference
worker
=
new
HandlerThread
(
"Predictor Worker"
);
worker
.
start
();
sender
=
new
Handler
(
worker
.
getLooper
())
{
public
void
handleMessage
(
Message
msg
)
{
switch
(
msg
.
what
)
{
case
REQUEST_LOAD_MODEL:
// Load model and reload test image
if
(!
onLoadModel
())
{
runOnUiThread
(
new
Runnable
()
{
@Override
public
void
run
()
{
Toast
.
makeText
(
MiniActivity
.
this
,
"Load model failed!"
,
Toast
.
LENGTH_SHORT
).
show
();
}
});
}
break
;
case
REQUEST_RUN_MODEL:
// Run model if model is loaded
final
boolean
isSuccessed
=
onRunModel
();
runOnUiThread
(
new
Runnable
()
{
@Override
public
void
run
()
{
if
(
isSuccessed
){
onRunModelSuccessed
();
}
else
{
Toast
.
makeText
(
MiniActivity
.
this
,
"Run model failed!"
,
Toast
.
LENGTH_SHORT
).
show
();
}
}
});
break
;
}
}
};
sender
.
sendEmptyMessage
(
REQUEST_LOAD_MODEL
);
// corresponding to REQUEST_LOAD_MODEL, to call onLoadModel()
imageView
=
findViewById
(
R
.
id
.
imageView
);
textView
=
findViewById
(
R
.
id
.
sample_text
);
button
=
findViewById
(
R
.
id
.
button
);
button
.
setOnClickListener
(
new
View
.
OnClickListener
()
{
@Override
public
void
onClick
(
View
v
)
{
sender
.
sendEmptyMessage
(
REQUEST_RUN_MODEL
);
}
});
}
@Override
protected
void
onDestroy
()
{
onUnloadModel
();
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
JELLY_BEAN_MR2
)
{
worker
.
quitSafely
();
}
else
{
worker
.
quit
();
}
super
.
onDestroy
();
}
/**
* call in onCreate, model init
*
* @return
*/
private
boolean
onLoadModel
()
{
if
(
predictor
==
null
)
{
predictor
=
new
Predictor
();
}
return
predictor
.
init
(
this
,
assetModelDirPath
,
assetlabelFilePath
);
}
/**
* init engine
* call in onCreate
*
* @return
*/
private
boolean
onRunModel
()
{
try
{
String
assetImagePath
=
"images/5.jpg"
;
InputStream
imageStream
=
getAssets
().
open
(
assetImagePath
);
Bitmap
image
=
BitmapFactory
.
decodeStream
(
imageStream
);
// Input is Bitmap
predictor
.
setInputImage
(
image
);
return
predictor
.
isLoaded
()
&&
predictor
.
runModel
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
return
false
;
}
}
private
void
onRunModelSuccessed
()
{
Log
.
i
(
TAG
,
"onRunModelSuccessed"
);
textView
.
setText
(
predictor
.
outputResult
);
imageView
.
setImageBitmap
(
predictor
.
outputImage
);
}
private
void
onUnloadModel
()
{
if
(
predictor
!=
null
)
{
predictor
.
releaseModel
();
}
}
}
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java
deleted
100644 → 0
View file @
2735e9e3
package
com.baidu.paddle.lite.demo.ocr
;
import
android.graphics.Bitmap
;
import
android.util.Log
;
import
java.util.ArrayList
;
import
java.util.concurrent.atomic.AtomicBoolean
;
public
class
OCRPredictorNative
{
private
static
final
AtomicBoolean
isSOLoaded
=
new
AtomicBoolean
();
public
static
void
loadLibrary
()
throws
RuntimeException
{
if
(!
isSOLoaded
.
get
()
&&
isSOLoaded
.
compareAndSet
(
false
,
true
))
{
try
{
System
.
loadLibrary
(
"Native"
);
}
catch
(
Throwable
e
)
{
RuntimeException
exception
=
new
RuntimeException
(
"Load libNative.so failed, please check it exists in apk file."
,
e
);
throw
exception
;
}
}
}
private
Config
config
;
private
long
nativePointer
=
0
;
public
OCRPredictorNative
(
Config
config
)
{
this
.
config
=
config
;
loadLibrary
();
nativePointer
=
init
(
config
.
detModelFilename
,
config
.
recModelFilename
,
config
.
cpuThreadNum
,
config
.
cpuPower
);
Log
.
i
(
"OCRPredictorNative"
,
"load success "
+
nativePointer
);
}
public
void
release
()
{
if
(
nativePointer
!=
0
)
{
nativePointer
=
0
;
destory
(
nativePointer
);
}
}
public
ArrayList
<
OcrResultModel
>
runImage
(
float
[]
inputData
,
int
width
,
int
height
,
int
channels
,
Bitmap
originalImage
)
{
Log
.
i
(
"OCRPredictorNative"
,
"begin to run image "
+
inputData
.
length
+
" "
+
width
+
" "
+
height
);
float
[]
dims
=
new
float
[]{
1
,
channels
,
height
,
width
};
float
[]
rawResults
=
forward
(
nativePointer
,
inputData
,
dims
,
originalImage
);
ArrayList
<
OcrResultModel
>
results
=
postprocess
(
rawResults
);
return
results
;
}
public
static
class
Config
{
public
int
cpuThreadNum
;
public
String
cpuPower
;
public
String
detModelFilename
;
public
String
recModelFilename
;
}
protected
native
long
init
(
String
detModelPath
,
String
recModelPath
,
int
threadNum
,
String
cpuMode
);
protected
native
float
[]
forward
(
long
pointer
,
float
[]
buf
,
float
[]
ddims
,
Bitmap
originalImage
);
protected
native
void
destory
(
long
pointer
);
private
ArrayList
<
OcrResultModel
>
postprocess
(
float
[]
raw
)
{
ArrayList
<
OcrResultModel
>
results
=
new
ArrayList
<
OcrResultModel
>();
int
begin
=
0
;
while
(
begin
<
raw
.
length
)
{
int
point_num
=
Math
.
round
(
raw
[
begin
]);
int
word_num
=
Math
.
round
(
raw
[
begin
+
1
]);
OcrResultModel
model
=
parse
(
raw
,
begin
+
2
,
point_num
,
word_num
);
begin
+=
2
+
1
+
point_num
*
2
+
word_num
;
results
.
add
(
model
);
}
return
results
;
}
private
OcrResultModel
parse
(
float
[]
raw
,
int
begin
,
int
pointNum
,
int
wordNum
)
{
int
current
=
begin
;
OcrResultModel
model
=
new
OcrResultModel
();
model
.
setConfidence
(
raw
[
current
]);
current
++;
for
(
int
i
=
0
;
i
<
pointNum
;
i
++)
{
model
.
addPoints
(
Math
.
round
(
raw
[
current
+
i
*
2
]),
Math
.
round
(
raw
[
current
+
i
*
2
+
1
]));
}
current
+=
(
pointNum
*
2
);
for
(
int
i
=
0
;
i
<
wordNum
;
i
++)
{
int
index
=
Math
.
round
(
raw
[
current
+
i
]);
model
.
addWordIndex
(
index
);
}
Log
.
i
(
"OCRPredictorNative"
,
"word finished "
+
wordNum
);
return
model
;
}
}
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OcrResultModel.java
deleted
100644 → 0
View file @
2735e9e3
package
com.baidu.paddle.lite.demo.ocr
;
import
android.graphics.Point
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
OcrResultModel
{
private
List
<
Point
>
points
;
private
List
<
Integer
>
wordIndex
;
private
String
label
;
private
float
confidence
;
public
OcrResultModel
()
{
super
();
points
=
new
ArrayList
<>();
wordIndex
=
new
ArrayList
<>();
}
public
void
addPoints
(
int
x
,
int
y
)
{
Point
point
=
new
Point
(
x
,
y
);
points
.
add
(
point
);
}
public
void
addWordIndex
(
int
index
)
{
wordIndex
.
add
(
index
);
}
public
List
<
Point
>
getPoints
()
{
return
points
;
}
public
List
<
Integer
>
getWordIndex
()
{
return
wordIndex
;
}
public
String
getLabel
()
{
return
label
;
}
public
void
setLabel
(
String
label
)
{
this
.
label
=
label
;
}
public
float
getConfidence
()
{
return
confidence
;
}
public
void
setConfidence
(
float
confidence
)
{
this
.
confidence
=
confidence
;
}
}
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java
deleted
100644 → 0
View file @
2735e9e3
package
com.baidu.paddle.lite.demo.ocr
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.graphics.Canvas
;
import
android.graphics.Color
;
import
android.graphics.Paint
;
import
android.graphics.Path
;
import
android.graphics.Point
;
import
android.util.Log
;
import
java.io.File
;
import
java.io.InputStream
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Vector
;
import
static
android
.
graphics
.
Color
.*;
public
class
Predictor
{
private
static
final
String
TAG
=
Predictor
.
class
.
getSimpleName
();
public
boolean
isLoaded
=
false
;
public
int
warmupIterNum
=
1
;
public
int
inferIterNum
=
1
;
public
int
cpuThreadNum
=
4
;
public
String
cpuPowerMode
=
"LITE_POWER_HIGH"
;
public
String
modelPath
=
""
;
public
String
modelName
=
""
;
protected
OCRPredictorNative
paddlePredictor
=
null
;
protected
float
inferenceTime
=
0
;
// Only for object detection
protected
Vector
<
String
>
wordLabels
=
new
Vector
<
String
>();
protected
String
inputColorFormat
=
"BGR"
;
protected
long
[]
inputShape
=
new
long
[]{
1
,
3
,
960
};
protected
float
[]
inputMean
=
new
float
[]{
0.485f
,
0.456f
,
0.406f
};
protected
float
[]
inputStd
=
new
float
[]{
1.0f
/
0.229f
,
1.0f
/
0.224f
,
1.0f
/
0.225f
};
protected
float
scoreThreshold
=
0.1f
;
protected
Bitmap
inputImage
=
null
;
protected
Bitmap
outputImage
=
null
;
protected
volatile
String
outputResult
=
""
;
protected
float
preprocessTime
=
0
;
protected
float
postprocessTime
=
0
;
public
Predictor
()
{
}
public
boolean
init
(
Context
appCtx
,
String
modelPath
,
String
labelPath
)
{
isLoaded
=
loadModel
(
appCtx
,
modelPath
,
cpuThreadNum
,
cpuPowerMode
);
if
(!
isLoaded
)
{
return
false
;
}
isLoaded
=
loadLabel
(
appCtx
,
labelPath
);
return
isLoaded
;
}
public
boolean
init
(
Context
appCtx
,
String
modelPath
,
String
labelPath
,
int
cpuThreadNum
,
String
cpuPowerMode
,
String
inputColorFormat
,
long
[]
inputShape
,
float
[]
inputMean
,
float
[]
inputStd
,
float
scoreThreshold
)
{
if
(
inputShape
.
length
!=
3
)
{
Log
.
e
(
TAG
,
"Size of input shape should be: 3"
);
return
false
;
}
if
(
inputMean
.
length
!=
inputShape
[
1
])
{
Log
.
e
(
TAG
,
"Size of input mean should be: "
+
Long
.
toString
(
inputShape
[
1
]));
return
false
;
}
if
(
inputStd
.
length
!=
inputShape
[
1
])
{
Log
.
e
(
TAG
,
"Size of input std should be: "
+
Long
.
toString
(
inputShape
[
1
]));
return
false
;
}
if
(
inputShape
[
0
]
!=
1
)
{
Log
.
e
(
TAG
,
"Only one batch is supported in the image classification demo, you can use any batch size in "
+
"your Apps!"
);
return
false
;
}
if
(
inputShape
[
1
]
!=
1
&&
inputShape
[
1
]
!=
3
)
{
Log
.
e
(
TAG
,
"Only one/three channels are supported in the image classification demo, you can use any "
+
"channel size in your Apps!"
);
return
false
;
}
if
(!
inputColorFormat
.
equalsIgnoreCase
(
"BGR"
))
{
Log
.
e
(
TAG
,
"Only BGR color format is supported."
);
return
false
;
}
boolean
isLoaded
=
init
(
appCtx
,
modelPath
,
labelPath
);
if
(!
isLoaded
)
{
return
false
;
}
this
.
inputColorFormat
=
inputColorFormat
;
this
.
inputShape
=
inputShape
;
this
.
inputMean
=
inputMean
;
this
.
inputStd
=
inputStd
;
this
.
scoreThreshold
=
scoreThreshold
;
return
true
;
}
protected
boolean
loadModel
(
Context
appCtx
,
String
modelPath
,
int
cpuThreadNum
,
String
cpuPowerMode
)
{
// Release model if exists
releaseModel
();
// Load model
if
(
modelPath
.
isEmpty
())
{
return
false
;
}
String
realPath
=
modelPath
;
if
(!
modelPath
.
substring
(
0
,
1
).
equals
(
"/"
))
{
// Read model files from custom path if the first character of mode path is '/'
// otherwise copy model to cache from assets
realPath
=
appCtx
.
getCacheDir
()
+
"/"
+
modelPath
;
Utils
.
copyDirectoryFromAssets
(
appCtx
,
modelPath
,
realPath
);
}
if
(
realPath
.
isEmpty
())
{
return
false
;
}
OCRPredictorNative
.
Config
config
=
new
OCRPredictorNative
.
Config
();
config
.
cpuThreadNum
=
cpuThreadNum
;
config
.
detModelFilename
=
realPath
+
File
.
separator
+
"ch_det_mv3_db_opt.nb"
;
config
.
recModelFilename
=
realPath
+
File
.
separator
+
"ch_rec_mv3_crnn_opt.nb"
;
Log
.
e
(
"Predictor"
,
"model path"
+
config
.
detModelFilename
+
" ; "
+
config
.
recModelFilename
);
config
.
cpuPower
=
cpuPowerMode
;
paddlePredictor
=
new
OCRPredictorNative
(
config
);
this
.
cpuThreadNum
=
cpuThreadNum
;
this
.
cpuPowerMode
=
cpuPowerMode
;
this
.
modelPath
=
realPath
;
this
.
modelName
=
realPath
.
substring
(
realPath
.
lastIndexOf
(
"/"
)
+
1
);
return
true
;
}
public
void
releaseModel
()
{
if
(
paddlePredictor
!=
null
)
{
paddlePredictor
.
release
();
paddlePredictor
=
null
;
}
isLoaded
=
false
;
cpuThreadNum
=
1
;
cpuPowerMode
=
"LITE_POWER_HIGH"
;
modelPath
=
""
;
modelName
=
""
;
}
protected
boolean
loadLabel
(
Context
appCtx
,
String
labelPath
)
{
wordLabels
.
clear
();
// Load word labels from file
try
{
InputStream
assetsInputStream
=
appCtx
.
getAssets
().
open
(
labelPath
);
int
available
=
assetsInputStream
.
available
();
byte
[]
lines
=
new
byte
[
available
];
assetsInputStream
.
read
(
lines
);
assetsInputStream
.
close
();
String
words
=
new
String
(
lines
);
String
[]
contents
=
words
.
split
(
"\n"
);
for
(
String
content
:
contents
)
{
wordLabels
.
add
(
content
);
}
Log
.
i
(
TAG
,
"Word label size: "
+
wordLabels
.
size
());
}
catch
(
Exception
e
)
{
Log
.
e
(
TAG
,
e
.
getMessage
());
return
false
;
}
return
true
;
}
public
boolean
runModel
()
{
if
(
inputImage
==
null
||
!
isLoaded
())
{
return
false
;
}
// Pre-process image, and feed input tensor with pre-processed data
Bitmap
scaleImage
=
Utils
.
resizeWithStep
(
inputImage
,
Long
.
valueOf
(
inputShape
[
2
]).
intValue
(),
32
);
Date
start
=
new
Date
();
int
channels
=
(
int
)
inputShape
[
1
];
int
width
=
scaleImage
.
getWidth
();
int
height
=
scaleImage
.
getHeight
();
float
[]
inputData
=
new
float
[
channels
*
width
*
height
];
if
(
channels
==
3
)
{
int
[]
channelIdx
=
null
;
if
(
inputColorFormat
.
equalsIgnoreCase
(
"RGB"
))
{
channelIdx
=
new
int
[]{
0
,
1
,
2
};
}
else
if
(
inputColorFormat
.
equalsIgnoreCase
(
"BGR"
))
{
channelIdx
=
new
int
[]{
2
,
1
,
0
};
}
else
{
Log
.
i
(
TAG
,
"Unknown color format "
+
inputColorFormat
+
", only RGB and BGR color format is "
+
"supported!"
);
return
false
;
}
int
[]
channelStride
=
new
int
[]{
width
*
height
,
width
*
height
*
2
};
int
p
=
scaleImage
.
getPixel
(
scaleImage
.
getWidth
()
-
1
,
scaleImage
.
getHeight
()
-
1
);
for
(
int
y
=
0
;
y
<
height
;
y
++)
{
for
(
int
x
=
0
;
x
<
width
;
x
++)
{
int
color
=
scaleImage
.
getPixel
(
x
,
y
);
float
[]
rgb
=
new
float
[]{(
float
)
red
(
color
)
/
255.0f
,
(
float
)
green
(
color
)
/
255.0f
,
(
float
)
blue
(
color
)
/
255.0f
};
inputData
[
y
*
width
+
x
]
=
(
rgb
[
channelIdx
[
0
]]
-
inputMean
[
0
])
/
inputStd
[
0
];
inputData
[
y
*
width
+
x
+
channelStride
[
0
]]
=
(
rgb
[
channelIdx
[
1
]]
-
inputMean
[
1
])
/
inputStd
[
1
];
inputData
[
y
*
width
+
x
+
channelStride
[
1
]]
=
(
rgb
[
channelIdx
[
2
]]
-
inputMean
[
2
])
/
inputStd
[
2
];
}
}
}
else
if
(
channels
==
1
)
{
for
(
int
y
=
0
;
y
<
height
;
y
++)
{
for
(
int
x
=
0
;
x
<
width
;
x
++)
{
int
color
=
inputImage
.
getPixel
(
x
,
y
);
float
gray
=
(
float
)
(
red
(
color
)
+
green
(
color
)
+
blue
(
color
))
/
3.0f
/
255.0f
;
inputData
[
y
*
width
+
x
]
=
(
gray
-
inputMean
[
0
])
/
inputStd
[
0
];
}
}
}
else
{
Log
.
i
(
TAG
,
"Unsupported channel size "
+
Integer
.
toString
(
channels
)
+
", only channel 1 and 3 is "
+
"supported!"
);
return
false
;
}
float
[]
pixels
=
inputData
;
Log
.
i
(
TAG
,
"pixels "
+
pixels
[
0
]
+
" "
+
pixels
[
1
]
+
" "
+
pixels
[
2
]
+
" "
+
pixels
[
3
]
+
" "
+
pixels
[
pixels
.
length
/
2
]
+
" "
+
pixels
[
pixels
.
length
/
2
+
1
]
+
" "
+
pixels
[
pixels
.
length
-
2
]
+
" "
+
pixels
[
pixels
.
length
-
1
]);
Date
end
=
new
Date
();
preprocessTime
=
(
float
)
(
end
.
getTime
()
-
start
.
getTime
());
// Warm up
for
(
int
i
=
0
;
i
<
warmupIterNum
;
i
++)
{
paddlePredictor
.
runImage
(
inputData
,
width
,
height
,
channels
,
inputImage
);
}
warmupIterNum
=
0
;
// do not need warm
// Run inference
start
=
new
Date
();
ArrayList
<
OcrResultModel
>
results
=
paddlePredictor
.
runImage
(
inputData
,
width
,
height
,
channels
,
inputImage
);
end
=
new
Date
();
inferenceTime
=
(
end
.
getTime
()
-
start
.
getTime
())
/
(
float
)
inferIterNum
;
results
=
postprocess
(
results
);
Log
.
i
(
TAG
,
"[stat] Preprocess Time: "
+
preprocessTime
+
" ; Inference Time: "
+
inferenceTime
+
" ;Box Size "
+
results
.
size
());
drawResults
(
results
);
return
true
;
}
public
boolean
isLoaded
()
{
return
paddlePredictor
!=
null
&&
isLoaded
;
}
public
String
modelPath
()
{
return
modelPath
;
}
public
String
modelName
()
{
return
modelName
;
}
public
int
cpuThreadNum
()
{
return
cpuThreadNum
;
}
public
String
cpuPowerMode
()
{
return
cpuPowerMode
;
}
public
float
inferenceTime
()
{
return
inferenceTime
;
}
public
Bitmap
inputImage
()
{
return
inputImage
;
}
public
Bitmap
outputImage
()
{
return
outputImage
;
}
public
String
outputResult
()
{
return
outputResult
;
}
public
float
preprocessTime
()
{
return
preprocessTime
;
}
public
float
postprocessTime
()
{
return
postprocessTime
;
}
public
void
setInputImage
(
Bitmap
image
)
{
if
(
image
==
null
)
{
return
;
}
this
.
inputImage
=
image
.
copy
(
Bitmap
.
Config
.
ARGB_8888
,
true
);
}
private
ArrayList
<
OcrResultModel
>
postprocess
(
ArrayList
<
OcrResultModel
>
results
)
{
for
(
OcrResultModel
r
:
results
)
{
StringBuffer
word
=
new
StringBuffer
();
for
(
int
index
:
r
.
getWordIndex
())
{
if
(
index
>=
0
&&
index
<
wordLabels
.
size
())
{
word
.
append
(
wordLabels
.
get
(
index
));
}
else
{
Log
.
e
(
TAG
,
"Word index is not in label list:"
+
index
);
word
.
append
(
"×"
);
}
}
r
.
setLabel
(
word
.
toString
());
}
return
results
;
}
private
void
drawResults
(
ArrayList
<
OcrResultModel
>
results
)
{
StringBuffer
outputResultSb
=
new
StringBuffer
(
""
);
for
(
int
i
=
0
;
i
<
results
.
size
();
i
++)
{
OcrResultModel
result
=
results
.
get
(
i
);
StringBuilder
sb
=
new
StringBuilder
(
""
);
sb
.
append
(
result
.
getLabel
());
sb
.
append
(
" "
).
append
(
result
.
getConfidence
());
sb
.
append
(
"; Points: "
);
for
(
Point
p
:
result
.
getPoints
())
{
sb
.
append
(
"("
).
append
(
p
.
x
).
append
(
","
).
append
(
p
.
y
).
append
(
") "
);
}
Log
.
i
(
TAG
,
sb
.
toString
());
// show LOG in Logcat panel
outputResultSb
.
append
(
i
+
1
).
append
(
": "
).
append
(
result
.
getLabel
()).
append
(
"\n"
);
}
outputResult
=
outputResultSb
.
toString
();
outputImage
=
inputImage
;
Canvas
canvas
=
new
Canvas
(
outputImage
);
Paint
paintFillAlpha
=
new
Paint
();
paintFillAlpha
.
setStyle
(
Paint
.
Style
.
FILL
);
paintFillAlpha
.
setColor
(
Color
.
parseColor
(
"#3B85F5"
));
paintFillAlpha
.
setAlpha
(
50
);
Paint
paint
=
new
Paint
();
paint
.
setColor
(
Color
.
parseColor
(
"#3B85F5"
));
paint
.
setStrokeWidth
(
5
);
paint
.
setStyle
(
Paint
.
Style
.
STROKE
);
for
(
OcrResultModel
result
:
results
)
{
Path
path
=
new
Path
();
List
<
Point
>
points
=
result
.
getPoints
();
path
.
moveTo
(
points
.
get
(
0
).
x
,
points
.
get
(
0
).
y
);
for
(
int
i
=
points
.
size
()
-
1
;
i
>=
0
;
i
--)
{
Point
p
=
points
.
get
(
i
);
path
.
lineTo
(
p
.
x
,
p
.
y
);
}
canvas
.
drawPath
(
path
,
paint
);
canvas
.
drawPath
(
path
,
paintFillAlpha
);
}
}
}
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java
deleted
100644 → 0
View file @
2735e9e3
package
com.baidu.paddle.lite.demo.ocr
;
import
android.content.SharedPreferences
;
import
android.os.Bundle
;
import
android.preference.CheckBoxPreference
;
import
android.preference.EditTextPreference
;
import
android.preference.ListPreference
;
import
androidx.appcompat.app.ActionBar
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
SettingsActivity
extends
AppCompatPreferenceActivity
implements
SharedPreferences
.
OnSharedPreferenceChangeListener
{
ListPreference
lpChoosePreInstalledModel
=
null
;
CheckBoxPreference
cbEnableCustomSettings
=
null
;
EditTextPreference
etModelPath
=
null
;
EditTextPreference
etLabelPath
=
null
;
EditTextPreference
etImagePath
=
null
;
ListPreference
lpCPUThreadNum
=
null
;
ListPreference
lpCPUPowerMode
=
null
;
ListPreference
lpInputColorFormat
=
null
;
EditTextPreference
etInputShape
=
null
;
EditTextPreference
etInputMean
=
null
;
EditTextPreference
etInputStd
=
null
;
EditTextPreference
etScoreThreshold
=
null
;
List
<
String
>
preInstalledModelPaths
=
null
;
List
<
String
>
preInstalledLabelPaths
=
null
;
List
<
String
>
preInstalledImagePaths
=
null
;
List
<
String
>
preInstalledInputShapes
=
null
;
List
<
String
>
preInstalledCPUThreadNums
=
null
;
List
<
String
>
preInstalledCPUPowerModes
=
null
;
List
<
String
>
preInstalledInputColorFormats
=
null
;
List
<
String
>
preInstalledInputMeans
=
null
;
List
<
String
>
preInstalledInputStds
=
null
;
List
<
String
>
preInstalledScoreThresholds
=
null
;
@Override
public
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
addPreferencesFromResource
(
R
.
xml
.
settings
);
ActionBar
supportActionBar
=
getSupportActionBar
();
if
(
supportActionBar
!=
null
)
{
supportActionBar
.
setDisplayHomeAsUpEnabled
(
true
);
}
// Initialized pre-installed models
preInstalledModelPaths
=
new
ArrayList
<
String
>();
preInstalledLabelPaths
=
new
ArrayList
<
String
>();
preInstalledImagePaths
=
new
ArrayList
<
String
>();
preInstalledInputShapes
=
new
ArrayList
<
String
>();
preInstalledCPUThreadNums
=
new
ArrayList
<
String
>();
preInstalledCPUPowerModes
=
new
ArrayList
<
String
>();
preInstalledInputColorFormats
=
new
ArrayList
<
String
>();
preInstalledInputMeans
=
new
ArrayList
<
String
>();
preInstalledInputStds
=
new
ArrayList
<
String
>();
preInstalledScoreThresholds
=
new
ArrayList
<
String
>();
// Add ssd_mobilenet_v1_pascalvoc_for_cpu
preInstalledModelPaths
.
add
(
getString
(
R
.
string
.
MODEL_PATH_DEFAULT
));
preInstalledLabelPaths
.
add
(
getString
(
R
.
string
.
LABEL_PATH_DEFAULT
));
preInstalledImagePaths
.
add
(
getString
(
R
.
string
.
IMAGE_PATH_DEFAULT
));
preInstalledCPUThreadNums
.
add
(
getString
(
R
.
string
.
CPU_THREAD_NUM_DEFAULT
));
preInstalledCPUPowerModes
.
add
(
getString
(
R
.
string
.
CPU_POWER_MODE_DEFAULT
));
preInstalledInputColorFormats
.
add
(
getString
(
R
.
string
.
INPUT_COLOR_FORMAT_DEFAULT
));
preInstalledInputShapes
.
add
(
getString
(
R
.
string
.
INPUT_SHAPE_DEFAULT
));
preInstalledInputMeans
.
add
(
getString
(
R
.
string
.
INPUT_MEAN_DEFAULT
));
preInstalledInputStds
.
add
(
getString
(
R
.
string
.
INPUT_STD_DEFAULT
));
preInstalledScoreThresholds
.
add
(
getString
(
R
.
string
.
SCORE_THRESHOLD_DEFAULT
));
// Setup UI components
lpChoosePreInstalledModel
=
(
ListPreference
)
findPreference
(
getString
(
R
.
string
.
CHOOSE_PRE_INSTALLED_MODEL_KEY
));
String
[]
preInstalledModelNames
=
new
String
[
preInstalledModelPaths
.
size
()];
for
(
int
i
=
0
;
i
<
preInstalledModelPaths
.
size
();
i
++)
{
preInstalledModelNames
[
i
]
=
preInstalledModelPaths
.
get
(
i
).
substring
(
preInstalledModelPaths
.
get
(
i
).
lastIndexOf
(
"/"
)
+
1
);
}
lpChoosePreInstalledModel
.
setEntries
(
preInstalledModelNames
);
lpChoosePreInstalledModel
.
setEntryValues
(
preInstalledModelPaths
.
toArray
(
new
String
[
preInstalledModelPaths
.
size
()]));
cbEnableCustomSettings
=
(
CheckBoxPreference
)
findPreference
(
getString
(
R
.
string
.
ENABLE_CUSTOM_SETTINGS_KEY
));
etModelPath
=
(
EditTextPreference
)
findPreference
(
getString
(
R
.
string
.
MODEL_PATH_KEY
));
etModelPath
.
setTitle
(
"Model Path (SDCard: "
+
Utils
.
getSDCardDirectory
()
+
")"
);
etLabelPath
=
(
EditTextPreference
)
findPreference
(
getString
(
R
.
string
.
LABEL_PATH_KEY
));
etImagePath
=
(
EditTextPreference
)
findPreference
(
getString
(
R
.
string
.
IMAGE_PATH_KEY
));
lpCPUThreadNum
=
(
ListPreference
)
findPreference
(
getString
(
R
.
string
.
CPU_THREAD_NUM_KEY
));
lpCPUPowerMode
=
(
ListPreference
)
findPreference
(
getString
(
R
.
string
.
CPU_POWER_MODE_KEY
));
lpInputColorFormat
=
(
ListPreference
)
findPreference
(
getString
(
R
.
string
.
INPUT_COLOR_FORMAT_KEY
));
etInputShape
=
(
EditTextPreference
)
findPreference
(
getString
(
R
.
string
.
INPUT_SHAPE_KEY
));
etInputMean
=
(
EditTextPreference
)
findPreference
(
getString
(
R
.
string
.
INPUT_MEAN_KEY
));
etInputStd
=
(
EditTextPreference
)
findPreference
(
getString
(
R
.
string
.
INPUT_STD_KEY
));
etScoreThreshold
=
(
EditTextPreference
)
findPreference
(
getString
(
R
.
string
.
SCORE_THRESHOLD_KEY
));
}
private
void
reloadPreferenceAndUpdateUI
()
{
SharedPreferences
sharedPreferences
=
getPreferenceScreen
().
getSharedPreferences
();
boolean
enableCustomSettings
=
sharedPreferences
.
getBoolean
(
getString
(
R
.
string
.
ENABLE_CUSTOM_SETTINGS_KEY
),
false
);
String
modelPath
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
CHOOSE_PRE_INSTALLED_MODEL_KEY
),
getString
(
R
.
string
.
MODEL_PATH_DEFAULT
));
int
modelIdx
=
lpChoosePreInstalledModel
.
findIndexOfValue
(
modelPath
);
if
(
modelIdx
>=
0
&&
modelIdx
<
preInstalledModelPaths
.
size
())
{
if
(!
enableCustomSettings
)
{
SharedPreferences
.
Editor
editor
=
sharedPreferences
.
edit
();
editor
.
putString
(
getString
(
R
.
string
.
MODEL_PATH_KEY
),
preInstalledModelPaths
.
get
(
modelIdx
));
editor
.
putString
(
getString
(
R
.
string
.
LABEL_PATH_KEY
),
preInstalledLabelPaths
.
get
(
modelIdx
));
editor
.
putString
(
getString
(
R
.
string
.
IMAGE_PATH_KEY
),
preInstalledImagePaths
.
get
(
modelIdx
));
editor
.
putString
(
getString
(
R
.
string
.
CPU_THREAD_NUM_KEY
),
preInstalledCPUThreadNums
.
get
(
modelIdx
));
editor
.
putString
(
getString
(
R
.
string
.
CPU_POWER_MODE_KEY
),
preInstalledCPUPowerModes
.
get
(
modelIdx
));
editor
.
putString
(
getString
(
R
.
string
.
INPUT_COLOR_FORMAT_KEY
),
preInstalledInputColorFormats
.
get
(
modelIdx
));
editor
.
putString
(
getString
(
R
.
string
.
INPUT_SHAPE_KEY
),
preInstalledInputShapes
.
get
(
modelIdx
));
editor
.
putString
(
getString
(
R
.
string
.
INPUT_MEAN_KEY
),
preInstalledInputMeans
.
get
(
modelIdx
));
editor
.
putString
(
getString
(
R
.
string
.
INPUT_STD_KEY
),
preInstalledInputStds
.
get
(
modelIdx
));
editor
.
putString
(
getString
(
R
.
string
.
SCORE_THRESHOLD_KEY
),
preInstalledScoreThresholds
.
get
(
modelIdx
));
editor
.
commit
();
}
lpChoosePreInstalledModel
.
setSummary
(
modelPath
);
}
cbEnableCustomSettings
.
setChecked
(
enableCustomSettings
);
etModelPath
.
setEnabled
(
enableCustomSettings
);
etLabelPath
.
setEnabled
(
enableCustomSettings
);
etImagePath
.
setEnabled
(
enableCustomSettings
);
lpCPUThreadNum
.
setEnabled
(
enableCustomSettings
);
lpCPUPowerMode
.
setEnabled
(
enableCustomSettings
);
lpInputColorFormat
.
setEnabled
(
enableCustomSettings
);
etInputShape
.
setEnabled
(
enableCustomSettings
);
etInputMean
.
setEnabled
(
enableCustomSettings
);
etInputStd
.
setEnabled
(
enableCustomSettings
);
etScoreThreshold
.
setEnabled
(
enableCustomSettings
);
modelPath
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
MODEL_PATH_KEY
),
getString
(
R
.
string
.
MODEL_PATH_DEFAULT
));
String
labelPath
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
LABEL_PATH_KEY
),
getString
(
R
.
string
.
LABEL_PATH_DEFAULT
));
String
imagePath
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
IMAGE_PATH_KEY
),
getString
(
R
.
string
.
IMAGE_PATH_DEFAULT
));
String
cpuThreadNum
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
CPU_THREAD_NUM_KEY
),
getString
(
R
.
string
.
CPU_THREAD_NUM_DEFAULT
));
String
cpuPowerMode
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
CPU_POWER_MODE_KEY
),
getString
(
R
.
string
.
CPU_POWER_MODE_DEFAULT
));
String
inputColorFormat
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
INPUT_COLOR_FORMAT_KEY
),
getString
(
R
.
string
.
INPUT_COLOR_FORMAT_DEFAULT
));
String
inputShape
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
INPUT_SHAPE_KEY
),
getString
(
R
.
string
.
INPUT_SHAPE_DEFAULT
));
String
inputMean
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
INPUT_MEAN_KEY
),
getString
(
R
.
string
.
INPUT_MEAN_DEFAULT
));
String
inputStd
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
INPUT_STD_KEY
),
getString
(
R
.
string
.
INPUT_STD_DEFAULT
));
String
scoreThreshold
=
sharedPreferences
.
getString
(
getString
(
R
.
string
.
SCORE_THRESHOLD_KEY
),
getString
(
R
.
string
.
SCORE_THRESHOLD_DEFAULT
));
etModelPath
.
setSummary
(
modelPath
);
etModelPath
.
setText
(
modelPath
);
etLabelPath
.
setSummary
(
labelPath
);
etLabelPath
.
setText
(
labelPath
);
etImagePath
.
setSummary
(
imagePath
);
etImagePath
.
setText
(
imagePath
);
lpCPUThreadNum
.
setValue
(
cpuThreadNum
);
lpCPUThreadNum
.
setSummary
(
cpuThreadNum
);
lpCPUPowerMode
.
setValue
(
cpuPowerMode
);
lpCPUPowerMode
.
setSummary
(
cpuPowerMode
);
lpInputColorFormat
.
setValue
(
inputColorFormat
);
lpInputColorFormat
.
setSummary
(
inputColorFormat
);
etInputShape
.
setSummary
(
inputShape
);
etInputShape
.
setText
(
inputShape
);
etInputMean
.
setSummary
(
inputMean
);
etInputMean
.
setText
(
inputMean
);
etInputStd
.
setSummary
(
inputStd
);
etInputStd
.
setText
(
inputStd
);
etScoreThreshold
.
setText
(
scoreThreshold
);
etScoreThreshold
.
setSummary
(
scoreThreshold
);
}
@Override
protected
void
onResume
()
{
super
.
onResume
();
getPreferenceScreen
().
getSharedPreferences
().
registerOnSharedPreferenceChangeListener
(
this
);
reloadPreferenceAndUpdateUI
();
}
@Override
protected
void
onPause
()
{
super
.
onPause
();
getPreferenceScreen
().
getSharedPreferences
().
unregisterOnSharedPreferenceChangeListener
(
this
);
}
@Override
public
void
onSharedPreferenceChanged
(
SharedPreferences
sharedPreferences
,
String
key
)
{
if
(
key
.
equals
(
getString
(
R
.
string
.
CHOOSE_PRE_INSTALLED_MODEL_KEY
)))
{
SharedPreferences
.
Editor
editor
=
sharedPreferences
.
edit
();
editor
.
putBoolean
(
getString
(
R
.
string
.
ENABLE_CUSTOM_SETTINGS_KEY
),
false
);
editor
.
commit
();
}
reloadPreferenceAndUpdateUI
();
}
}
deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Utils.java
deleted
100644 → 0
View file @
2735e9e3
package
com.baidu.paddle.lite.demo.ocr
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.graphics.Matrix
;
import
android.media.ExifInterface
;
import
android.os.Environment
;
import
java.io.*
;
public
class
Utils
{
private
static
final
String
TAG
=
Utils
.
class
.
getSimpleName
();
public
static
void
copyFileFromAssets
(
Context
appCtx
,
String
srcPath
,
String
dstPath
)
{
if
(
srcPath
.
isEmpty
()
||
dstPath
.
isEmpty
())
{
return
;
}
InputStream
is
=
null
;
OutputStream
os
=
null
;
try
{
is
=
new
BufferedInputStream
(
appCtx
.
getAssets
().
open
(
srcPath
));
os
=
new
BufferedOutputStream
(
new
FileOutputStream
(
new
File
(
dstPath
)));
byte
[]
buffer
=
new
byte
[
1024
];
int
length
=
0
;
while
((
length
=
is
.
read
(
buffer
))
!=
-
1
)
{
os
.
write
(
buffer
,
0
,
length
);
}
}
catch
(
FileNotFoundException
e
)
{
e
.
printStackTrace
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
finally
{
try
{
os
.
close
();
is
.
close
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
}
public
static
void
copyDirectoryFromAssets
(
Context
appCtx
,
String
srcDir
,
String
dstDir
)
{
if
(
srcDir
.
isEmpty
()
||
dstDir
.
isEmpty
())
{
return
;
}
try
{
if
(!
new
File
(
dstDir
).
exists
())
{
new
File
(
dstDir
).
mkdirs
();
}
for
(
String
fileName
:
appCtx
.
getAssets
().
list
(
srcDir
))
{
String
srcSubPath
=
srcDir
+
File
.
separator
+
fileName
;
String
dstSubPath
=
dstDir
+
File
.
separator
+
fileName
;
if
(
new
File
(
srcSubPath
).
isDirectory
())
{
copyDirectoryFromAssets
(
appCtx
,
srcSubPath
,
dstSubPath
);
}
else
{
copyFileFromAssets
(
appCtx
,
srcSubPath
,
dstSubPath
);
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
public
static
float
[]
parseFloatsFromString
(
String
string
,
String
delimiter
)
{
String
[]
pieces
=
string
.
trim
().
toLowerCase
().
split
(
delimiter
);
float
[]
floats
=
new
float
[
pieces
.
length
];
for
(
int
i
=
0
;
i
<
pieces
.
length
;
i
++)
{
floats
[
i
]
=
Float
.
parseFloat
(
pieces
[
i
].
trim
());
}
return
floats
;
}
public
static
long
[]
parseLongsFromString
(
String
string
,
String
delimiter
)
{
String
[]
pieces
=
string
.
trim
().
toLowerCase
().
split
(
delimiter
);
long
[]
longs
=
new
long
[
pieces
.
length
];
for
(
int
i
=
0
;
i
<
pieces
.
length
;
i
++)
{
longs
[
i
]
=
Long
.
parseLong
(
pieces
[
i
].
trim
());
}
return
longs
;
}
public
static
String
getSDCardDirectory
()
{
return
Environment
.
getExternalStorageDirectory
().
getAbsolutePath
();
}
public
static
boolean
isSupportedNPU
()
{
return
false
;
// String hardware = android.os.Build.HARDWARE;
// return hardware.equalsIgnoreCase("kirin810") || hardware.equalsIgnoreCase("kirin990");
}
public
static
Bitmap
resizeWithStep
(
Bitmap
bitmap
,
int
maxLength
,
int
step
)
{
int
width
=
bitmap
.
getWidth
();
int
height
=
bitmap
.
getHeight
();
int
maxWH
=
Math
.
max
(
width
,
height
);
float
ratio
=
1
;
int
newWidth
=
width
;
int
newHeight
=
height
;
if
(
maxWH
>
maxLength
)
{
ratio
=
maxLength
*
1.0f
/
maxWH
;
newWidth
=
(
int
)
Math
.
floor
(
ratio
*
width
);
newHeight
=
(
int
)
Math
.
floor
(
ratio
*
height
);
}
newWidth
=
newWidth
-
newWidth
%
step
;
if
(
newWidth
==
0
)
{
newWidth
=
step
;
}
newHeight
=
newHeight
-
newHeight
%
step
;
if
(
newHeight
==
0
)
{
newHeight
=
step
;
}
return
Bitmap
.
createScaledBitmap
(
bitmap
,
newWidth
,
newHeight
,
true
);
}
public
static
Bitmap
rotateBitmap
(
Bitmap
bitmap
,
int
orientation
)
{
Matrix
matrix
=
new
Matrix
();
switch
(
orientation
)
{
case
ExifInterface
.
ORIENTATION_NORMAL
:
return
bitmap
;
case
ExifInterface
.
ORIENTATION_FLIP_HORIZONTAL
:
matrix
.
setScale
(-
1
,
1
);
break
;
case
ExifInterface
.
ORIENTATION_ROTATE_180
:
matrix
.
setRotate
(
180
);
break
;
case
ExifInterface
.
ORIENTATION_FLIP_VERTICAL
:
matrix
.
setRotate
(
180
);
matrix
.
postScale
(-
1
,
1
);
break
;
case
ExifInterface
.
ORIENTATION_TRANSPOSE
:
matrix
.
setRotate
(
90
);
matrix
.
postScale
(-
1
,
1
);
break
;
case
ExifInterface
.
ORIENTATION_ROTATE_90
:
matrix
.
setRotate
(
90
);
break
;
case
ExifInterface
.
ORIENTATION_TRANSVERSE
:
matrix
.
setRotate
(-
90
);
matrix
.
postScale
(-
1
,
1
);
break
;
case
ExifInterface
.
ORIENTATION_ROTATE_270
:
matrix
.
setRotate
(-
90
);
break
;
default
:
return
bitmap
;
}
try
{
Bitmap
bmRotated
=
Bitmap
.
createBitmap
(
bitmap
,
0
,
0
,
bitmap
.
getWidth
(),
bitmap
.
getHeight
(),
matrix
,
true
);
bitmap
.
recycle
();
return
bmRotated
;
}
catch
(
OutOfMemoryError
e
)
{
e
.
printStackTrace
();
return
null
;
}
}
}
deploy/android_demo/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
deleted
100644 → 0
View file @
2735e9e3
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:aapt=
"http://schemas.android.com/aapt"
android:width=
"108dp"
android:height=
"108dp"
android:viewportWidth=
"108"
android:viewportHeight=
"108"
>
<path
android:fillType=
"evenOdd"
android:pathData=
"M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeWidth=
"1"
android:strokeColor=
"#00000000"
>
<aapt:attr
name=
"android:fillColor"
>
<gradient
android:endX=
"78.5885"
android:endY=
"90.9159"
android:startX=
"48.7653"
android:startY=
"61.0927"
android:type=
"linear"
>
<item
android:color=
"#44000000"
android:offset=
"0.0"
/>
<item
android:color=
"#00000000"
android:offset=
"1.0"
/>
</gradient>
</aapt:attr>
</path>
<path
android:fillColor=
"#FFFFFF"
android:fillType=
"nonZero"
android:pathData=
"M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeWidth=
"1"
android:strokeColor=
"#00000000"
/>
</vector>
Prev
1
2
3
4
5
6
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment