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相关应用。