当前位置: 首页 > news >正文

100ASK_全志V853-PRO开发板支持人形检测和人脸识别

1.前言

V853 芯片内置一颗 NPU核,其处理性能为最大 1 TOPS 并有 128KB 内部高速缓存用于高速数据交换,支持 OpenCL、OpenVX、android NN 与 ONNX 的 API 调用,同时也支持导入大量常用的深度学习模型。本章提供一个例程,展示如何使用V853芯片中的NPU部分进行人形检测和人脸识别。

资源包(含有应用程序、模型和yuvplayer软件包等文件):source.zip

2.示例程序目录

将上述资源包下载完成解压后,把示例程序100ASK_viplite-driver放在Ubuntu中的任意目录中。假设我放在/home/book/workspaces目录下,下面为人形识别和人脸识别应用程序的目录结构。

book@100ask:~/workspaces/100ASK_viplite-driver$ tree
.
├── 100ASK_Algo
│ ├── det_demo
│ │ ├── 100ASK_det_demo
│ │ ├── aw_errors.c
│ │ ├── aw_errors.h
│ │ ├── body_384x216.yuv
│ │ ├── body_640x360.yuv
│ │ ├── demo.cc
│ │ ├── face_480x270.nv12
│ │ ├── list.c
│ │ ├── list.h
│ │ ├── Makefile
│ │ ├── Readme.txt
│ │ └── testcase.txt
│ ├── fdet
│ │ └── 100ASK_Facedet_480_288_nv12.nb
│ ├── include
│ │ ├── awnn_det.h
│ │ ├── awnn.h
│ │ ├── awnn_info.h
│ │ ├── awnn_lib.h
│ │ └── cross_utils.h
│ ├── libawnn.a
│ ├── libawnn.so
│ ├── pdet
│ │ ├── 100ASK_humandet_384_224_V0.nb
│ │ ├── 100ASK_humandet_384_224_V1.nb
│ │ ├── 100ASK_humandet_640_384_V0.nb
│ │ └── 100ASK_humandet_640_384_V1.nb
│ └── Readme.txt
└── sdk_release
├── libVIPlite.a
├── libVIPlite.so
├── libVIPuser.a
├── libVIPuser.so
└── sdk
├── vip_lite_common.h
└── vip_lite.h7 directories, 31 files
  • 其中100ASK_Algo文件包含了:
    1.det_demo目录包含应用程序和测试图片
    2.fdet目录包含人脸模型
    3.include目录包含应用程序头文件和
    4.pdet目录包含人形模型
    5.sdk_release中包含了NPU相关的模型处理文件

3.主函数 demo.cc

下面仅对应用程序中的demo.cc程序中的main.cc进行讲解,对于其他代码,您可以直接查看应用程序压缩包的其他文件。

int main(int argc, char* argv[]) {
if (argc != 2) {
printf("%s testcase.txt\n", argv[0]);
return 0;
}
int count = 0;
/*创建一个结构体获取参数1的中的数据,该结构体是输入nbg路径,返回awnn_info_t结构体。包含库名称,网络输入图像宽高,内存占用大小,阈值信息等,其中count为处理的图像和网络模型个数*/
network_info_t **infos = create_infos_from_testcase(argv[1], count);
printf("count=%d\n", count);
​
if (count && infos) {
awnn_info_t * nbinfo;
unsigned int mem_size = 0;
pthread_t thread[count] = {0};
//获取参数1获取对应模型个数
for (int i = 0; i < count; i++) {
nbinfo = awnn_get_info(infos[i]->nbg);
printf("info %s %s %u %u %u %f\n", nbinfo->name, nbinfo->md5,
nbinfo->width, nbinfo->height, nbinfo->mem_size, nbinfo->thresh);
infos[i]->nbinfo = nbinfo;
mem_size += nbinfo->mem_size;
}
//根据内存初始化申请NPU模型所需的内存大小
printf("mem_size: %u\n", mem_size);
awnn_init(mem_size);
//创建线程处理模型和图片
for (int i = 0; i < count; i++) {
pthread_create(&thread[i], NULL, detect_thread, infos[i]);
}for (int i = 0; i < count; i++) {
if (thread[i] != 0)
pthread_join(thread[i], NULL);
}
awnn_uninit();
}
//销毁结构体内存
destroy_infos(infos, count);
return 0;
}

可以看到上述过程并没有涉及到模型的处理过程,可以查看100ASK_viplite-driver/100ASK_Algo/include/目录中对应函数的函数说明。

4.编译应用程序

假设我将应用程序文件夹100ASK_viplite-driver放在~/workspaces/100ASK_viplite-driver,进入应用程序目录下

book@100ask:~$ cd ~/workspaces/100ASK_viplite-driver/
book@100ask:~/workspaces/100ASK_viplite-driver$ cd 100ASK_Algo/det_demo/

假设我的Tina SDK放在/home/book/workspaces/tina-v853-open,为应用程序增加环境变量。

book@100ask:~/workspaces/100ASK_viplite-driver/100ASK_Algo/det_demo$ export TINA_TOP=/home/book/workspaces/tina-v853-open
book@100ask:~/workspaces/100ASK_viplite-driver/100ASK_Algo/det_demo$ export STAGING_DIR=~/workspaces/tina-v853-open/openwrt/openwrt/staging_dir/

添加完成后即可编译应用程序

book@100ask:~/workspaces/100ASK_viplite-driver/100ASK_Algo/det_demo$ make
/home/book/workspaces/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-muslgnueabi-g++ demo.cc list.c aw_errors.c -I./ -I./../../100ASK_Algo/include -L./../../100ASK_Algo -L./../../sdk_release -l:libawnn.a -l:libVIPlite.a -l:libVIPuser.a -o 100ASK_det_demo
book@100ask:~/workspaces/100ASK_viplite-driver/100ASK_Algo/det_demo$ ls
100ASK_det_demo aw_errors.h body_640x360.yuv face_480x270.nv12 list.h Readme.txt
aw_errors.c body_384x216.yuv demo.cc list.c Makefile testcase.txt

编译完成后,可以在当前目录下生成一个名为100ASK_det_demo的应用程序。

5.修改testcase.txt

testcase.txt文件里面包含有模型路径、待检测的图像、图像尺寸。下面对该文件进行详细的解读,testcase.txt原文件为:

# example:
# [network]
# network type thresh loop
# input1 width height
# input2 width height
# input3 width height
#
# network: nbg path
# type: 1(humanoidv1.0),3(humanoidv3.0),4(face)
# thresh: postprocess thresh
# loop: loop count
# input: multi test case each in oneline
​
[network]
models/100ASK_humandet_640_384_V1.nb 1 0.25 1
body_640x360.yuv 640 360
​
[network]
models/100ASK_humandet_384_224_V1.nb 3 0.25 1
body_384x216.yuv 384 216
​
[network]
models/100ASK_Facedet_480_288_nv12.nb 4 0.6 1
face_480x270.nv12 480 270

可以看到文件已经对该文件如何使用和网络节点的各参数定义有了解释。testcase.txt文件中可以包含有多个处理的模型,每个需要处理的模型需要有特定的格式要求,假设我现在使用的是100ASK_humandet_640_384_V1.nb模型文件处理test1_640x360.yuv的图像文件,则可以修改testcase.txt文件为

[network]
models/100ASK_humandet_640_384_V1.nb 1 0.25 1
test1_640x360.yuv 640 360

models/100ASK_humandet_640_384_V1.nb为模型的存放路径;1为模型的类别;0.25为后处理阈值;1为循环次数;test1_640x360.yuv为测试图像的名称;640 360为测试图像的尺寸。

注意:100ASK_humandet_640_384_V1.nb为类别1,100ASK_humandet_384_224_V1.nb为类别3。

如果你还想使用同一个模型,增加一个test2_640x360.yuv测试图像,可以直接在该模型下增加

test2_640x360.yuv测试图像和图像尺寸,例如:

[network]
models/100ASK_humandet_640_384_V1.nb 1 0.25 1
test1_640x360.yuv 640 360
test2_640x360.yuv 640 360

6.运行测试程序

我们在示例程序中已经放入供您进行测试使用的图像,您也可以使用TF卡将虚拟机中的应用程序、模型和测试图像等文件拷贝到TF卡中 ,TF卡中的文件结构应如下所示

book@100ask:/media/book/B89C-7C55$ tree
.
├── 100ASK_det_demo
├── body_384x216.yuv
├── body_640x360.yuv
├── face_480x270.nv12
├── models
│ ├── 100ASK_Facedet_480_288_nv12.nb
│ ├── 100ASK_humandet_384_224_V1.nb
│ └── 100ASK_humandet_640_384_V1.nb
└── testcase.txt

可以看到应用程序、测试图片和testcase.txt文件放在TF卡根目录的文件夹下,单独创建一个models文件夹将模型文件放在该文件夹下。

将开发板板上电,插入12V电源线和2条Type-C数据线后,再将TF卡插入开发板中

在这里插入图片描述

启动完成开发板后,挂载TF卡到/mnt目录下,输入mount /dev/mmcblk1p1 /mnt/

root@TinaLinux:/# [ 9866.263682] sunxi-mmc sdc0: sdc set ios:clk 0Hz bm PP pm UP vdd 22 width 1 timing LEGACY(SDR12) dt B
[ 9866.523742] sunxi-mmc sdc0: no vqmmc,Check if there is regulator
[ 9866.553676] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
[ 9866.593686] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
[ 9866.606971] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
[ 9866.619855] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
[ 9866.633161] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
[ 9866.855649] sunxi-mmc sdc0: sdc set ios:clk 0Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
[ 9866.866027] sunxi-mmc sdc0: no vqmmc,Check if there is regulator
[ 9866.893675] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
[ 9866.914333] mmc1: host does not support reading read-only switch, assuming write-enable
[ 9866.924044] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 4 timing LEGACY(SDR12) dt B
[ 9866.938320] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 4 timing UHS-DDR50 dt B
[ 9866.948838] sunxi-mmc sdc0: sdc set ios:clk 50000000Hz bm PP pm ON vdd 22 width 4 timing UHS-DDR50 dt B
[ 9866.959640] mmc1: new ultra high speed DDR50 SDHC card at address aaaa
[ 9866.967694] mmcblk1: mmc1:aaaa SU08G 7.40 GiB
[ 9866.990824] mmcblk1: p1
root@TinaLinux:/# mount /dev/mmcblk1p1 /mnt/
[ 3573.953864] FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

进入mnt目录下即可看到TF卡内的文件

root@TinaLinux:/# cd /mnt/
root@TinaLinux:/mnt# ls
100ASK_det_demo face_480x270.nv12
System Volume Information models
body_384x216.yuv testcase.txt
body_640x360.yuv
root@TinaLinux:/mnt# ls models/
100ASK_Facedet_480_288_nv12.nb 100ASK_humandet_640_384_V1.nb
100ASK_humandet_384_224_V1.nb

确保应用程序、模型文件夹中的模型文件、测试图片、testcase.txt都存在后,即可开始运行测试程序,输入

./100ASK_det_demo testcase.txt

root@TinaLinux:/mnt# ./100ASK_det_demo testcase.txt
count=3
info 05dc32ee903c08a3abd53ddd829a8dd5 640 384 10061394 0.000000
info 827b3a725d0fd7173338a56fd06c8db0 384 224 2829624 0.000000
info 3d42fcd47490a62d52ea021760[ 7944.592701] npu[665][665] vipcore, device init..
[ 7944.600170] set_vip_power_clk ON
​
mem_size: 16530637
Version: AW[ 7944.608597] enter aw vip mem alloc size 16530637
NN_LIB_1.0.3
[0xb6f8f560]vip_in[ 7944.615697] aw_vip_mem_alloc vir 0xe1328000, phy 0x48800000
it[121],
The version of Viplit[ 7944.623477] npu[665][665] gckvip_drv_init kernel logical phy address=0x48800000 virtual =0xe1328000
e is: 1.8.0-0-AW-2023-02-24
VIPLite driver version=0x00010800...
malloc 384x224 nv12 buffer
malloc 480x288 nv12 buffer
malloc 640x384 nv12 buffer
save file: post_body_384x216.yuv
save file: post_face_480x270.nv12
save file: post_body_640x360.yuv
[ 7946.373546] npu[665][665] gckvip_drv_exit, aw_vip_mem_free
[ 7946.379816] aw_vip_mem_free vir 0xe1328000, phy 0x48800000
[ 7946.386027] aw_vip_mem_free dma_unmap_sg_atrs
[ 7946.391003] aw_vip_mem_free ion_unmap_kernel
[ 7946.396101] aw_vip_mem_free ion_free
[ 7946.400118] aw_vip_mem_free ion_client_destroy
[ 7946.410983] npu[665][665] vipcore, device un-init..

执行测试程序完成后可以查看当前目录下的文件,输入ls

root@TinaLinux:/mnt# ls
100ASK_det_demo post_body_640x360.yuv.input_0.txt
System Volume Information post_body_640x360.yuv.input_1.txt
body_384x216.yuv post_body_640x360.yuv.output_0.txt
body_640x360.yuv post_data
face_480x270.nv12 post_face_480x270.nv12
models post_face_480x270.nv12.input_0.txt
post_body_384x216.yuv post_face_480x270.nv12.input_1.txt
post_body_384x216.yuv.input_0.txt post_face_480x270.nv12.output_0.txt
post_body_384x216.yuv.input_1.txt post_face_480x270.nv12.output_1.txt
post_body_384x216.yuv.output_0.txt post_face_480x270.nv12.output_2.txt
post_body_384x216.yuv.output_1.txt testcase.txt
post_body_640x360.yuv

上述文件中,带有post前缀的文件为执行应用程序后生成的文件。其中post_data文件夹含有模型的执行结果和执行性能

post_data/result_TID.txt :输出每个模型检测结果,其中 TID 为检测线程ID号。
post_data/performance_TID.txt :输出每个模型检测性能结果,其中 TID 为检测线程ID号;性能评测时建议运行单个模型且将 stdout 重定向为 /dev/null 。
post_inputN :每个输入的画框结果,其中 inputN 为输入图像路径,直接在路径前添加 post_前缀进行保存,因此输入图像路径请勿添加 ./ 或使用绝对路径。

post_body_384x216.yuv、post_body_640x360.yuv、post_face_480x270.nv12为输出画框结果的图像。

卸载TF卡所用的文件系统,输入

root@TinaLinux:/mnt# cd ../
root@TinaLinux:/# umount /mnt/

7.使用yuvplayer软件查看图像

将TF卡放入读卡器后,插入电脑端,使用yuvplayer软件打开图像,该文件放在source目录下的yuvplayer-2.5.zip,解压后即可使用。设置图像尺寸和颜色空间即可查看图像。

在电脑端,打开U盘文件夹。注意:您之前没使用过yuvplayer.exe,可能不会出现我的.nv12文件一样的图标,但不影响后续的操作。

在这里插入图片描述

选择我们需要查看的图像,例如我想查看body_640x360.yuv文件,单击body_640x360.yuv文件后,右键后选择打开方式。

在这里插入图片描述

点击更多应用

在这里插入图片描述

使用滚轮往下滑,点击在这台电脑上查找其他应用

在这里插入图片描述

找到yuvplayer-2.5.zip解压出来的yuvplayer-2.5文件夹中的yuvplayer.exe文件,选中该文件后点击打开

在这里插入图片描述

打开后,会出现如下画面,该画面是由于没有设置尺寸和颜色空间导致的

在这里插入图片描述

在选项栏中点击Size后,选择Custom。这样的选择意思是选择自定义尺寸

在这里插入图片描述

在自定义尺寸界面输入图像尺寸,该图像尺寸宽为640,高为360,设置完成后点击确定

在这里插入图片描述

确定完成之后可以,看到大致的图像,但此时还需要修改显示的图像空间。

在这里插入图片描述

在选项栏中点击选择Color后,点击选择NV12颜色空间

在这里插入图片描述

选择完成后,即可看到正常的图像

在这里插入图片描述

其他图像的查看方式也同理,值得注意的是每张图像的尺寸可能不一样,需要根据源图像的尺寸设置。
使用yuvplayer查看post_face_480x270.nv12 图像文件为:

在这里插入图片描述

7.使用自定义图片测试

由于我们平常使用的图片格式多为JPG或者PNG格式,其图像数据格式都为RGB等常见颜色空间,但在视频编解码和视频传输应用中通常使用NV12的视频存储格式,它将图片中 Y 轴色度信息和 UV 轴亚像素信息存储在同一个平面中。这就导致在 NV12 格式中,图像的每一行都存储一个 Y 值(代表色度信息),然后每隔两行存储一个 U 和 V 值(代表亚像素信息)。所以NV12 格式中的图像数据通常会比其他格式(如 RGB)少一半。

如果您获取的应用的图像为NV12就不需要进行格式转换,如果您想测试的图像为并不是NV12格式,而是我们常见的RGB格式的JPG或PNG图像,则需要使用工具进行转换。

下面我们使用的工具是ffmpeg,下面演示如何使用ffmpeg进行图像存储格式的转换。

安装ffmpeg,在虚拟机终端界面输入sudo apt-get install ffmpeg

book@100ask:~$ sudo apt-get install ffmpeg
[sudo] password for book:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libdumbnet1
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
i965-va-driver libaacs0 libass9 libavcodec57 libavdevice57 libavfilter6
libavformat57 libavresample3 libavutil55 libbdplus0 libbluray2 libbs2b0
libchromaprint1 libcrystalhd3 libdc1394-22 libflite1 libgme0 libgsm1
libllvm10 libmysofa0 libnorm1 libopenal-data libopenal1 libopenjp2-7
libopenmpt0 libpgm-5.2-0 libpostproc54 librubberband2 libsdl2-2.0-0
libshine3 libsnappy1v5 libsndio6.1 libsoxr0 libssh-gcrypt-4 libswresample2
libswscale4 libva-drm2 libva-x11-2 libva2 libvdpau1 libx264-152 libx265-146
libxvidcore4 libzmq5 libzvbi-common libzvbi0 mesa-va-drivers
mesa-vdpau-drivers va-driver-all vdpau-driver-all
Suggested packages:
ffmpeg-doc i965-va-driver-shaders libbluray-bdj firmware-crystalhd
libportaudio2 sndiod libvdpau-va-gl1 nvidia-vdpau-driver
nvidia-legacy-340xx-vdpau-driver
The following NEW packages will be installed:
ffmpeg i965-va-driver libaacs0 libass9 libavcodec57 libavdevice57
libavfilter6 libavformat57 libavresample3 libavutil55 libbdplus0 libbluray2
libbs2b0 libchromaprint1 libcrystalhd3 libdc1394-22 libflite1 libgme0
libgsm1 libllvm10 libmysofa0 libnorm1 libopenal-data libopenal1 libopenjp2-7
libopenmpt0 libpgm-5.2-0 libpostproc54 librubberband2 libsdl2-2.0-0
libshine3 libsnappy1v5 libsndio6.1 libsoxr0 libssh-gcrypt-4 libswresample2
libswscale4 libva-drm2 libva-x11-2 libva2 libvdpau1 libx264-152 libx265-146
libxvidcore4 libzmq5 libzvbi-common libzvbi0 mesa-va-drivers
mesa-vdpau-drivers va-driver-all vdpau-driver-all
0 upgraded, 51 newly installed, 0 to remove and 242 not upgraded.
Need to get 32.5 MB/47.9 MB of archives.
After this operation, 222 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

此时会提示您将有222M空间需要被使用,此时输入y,即可进行下载安装

等待安装完成后,输入ffmpeg -h

book@100ask:~$ ffmpeg -h
ffmpeg version 3.4.11-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
...

可以看到ffmpeg的版本号和适用的Ubuntu,后续的使用指南可自行观看,这里就不展示全部输出信息。

下面我们使用《RISC-V嵌入式开发线下交流会》中的照片,尺寸为480×270,图像格式为JPG

在这里插入图片描述

book@100ask:~/workspaces/testImg$ ls
test_480-270.jpg

使用ffmpeg进行格式转换,在终端输入ffmpeg -i test_480-270.jpg -s 480x288 -pix_fmt nv12 100ask_face-480-270.yuv

book@100ask:~/workspaces/testImg$ ffmpeg -i test_480-270.jpg -s 480x270 -pix_fmt nv12 100ask_face-480-270.yuv
ffmpeg version 3.4.11-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Input #0, image2, from 'test_480-270.jpg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 5699 kb/s
Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 480x270 [SAR 96:96 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> rawvideo (native))
Press [q] to stop, [?] for help
[swscaler @ 0x55787ff64b20] deprecated pixel format used, make sure you did set range correctly
Output #0, rawvideo, to '100ask_face-480-270.yuv':
Metadata:
encoder : Lavf57.83.100
Stream #0:0: Video: rawvideo (NV12 / 0x3231564E), nv12, 480x270 [SAR 1:1 DAR 16:9], q=2-31, 38880 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc57.107.100 rawvideo
frame= 1 fps=0.0 q=-0.0 Lsize= 190kB time=00:00:00.04 bitrate=38880.0kbits/s speed=0.664x
video:190kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%

执行完成没有出现报错,并可以输入ls查看转换后的图像文件

book@100ask:~/workspaces/testImg$ ls
test_480-270.jpg 100ask_face-480-270.yuv

可以发现生成了一个名为100ask_face-480-270.yuv文件,该文件的图像尺寸为480×270,图像存储格式为NV12。

将其拷贝到开发板上,与应用程序100ASK_det_demo放在同一目录中,例如:

root@TinaLinux:/mnt# ls
100ASK_det_demo
100ask_face-480-270.yuv
System Volume Information
body_384x216.yuv
body_640x360.yuv
face_480x270.nv12
models
post_100ask_face-480_288.yuv.input_0.txt
post_100ask_face-480_288.yuv.input_1.txt
post_100ask_face-480_288.yuv.output_0.txt
post_100ask_face-480_288.yuv.output_1.txt
post_100ask_face-480_288.yuv.output_2.txt
post_body_384x216.yuv
post_body_384x216.yuv.input_0.txt
post_body_384x216.yuv.input_1.txt
post_body_384x216.yuv.output_0.txt
post_body_384x216.yuv.output_1.txt
post_body_640x360.yuv
post_body_640x360.yuv.input_0.txt
post_body_640x360.yuv.input_1.txt
post_body_640x360.yuv.output_0.txt
post_data
post_face_480x270.nv12
post_face_480x270.nv12.input_0.txt
post_face_480x270.nv12.input_1.txt
post_face_480x270.nv12.output_0.txt
post_face_480x270.nv12.output_1.txt
post_face_480x270.nv12.output_2.txt
testcase.txt

修改testcase.txt,增加人脸模型的输入图像,在串口终端输入

root@TinaLinux:/mnt# vi testcase.txt

修改文件内容为:

# example:
# [network]
# network type thresh loop
# input1 width height
# input2 width height
# input3 width height
#
# network: nbg path
# type: 1(humanoidv1.0),3(humanoidv3.0),4(face)
# thresh: postprocess thresh
# loop: loop count
# input: multi test case each in oneline
​
[network]
models/100ASK_humandet_640_384_V1.nb 1 0.25 1
body_640x360.yuv 640 360
​
[network]
models/100ASK_humandet_384_224_V1.nb 3 0.25 1
body_384x216.yuv 384 216
​
[network]
models/100ASK_Facedet_480_288_nv12.nb 4 0.6 1
face_480x270.nv12 480 270
100ask_face-480-270.yuv 480 270

运行100ASK_det_demo应用程序

root@TinaLinux:/mnt# ./100ASK_det_demo testcase.txt
count=3
info 05dc32ee903c08a3abd53ddd829a8dd5 640 384 10061394 0.000000
info 827b3a725d0fd7173338a56fd06c8db0 384 224 2829624 0.000000
info 3d42fcd47490a62d52ea021760[ 212.538113] npu[465][465] vipcore, device init..
[ 212.545449] set_vip_power_clk ON
​
mem_size: 16530637
Version: AW[ 212.553935] enter aw vip mem alloc size 16530637
NN_LIB_1.0.3
[0xb6fe0560]vip_init[121],
The version of Viplite is: 1.8.0-0-AW-2023-02-24
[ 212.569158] aw_vip_mem_alloc vir 0xe1353000, phy 0x48800000
[ 212.575548] npu[465][465] gckvip_drv_init kernel logical phy address=0x48800000 virtual =0xe1353000
VIPLite driver version=0x00010800...
malloc 480x288 nv12 buffer
malloc 384x224 nv12 buffer
malloc 640x384 nv12 buffer
save file: post_body_384x216.yuv
save file: post_face_480x270.nv12
save file: post_body_640x360.yuv
save file: post_100ask_face-480-270.yuv
[ 215.019076] npu[465][465] gckvip_drv_exit, aw_vip_mem_free
[ 215.025231] aw_vip_mem_free vir 0xe1353000, phy 0x48800000
[ 215.031525] aw_vip_mem_free dma_unmap_sg_atrs
[ 215.036451] aw_vip_mem_free ion_unmap_kernel
[ 215.041627] aw_vip_mem_free ion_free
[ 215.045646] aw_vip_mem_free ion_client_destroy
[ 215.051785] npu[465][465] vipcore, device un-init..

使用yuvplayer软件查看图像,配置图像的尺寸:宽480、高270;配置图像颜色空间为NV12

在这里插入图片描述

可以看到该模型已经检测到大部分人脸模型,可能由于图像过于模糊导致有个别未能识别到,但该模型的精度还是比较高的。这里仅演示人脸识别,对于人形识别大家也可以参考这个示例自行去修改增加。参考这个示例大家可以去自己尝试获取自定义的图像进行人脸识别或人形检测。

对于如何在100ASK_V853-PRO如何实时处理从摄像头获取的图像进行人脸识别和人形检测可在下节MPP中讲述。

相关文章:

100ASK_全志V853-PRO开发板支持人形检测和人脸识别

1.前言 V853 芯片内置一颗 NPU核&#xff0c;其处理性能为最大 1 TOPS 并有 128KB 内部高速缓存用于高速数据交换&#xff0c;支持 OpenCL、OpenVX、android NN 与 ONNX 的 API 调用&#xff0c;同时也支持导入大量常用的深度学习模型。本章提供一个例程&#xff0c;展示如何使…...

简单实现基于UDP与TCP的回显服务器

目录 前言UDP 版的回显服务器需要用到的 api服务端客户端UDP 版本的字典客户端和字典服务器 TCP 版的回显服务器需要用到的 api服务器客户端对服务器进行改进(使用线程池)TCP 版本的字典客户端和字典服务器 前言 我们写网络程序, 主要编写的是应用层代码. 真正要发送这个数据,…...

家用洗地机有什么推荐的吗?家用洗地机哪款好

洗地机是创新、高效的清洁工具&#xff0c;其具有高性能的清洁能力和卓越的操作体验。与传统的清洁工具相比&#xff0c;洗地机可以迅速而彻底地打扫地面&#xff0c;降低清洁时间和人力成本&#xff0c;让我们在工作之余不用花费大量的时间和精力去打扫卫生&#xff0c;下面就…...

深度学习与文本聚类:一篇全面的介绍与实践指南

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

AP5153 线性降压恒流驱动芯片 2.5A

AP5153 是一种 PWM 调光的、低压 差的 LED 线性降压恒流驱动器。 AP5153 仅需要外接一个电阻和一个 NMOS 管就可以构成一个完整的 LED 恒 流驱动电路&#xff0c; 调节该外接电阻就可以调节 输出电流&#xff0c;输出电流可调范围为 20mA 到 3.0A。 AP5153 还可以通过在 DIM…...

Unity物理系统脚本编程(下)

一、修改物理材质 Unity对物体表面材料的性质做了件化处理&#xff0c;仅有5种常用属性&#xff1a; Dynamic Friction&#xff08;动态摩擦系数&#xff09;Static Friction&#xff08;静态摩擦系数&#xff09;Bounciness&#xff08;弹性系数&#xff09;Friction Combine…...

容器技术的发展

容器技术的发展 近年来&#xff0c;随着计算机硬件、网络以及云计算等技术的迅速发展&#xff0c;云原生的概念也越来越受到业界人士的广泛关注&#xff0c;越来越多的应用场景开始拥抱云原生&#xff0c;其中容器技术的发展起着至关重要的作用。本章将介绍容器技术的基础知识…...

Python Flask request中常见存储参数的介绍

Python Flask request中常见存储参数的介绍 首先从flask模块中导入请求对象&#xff1a; from flask import requestrequest.form 通过method属性可以操作当前请求方法&#xff0c;通过使用form属性处理表单数据&#xff08;本质也是得到一个字典&#xff0c;如果传输的是字…...

php+vue网盘系统的设计与实现

该网盘系统的开发和设计根据用户的实际情况出发&#xff0c;对系统的需求进行了详细的分析&#xff0c;然后进行系统的整体设计&#xff0c;最后通过测试使得系统设计的更加完整&#xff0c;可以实现系统中所有的功能&#xff0c;在开始编写论文之前亲自到图书馆借阅php书籍&am…...

[前端]深浅拷贝

一、回顾变量类型 基础类型 boolean&#xff08;bool&#xff09; number string null undefined 引用类型 object ​ function ​ array 基本类型与引用类型的存储 基本类型一般存储在 栈 (栈小) 栈一旦确认 大小就固定 可能会造成溢出栈一般是先进后出用于存储…...

文章纠错免费软件-文字校对软件免费下载

自动校对稿件的软件 自动校对稿件的软件是一种基于自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;和机器学习&#xff08;Machine Learning&#xff09;技术的工具&#xff0c;可以较为准确地检测和纠正文本中出现的语法、拼写、标点符号以及其他笔误…...

【Redis】Redis缓存雪崩、缓存穿透、缓存击穿(热key问题)

目录 一、缓存穿透 1、概念 2、解决办法 1.缓存空对象 2.布隆过滤 二、缓存雪崩 1、概念 2、解决办法 1.给key设置随机的过期时间TTL 2.业务添加多级缓存 3.利用集群提供服务可用性 4.缓存业务添加降级限流 三、缓存击穿 1、概念 2、解决办法 1.互斥锁 2.逻辑…...

为什么很多程序员喜欢linux系统?

a> Linux哪些行业在运用&#xff1f; Linux系统运用极其广泛&#xff0c;不少用户只知道windows&#xff0c;是因为&#xff0c;Linux的运用主要是在企业端。现在科技极其发达&#xff0c;我们手机在手&#xff0c;就能干很多事情&#xff0c;只需点一点屏幕&#xff0c;轻松…...

Bean 作用域和生命周期

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 lombok的使用案例引入作用域定义singleton单例作用域prototype原型作用域(多例作用域)request请求作用域session会话作用域ap…...

PMP考试常见13个固定套路

一、变更批准之后 变更批准后要做三件事: 1、在变更日志中记录 2、通知相关干系人 3、更新项目管理计划 二、风险的情景题 1、先判断风险识别了&#xff0c;还是风险发生了。 2、若是风险识别&#xff0c;按风险管理程序走; 3、若是风险发生&#xff0c;则应采取应急措施…...

Leecode101 ——对称二叉树

对称二叉树:Leecode 101 leecode 101 对称二叉树 根据题目描述&#xff0c;首先想清楚&#xff0c;对称二叉树要比较的是哪两个节点。对于二叉树是否对称&#xff0c;要比较的是根节点的左子树与根节点的右子树是不是相互翻转的&#xff0c;其实也就是比较两个树&#xff0c;…...

JVM学习随笔03——Java堆中new一个对象的步骤

目录 一、进行类加载 二、堆中分配内存 1、怎么输出GC日志&#xff1a; 2、内存分配的两种方式&#xff1a; 3、内存分配过程中并发控制的两种方式&#xff1a; 三、内存空间初始化 四、对象头初始化&#xff08;对象头包含哪些信息&#xff1f;&#xff09; 五、执行构…...

虹科方案 | CEMEX 使用HK-Edgility 智能边缘计算平台简化其企业 WAN 管理和运营

一、应对价值 130 亿美元的跨国企业的网络挑战 “我们选择 Edgility 是因为其卓越的管理和协调功能&#xff0c;它为我们提供了一个端到端的工具集&#xff0c;可以经济高效地部署和管理我们边缘设备的生命周期。” —— Fernando Garcia -Villaraco Casero, CEMEX 全球IT 战略…...

rk3568 系统移植和编译

1。 硬件问题 尽量根据原版 evb 开发版 pcb 进行布线和移植&#xff0c;切记不可自行走线。 emmc 和 ddr4 选型都有要求的&#xff0c;按照硬件手册进行设计 2。软件问题 2.1 目前固件系统选用1.3.2 版本进行设计 解压后运行 .repo/repo/repo sync -c 更新代码 2.2 ubo…...

深度解析C++异常处理机制:分类、处理方式、常见错误及11新增功能

C 基础知识 八 异常处理 上篇 一、基础1. 异常的概念2. 异常的分类2.1 内置异常2.2 自定义异常 3. 异常的处理方式3.1 try-catch 语句3.2 throw 语句3.3 noexcept 修饰符3.4 finally 语句块 二、 异常处理机制1 try-catch 语句块2 异常处理流程3 标准异常类 三、 抛出异常1 thr…...

FPGA时序约束(四)主时钟、虚拟时钟和时钟特性的约束

系列文章目录 FPGA时序约束&#xff08;一&#xff09;基本概念入门及简单语法 FPGA时序约束&#xff08;二&#xff09;利用Quartus18对Altera进行时序约束 FPGA时序约束&#xff08;三&#xff09;时序约束基本路径的深入分析 文章目录 系列文章目录前言主时钟约束跨时钟域…...

JNI开发

文件结构&#xff08;选中的为生成的&#xff09; CMake构建不需要执行命令&#xff0c;会自动生成so文件打包进apk Android mk构建需要执行命令生成so文件&#xff0c;再打包进apk。命令如下。 # 在jni目录下执行 # 生成com_demo_cppproject_OtherNdkTest.h头文件 javac -h .…...

JAVA有哪些特点?

JAVA有以下特点&#xff1a; 综上所述&#xff0c;Java作为一种先进的面向对象编程语言&#xff0c;具有简单、可移植、健壮、高性能、多线程、动态性、跨平台、开放性和安全性等众多特点&#xff0c;已经成为广泛使用的编程语言之一。 简单易学&#xff1a;JAVA语言的语法与C语…...

使用读写锁提高并发

我们想要的是&#xff1a;允许多个线程同时读&#xff0c;但只要有一个线程在写&#xff0c;其他线程就必须等待。 ReadWriteLock ReadWriteLock的作用&#xff1a; 只允许一个线程写入&#xff08;其他线程既不能写入也不能读取&#xff09;&#xff1b;没有写入时&#xf…...

使用@PropertySource加载配置文件

1.PropertySource和PropertySources注解 1.1.PropertySource注解概述 PropertySource注解是Spring 3.1开始引入的配置类注解。通过**PropertySource注解可以将properties配置文件中的key/value存储到Spring的Environment中&#xff0c;Environment接口提供了方法去读取配置文…...

事务及分布式事务解决方案

基础概念 1.1.事务 事务可以看做是一次大的活动&#xff0c;它由不同的小活动组成&#xff0c;这些活动要么全部成功&#xff0c;要么全部失败。 1.2.本地事务 在计算机系统中&#xff0c;更多的是通过关系型数据库来控制事务&#xff0c;利用数据库本身的事务特性来实现&a…...

【思科、华为、华三、锐捷网络设备巡检命令】

华三 screen-1ength disable 取消分页 displayversion 查看版本 displayclock 查看日期时钟 displayfan 查看风扇状态 displaypower 查看电源信息 displaycpu-usage 查看CPU利用率 displaymemory 查看内存利用率 display environment 查看温度信息 display device 查看设备信息…...

代码随想录算法训练营第五十二天

代码随想录算法训练营第五十二天| 300.最长递增子序列&#xff0c;674. 最长连续递增序列&#xff0c;718. 最长重复子数组 300.最长递增子序列674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 题目链接&#xff1a;最长递增子序列 这里是不用处理if nums[i] &l…...

【Linux网络】传输层中UDP和TCP协议

文章目录 1、再谈端口号2、UDP协议3、TCP协议3.1 TCP协议段格式3.2 TCP的三次握手和四次挥手&#xff08;连接管理机制&#xff09;3.3 TCP的滑动窗口3.4 TCP的流量控制3.5 拥塞控制3.6 延迟应答和捎带应答3.7 面向字节流和粘包问题3.8 TCP总结 1、再谈端口号 端口号port标识一…...

工具︱ Web3加密浏览器Brave有什么特别之处?

使用浏览器来上网访问和获取各种信息和资源已经成为传统互联网民的普遍活动&#xff0c;下一代互联网协议Web3的核心特点是去中心化&#xff0c;即不依赖于中心化的服务器和数据中心&#xff0c;而是通过分布式的网络节点来实现数据存储和传输。 浏览器承载着信息网络与用户需求…...