1. 程式人生 > >Segmentation fault: 11 python mtcnn

Segmentation fault: 11 python mtcnn

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)

即可正常執行。