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 開発ボード
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. インクルード ディレクトリにはアプリケーション ヘッダー ファイルと
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.yuv
はpost_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] をクリックします。
確認が完了すると全体的な画像が表示されますが、このとき表示される画像空間を修正する必要があります。
オプション バーで [カラー] をクリックして選択した後、NV12 色空間をクリックして選択します。
選択が完了すると通常の画像が表示されます
他の画像を表示する方法も同様ですが、各画像のサイズは異なる場合があるので、ソース画像のサイズに応じて設定する必要があることに注意してください。
post_face_480x270.nv12
yuvplayer を使用して画像ファイルを次のように表示します。
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 に設定します。
モデルはほとんどの顔モデルを検出しており、画像がぼやけすぎているために一部の顔モデルが認識されない可能性がありますが、モデルの精度は依然として比較的高いことがわかります。ここでは顔認識のみを示していますが、人物認識についてはこの例を参考に自分で修正・追加することも可能です。この例を参照して、顔認識または人体形状検出用のカスタム画像の取得を試みることができます。