导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

    100ASK_V853-PRO开发板支持人形检测和人脸识别

    V Series
    2
    3
    1633
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • bayche
      bayche LV 6 最后由 q1215200171 编辑

      本文转载自:https://forums.100ask.net/t/topic/3074/1

      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.h
      
      7 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卡插入开发板中

      8d09d57caff533f572d14e2fe651d6b8969c7090.jpeg

      启动完成开发板后,挂载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文件一样的图标,但不影响后续的操作。

      3d88a1b8c9bc8330f2f99f2046984858d5afd7c7.png

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

      ceee827852b29190f3667d02a8591d1f9efdcc89.png

      点击更多应用

      c705913b89a28836c9477e8094542d80dffe7fbe.png

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

      735f8a995292a65552cd9a4b1f61d08f0e2d6a98.png

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

      a1db7165384e4c62012894f514926921aeefff14.png

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

      5d71be34721b0a80aa0fa118719b0b04693aaf9f.png

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

      957025fabf7b0b9f27f6701563c0d026431b0cea.png

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

      13e51a9f4a34ff08359b8834d8ecf0bb8bb2cb61.png

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

      acc8bb5980d84677160090ed774ac2219c886461.jpeg

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

      7d9409975e21961d7a5ba9371006e018c6bc9825.png

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

      9fcd255dd30108781ead55f2b85c3575873366a4.png

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

      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

      56b5b6eb8b7eab72a3cd0a4c28bacfdff5f5879e.jpeg

      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

      22a3027605a6ce16a408dd4cf151e944d6c9f0c6.png

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

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

      S 1 条回复 最后回复 回复 引用 分享 1
      • S
        sunxi LV 5 最后由 编辑

        楼主,你知道这个human.nb是用什么训练的模型,然后量化的吗?yolo吗?

        1 条回复 最后回复 回复 引用 分享 0
        • S
          sunxi LV 5 @bayche 最后由 编辑

          @bayche 这个human.nb是用yolo训练之后量化的吗?

          1 条回复 最后回复 回复 引用 分享 0
          • 1 / 1
          • First post
            Last post

          Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

          行为准则 | 用户协议 | 隐私权政策