Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug:输入图像没有参数可以限制其最大和最小尺寸 #265

Open
SWHL opened this issue Nov 22, 2024 · 2 comments
Open

Bug:输入图像没有参数可以限制其最大和最小尺寸 #265

SWHL opened this issue Nov 22, 2024 · 2 comments
Assignees

Comments

@SWHL
Copy link
Member

SWHL commented Nov 22, 2024

设定最小尺寸和最大尺寸。如果超出,则直接返回,避免OOM。这一点是从CnOCR项目源码中看到的。

if min(img.shape[0], img.shape[1]) < 2:
    return []

当前代码中并没有此类限制。

  • min_height参数是用来决定图像进入检测前是否padding。
  • min_side_lenmax_side_len:用来缩放图像使用。最大边超出尺寸,则拉到minmax尺寸
  • width_height_ratio: 只计算了宽高比,同样用来决定文本检测是否padding的。只限制很宽的图像类型。缺少了限制很长的类型。
@SWHL SWHL self-assigned this Nov 22, 2024
@SWHL
Copy link
Member Author

SWHL commented Dec 13, 2024

这一点需要仔细debug一下,因为在rapidocr_onnxruntime>=1.4.3在det中引入了以下代码:

def get_preprocess(self, max_wh):
if self.limit_type == 'min':
limit_side_len = self.limit_side_len
elif max_wh < 960:
limit_side_len = 960
elif max_wh < 1500:
limit_side_len = 1500
else:
limit_side_len = 2000
return DetPreProcess(limit_side_len, self.limit_type)

原有逻辑是:

def preprocess(self, img: np.ndarray) -> Tuple[np.ndarray, float, float]:
h, w = img.shape[:2]
max_value = max(h, w)
ratio_h = ratio_w = 1.0
if max_value > self.max_side_len:
img, ratio_h, ratio_w = reduce_max_side(img, self.max_side_len)
h, w = img.shape[:2]
min_value = min(h, w)
if min_value < self.min_side_len:
img, ratio_h, ratio_w = increase_min_side(img, self.min_side_len)
return img, ratio_h, ratio_w

两者关系如何,是否可以合并?需要具体探讨,来确定进一步修改方向。

@SWHL SWHL added this to RapidOCR Dec 13, 2024
@SWHL SWHL moved this to Todo in RapidOCR Dec 13, 2024
@nzm001
Copy link

nzm001 commented Jan 14, 2025

如果考虑内存问题,例如1920x1080的RGB未压缩为6MB。

那么设置为det_limit_type=max其实只无脑缩小图片即可,不需要其他处理。因其最大不超过max x max(例如4000x4000),使用时只需要自己清楚就可以。上面的代码强制最大为limit_side_len = 2000其实挺反直觉的,限制长边小于某个值意味着图片只会变小,我认为不须要再多做处理。

反而当设置为det_limit_type=min时才须要考虑。如果不希望一张图片超出100MB,那么这个时候须要计算出放大后的图片大小。如果超出限制,则限制这次放大,即使违反det_limit_side_len=736,即图片短边可以小于736。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: Todo
Development

No branches or pull requests

2 participants