benjaminwan / OcrLiteNcnn

chineseocr lite onnx to ncnn,超轻量级中文ocr demo,支持ncnn推理 ( dbnet+crnn+anglenet)
https://github.com/ouyanghuiyu/chineseocr_lite
49 stars 15 forks source link

请问这个能实时么 #2

Closed YJLCV closed 3 years ago

benjaminwan commented 3 years ago

先定义实时识别耗时来作为沟通的基准

先查下网络音视频传输的延时多少来作为参考 有的说300ms,也有的说500ms https://cloud.tencent.com/developer/ask/239992 https://www.jianshu.com/p/e660071bdafa 应该是没有统一的标准,延时当然是越低越好。

假设就以300ms延时作为合格门槛吧

  1. 识别的耗时跟硬件性能关系很大,这里以麒麟970为例。
  2. 识别640x640的图像,cpu耗时790ms,GPU+CPU耗时455ms,达不到实时识别的门槛,但已经很接近,具体测试数据在这里:https://github.com/DayBreak-u/chineseocr_lite/tree/onnx/android_projects
  3. 识别更小的图像,或更简单的图像,比如把摄像头的识别区域裁剪到300x300,这样就应该能实现耗时控制在300ms以内
  4. 可以装个android demo,用里面的IMEI识别场景试一把。
YJLCV commented 3 years ago

好的感谢您的回复!想请教下关于算法的问题。看到项目用(DBNet+AngleNet+CRNN),然后DBNet用于文本检测,CRNN是文本的识别,那请问加入AngleNet的目的是什么?貌似没有找到anglenet的论文出处,有AngleNet具体的网络结构图么?感谢回复

benjaminwan commented 3 years ago

AngleNet是分类网络,识别文字是正的或倒的。

YJLCV commented 3 years ago

@benjaminwan 您好,请问图片的输入有参数能改变么?是模型的输入定死了大小,还是我能将输入图片的size写成300×300,或者500×500之类的

benjaminwan commented 3 years ago

ncnn模型来自于onnx模型,用netron打开onnx模型可以查看,3个模型不一样。 dbnet模型的长宽是任意尺寸。 angle模型是32x192。 crnn模型是32x任意。

benjaminwan commented 3 years ago

图片的输入尺寸不能小于32x32,在这之上可以任意大小。

YJLCV commented 3 years ago

@benjaminwan 实在是太感谢您的每个回复了!想问下上述您说的图片的输入尺寸参数在哪修改?我还在看您的代码还没研究透。我想设置小一点,因为现在识别速度较慢且我的图片简单,我想把摄像头的识别区域裁剪到300x300或者更小,然后看看速度

benjaminwan commented 3 years ago

maxSideLen 按最长边缩放,此值为0代表不缩放,例:1024,如果图片长边大于1024则把图像整体缩小到1024再进行图像分割计算,如果图片长边小于1024则不缩放,如果图片长边小于32,则缩放到32。

YJLCV commented 3 years ago

@benjaminwan 嗯嗯,界面上拉到maxSideLen=150,然后就识别一个大大的字速度很快。看了代码还想问问您剩下的几个参数的含义,文字有点多我发到您邮箱了

benjaminwan commented 3 years ago

在这个项目的readme里有参数说明。 https://github.com/benjaminwan/OcrLiteNcnn#输入参数说明

YJLCV commented 3 years ago

嗯嗯参数已经理解了。请问怎么修改才能达到调用摄像头实时ocr呢?具体来说就是想修改或者添加您的代码,然后把相机识别改成不用拍就能识别,就直接点开相机识别就实时识别(实时不是说速度要实时,哪怕多慢都没关系,就是想改成摄像头指哪就识别哪,不需要按下拍照才能识别

benjaminwan commented 3 years ago

pc端的话,opencv的video模块本身就支持获取视频或摄像头的帧图像,帧图像可以直接转成cv::Mat再识别。 移动端的话,android有摄像头的sdk或者opencv的video模块,大概流程也是获取帧图像,转成bitmap给opencv处理再识别,ios不熟悉。 我实际没有开发过,但总体思路是这样吧。

YJLCV commented 3 years ago

@benjaminwan 嗯嗯,那又比如说在移动端的安卓下,想把相机识别修改或者添加成读取一段离线视频,然后对离线视频进行OCR呢?就不需要实时摄像头了,只要能导入一段视频,然后识别这段视频就行

benjaminwan commented 3 years ago

android 从视频文件取bitmap,百度一下不难,这类的文章很多,也有各种现成的demo,代码就几行,就不一一列举了。 https://blog.csdn.net/qq_25412055/article/details/79094919 https://blog.csdn.net/zyldzs27/article/details/75125211

取得bitmap img之后调用ocrEngine.detect就行了。

YJLCV commented 3 years ago

@benjaminwan 感谢感谢,我先从您给的链接学习学习

benjaminwan commented 3 years ago

tnn的demo也已经实现了实时效果 https://github.com/Tencent/TNN/blob/master/doc/cn/user/demo.md