Vitis AI Library体验之OCR识别

描述

OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。衡量一个OCR系统性能好坏的主要指标有:拒识率、误识率、识别速度、用户界面的友好性,产品的稳定性,易用性及可行性等。

一、Vitis AI Library

Vitis AI Library是一组高层次库和 API,专为利用 DPU 高效执行 AI 推断而构建。它是基于 Vitis AI运行时利用 Vitis运行时统一 API 来构建的,能够为 XRT 提供完整支持。

Vitis AI Library 通过封装诸多高效且高质量的神经网络,提供易用且统一的接口。由此可简化深度学习神经网络的使用,对于不具备深度学习或 FPGA 知识的用户也是如此。Vitis AI Library 使开发者能够专注于开发自己的应用,而不是底层硬件。
 

神经网络

二、实现

相较于Vitis AI Runtime,Vitis AI Library 有很多已经封装好的神经网络接口,直接拿来用即可。

OCR识别基于Vitis AI Library 的ocr_pt模型,OCR识别的代码如下:

#include < glog/logging.h >

#include < iostream >
#include < memory >
#include < opencv2/core.hpp >
#include < opencv2/highgui.hpp >
#include < opencv2/imgproc.hpp >
#include < vitis/ai/ocr.hpp >
#include < vitis/ai/demo.hpp >

#include "./process_result.hpp"

int main(int argc, char* argv[]) {
  std::string model = argv[1];
  return vitis::ai::main_for_jpeg_demo(
      argc, argv,
      [model] {
        return vitis::ai::OCR::create(model);
      },
      process_result, 2);
}

主要使用Vitis AI Library 的OCR功能(lvitis_ai_library-ocr),具体文字实现的代码:

#include < sys/stat.h >

#include < iostream >
#include < opencv2/core.hpp >
#include < opencv2/highgui.hpp >
#include < opencv2/imgproc.hpp >
#include < vector >

#include "vitis/ai/ocr.hpp"

using namespace cv;
using namespace std;

Scalar colors[] = { Scalar(255, 0, 0), Scalar(0, 255, 0), Scalar(255, 255, 0), Scalar(0, 0, 255) };

static cv::Mat process_result( cv::Mat &img,
           const vitis::ai::OCRResult &result, bool is_jpeg) {

   for(unsigned int i=0; i< result.words.size(); i++) {
      std::string str;
      for(auto& it: result.box[i]) {
         str+= std::to_string(it.x)+","+std::to_string(it.y)+",";
      }
      str+=result.words[i];
      std::cout < < str < <"\n";

      cv::polylines(img, result.box[i], true, cv::Scalar(0, 0, 255), 2 );
      cv::putText(img,
                  result.words[i],
                  cv::Point(result.box[i][0].x+1, result.box[i][0].y+1 ),
                  cv::FONT_HERSHEY_SIMPLEX, 0.5,
                  cv::Scalar(0,0,0), 1);
      cv::putText(img,
                  result.words[i],
                  cv::Point(result.box[i][0].x, result.box[i][0].y),
                  cv::FONT_HERSHEY_SIMPLEX, 0.5,
                  cv::Scalar(0,255,255), 1);
   }
   return img;
}

代码中可以看出,直接使用了openCV的功能。

三、编译&运行

build.sh文件内容如下:

result=0 && pkg-config --list-all | grep opencv4 && result=1
if [ $result -eq 1 ]; then
        OPENCV_FLAGS=$(pkg-config --cflags --libs-only-L opencv4)
else
        OPENCV_FLAGS=$(pkg-config --cflags --libs-only-L opencv)
fi

CXX=${CXX:-g++}
for file in $(ls *.cpp); do
        filename=${file%.*}
        $CXX -std=c++17 -O2 -I. -o ${filename} ${file} -lvitis_ai_library-ocr -lvitis_ai_library-dpu_task -lvitis_ai_library-xnnpp -lvitis_ai_library-model_config -lvitis_ai_library-math -lvart-util -lxir -pthread -ljson-c -lglog ${OPENCV_FLAGS} -lopencv_core -lopencv_videoio -lopencv_imgproc -lopencv_imgcodecs -lopencv_highgui
done

执行sh build.sh生成可执行文件。待测试的图片如下:

 

执行OCR识别后的结果如下:
 

神经网络

总体情况识别速度很快,内容识别无误,不知道啥情况中间的“OF”不见了。
可以看出,Vitis AI Library 使开发者能够专注于开发自己的应用,而不是底层硬件,快速部署AI相关应用。
 

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分