7.100ASK_V853-PRO 開発ボードは人物検出と顔認識をサポート

1 はじめに

V853 チップには、最大 1 TOPS の処理性能と 128KB の内部キャッシュを備えた NPU コアが内蔵されており、高速なデータ交換を実現しており、OpenCL、OpenVX、android NN、ONNX API 呼び出しをサポートしており、大容量ファイルのインポートもサポートしています。一般的に使用される深層学習モデルの数。この章では、V853 チップの NPU 部分を人物検出と顔認識に使用する方法を示すルーチンを提供します。

リソース パッケージ (アプリケーション プログラムおよび yuvplayer ソフトウェア パッケージを含む): source.zip
100ASK_V853-PRO 開発ボード データの概要:

リンク: 100ASK_100ASK-PRO データ概要 - Allwinner / V853-Pro - 組み込み開発 Q&A コミュニティ

100ASK_V853-PRO 開発ボード購入リンク: 100ASK_V853-PRO 開発ボード

画像-20230418094041344

2. サンプルプログラムディレクトリ

上記のリソースパッケージをダウンロードして解凍した後、サンプルプログラムを100ASK_viplite-driverUbuntuの任意のディレクトリに配置します。/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. インクルード ディレクトリにはアプリケーション ヘッダー ファイルと

4. pdet ディレクトリには人型モデルが含まれています

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 ファイルには複数の処理済みモデルを含めることができ、処理する必要がある各モデルには特定の形式要件が必要です。test1_640x360.yuv のイメージ ファイルを処理するために 100ASK_humandet_640_384_V1.nb モデル ファイルを使用していると仮定すると、次のことができます。テストケースを変更します。.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

TF カードのルート ディレクトリのフォルダーにアプリケーション プログラム、テスト ピクチャ、testcase.txt ファイルが配置され、このフォルダー内にモデル ファイルを配置するために別のモデル フォルダーが作成されていることがわかります。

開発ボードの電源を入れ、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.yuvpost_face_480x270.nv12出力フレーム結果のイメージです。

TF カードで使用されているファイル システムをアンインストールするには、次のように入力します。

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

7. yuvplayer ソフトウェアを使用して画像を表示します

TF カードをカード リーダーに挿入し、コンピューターに挿入し、yuvplayer ソフトウェアを使用してイメージを開き、ファイルはソース ディレクトリの yuvplayer-2.5.zip に配置され、解凍後に使用できます。画像を表示するには、画像のサイズと色空間を設定します。

コンピューター側で、U ディスクフォルダーを開きます。注: これまでに yuvplayer.exe を使用したことがない場合、.nv12 ファイルと同じアイコンが表示されない場合がありますが、その後の操作には影響しません。
ここに画像の説明を挿入

表示する必要がある画像を選択します。たとえば、body_640x360.yuvファイルを表示したい場合は、body_640x360.yuvファイルをクリックし、右クリックして開く方法を選択します。

ここに画像の説明を挿入

さらに多くのアプリケーションを表示するにはクリックしてください
ここに画像の説明を挿入

スクロール ホイールを使用して下にスワイプし、[このコンピュータ上の他のアプリを探す]をクリックします。

ここに画像の説明を挿入

yuvplayer-2.5.zip から抽出された yuvplayer-2.5 フォルダーで yuvplayer.exe ファイルを見つけ、ファイルを選択して「開く」をクリックします

開くと以下の画面が表示されますが、これはサイズと色空間を設定していないことが原因です。

ここに画像の説明を挿入

オプションバーの「サイズ」をクリックした後、「カスタム」を選択します。このような選択は、カスタム サイズを選択することを意味します

ここに画像の説明を挿入

カスタム サイズ インターフェイスに画像サイズを入力します。画像サイズは幅 640、高さ 360 です。設定後、[OK] をクリックします。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-9ywUCjkx-1683855628085) (${media}/image-20230423155745696.png)]

確認が完了すると全体的な画像が表示されますが、このとき表示される画像空間を修正する必要があります。

ここに画像の説明を挿入

オプション バーで [カラー] をクリックして選択した後、NV12 色空間をクリックして選択します。
ここに画像の説明を挿入

選択が完了すると通常の画像が表示されます

ここに画像の説明を挿入

他の画像を表示する方法も同様ですが、各画像のサイズは異なる場合があるので、ソース画像のサイズに応じて設定する必要があることに注意してください。

post_face_480x270.nv12yuvplayer を使用して画像ファイルを次のように表示します。

ここに画像の説明を挿入

7. カスタム イメージを使用したテスト

私たちが通常使用する画像形式のほとんどは JPG または PNG 形式であり、画像データ形式は RGB などの一般的な色空間であるため、ビデオ コーデックやビデオ送信アプリケーションでは NV12 ビデオ ストレージ形式が通常使用されます。画像 UV 軸上の色差情報と UV 軸上のサブピクセル情報は同じ平面に格納されます。これにより、NV12 形式では、画像の各行に Y 値 (クロミナンス情報を表す) が保存され、次に 2 行ごとに 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 に設定します。

ここに画像の説明を挿入

モデルはほとんどの顔モデルを検出しており、画像がぼやけすぎているために一部の顔モデルが認識されない可能性がありますが、モデルの精度は依然として比較的高いことがわかります。ここでは顔認識のみを示していますが、人物認識についてはこの例を参考に自分で修正・追加することも可能です。この例を参照して、顔認識または人体形状検出用のカスタム画像の取得を試みることができます。

おすすめ

転載: blog.csdn.net/thisway_diy/article/details/130635527