eragonruan / text-detection-ctpn

text detection mainly based on ctpn model in tensorflow, id card detect, connectionist text proposal network
MIT License
3.43k stars 1.33k forks source link

刚clone按文档跑出错了ValueError: Buffer dtype mismatch, expected 'int_t' but got 'long long' #297

Open woshi91 opened 5 years ago

woshi91 commented 5 years ago

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'

woshi91 commented 5 years ago

文档应该注明一下 D:\ocr\text-detection-ctpn\utils\bbox编译之后要自己从build文件夹拷贝出bbox.cp37-win_amd64.pyd和nms.cp37-win_amd64.pyd到bbox目录, 很多人不知道

hcnhatnam commented 5 years ago

Can you show me nms function in utils/bbox/nms.pyx?

woshi91 commented 5 years ago
# --------------------------------------------------------
# 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

woshi91 commented 5 years ago

Should be a common problem Https://stackoverflow.com/questions/49477112/valueerror-buffer-dtype-mismatch-expected-int-t-but-got-long-long

woshi91 commented 5 years ago

https://github.com/eragonruan/text-detection-ctpn/issues/73

Glimpse-006 commented 5 years ago

我也遇到这个问题了: 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后问题依然存在。

不知楼主问题解决没有。

mrxiaohe commented 5 years ago

我也遇到这个问题了: 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

Glimpse-006 commented 5 years ago

按照你方法,把25行修改成如下: cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1].astype('int32') 问题解决了。 谢谢