Segmentation fault: 11 python mtcnn

本文介绍了一种解决mtcnn在Python3环境下运行时出现Segmentation fault:11错误的方法。该问题源于mtcnn的第一阶段预测过程中使用了多特征图并行运算,导致opencv在多任务执行时发生死锁。文章提供了详细的解决方案,包括修改多进程为顺序执行的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Segmentation fault: 11

在使用python3 运行mtcnn的时候一直出现Segmentation fault: 11的问题。或者说运行过程中,程序停止运行。如下图所示:
这里写图片描述
或者
这里写图片描述
分析原因是因为在mtcnn做第一阶段预测的时候使用了多个特征图进行并行运算,这些进程可能会同时使用opencv,而opencv虽然支持多任务同时执行,但都是共享同一块数据。所以会出现死锁的问题。
类似的问题都可以归结为opencv多任务并行计算出现死锁的问题。解决办法就是找到死锁的位置,然后使用以下方法之一就可以解决:

  • 使用cv2.setNumThreads(0) 设置opencv不使用多进程运行,但这句命令只在本作用域有效。

  • 将所有的多进程都关闭,使用顺序执行。

而对于mtcnn的源码来讲,可以将 mtcnn_detector.py内的detect_face函数中的

for batch in sliced_index:
            local_boxes = self.Pool.map( detect_first_stage_warpper, \
                    zip(repeat(img), self.PNets[:len(batch)], [scales[i] for i in batch], repeat(self.threshold[0])) )
            total_boxes.extend(local_boxes)

改为:

        for batch in sliced_index:
            for i in batch:
                local_boxes=detect_first_stage_warpper((img,self.PNets[i%4],scales[i],self.threshold[0]))
                if local_boxes is None:
                    continue
                total_boxes.extend(local_boxes)

即可正常运行。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值