[Rising Sun x3] Práctico bpu_rezie y proceso simplificado de compilación de cpp

1. Introducción

En el manual del desarrollador x3, la operación de usar bpu para cambiar el tamaño se probó en la placa, y se comparó la diferencia de tiempo entre bpu-resize y opencv-resize, y el área recortada también se puede ampliar mientras se recorta. Y se ha compilado antes en el entorno docker, lo cual es un poco problemático, y la compilación cpp solo depende de la herramienta de compilación cruzada y los archivos dependientes, y la herramienta de compilación cruzada es /opt/gcc-ubuntu-9.3.0- 2020.03-x86_64- en docker En aarch64-linux-gnu, cópielo en el host y luego puede compilarlo sin depender de docker.Si hay un problema con la compilación, también puede obtener el archivo de dependencia completo y el código fuente de el enlace de la nube de Baidu en este artículo.
El código de prueba de este artículo: https://github.com/Rex-LK/ai_arm_learning
Baidu cloud completa los archivos de dependencia y el código fuente: https://pan.baidu.com/s/1x34kaRseh8YXMJ-vmFhxEg?pwd=c6cn Código de extracción :c6cn
damos la bienvenida a los estudiantes de CV que están estudiando o quieren aprender, únanse al grupo para discutir y estudiar juntos, v: Rex1586662742, q grupo: 468713665

2. Simplifique el entorno de compilación de cpp

La ruta de la herramienta de compilación cruzada de exportación en esta máquina

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     ## ....为实际路径

Si no usa la herramienta de compilación cruzada, es decir, comente # SET (tar x3), aparecerá cuando el host ejecute yolo_demo

./yolo_demo: error while loading shared libraries: libhbdk_sim_x86.so: cannot open shared object file: No such file or directory

La ruta de la biblioteca correspondiente a la misma exportación se puede

export LD_LIBRARY_PATH=..../ai_arm_learning/x3/data/deps/x86/dnn_x86/lib   ## ....为实际路径

Con el proceso anterior, puede realizar compilaciones cruzadas sin depender de la ventana acoplable. Comencemos con el tema de este artículo.

3. Use bpu para cambiar el tamaño

En x3_inference/sample/resize_demo.cpp, se implementan los métodos de cambio de tamaño de tres formatos de imagen diferentes, yuv420, rgb, bgr, y la interfaz API final llamada es 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);
    }

Realice el archivo de encabezado bpu_resize.hpp de bpu-resize. Escalar el área recortada es beneficioso para predecir el modelo posterior. Por supuesto, este paso se puede realizar utilizando la interfaz oficial de roiInfer, pero roiInfer tiene algunas restricciones, como el tamaño del área recortada La altura y el ancho deben ser inferiores a 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. Resumen

Esta prueba simplifica el proceso transversal de cpp y omite ciertos pasos para la prueba de placa posterior. Al mismo tiempo, se prueba la interfaz de cambio de tamaño de la bpu y se prueba la función de recorte y zoom. Se encuentra que si la imagen original es 1920*1080, cambiar el tamaño Cuando el tamaño de la imagen final es 640*640, el cambio de tamaño de opencv necesita más de 40 ms, mientras que el tiempo de la interfaz bpu solo necesita más de 25 ms, pero en la actualidad, al hacer zoom desde la imagen pequeña , el cambio de tamaño de opencv es más rápido, no sé si esto es un fenómeno normal.

Supongo que te gusta

Origin blog.csdn.net/weixin_42108183/article/details/128161886
Recomendado
Clasificación