FastDeploy icon indicating copy to clipboard operation
FastDeploy copied to clipboard

c_api的接口相关

Open oldma3095 opened this issue 3 years ago • 7 comments

环境

  • 【FastDeploy版本】: 说明具体的版本,如fastdeploy-linux-gpu-0.8.0
  • 【系统平台】: Linux x64(Ubuntu 20.04.1)
  • 【编译语言】: C++ / golang(1.19)

问题日志及出现问题的操作流程

使用FD_C_Imread正常读取图片文件,是没问题的。 现在使用的时候,通过其他方式抽取了视频帧,只能先创建一个文件,通过FD_C_Imread来返回FD_C_Mat进行预测。 希望可以提供一个api,通过图片数组、[]byte、指针地址或者其他方式,创建FD_C_Mat使用。

在实际使用的时候,经常会有模型堆叠的问题,希望提供一个api,通过score_threshold,来过滤结果数据。

oldma3095 avatar Mar 02 '23 10:03 oldma3095

你好,收到您的反馈。这边希望能够更具体的了解您的使用场景和希望增加的接口类型,请问是纯C工程吗,还是在其它的语言里来调用C接口而已。 我理解是希望提供一个C API,能够不从文件中读图片,而是以其它方式直接从内存中将一组图片以FD_C_Mat数组形式返回。

rainyfly avatar Mar 03 '23 09:03 rainyfly

你好,收到您的反馈。这边希望能够更具体的了解您的使用场景和希望增加的接口类型,请问是纯C工程吗,还是在其它的语言里来调用C接口而已。 我理解是希望提供一个C API,能够不从文件中读图片,而是以其它方式直接从内存中将一组图片以FD_C_Mat数组形式返回。

使用的cgo调用C API,进行视频抽帧后无法通过其他方式创建FD_C_Mat,目前只能把帧写成一个图片文件,然后通过这个文件地址读取返回FD_C_Mat。 希望可以通过其他方式来直接转换成FD_C_Mat格式,避免一次写读文件操作。

oldma3095 avatar Mar 03 '23 17:03 oldma3095

如果可以的话,也希望result支持nms重叠区域过滤,这个也是目标检测经常会使用到的业务场景。

oldma3095 avatar Mar 03 '23 17:03 oldma3095

Hi, 不知道你有没有注意到我们的FD_C_Mat 其实在C语言里使用void* 表示的,理论上你用任何高级语言只要绑定了OpenCV的,都可以直接把OpenCV的Mat指针直接当做FD_C_Mat放进去用,我们每个用到了FD_C_Mat的函数,内部其实都是把这个void*给转换成了cv::Mat来使用。所以,如果你在Go里面已经使用OpenCV读取了某个图像,你可以把这个Mat的指针直接当做FD_C_Mat的类型给放到C接口里面去使用的。我看了一下,好像Go语言确实也有绑定了OpenCV的package可以使用。 比如以下是我们C#中实现的某个Predict函数

  public DetectionResult Predict(Mat img) {
    FD_DetectionResult fd_detection_result = new FD_DetectionResult();
    if(! FD_C_PPYOLOEWrapperPredict(fd_ppyoloe_wrapper, img.CvPtr,
                               ref fd_detection_result))
    {
      return null;
    } // predict
    
    DetectionResult detection_result =
        ConvertResult.ConvertCResultToDetectionResult(fd_detection_result);
    FD_C_DestroyDetectionResult(ref fd_detection_result);
    return detection_result;
  }

其中FD_C_PPYOLOEWrapperPredict就是我们的C函数接口,就像用Go直接调这个C函数接口一样,第二个参数就是FD_C_Mat, 这里我们就是直接通过C#里使用的OpenCV Mat直接把对应的指针放进去就行。并不用把图片先保存起来,再用我们提供的FD_C_Imread接口去读来得到FD_C_Mat。这个接口唯一的作用是为了给那些纯C语言的项目,要是没有函数读图片的话,可以用这个C接口去读图片

rainyfly avatar Mar 08 '23 09:03 rainyfly

另外,我这里还想问一下关于'希望result支持nms重叠区域过滤,这个也是目标检测经常会使用到的业务场景'的这个需求,你们调用完我们的Predict函数获得推理结果后,在Go语言里是直接访问C的这个FD_C_DetectionResult进行使用么。我觉得比较合适的做法是,把FD_C_DetectionResult这个结构里的结果数据,转移到Go语言里你们自己定义的或者是某些CV库定义的结构中进行表示,然后用对应的库来对结果进行进一步的后处理等操作。当然,我们也可以封装以下FastDeploy里的后处理函数成C接口提供使用,但是这样的话,所有函数的处理结果一直都只能用C语言里的结构进行表示,比如nms筛选后的结果,依然还是用FD_C_DetectionResult里表示着,用Go语言来访问这个C语言的结构应该不是很方便的。因此,这边建议还是把结果先转移到Go语言里表示,然后做后处理啥的。当然,如果Go语言需求大的话,我们后续会考虑提供Go语言的SDK,采用Go语言封装好所有接口,像我们C# SDK那样,使得用户不需要自己来调用底层的C接口。

rainyfly avatar Mar 08 '23 09:03 rainyfly

好的,多谢。 这边公司的很多检测和识别的项目,都准备使用fastdeploy来做,公司也基本以golang作为主力语言,希望可以出一个go语言的SDK,这样封装后也更方便使用。

展示一个使用gocv的代码,方便其他人参考使用:

mat := gocv.IMRead(filename, gocv.IMReadAnyColor)
FD_C_Mat := C.FD_C_Mat(unsafe.Pointer(mat.Ptr()))

oldma3095 avatar Mar 09 '23 01:03 oldma3095

好的,多谢。 这边公司的很多检测和识别的项目,都准备使用fastdeploy来做,公司也基本以golang作为主力语言,希望可以出一个go语言的SDK,这样封装后也更方便使用。

展示一个使用gocv的代码,方便其他人参考使用:

mat := gocv.IMRead(filename, gocv.IMReadAnyColor)
FD_C_Mat := C.FD_C_Mat(unsafe.Pointer(mat.Ptr()))

用golang怎么调用 capi呢?能利用上 gpu么

cumthxy avatar Apr 15 '24 11:04 cumthxy