[英]tesseract multithreading c#
我有一個 tesseract 的代碼可以在 1 個實例中運行我如何並行化代碼以便它可以在四核處理器或 8 核處理器系統中運行。這是我的代碼塊。提前致謝。
using (TesseractEngine engine = new TesseractEngine(@"./tessdata", "tel+tel1", EngineMode.Default))
{
foreach (string ab in files)
{
using (var pages = Pix.LoadFromFile(ab))
{
using (Tesseract.Page page = engine.Process(pages,Tesseract.PageSegMode.SingleBlock))
{
string text = page.GetText();
OCRedText.Append(text);
}
}
}
並行運行此代碼的最簡單方法是使用PLINQ 。 在枚舉上調用AsParallel()將自動在所有可用CPU內核上同時運行緊隨其后的查詢( .Select(...) )。
僅並行運行線程安全代碼至關重要。 假設TesseractEngine和Pix.LoadFromFile()是線程安全的(正如您在評論中建議的那樣,我自己沒有對其進行驗證),則唯一有問題的部分可能是OCRedText.Append() 。 從代碼尚不清楚OCRedText是什么,因此我假設它是StringBuilder或List,因此它不是線程安全的。 因此,我從將要並行運行的代碼中刪除了這部分,然后稍后在單線程中對其進行處理-由於方法.Append()可能運行速度很快,因此這不會對整體性能產生重大不利影響。
using (TesseractEngine engine = new TesseractEngine(@"./tessdata", "tel+tel1", EngineMode.Default))
{
var texts = files.AsParallel().Select(ab =>
{
using (var pages = Pix.LoadFromFile(ab))
{
using (Tesseract.Page page = engine.Process(pages, eract.PageSegMode.SingleBlock))
{
return page.GetText();
}
}
});
foreach (string text in texts)
{
OCRedText.Append(text);
}
}
這對我有用:
static IEnumerable<string> Ocr(string directory, string sep)
=> Directory.GetFiles(directory, sep)
.AsParallel()
.Select(x =>
{
using var engine = new TesseractEngine(@"D:\source\repos\WPF\OcrTest\tessdata\", "deu", EngineMode.Default);
using var img = Pix.LoadFromFile(x);
using var page = engine.Process(img);
return page.GetText();
}).ToList();
我不是並行化問題的專家,但是這個 function ocr 在 12 秒內完成了 8 個 Tiff。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.