Open woshi91 opened 5 years ago
文档应该注明一下 D:\ocr\text-detection-ctpn\utils\bbox编译之后要自己从build文件夹拷贝出bbox.cp37-win_amd64.pyd和nms.cp37-win_amd64.pyd到bbox目录, 很多人不知道
Can you show me nms function in utils/bbox/nms.pyx?
# --------------------------------------------------------
# Fast R-CNN
# Copyright (c) 2015 Microsoft
# Licensed under The MIT License [see LICENSE for details]
# Written by Ross Girshick
# --------------------------------------------------------
import numpy as np
cimport numpy as np
cdef inline np.float32_t max(np.float32_t a, np.float32_t b):
return a if a >= b else b
cdef inline np.float32_t min(np.float32_t a, np.float32_t b):
return a if a <= b else b
def nms(np.ndarray[np.float32_t, ndim=2] dets, np.float thresh):
cdef np.ndarray[np.float32_t, ndim=1] x1 = dets[:, 0]
cdef np.ndarray[np.float32_t, ndim=1] y1 = dets[:, 1]
cdef np.ndarray[np.float32_t, ndim=1] x2 = dets[:, 2]
cdef np.ndarray[np.float32_t, ndim=1] y2 = dets[:, 3]
cdef np.ndarray[np.float32_t, ndim=1] scores = dets[:, 4]
cdef np.ndarray[np.float32_t, ndim=1] areas = (x2 - x1 + 1) * (y2 - y1 + 1)
cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1]
cdef int ndets = dets.shape[0]
cdef np.ndarray[np.int_t, ndim=1] suppressed = \
np.zeros((ndets), dtype=np.int)
# nominal indices
cdef int _i, _j
# sorted indices
cdef int i, j
# temp variables for box i's (the box currently under consideration)
cdef np.float32_t ix1, iy1, ix2, iy2, iarea
# variables for computing overlap with box j (lower scoring box)
cdef np.float32_t xx1, yy1, xx2, yy2
cdef np.float32_t w, h
cdef np.float32_t inter, ovr
keep = []
for _i in range(ndets):
i = order[_i]
if suppressed[i] == 1:
continue
keep.append(i)
ix1 = x1[i]
iy1 = y1[i]
ix2 = x2[i]
iy2 = y2[i]
iarea = areas[i]
for _j in range(_i + 1, ndets):
j = order[_j]
if suppressed[j] == 1:
continue
xx1 = max(ix1, x1[j])
yy1 = max(iy1, y1[j])
xx2 = min(ix2, x2[j])
yy2 = min(iy2, y2[j])
w = max(0.0, xx2 - xx1 + 1)
h = max(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (iarea + areas[j] - inter)
if ovr >= thresh:
suppressed[j] = 1
return keep
def nms_new(np.ndarray[np.float32_t, ndim=2] dets, np.float thresh):
cdef np.ndarray[np.float32_t, ndim=1] x1 = dets[:, 0]
cdef np.ndarray[np.float32_t, ndim=1] y1 = dets[:, 1]
cdef np.ndarray[np.float32_t, ndim=1] x2 = dets[:, 2]
cdef np.ndarray[np.float32_t, ndim=1] y2 = dets[:, 3]
cdef np.ndarray[np.float32_t, ndim=1] scores = dets[:, 4]
cdef np.ndarray[np.float32_t, ndim=1] areas = (x2 - x1 + 1) * (y2 - y1 + 1)
cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1]
cdef int ndets = dets.shape[0]
cdef np.ndarray[np.int_t, ndim=1] suppressed = \
np.zeros((ndets), dtype=np.int)
# nominal indices
cdef int _i, _j
# sorted indices
cdef int i, j
# temp variables for box i's (the box currently under consideration)
cdef np.float32_t ix1, iy1, ix2, iy2, iarea
# variables for computing overlap with box j (lower scoring box)
cdef np.float32_t xx1, yy1, xx2, yy2
cdef np.float32_t w, h
cdef np.float32_t inter, ovr
keep = []
for _i in range(ndets):
i = order[_i]
if suppressed[i] == 1:
continue
keep.append(i)
ix1 = x1[i]
iy1 = y1[i]
ix2 = x2[i]
iy2 = y2[i]
iarea = areas[i]
for _j in range(_i + 1, ndets):
j = order[_j]
if suppressed[j] == 1:
continue
xx1 = max(ix1, x1[j])
yy1 = max(iy1, y1[j])
xx2 = min(ix2, x2[j])
yy2 = min(iy2, y2[j])
w = max(0.0, xx2 - xx1 + 1)
h = max(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (iarea + areas[j] - inter)
ovr1 = inter / iarea
ovr2 = inter / areas[j]
if ovr >= thresh or ovr1 > 0.95 or ovr2 > 0.95:
suppressed[j] = 1
return keep
@hcnhatnam
我也遇到这个问题了: File "ctpn\lib\utils\cython_nms.pyx", line 25, in ctpn.lib.utils.cython_nms.nm s (cython_nms.c:1869) cdef np.ndarray[np.intp_t, ndim=1] order = scores.argsort()[::-1]
ValueError: Buffer dtype mismatch, expected 'int_t' but got 'long long' 环境 python37; window7 CPU vs2017
按照别人给的方案,把25行的np.int_t 修改为np.intp_t后问题依然存在。
不知楼主问题解决没有。
我也遇到这个问题了: File "ctpn\lib\utils\cython_nms.pyx", line 25, in ctpn.lib.utils.cython_nms.nm s (cython_nms.c:1869) cdef np.ndarray[np.intp_t, ndim=1] order = scores.argsort()[::-1]
ValueError: Buffer dtype mismatch, expected 'int_t' but got 'long long' 环境 python37; window7 CPU vs2017
按照别人给的方案,把25行的np.int_t 修改为np.intp_t后问题依然存在。
不知楼主问题解决没有。
I changed line 25 to the following:
cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1].astype('int32')
After making the change, I recompiled bbox/nms
按照你方法,把25行修改成如下: cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1].astype('int32') 问题解决了。 谢谢
ance gains if more memory were available. 2019-02-21 18:10:42.680200: W tensorflow/core/common_runtime/bfc_allocator.cc:21 1] Allocator (GPU_0_bfc) ran out of memory trying to allocate 1.60GiB. The calle r indicates that this is not a failure, but may mean that there could be perform ance gains if more memory were available. 2019-02-21 18:10:42.961200: W tensorflow/core/common_runtime/bfc_allocator.cc:21 1] Allocator (GPU_0_bfc) ran out of memory trying to allocate 2.14GiB. The calle r indicates that this is not a failure, but may mean that there could be perform ance gains if more memory were available. Traceback (most recent call last): File "./main/demo.py", line 121, in
tf.app.run()
File "C:\Users\x001\AppData\Local\Programs\Python\Python37\lib\site-pa
ckages\tensorflow\python\platform\app.py", line 125, in run
sys.exit(main(argv))
File "./main/demo.py", line 95, in main
textsegs, = proposal_layer(cls_prob_val, bbox_pred_val, im_info)
File "D:\ocr\text-detection-ctpn\utils\rpn_msr\proposal_layer.py", line 136, i
n proposal_layer
keep = nms(np.hstack((proposals, scores)), nms_thresh) # 进行nms操作,保留2
000个proposal
File "nms.pyx", line 25, in nms.nms
ValueError: Buffer dtype mismatch, expected 'int_t' but got 'long long'