Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
Paddle-Lite
提交
b918067c
P
Paddle-Lite
项目概览
PaddlePaddle
/
Paddle-Lite
通知
331
Star
4
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
271
列表
看板
标记
里程碑
合并请求
78
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle-Lite
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
271
Issue
271
列表
看板
标记
里程碑
合并请求
78
合并请求
78
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
b918067c
编写于
1月 07, 2020
作者:
Y
yiicy
提交者:
GitHub
1月 07, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add yolov3 demo, test=develop (#2731)
上级
8fef7532
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
433 addition
and
67 deletion
+433
-67
lite/CMakeLists.txt
lite/CMakeLists.txt
+8
-4
lite/demo/cxx/README.md
lite/demo/cxx/README.md
+52
-50
lite/demo/cxx/makefiles/ssd_detection/Makefile.android.armv7
lite/demo/cxx/makefiles/ssd_detection/Makefile.android.armv7
+6
-6
lite/demo/cxx/makefiles/ssd_detection/Makefile.android.armv8
lite/demo/cxx/makefiles/ssd_detection/Makefile.android.armv8
+6
-6
lite/demo/cxx/makefiles/yolov3_detection/Makefile.android.armv7
...emo/cxx/makefiles/yolov3_detection/Makefile.android.armv7
+61
-0
lite/demo/cxx/makefiles/yolov3_detection/Makefile.android.armv8
...emo/cxx/makefiles/yolov3_detection/Makefile.android.armv8
+61
-0
lite/demo/cxx/mobile_detection/test.jpg
lite/demo/cxx/mobile_detection/test.jpg
+0
-0
lite/demo/cxx/ssd_detection/ssd_detection.cc
lite/demo/cxx/ssd_detection/ssd_detection.cc
+1
-1
lite/demo/cxx/yolov3_detection/yolov3_detection.cc
lite/demo/cxx/yolov3_detection/yolov3_detection.cc
+238
-0
未找到文件。
lite/CMakeLists.txt
浏览文件 @
b918067c
...
...
@@ -220,8 +220,10 @@ if (LITE_WITH_LIGHT_WEIGHT_FRAMEWORK AND LITE_WITH_ARM)
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/mobile_full/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/mobile_full/Makefile"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/mobile_light"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/mobile_light/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/mobile_light/Makefile"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/mobile_detection"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/mobile_detection/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/mobile_detection/Makefile"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/ssd_detection"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/ssd_detection/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/ssd_detection/Makefile"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/yolov3_detection"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/yolov3_detection/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/yolov3_detection/Makefile"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/mobile_classify"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/mobile_classify/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/mobile_classify/Makefile"
)
...
...
@@ -235,8 +237,10 @@ if (LITE_WITH_LIGHT_WEIGHT_FRAMEWORK AND LITE_WITH_ARM)
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/README.md"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/mobile_light"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/mobile_light/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/mobile_light/Makefile"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/mobile_detection"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/mobile_detection/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/mobile_detection/Makefile"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/ssd_detection"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/ssd_detection/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/ssd_detection/Makefile"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/yolov3_detection"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/yolov3_detection/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/yolov3_detection/Makefile"
COMMAND cp -r
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/mobile_classify"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx"
COMMAND cp
"
${
CMAKE_SOURCE_DIR
}
/lite/demo/cxx/makefiles/mobile_classify/Makefile.
${
ARM_TARGET_OS
}
.
${
ARM_TARGET_ARCH_ABI
}
"
"
${
INFER_LITE_PUBLISH_ROOT
}
/demo/cxx/mobile_classify/Makefile"
)
...
...
lite/demo/cxx/README.md
浏览文件 @
b918067c
# C++ Demo
1.
使用
`lite/tools/Dockerfile.mobile`
生成docker镜像
2.
运行并进入docker镜像环境,执行
`wget http://paddle-inference-dist.bj.bcebos.com/lite_release/v2.1.0/inference_lite_lib.android.armv8.tar.gz `
下载所需demo环境。(armv7 demo可使用命令
`wget http://paddle-inference-dist.bj.bcebos.com/lite_release/v2.1.0/inference_lite_lib.android.armv7.tar.gz`
进行下载)。
3.
解压下载文件
`tar zxvf inference_lite_lib.android.armv8.tar.gz `
4.
执行以下命令准备模拟器环境
```
shell
# armv8
adb kill-server
adb devices |
grep
emulator |
cut
-f1
|
while
read
line
;
do
adb
-s
$line
emu
kill
;
done
echo
n | avdmanager create avd
-f
-n
paddle-armv8
-k
"system-images;android-24;google_apis;arm64-v8a"
echo
-ne
'\n'
|
${
ANDROID_HOME
}
/emulator/emulator
-avd
paddle-armv8
-noaudio
-no-window
-gpu
off
-port
5554 &
sleep
1m
```
```
shell
# armv7
adb kill-server
adb devices |
grep
emulator |
cut
-f1
|
while
read
line
;
do
adb
-s
$line
emu
kill
;
done
echo
n | avdmanager create avd
-f
-n
paddle-armv7
-k
"system-images;android-24;google_apis;armeabi-v7a"
echo
-ne
'\n'
|
${
ANDROID_HOME
}
/emulator/emulator
-avd
paddle-armv7
-noaudio
-no-window
-gpu
off
-port
5554 &
sleep
1m
```
5.
准备模型、编译并运行完整api的demo
1.
环境准备
-
保证Android NDK在/opt目录下
-
一台armv7或armv8架构的安卓手机
2.
编译并运行全量api的demo(注:当编译模式为tiny_pubish时将不存在该demo)
```
shell
cd
inference_lite_lib.android.armv8/demo/cxx/mobile_full
wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz
tar
zxvf mobilenet_v1.tar.gz
make
adb
-s
emulator-5554
push mobilenet_v1 /data/local/tmp/
adb
-s
emulator-5554
push mobilenetv1_full_api /data/local/tmp/
adb
-s
emulator-5554
push ../../../cxx/lib/libpaddle_full_api_shared.so /data/local/tmp/
adb
-s
emulator-5554
shell
chmod
+x /data/local/tmp/mobilenetv1_full_api
adb
-s
emulator-5554
shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
adb push mobilenet_v1 /data/local/tmp/
adb push mobilenetv1_full_api /data/local/tmp/
adb push ../../../cxx/lib/libpaddle_full_api_shared.so /data/local/tmp/
adb shell
chmod
+x /data/local/tmp/mobilenetv1_full_api
adb shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
/data/local/tmp/mobilenetv1_full_api --model_dir=/data/local/tmp/mobilenet_v1 --optimized_model_dir=/data/local/tmp/mobilenet_v1.opt"
```
运行成功将在控制台输出预测结果的前10个类别的预测概率
6
.
编译并运行轻量级api的demo
3
.
编译并运行轻量级api的demo
```
shell
cd
../mobile_light
make
adb
-s
emulator-5554
push mobilenetv1_light_api /data/local/tmp/
adb
-s
emulator-5554
push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/
adb
-s
emulator-5554
shell
chmod
+x /data/local/tmp/mobilenetv1_light_api
adb
-s
emulator-5554
shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
adb push mobilenetv1_light_api /data/local/tmp/
adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/
adb shell
chmod
+x /data/local/tmp/mobilenetv1_light_api
adb shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
/data/local/tmp/mobilenetv1_light_api /data/local/tmp/mobilenet_v1.opt"
```
运行成功将在控制台输出预测结果的前10个类别的预测概率
7.
编译并运行
目标检测的demo
4.
编译并运行ssd
目标检测的demo
```
shell
cd
../
mobile
_detection
cd
../
ssd
_detection
wget https://paddle-inference-dist.bj.bcebos.com/mobilenetv1-ssd.tar.gz
tar
zxvf mobilenetv1-ssd.tar.gz
make
adb
-s
emulator-5554 push mobile_detection /data/local/tmp/
adb
-s
emulator-5554 push test.jpg /data/local/tmp/
adb
-s
emulator-5554 push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/
adb
-s
emulator-5554 shell
chmod
+x /data/local/tmp/mobile_detection
adb
-s
emulator-5554 shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
/data/local/tmp/mobile_detection /data/local/tmp/mobilenetv1-ssd /data/local/tmp/test.jpg"
adb
-s
emulator-5554 pull /data/local/tmp/test_detection_result.jpg ./
adb push ssd_detection /data/local/tmp/
adb push test.jpg /data/local/tmp/
adb push mobilenetv1-ssd /data/local/tmp
adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/
adb shell
chmod
+x /data/local/tmp/ssd_detection
adb shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
/data/local/tmp/ssd_detection /data/local/tmp/mobilenetv1-ssd /data/local/tmp/test.jpg"
adb pull /data/local/tmp/test_ssd_detection_result.jpg ./
```
运行成功将在ssd_detection目录下看到生成的目标检测结果图像: test_ssd_detection_result.jpg
5.
编译并运行yolov3目标检测的demo
```
shell
cd
../yolov3_detection
wget https://paddle-inference-dist.bj.bcebos.com/mobilenetv1-yolov3.tar.gz
tar
zxvf mobilenetv1-yolov3.tar.gz
make
adb push yolov3_detection /data/local/tmp/
adb push test.jpg /data/local/tmp/
adb push mobilenetv1-yolov3 /data/local/tmp
adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/
adb shell
chmod
+x /data/local/tmp/yolov3_detection
adb shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
/data/local/tmp/yolov3_detection /data/local/tmp/mobilenetv1-yolov3 /data/local/tmp/test.jpg"
adb pull /data/local/tmp/test_yolov3_detection_result.jpg ./
```
运行成功将在
mobile_detection目录下看到生成的目标检测结果图像: test
_detection_result.jpg
运行成功将在
yolov3_detection目录下看到生成的目标检测结果图像: test_yolov3
_detection_result.jpg
8
.
编译并运行物体分类的demo
6
.
编译并运行物体分类的demo
```
shell
cd
../mobile_classify
wget http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz
tar
zxvf mobilenet_v1.tar.gz
make
adb
-s
emulator-5554
push mobile_classify /data/local/tmp/
adb
-s
emulator-5554
push test.jpg /data/local/tmp/
adb
-s
emulator-5554
push labels.txt /data/local/tmp/
adb
-s
emulator-5554
push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/
adb
-s
emulator-5554
shell
chmod
+x /data/local/tmp/mobile_classify
adb
-s
emulator-5554
shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
adb push mobile_classify /data/local/tmp/
adb push test.jpg /data/local/tmp/
adb push labels.txt /data/local/tmp/
adb push ../../../cxx/lib/libpaddle_light_api_shared.so /data/local/tmp/
adb shell
chmod
+x /data/local/tmp/mobile_classify
adb shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
/data/local/tmp/mobile_classify /data/local/tmp/mobilenet_v1 /data/local/tmp/test.jpg /data/local/tmp/labels.txt"
```
运行成功将在控制台输出预测结果的前5个类别的预测概率
-
如若想看前10个类别的预测概率,在运行命令输入topk的值即可
eg:
```
shell
adb
-s
emulator-5554
shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
adb shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
/data/local/tmp/mobile_classify /data/local/tmp/mobilenet_v1 /data/local/tmp/test.jpg /data/local/tmp/labels.txt 10"
```
-
如若想看其他模型的分类结果, 在运行命令输入model_dir 及其model的输入大小即可
eg:
```
shell
adb
-s
emulator-5554
shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
adb shell
"export LD_LIBRARY_PATH=/data/local/tmp/:
$LD_LIBRARY_PATH
&&
/data/local/tmp/mobile_classify /data/local/tmp/mobilenet_v2 /data/local/tmp/test.jpg /data/local/tmp/labels.txt 10 224 224"
```
lite/demo/cxx/makefiles/
mobile
_detection/Makefile.android.armv7
→
lite/demo/cxx/makefiles/
ssd
_detection/Makefile.android.armv7
浏览文件 @
b918067c
...
...
@@ -40,11 +40,11 @@ CXX_LIBS = ${OPENCV_LIBS} -L$(LITE_ROOT)/cxx/lib/ -lpaddle_light_api_shared $(SY
#CXX_LIBS = $(LITE_ROOT)/cxx/lib/libpaddle_api_light_bundled.a $(SYSTEM_LIBS)
mobile_detection
:
fetch_opencv mobile
_detection.o
$(CC)
$(SYSROOT_LINK)
$(CXXFLAGS_LINK)
mobile_detection.o
-o
mobile
_detection
$(CXX_LIBS)
$(LDFLAGS)
ssd_detection
:
fetch_opencv ssd
_detection.o
$(CC)
$(SYSROOT_LINK)
$(CXXFLAGS_LINK)
ssd_detection.o
-o
ssd
_detection
$(CXX_LIBS)
$(LDFLAGS)
mobile_detection.o
:
mobile
_detection.cc
$(CC)
$(SYSROOT_COMPLILE)
$(CXX_DEFINES)
$(CXX_INCLUDES)
$(CXX_FLAGS)
-o
mobile_detection.o
-c
mobile
_detection.cc
ssd_detection.o
:
ssd
_detection.cc
$(CC)
$(SYSROOT_COMPLILE)
$(CXX_DEFINES)
$(CXX_INCLUDES)
$(CXX_FLAGS)
-o
ssd_detection.o
-c
ssd
_detection.cc
fetch_opencv
:
@
test
-d
${THIRD_PARTY_DIR}
||
mkdir
${THIRD_PARTY_DIR}
...
...
@@ -57,5 +57,5 @@ fetch_opencv:
.PHONY
:
clean
clean
:
rm
-f
mobile
_detection.o
rm
-f
mobile
_detection
rm
-f
ssd
_detection.o
rm
-f
ssd
_detection
lite/demo/cxx/makefiles/
mobile
_detection/Makefile.android.armv8
→
lite/demo/cxx/makefiles/
ssd
_detection/Makefile.android.armv8
浏览文件 @
b918067c
...
...
@@ -40,11 +40,11 @@ CXX_LIBS = ${OPENCV_LIBS} -L$(LITE_ROOT)/cxx/lib/ -lpaddle_light_api_shared $(SY
#CXX_LIBS = $(LITE_ROOT)/cxx/lib/libpaddle_api_light_bundled.a $(SYSTEM_LIBS)
mobile_detection
:
fetch_opencv mobile
_detection.o
$(CC)
$(SYSROOT_LINK)
$(CXXFLAGS_LINK)
mobile_detection.o
-o
mobile
_detection
$(CXX_LIBS)
$(LDFLAGS)
ssd_detection
:
fetch_opencv ssd
_detection.o
$(CC)
$(SYSROOT_LINK)
$(CXXFLAGS_LINK)
ssd_detection.o
-o
ssd
_detection
$(CXX_LIBS)
$(LDFLAGS)
mobile_detection.o
:
mobile
_detection.cc
$(CC)
$(SYSROOT_COMPLILE)
$(CXX_DEFINES)
$(CXX_INCLUDES)
$(CXX_FLAGS)
-o
mobile_detection.o
-c
mobile
_detection.cc
ssd_detection.o
:
ssd
_detection.cc
$(CC)
$(SYSROOT_COMPLILE)
$(CXX_DEFINES)
$(CXX_INCLUDES)
$(CXX_FLAGS)
-o
ssd_detection.o
-c
ssd
_detection.cc
fetch_opencv
:
@
test
-d
${THIRD_PARTY_DIR}
||
mkdir
${THIRD_PARTY_DIR}
...
...
@@ -57,5 +57,5 @@ fetch_opencv:
.PHONY
:
clean
clean
:
rm
-f
mobile
_detection.o
rm
-f
mobile
_detection
rm
-f
ssd
_detection.o
rm
-f
ssd
_detection
lite/demo/cxx/makefiles/yolov3_detection/Makefile.android.armv7
0 → 100644
浏览文件 @
b918067c
ARM_ABI
=
arm7
export
ARM_ABI
include
../Makefile.def
LITE_ROOT
=
../../../
THIRD_PARTY_DIR
=
${LITE_ROOT}
/third_party
OPENCV_VERSION
=
opencv4.1.0
OPENCV_LIBS
=
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/libs/libopencv_imgcodecs.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/libs/libopencv_imgproc.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/libs/libopencv_core.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/3rdparty/libs/libtegra_hal.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/3rdparty/libs/liblibjpeg-turbo.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/3rdparty/libs/liblibwebp.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/3rdparty/libs/liblibpng.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/3rdparty/libs/liblibjasper.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/3rdparty/libs/liblibtiff.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/3rdparty/libs/libIlmImf.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/3rdparty/libs/libtbb.a
\
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/3rdparty/libs/libcpufeatures.a
OPENCV_INCLUDE
=
-I
../../../third_party/
${OPENCV_VERSION}
/armeabi-v7a/include
CXX_INCLUDES
=
$(INCLUDES)
${OPENCV_INCLUDE}
-I
$(LITE_ROOT)
/cxx/include
CXX_LIBS
=
${OPENCV_LIBS}
-L
$(LITE_ROOT)
/cxx/lib/
-lpaddle_light_api_shared
$(SYSTEM_LIBS)
###############################################################
# How to use one of static libaray: #
# `libpaddle_api_full_bundled.a` #
# `libpaddle_api_light_bundled.a` #
###############################################################
# Note: default use lite's shared library. #
###############################################################
# 1. Comment above line using `libpaddle_light_api_shared.so`
# 2. Undo comment below line using `libpaddle_api_light_bundled.a`
#CXX_LIBS = $(LITE_ROOT)/cxx/lib/libpaddle_api_light_bundled.a $(SYSTEM_LIBS)
yolov3_detection
:
fetch_opencv yolov3_detection.o
$(CC)
$(SYSROOT_LINK)
$(CXXFLAGS_LINK)
yolov3_detection.o
-o
yolov3_detection
$(CXX_LIBS)
$(LDFLAGS)
yolov3_detection.o
:
yolov3_detection.cc
$(CC)
$(SYSROOT_COMPLILE)
$(CXX_DEFINES)
$(CXX_INCLUDES)
$(CXX_FLAGS)
-o
yolov3_detection.o
-c
yolov3_detection.cc
fetch_opencv
:
@
test
-d
${THIRD_PARTY_DIR}
||
mkdir
${THIRD_PARTY_DIR}
@
test
-e
${THIRD_PARTY_DIR}
/
${OPENCV_VERSION}
.tar.gz
||
\
(
echo
"fetch opencv libs"
&&
\
wget
-P
${THIRD_PARTY_DIR}
https://paddle-inference-dist.bj.bcebos.com/
${OPENCV_VERSION}
.tar.gz
)
@
test
-d
${THIRD_PARTY_DIR}
/
${OPENCV_VERSION}
||
\
tar
-zxvf
${THIRD_PARTY_DIR}
/
${OPENCV_VERSION}
.tar.gz
-C
${THIRD_PARTY_DIR}
.PHONY
:
clean
clean
:
rm
-f
yolov3_detection.o
rm
-f
yolov3_detection
lite/demo/cxx/makefiles/yolov3_detection/Makefile.android.armv8
0 → 100644
浏览文件 @
b918067c
ARM_ABI
=
arm8
export
ARM_ABI
include
../Makefile.def
LITE_ROOT
=
../../../
THIRD_PARTY_DIR
=
${LITE_ROOT}
/third_party
OPENCV_VERSION
=
opencv4.1.0
OPENCV_LIBS
=
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/libs/libopencv_imgcodecs.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/libs/libopencv_imgproc.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/libs/libopencv_core.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/3rdparty/libs/libtegra_hal.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/3rdparty/libs/liblibjpeg-turbo.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/3rdparty/libs/liblibwebp.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/3rdparty/libs/liblibpng.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/3rdparty/libs/liblibjasper.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/3rdparty/libs/liblibtiff.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/3rdparty/libs/libIlmImf.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/3rdparty/libs/libtbb.a
\
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/3rdparty/libs/libcpufeatures.a
OPENCV_INCLUDE
=
-I
../../../third_party/
${OPENCV_VERSION}
/arm64-v8a/include
CXX_INCLUDES
=
$(INCLUDES)
${OPENCV_INCLUDE}
-I
$(LITE_ROOT)
/cxx/include
CXX_LIBS
=
${OPENCV_LIBS}
-L
$(LITE_ROOT)
/cxx/lib/
-lpaddle_light_api_shared
$(SYSTEM_LIBS)
###############################################################
# How to use one of static libaray: #
# `libpaddle_api_full_bundled.a` #
# `libpaddle_api_light_bundled.a` #
###############################################################
# Note: default use lite's shared library. #
###############################################################
# 1. Comment above line using `libpaddle_light_api_shared.so`
# 2. Undo comment below line using `libpaddle_api_light_bundled.a`
#CXX_LIBS = $(LITE_ROOT)/cxx/lib/libpaddle_api_light_bundled.a $(SYSTEM_LIBS)
yolov3_detection
:
fetch_opencv yolov3_detection.o
$(CC)
$(SYSROOT_LINK)
$(CXXFLAGS_LINK)
yolov3_detection.o
-o
yolov3_detection
$(CXX_LIBS)
$(LDFLAGS)
yolov3_detection.o
:
yolov3_detection.cc
$(CC)
$(SYSROOT_COMPLILE)
$(CXX_DEFINES)
$(CXX_INCLUDES)
$(CXX_FLAGS)
-o
yolov3_detection.o
-c
yolov3_detection.cc
fetch_opencv
:
@
test
-d
${THIRD_PARTY_DIR}
||
mkdir
${THIRD_PARTY_DIR}
@
test
-e
${THIRD_PARTY_DIR}
/
${OPENCV_VERSION}
.tar.gz
||
\
(
echo
"fetch opencv libs"
&&
\
wget
-P
${THIRD_PARTY_DIR}
https://paddle-inference-dist.bj.bcebos.com/
${OPENCV_VERSION}
.tar.gz
)
@
test
-d
${THIRD_PARTY_DIR}
/
${OPENCV_VERSION}
||
\
tar
-zxvf
${THIRD_PARTY_DIR}
/
${OPENCV_VERSION}
.tar.gz
-C
${THIRD_PARTY_DIR}
.PHONY
:
clean
clean
:
rm
-f
yolov3_detection.o
rm
-f
yolov3_detection
lite/demo/cxx/mobile_detection/test.jpg
已删除
100644 → 0
浏览文件 @
8fef7532
124.5 KB
lite/demo/cxx/
mobile_detection/mobile
_detection.cc
→
lite/demo/cxx/
ssd_detection/ssd
_detection.cc
浏览文件 @
b918067c
...
...
@@ -194,7 +194,7 @@ void RunModel(std::string model_dir, std::string img_path) {
}
auto
rec_out
=
detect_object
(
outptr
,
static_cast
<
int
>
(
cnt
/
6
),
0.6
f
,
img
);
std
::
string
result_name
=
img_path
.
substr
(
0
,
img_path
.
find
(
"."
))
+
"_detection_result.jpg"
;
img_path
.
substr
(
0
,
img_path
.
find
(
"."
))
+
"_
ssd_
detection_result.jpg"
;
cv
::
imwrite
(
result_name
,
img
);
}
...
...
lite/demo/cxx/yolov3_detection/yolov3_detection.cc
0 → 100644
浏览文件 @
b918067c
// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved.
//
// 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.
#include <iostream>
#include <vector>
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "paddle_api.h" // NOLINT
using
namespace
paddle
::
lite_api
;
// NOLINT
struct
Object
{
cv
::
Rect
rec
;
int
class_id
;
float
prob
;
};
int64_t
ShapeProduction
(
const
shape_t
&
shape
)
{
int64_t
res
=
1
;
for
(
auto
i
:
shape
)
res
*=
i
;
return
res
;
}
const
char
*
class_names
[]
=
{
"person"
,
"bicycle"
,
"car"
,
"motorcycle"
,
"airplane"
,
"bus"
,
"train"
,
"truck"
,
"boat"
,
"traffic light"
,
"fire hydrant"
,
"stop sign"
,
"parking meter"
,
"bench"
,
"bird"
,
"cat"
,
"dog"
,
"horse"
,
"sheep"
,
"cow"
,
"elephant"
,
"bear"
,
"zebra"
,
"giraffe"
,
"backpack"
,
"umbrella"
,
"handbag"
,
"tie"
,
"suitcase"
,
"frisbee"
,
"skis"
,
"snowboard"
,
"sports ball"
,
"kite"
,
"baseball bat"
,
"baseball glove"
,
"skateboard"
,
"surfboard"
,
"tennis racket"
,
"bottle"
,
"wine glass"
,
"cup"
,
"fork"
,
"knife"
,
"spoon"
,
"bowl"
,
"banana"
,
"apple"
,
"sandwich"
,
"orange"
,
"broccoli"
,
"carrot"
,
"hot dog"
,
"pizza"
,
"donut"
,
"cake"
,
"chair"
,
"couch"
,
"potted plant"
,
"bed"
,
"dining table"
,
"toilet"
,
"tv"
,
"laptop"
,
"mouse"
,
"remote"
,
"keyboard"
,
"cell phone"
,
"microwave"
,
"oven"
,
"toaster"
,
"sink"
,
"refrigerator"
,
"book"
,
"clock"
,
"vase"
,
"scissors"
,
"teddy bear"
,
"hair drier"
,
"toothbrush"
};
// 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
)
{
std
::
cerr
<<
"[ERROR] mean or scale size must equal to 3
\n
"
;
exit
(
1
);
}
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
(
1.
f
/
scale
[
0
]);
float32x4_t
vscale1
=
vdupq_n_f32
(
1.
f
/
scale
[
1
]);
float32x4_t
vscale2
=
vdupq_n_f32
(
1.
f
/
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_c0
++
)
=
(
*
(
din
++
)
-
mean
[
1
])
*
scale
[
1
];
*
(
dout_c0
++
)
=
(
*
(
din
++
)
-
mean
[
2
])
*
scale
[
2
];
}
}
void
pre_process
(
const
cv
::
Mat
&
img
,
int
width
,
int
height
,
float
*
data
)
{
cv
::
Mat
rgb_img
;
cv
::
cvtColor
(
img
,
rgb_img
,
cv
::
COLOR_BGR2RGB
);
cv
::
resize
(
rgb_img
,
rgb_img
,
cv
::
Size
(
width
,
height
),
0.
f
,
0.
f
,
cv
::
INTER_CUBIC
);
cv
::
Mat
imgf
;
rgb_img
.
convertTo
(
imgf
,
CV_32FC3
,
1
/
255.
f
);
std
::
vector
<
float
>
mean
=
{
0.485
f
,
0.456
f
,
0.406
f
};
std
::
vector
<
float
>
scale
=
{
0.229
f
,
0.224
f
,
0.225
f
};
const
float
*
dimg
=
reinterpret_cast
<
const
float
*>
(
imgf
.
data
);
neon_mean_scale
(
dimg
,
data
,
width
*
height
,
mean
,
scale
);
}
std
::
vector
<
Object
>
detect_object
(
const
float
*
data
,
int
count
,
float
thresh
,
cv
::
Mat
&
image
)
{
// NOLINT
if
(
data
==
nullptr
)
{
std
::
cerr
<<
"[ERROR] data can not be nullptr
\n
"
;
exit
(
1
);
}
std
::
vector
<
Object
>
rect_out
;
for
(
int
iw
=
0
;
iw
<
count
;
iw
++
)
{
int
oriw
=
image
.
cols
;
int
orih
=
image
.
rows
;
if
(
data
[
1
]
>
thresh
)
{
Object
obj
;
int
x
=
static_cast
<
int
>
(
data
[
2
]);
int
y
=
static_cast
<
int
>
(
data
[
3
]);
int
w
=
static_cast
<
int
>
(
data
[
4
]
-
data
[
2
]
+
1
);
int
h
=
static_cast
<
int
>
(
data
[
5
]
-
data
[
3
]
+
1
);
cv
::
Rect
rec_clip
=
cv
::
Rect
(
x
,
y
,
w
,
h
)
&
cv
::
Rect
(
0
,
0
,
image
.
cols
,
image
.
rows
);
obj
.
class_id
=
static_cast
<
int
>
(
data
[
0
]);
obj
.
prob
=
data
[
1
];
obj
.
rec
=
rec_clip
;
if
(
w
>
0
&&
h
>
0
&&
obj
.
prob
<=
1
)
{
rect_out
.
push_back
(
obj
);
cv
::
rectangle
(
image
,
rec_clip
,
cv
::
Scalar
(
0
,
0
,
255
),
1
,
cv
::
LINE_AA
);
std
::
string
str_prob
=
std
::
to_string
(
obj
.
prob
);
std
::
string
text
=
std
::
string
(
class_names
[
obj
.
class_id
])
+
": "
+
str_prob
.
substr
(
0
,
str_prob
.
find
(
"."
)
+
4
);
int
font_face
=
cv
::
FONT_HERSHEY_COMPLEX_SMALL
;
double
font_scale
=
1.
f
;
int
thickness
=
1
;
cv
::
Size
text_size
=
cv
::
getTextSize
(
text
,
font_face
,
font_scale
,
thickness
,
nullptr
);
float
new_font_scale
=
w
*
0.5
*
font_scale
/
text_size
.
width
;
text_size
=
cv
::
getTextSize
(
text
,
font_face
,
new_font_scale
,
thickness
,
nullptr
);
cv
::
Point
origin
;
origin
.
x
=
x
+
3
;
origin
.
y
=
y
+
text_size
.
height
+
3
;
cv
::
putText
(
image
,
text
,
origin
,
font_face
,
new_font_scale
,
cv
::
Scalar
(
0
,
255
,
255
),
thickness
,
cv
::
LINE_AA
);
std
::
cout
<<
"detection, image size: "
<<
image
.
cols
<<
", "
<<
image
.
rows
<<
", detect object: "
<<
class_names
[
obj
.
class_id
]
<<
", score: "
<<
obj
.
prob
<<
", location: x="
<<
x
<<
", y="
<<
y
<<
", width="
<<
w
<<
", height="
<<
h
<<
std
::
endl
;
}
}
data
+=
6
;
}
return
rect_out
;
}
void
RunModel
(
std
::
string
model_dir
,
std
::
string
img_path
)
{
// 1. Set MobileConfig
MobileConfig
config
;
config
.
set_model_dir
(
model_dir
);
// 2. Create PaddlePredictor by MobileConfig
std
::
shared_ptr
<
PaddlePredictor
>
predictor
=
CreatePaddlePredictor
<
MobileConfig
>
(
config
);
const
int
in_width
=
608
;
const
int
in_height
=
608
;
// 3. Prepare input data from image
// input 0
std
::
unique_ptr
<
Tensor
>
input_tensor0
(
std
::
move
(
predictor
->
GetInput
(
0
)));
input_tensor0
->
Resize
({
1
,
3
,
in_height
,
in_width
});
auto
*
data0
=
input_tensor0
->
mutable_data
<
float
>
();
cv
::
Mat
img
=
imread
(
img_path
,
cv
::
IMREAD_COLOR
);
pre_process
(
img
,
in_width
,
in_height
,
data0
);
// input1
std
::
unique_ptr
<
Tensor
>
input_tensor1
(
std
::
move
(
predictor
->
GetInput
(
1
)));
input_tensor1
->
Resize
({
1
,
2
});
auto
*
data1
=
input_tensor1
->
mutable_data
<
int
>
();
data1
[
0
]
=
img
.
rows
;
data1
[
1
]
=
img
.
cols
;
// 4. Run predictor
predictor
->
Run
();
// 5. Get output and post process
std
::
unique_ptr
<
const
Tensor
>
output_tensor
(
std
::
move
(
predictor
->
GetOutput
(
0
)));
auto
*
outptr
=
output_tensor
->
data
<
float
>
();
auto
shape_out
=
output_tensor
->
shape
();
int64_t
cnt
=
1
;
for
(
auto
&
i
:
shape_out
)
{
cnt
*=
i
;
}
auto
rec_out
=
detect_object
(
outptr
,
static_cast
<
int
>
(
cnt
/
6
),
0.5
f
,
img
);
std
::
string
result_name
=
img_path
.
substr
(
0
,
img_path
.
find
(
"."
))
+
"_yolov3_detection_result.jpg"
;
cv
::
imwrite
(
result_name
,
img
);
}
int
main
(
int
argc
,
char
**
argv
)
{
if
(
argc
<
3
)
{
std
::
cerr
<<
"[ERROR] usage: "
<<
argv
[
0
]
<<
" model_dir image_path
\n
"
;
exit
(
1
);
}
std
::
string
model_dir
=
argv
[
1
];
std
::
string
img_path
=
argv
[
2
];
RunModel
(
model_dir
,
img_path
);
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录