場景文字檢測與識別模型
OpenVINO2021.4支持場景文字檢測是基于MobileNetV2的PixelLink模型,模型有兩個分別是text-detection-0003與text-detection-0004。以text-detection-0003模型為例它有兩個輸出,分別是分割輸出與bounding Boxes輸出
下面是基于VGG16作為backbone實(shí)現(xiàn)的PixelLink的模型。
最終得到輸出text/notext的mask區(qū)域,對mask區(qū)域簡單處理之后就會得到每個場景文字區(qū)域的ROI。關(guān)于后處理,再后續(xù)的會有詳細(xì)代碼演示。OpenVINO2021.4不僅支持場景文字的檢測還支持場景文字的識別,支持場景文字識別的模型是基于VGG16+雙向LSTM,識別0~9與26個字符加空白,并且非大小寫敏感!
模型輸入與輸出格式
PixelLink場景文字檢測模型的輸入與輸出格式如下:
輸入格式:1x3x768x1280 BGR彩色圖像
輸出格式:
name: “model/link_logits_/add”, [1x16x192x320] – pixelLink的輸出
name: “model/segm_logits/add”, [1x2x192x320] – 像素分類text/no text
圖-3文本識別模型的輸入與輸出格式如下:
輸入格式:1x1x32x120
輸出格式:30, 1, 37
輸出解釋是基于CTC貪心解析方式。
其中37字符集長度,字符集為:
0123456789abcdefghijklmnopqrstuvwxyz#
#表示空白。
同步與異步推理
在OpenVINO的IE推理模塊相關(guān)SDK支持同步與異步推理模型,同步的意思是阻塞直到返回結(jié)果, 異步就是調(diào)用推理之后直接返回,接受到處理完成通知之后再解析輸出,相比同步方式,異步推理更加適合視頻流多路推理的方式。異步推理的執(zhí)行方式大致如下:
// start the async infer request (puts the request to the queue and immediately returns)
async_infer_request-》StartAsync();
// here you can continue execution on the host until results of the current request are really needed
//。。。
async_infer_request.Wait(IInferRequest::RESULT_READY);
auto output = async_infer_request.GetBlob(output_name);
場景文字檢測代碼演示
OpenVINO2021.4中場景文字檢測的,以text-detection-0003為例。加載模型文件與獲取推理請求等與之前的保持一致,無需再說,這里主要是PixelLink模型的輸出解析部分,它的解析部分代碼如下:
cv::Mat mask = cv::Size(out_w, out_h), CV_8U);
int step = out_h*out_w;
for (int row = 0; row 《 out_h; row++) {
for (int col = 0; col 《 out_w; col++) {
float p1 = detection_out[row*out_w + col];
float p2 = detection_out[step + row*out_w + col]; // text
if (p2》1.0) {
mask.at《uchar》(row, col) = 255;
}
}
}
cv::resize(mask, mask, cv::Size(im_w, im_h));
std::vector《std::vector《cv::Point》》 contours;
cv::findContours(mask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
對輸出的Mask數(shù)據(jù),完成text與非text的分類,得到二值圖象,然后對二值圖象完成輪廓發(fā)現(xiàn),根據(jù)輪廓發(fā)現(xiàn)的的結(jié)果輸出最大/最小外接矩形,得到每個Text區(qū)域的檢測結(jié)果,最終模型的運(yùn)行結(jié)果如下:
場景文字識別代碼演示
場景文字識別是基于場景文字檢測模型輸出得到的TEXT區(qū)域作為輸入,基于灰度圖象預(yù)測輸出,使用text-recognition-0012模型。關(guān)于模型加載、輸入與輸出設(shè)置同樣不再贅述,檢測得到TEXT的ROI作為輸入,推理與預(yù)測文字及顯示的代碼如下:
auto reco_output = reco_request.GetBlob(reco_output_name);
const float* blob_out = static_cast《PrecisionTrait《Precision::FP32》::value_type*》(reco_output-》buffer());
const SizeVector reco_dims = reco_output-》getTensorDesc().getDims();
const int RW = reco_dims[0];
const int RB = reco_dims[1];
const int RL = reco_dims[2];
std::string ocr_txt = ctc_decode(blob_out, RW, RL);
std::cout 《《 ocr_txt 《《 std::endl;
cv::putText(src, ocr_txt, box.tl(), cv::FONT_HERSHEY_PLAIN, 1.0, cv::Scalar(255, 0, 0), 1);
其中RWxRBxRL=30x1x37,CTC解析的函數(shù)ctc_decode實(shí)現(xiàn)代碼如下:
std::string ctc_decode(const float* blob_out, int seq_w, int seq_l) {
printf(“seq width: %d, seq length: %d ”, seq_w, seq_l);
std::string res = “”;
bool prev_pad = false;
const int num_classes = alphabet.length();
int seq_len = seq_w*seq_l;
for (int i = 0; i 《 seq_w; i++) {
int argmax = 0;
int max_prob = blob_out[i*seq_l];
for (int j = 0; j 《num_classes; j++) {
if (blob_out[i*seq_l + j] 》 max_prob) {
max_prob = blob_out[i*seq_l + j];
argmax = j;
}
}
auto symbol = alphabet[argmax];
if (symbol == ‘#’) {
prev_pad = true;
}
else {
if (res.empty() || prev_pad || (!res.empty() && symbol != res.back())) {
prev_pad = false;
res += symbol;
}
}
}
return res;
}
解析過程就是對得到二維矩陣30x37,按行先做argmax,然后再去掉重復(fù),最終得到預(yù)測生成的text文本返回。
總結(jié)
本文主要講述了OpenVINO2021.4版本中場景文字檢測與識別模型的推理使用,以及同步與異步推理的的基本概念。特別值得注意的是場景文字識別模型是基于灰度圖象不是RGB彩色圖象,如果搞錯這點(diǎn)就會得到錯誤的文本預(yù)測結(jié)果。
編輯:jq
-
RGB
+關(guān)注
關(guān)注
4文章
798瀏覽量
58394 -
識別
+關(guān)注
關(guān)注
3文章
173瀏覽量
31950 -
vgg
+關(guān)注
關(guān)注
1文章
11瀏覽量
5185 -
LSTM
+關(guān)注
關(guān)注
0文章
59瀏覽量
3738
原文標(biāo)題:OpenVINO? 場景文字識別與同步與異步推理
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論