[Rising Sun x3] ハンズオン bpu_rezie と簡略化された cpp コンパイル プロセス

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のリサイズの方が速い、これが正常な現象かどうかはわかりません。

おすすめ

転載: blog.csdn.net/weixin_42108183/article/details/128161886