gpt4 book ai didi

opencv - Golang 异步人脸检测

转载 作者:IT老高 更新时间:2023-10-28 13:07:02 27 4
gpt4 key购买 nike

我使用的是 OpenCV binding library for Go并尝试异步检测 10 个图像中的对象,但不断得到 this panic .只检测 4 张图像永远不会失败。

var wg sync.WaitGroup

for j := 0; j < 10; j++ {
wg.Add(1)
go func(i int) {
image := opencv.LoadImage(strconv.Itoa(i) + ".jpg")
defer image.Release()

faces := cascade.DetectObjects(image)
fmt.Println((len(faces) > 0))
wg.Done()
}(j)
}

wg.Wait()

我对 OpenCV 和 Go 还很陌生,并试图找出问题所在。我猜有些资源正在耗尽,但是是哪一个。

最佳答案

每次调用 DetectObjects 时,OpenCV 的底层实现都会构建一个分类器树并将它们存储在 cascade 中。您可以在 https://github.com/Itseez/opencv/blob/master/modules/objdetect/src/haar.cpp 看到对这些内存块的部分处理。 2002行

您的原始代码只有一个级联作为全局。每个新的 go 例程调用 DetectObjects 都使用相同的根级联。每个新图像都会释放旧内存并重建一棵新树,最终它们会踩踏彼此的内存使用并导致取消引用到 0,从而导致 panic 。

在 goroutine 中移动级联的分配会为每个 DetectObject 调用分配一个新的分配,并且它们不共享任何内存。

它从未发生在 4 个图像上,但在 5 个图像上失败是计算的本质。你很幸运有 4 张图片,但从未发现问题。您总是在 5 张图像上看到问题,因为每次都发生完全相同的事情(无论并发性如何)。

多次重复相同的图像不会导致级联树被重建。如果图像没有改变,为什么工作... OpenCV 中的优化以处理多个图像帧。

关于opencv - Golang 异步人脸检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25775650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com