1 はじめに
x3の開発者マニュアルでは、bpuを使ってリサイズする動作をボード上でテストし、bpu-resizeとopencv-resizeの時間差を比較し、トリミング中にトリミング領域をズームすることもできます。そして、以前に docker 環境でコンパイルしたことがあり、これが少し面倒であり、cpp コンパイルはクロス コンパイル ツールと依存ファイルのみに依存し、クロス コンパイル ツールは /opt/gcc-ubuntu-9.3.0- です。 2020.03-x86_64- docker配下 aarch64-linux-gnu配下で、ホストにコピーして、dockerに頼らずにコンパイルできます. コンパイルに問題がある場合は、完全な依存関係ファイルとソースコードをから入手することもできます.この記事の Baidu クラウド リンク。
この記事のテスト コード: https://github.com/Rex-LK/ai_arm_learning
Baidu クラウドの完全な依存ファイルとソース コード: https://pan.baidu.com/s/1x34kaRseh8YXMJ-vmFhxEg?pwd=c6cn 抽出コード: c6cn
歓迎 履歴書 勉強中または学びたい学生はグループに参加して、一緒に議論し、勉強してください, v: Rex1586662742, q グループ: 468713665
2. cpp のコンパイル環境を簡素化する
このマシンのエクスポート クロス コンパイル ツールのパス
export LD_LIBRARY_PATH=..../ai_arm_learning/x3/datagcc-ubuntu-9.3.0-2020. 03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu ## ....为实际路径
クロスコンパイル ツールを使用しない場合、つまり # SET(tar x3) をコメント アウトすると、ホストが yolo_demo を実行したときに表示されます。
./yolo_demo: error while loading shared libraries: libhbdk_sim_x86.so: cannot open shared object file: No such file or directory
同じエクスポートに対応するライブラリ パスは、
export LD_LIBRARY_PATH=..../ai_arm_learning/x3/data/deps/x86/dnn_x86/lib ## ....为实际路径
以上の手順で、Docker に依存せずにクロスコンパイルを快適に行うことができます。
3. bpu を使用してサイズを変更します
x3_inference/sample/resize_demo.cpp では、yuv420、rgb、bgr の 3 つの異なる画像フォーマットのサイズ変更メソッドが実装されており、呼び出される最後の API インターフェイスは hbDNNResize です。
string image_path = "../../data/images/kite.jpg";
string test_case = argv[1];
int oimg_w = 1920;
int oimg_h = 1080;
auto bgrImg = imread(image_path);
int resized_w = 640;
int resized_h = 640;
resize(bgrImg,bgrImg,Size(oimg_w,oimg_h));
if(test_case == "YUV420"){
Mat yuvImg;
cvtColor(bgrImg, yuvImg, COLOR_BGR2YUV_I420);
BpuResize* resizer = new BpuResize(oimg_w,oimg_h,resized_w,resized_h,imageType::YUV420);
long t1 = tools::get_current_time();
float* res = resizer->Resize(yuvImg);
long t2 = tools::get_current_time();
cout <<"bpu resize:" <<t2 - t1 << endl;
Mat ResizedYuvMat(resized_h * 1.5, resized_w, CV_8UC1);
memcpy(ResizedYuvMat.data,res,resized_w * resized_h * 1.5);
Mat ResizedBgrMat;
cvtColor(ResizedYuvMat,ResizedBgrMat, COLOR_YUV2BGR_I420);
imwrite("test_resized_yuv.png", ResizedBgrMat);
}
else if (test_case == "BGR"){
BpuResize* resizer = new BpuResize(oimg_w,oimg_h,resized_w,resized_h,imageType::BGR);
long t1 = tools::get_current_time();
float* res = resizer->Resize(bgrImg);
long t2 = tools::get_current_time();
cout <<"bpu resize:" <<t2 - t1 << endl;
Mat ResizedBgrMat(resized_h , resized_w, CV_8UC3);
memcpy(ResizedBgrMat.data,res,resized_w * resized_h * 3);
imwrite("test_resized_bgr.png", ResizedBgrMat);
}
else if (test_case == "RGB"){
Mat rgbImg;
cvtColor(bgrImg, rgbImg, COLOR_BGR2RGB);
BpuResize* resizer = new BpuResize(oimg_w,oimg_h,resized_w,resized_h,imageType::RGB);
long t1 = tools::get_current_time();
float* res = resizer->Resize(rgbImg,{
0,0,2000,2000});
long t2 = tools::get_current_time();
cout <<"bpu resize:" <<t2 - t1 << endl;
Mat ResizedRgbMat(resized_h , resized_w, CV_8UC3);
memcpy(ResizedRgbMat.data,res,resized_w * resized_h * 3);
Mat ResizedBgrMat;
cvtColor(ResizedRgbMat,ResizedBgrMat, COLOR_RGB2BGR);
imwrite("test_resized_rgb.png", ResizedBgrMat);
}
bpu-resize のヘッダファイル bpu_resize.hpp を実現する. クリッピングされた領域をスケーリングすることは, その後のモデルを予測するのに有益である. もちろん, このステップは公式の roiInfer インターフェイスを使用して実行できます.トリミングされた領域 高さと幅は 256 未満である必要があります。
class BpuResize{
public:
BpuResize(const BpuResize& other) = delete;
BpuResize& operator = (const BpuResize& other) = delete;
explicit BpuResize(const int input_w, const int input_h, const int output_w, const int output_h, const imageType imgType);
~BpuResize();
void copy_image_2_input_tensor(uint8_t *image_data,hbDNNTensor *tensor);
float *Resize(Mat ori_img, const std::initializer_list<int> crop);
int32_t prepare_input_tensor();
int32_t prepare_output_tensor();
//...
}
4. まとめ
このテストは、cpp トラバーサル プロセスを簡素化し、後続のボード テストのために特定の手順を省略します. 同時に、bpu のサイズ変更インターフェイスがテストされ、クロッピングとズームの機能がテストされます. 元の画像の場合is 1920*1080, resize 最終的な画像のサイズが 640*640 の場合、opencv のサイズ変更には 40+ms が必要ですが、bpu インターフェイスの時間は 25+ms しか必要としませんが、現在、小さな画像からズームインする場合、opencvのリサイズの方が速い、これが正常な現象かどうかはわかりません。