VIM3 NPU-yolov3 控制图片接口和获得图片测试结果

我按照官方文档(如何转换并通过NPU调用自己的模型、如何运行NPU Demo)操作,成功实现了我训练的yolov3模型在VIM3板子上的运行。

但我现在需要控制图片接口(传输待测试的图片路径和保存测试后的图片),这样可以同时测试多张图片。此外,我还需要获得图片的测试结果(标签结果、置信度等)。若您看到这个帖子,还请及时回复,非常感谢!

@Jack_Xu 你现在有什么问题,源码也是开放的

在vim3 npu板子上实现 yolov3模型的运行,但官方教程只能测试一张图片(./detect_x11 2 1080p.bmp),而我实际中需要一次性测试多张图片,请问该如何做呢?

@Jack_Xu 你可以看一下源码,你要连续传入的图片的话,只要连续执行设置tensor的输入,然后运行得到tensor的输出.

请问具体是在哪个程序改呢?还请您告诉我,谢谢

@Jack_Xu

x11下使用opencv3的,是这个文件

1 Like

请问有详细的教程吗?我找到您说的main_cv3.cpp文件,但不知道在哪个地方修改,以及修改完成之后又该如何做?

如何修改源代码,使得进行yolov3测试时可以同时测试多张图片(目前只能测试单张图片:./detect_demo_x11_cv3 2 1080p.bmp),若有知道此问题解决办法的还请不吝告知,谢谢!

@Jack_Xu 没有,这个你要自己看一下,如果有详细的教程,demo就直接出出来了,你可以参考一下我们使用摄像头的demo,原理是一样的.就是在循环里面去调用

同时是不行的,只能一次测试一个图片.一次tensor的输入是不能混合输入的

我的疑问是:控制图片的输入路径和保存图片测试结果的路径是在哪个程序(哪个位置)?这样我就可以添加一个循环:循环输入待测试图片,就可以批量测试图片了

@Jack_Xu 图片是以opencv处理的.opencv3是使用cvLoadImage函数加载图片的,opencv4,我们是使用imread函数,我们没有保存图片,保存是imwrite,建议你还是去研究一下整个源码的过程,不是仅仅处理这两个地方就可以的.

那整个源码该从哪里开始研究呢?代码比较多,不知该如何看?

@Jack_Xu
这个是应用层的代码,主要是对图片做初步处理,传给模型,和从模型获取结果之后的显示部分


这里是yolov3处理的主要过程,包括模型的创建使用,前后处理部分

这是两者之间的桥梁部分,应用层处理完图片调用这个库,这个库去调用yolov3.最后模型返回的数据通过这个库传回给应用层

这是大致的流程了,其实就是一些opencv的处理,前后处理也是通用的方法,这些捏可以自己研究一下,整个流程并不复杂,只是我们集成了好几个模型,所以中间多了一层调用而已.

这是对这个仓库的说明

您好!我按照您昨天说的对aml_npu_app/sample_demo_x11/main_cv4.cpp进行修改,修改代码如下:

std::vectorcv::String image_files;
cv::glob(picture_path, image_files);
string image_save;
string save_file;
unsigned int frame;
for (frame=0; frame < image_files.size(); ++frame)
{
cv::Mat sourceFrame = cv::imread(image_files[frame],CV_LOAD_IMAGE_COLOR);
IplImage* frame2process;
frame2process = cvCreateImage(cvSize(sourceFrame.cols,sourceFrame.rows),8,3);
IplImage temp = cvIplImage(sourceFrame);
cvCopy(&temp,frame2process);
/--------------------------------------------------------------------------------------/
//cv::Mat testImage;
// IplImage* frame2process = cvLoadImage(picture_path,CV_LOAD_IMAGE_COLOR);
if (!frame2process) {
cout << "Picture : “<< image_files[frame] << " load fail” <<endl;
det_release_model(type);
return -1;
}
else {
cout << "Picture : “<< image_files[frame] << " load success” <<endl;
int pos = image_files[frame].find_last_of(‘\’);
String image_save(image_files[frame].substr(pos+1));
//cout << image_save << endl;
}

  cv::Mat testImage(nn_height,nn_width,CV_8UC1);

// cv::Mat sourceFrame = cvarrToMat(frame2process);

/--------------------------------------------------------------------------------------/

  cv::resize(sourceFrame, testImage, testImage.size());
  img_width = sourceFrame.cols;
  img_height = sourceFrame.rows;

  printf("img_width: %d, img_height: %d\n", img_width, img_height);

  input_image_t image;
  image.data		= testImage.data;
  image.width 	= testImage.cols;
  image.height 	= testImage.rows;
  image.channel 	= testImage.channels();
  image.pixel_format = PIX_FMT_RGB888;

  cout << "Det_set_input START" << endl;
  ret = det_set_input(image, type);
  if (ret) {
  	cout << "det_set_input fail. ret=" << ret << endl;
  	det_release_model(type);
  	return ret;
  }
  cout << "Det_set_input END" << endl;

  cout << "Det_get_result START" << endl;
  ret = det_get_result(&resultData, type);
  if (ret) {
  	cout << "det_get_result fail. ret=" << ret << endl;
  	det_release_model(type);
  	return ret;
  }
  cout << "Det_get_result END" << endl;

  draw_results(frame2process, resultData, img_width, img_height, type);
  save_file = picture_path + '\\results\\' + image_save;
  cv::imwrite(save_file, sourceFrame);
  //cv::imwrite("output.bmp", sourceFrame);

  det_release_model(type);
  cvReleaseImage(&frame2process);

}

return ret;
}

然后运行./build_vx_cv4.sh /home/hngs/aml_npu_sdk_6.4.3/linux_sdk/linux_sdk_6.4.3进行编译,在编译过程中产生了一些错误但都被我解决,最后虽然不报错了但仍是编译失败,请问这个问题如何解决呢?

main_cv4.cpp:284:30: warning: character constant too long for its type
284 | save_file = picture_path + ‘\results\’ + image_save;
| ^~~~~~~~~~~~~
main_cv4.cpp: In function ‘void crop_face(cv::Mat, cv::Mat&, DetectResult, int, int)’:
main_cv4.cpp:159:9: warning: unused variable ‘font’ [-Wunused-variable]
159 | CvFont font;
| ^~~~
main_cv4.cpp: In function ‘int init_fb()’:
main_cv4.cpp:481:11: warning: unused variable ‘i’ [-Wunused-variable]
481 | long int i;
| ^
main_cv4.cpp: At global scope:
main_cv4.cpp:479:12: warning: ‘int init_fb()’ defined but not used [-Wunused-function]
479 | static int init_fb(void)
| ^~~~~~~
LINK detect_demo
/home/hngs/aml_npu_sdk_6.4.3/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/…/lib/gcc/aarch64-none-linux-gnu/9.2.1/…/…/…/…/aarch64-none-linux-gnu/bin/ld: cannot find -lnn_detect
collect2: error: ld returned 1 exit status
/home/hngs/aml_npu_sdk_6.4.3/linux_sdk/linux_sdk_6.4.3/common.target:64: recipe for target ‘bin_r_cv4/detect_demo’ failed
make: *** [bin_r_cv4/detect_demo] Error 1

error

@Jack_Xu

$ cd aml_npu_app/detect_library/source_code

先编译这个目录,就会生成libnn_detect.so,然后不需要移动也不需要做任何修改,重新回到你刚才的代码目录,重新编译

我按照您说的编译成功了,随后执行./build_vx.sh /home/hngs/aml_npu_sdk_6.4.3/linux_sdk/linux_sdk_6.4.3,生成了libnn_yolo_v3.so并拷贝至板子的detect_demo_picture/lib中(yolov3_88.nb没有变化所以我就没替换),之后我执行sudo ./UNINSTALL,再执行./INSTALL操作,再执行./detect_demo_x11_cv4 2 ./sewage_outlet_jpg/(sewage_outlet_jpg是我存放图片的文件夹),但是保错:
./detect_demo_x11_cv4: error while loading shared libraries: libopencv_imgproc.so.4.2:cannot open shared object file: No such file or directory.
请问是什么原因呢?如何解决呢?

@Jack_Xu 你里用opencv4的demo,板子上安装了么opencv4了么?

请问是使用什么命令在vim3板子上安装opencv4呢?我没有在文档上找到板子安装库/包的命令呢

@Jack_Xu ,板子上默认是安装了opencv3的,要先卸载,卸载方法

$ sudo apt remove opencv3

至于安装opencv4方法是通用的,你可以百度或者谷歌一下,如何在Ubuntu20.04上面安装opencv4.