This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Thursday, 12 February 2026
Siihen Osa 1 Näytin raakaputken:mallit laaditaan käsin,tokenointi kirjoitetaanM SK2 ONNX-tuloksen sijoittamiseenMSC3 ja BIO-merkintöjä dekodioidaan käsillä.
Nyt se on NuGet-paketti, ' ja . Yksi yhteys setup, nollamallin laatimiseen - kaikki automaattisesti -palauttaa ensimmäisessä käytössäM SK2
Huomautus: Tämä paketti on yksinkertaistettu, keskittynyt väline tekstien ja elinten extrahointiin kuvista. mikä tahansa ( valokuvat, , asiakirjat,, screenshots,, käännökset,M SK4 animaatioGIFit ja jopa videot, ilmeinenRAG where the production-grade version of this pipeline lives
Ennen kuin aiomme ottaa kantaa siihen, mitä tärkeimmät termet tarkoittavat
.onnx faili, paikallisesti, käyttäen vain CPU:tänne .Tesseract on vahva puhdasta asiakirjatekstiä varten,, mutta se laskee melua aiheuttaviin valoihin, alhainenM SK2 kontrastiskannerit , ja sekoitettu MSC4 näyttämö | + teksti |" kuvat |
Tämä paketti poistaa nämä puutteet
AddOcrNer() ja te olette päässeetflowchart LR
subgraph Part1["Part 1: Manual"]
M1[Download models]
M2[Write tokenizer]
M3[Wire ONNX]
M4[BIO decode]
end
subgraph Part2["Part 2: NuGet Package"]
N1["AddOcrNer()"]
N2[Auto-download]
N3[ImageSharp + OpenCV]
N4[Florence-2]
N5[Recognizers]
N6[CLI Tool]
end
Part1 -->|"packaged into"| Part2
style N1 stroke:#090,stroke-width:3px
style N2 stroke:#090,stroke-width:3px
style N3 stroke:#f60,stroke-width:3px
style N4 stroke:#f60,stroke-width:3px
style N5 stroke:#f60,stroke-width:3px
style N6 stroke:#f60,stroke-width:3px
Osa 1 oli koulutusta, osa - ymmärtää, mitä kukin osa tekee, osa
dotnet add package Mostlylucid.OcrNer
Euroopan unionin AddOcrNer() laajentumismenetelmä rekisteröi kaiken: OCRM SK1 NER , yhdistetty putkilinja, FirenzeMSC4 näkemys,, mallin lataaja,, ja kuvapreprocessori,M SK7 kaikki yksitonin muodossa
Tässä on todellinen rekisteröintikoodi ' ServiceCollectionExtensions.cs:
// Option 1: From appsettings.json (reads the "OcrNer" section)
builder.Services.AddOcrNer(builder.Configuration);
// Option 2: Inline configuration
builder.Services.AddOcrNer(config =>
{
config.EnableOcr = true;
config.TesseractLanguage = "eng";
config.MinConfidence = 0.5f;
});
Se' se. Mitään mallia ei voida ladata , ei tiedostoja, , ei ONNX-yhteyksiä,. Kapteen alla AddOcrNer() rekisteröi nämä palvelut:
// From ServiceCollectionExtensions.cs - what gets registered
services.AddSingleton<ModelDownloader>(); // Auto-downloads models on first use
services.AddSingleton<ImagePreprocessor>(); // ImageSharp-based image enhancement
services.AddSingleton<OpenCvPreprocessor>(); // OpenCV advanced preprocessing
services.AddSingleton<INerService, NerService>(); // BERT NER from text
services.AddSingleton<IOcrService, OcrService>(); // Tesseract OCR from images
services.AddSingleton<IOcrNerPipeline, OcrNerPipeline>(); // Combined OCR + NER
services.AddSingleton<ITextRecognizerService, TextRecognizerService>(); // Microsoft.Recognizers
services.AddSingleton<IVisionService, VisionService>(); // Florence-2 vision
{
"OcrNer": {
"EnableOcr": true,
"TesseractLanguage": "eng",
"MinConfidence": 0.5,
"MaxSequenceLength": 512,
"ModelDirectory": "models/ocrner",
"Preprocessing": "Default",
"EnableAdvancedPreprocessing": false,
"EnableRecognizers": false,
"RecognizerCulture": "en-us"
}
}
Tässä on todellinen OcrNerConfig luokitellaan nämä kartat :
// From OcrNerConfig.cs
public class OcrNerConfig
{
public string ModelDirectory { get; set; } =
Path.Combine(AppContext.BaseDirectory, "models", "ocrner");
public bool EnableOcr { get; set; } = true;
public string TesseractLanguage { get; set; } = "eng";
public int MaxSequenceLength { get; set; } = 512;
public float MinConfidence { get; set; } = 0.5f;
public string NerModelRepo { get; set; } = "protectai/bert-base-NER-onnx";
public PreprocessingLevel Preprocessing { get; set; } = PreprocessingLevel.Default;
public bool EnableAdvancedPreprocessing { get; set; } = false; // OpenCV pipeline
public bool EnableRecognizers { get; set; } = false; // Microsoft.Recognizers
public string RecognizerCulture { get; set; } = "en-us"; // Recognizer language
}
Kaikilla ohjelmilla on järkeviä standardeja. Voit poistaa koko osan ja kaikki toimiiM SK1 Kaksi opt-järjestelmää -ominaisuuksissa (EnableAdvancedPreprocessing ja EnableRecognizers) sääntöjen mukainen false joten paketti pysyy kevyenä niille käyttäjille, jotka eivät tarvitse niitä.
Euroopan unionin Preprocessing -vaihtoehto hallinnoi kuvaan parantamista ennen OCR:tä:
| Arvo | Mitä se tekee SSK2 Milloin sitä käytetään | |||||
|---|---|---|---|---|---|---|
None |
Ennaltakäsittelyä ei käytetä | Kuvat ovat jo optimoituja | ||||
Minimal |
Ainoastaan harmaassa mittakaavassa | Puhtaiset skansit | ||||
Default |
Grayscale + kontrasti | + | Sharpen | Useimmat kuvat | ||
Aggressive |
Vahva kontrasti + hidastetaan SSK2 laajennetaan | huonolaatuiset valokuvat S |
Paketissa rekisteröidään viisi palvelua, kukin käyttökelpoinen itsenäisesti . valitse se, joka sopii omaan käyttötarkoitukseenne M SK2 siellä' ei tarvitse lastata FirenzeäMSC4 jos tarvitsette vain tekstistä NER-viestin
flowchart TD
subgraph Services
NER["INerService<br>Text → Entities"]
OCR["IOcrService<br>Image → Text"]
REC["ITextRecognizerService<br>Text → Signals"]
PIPE["IOcrNerPipeline<br>Image → Entities + Signals"]
VIS["IVisionService<br>Image → Caption"]
end
OCR --> PIPE
NER --> PIPE
REC -.-> PIPE
style PIPE stroke:#090,stroke-width:3px
style VIS stroke:#f60,stroke-width:3px
style REC stroke:#f60,stroke-width:2px,stroke-dasharray: 5 5
Keskeinen periaate on tehokkuus: valitse pienintä työkalua, joka tekee tehtävän.
| Palvelu SSK1 Mitä se tekee | Mallin koko S | Nopeus M | Käytettäessä | |||||||
|---|---|---|---|---|---|---|---|---|---|---|
INerService |
BERT NER tekstistä SSK1 ~430MB S | ~50ms | Teillä on jo tekstiä | (PDF-asiakirjat | , | tietokannat | SSK8 | käyttäjän input | ) | SSK10 |
IOcrService |
Tesseract OCR:n omaksuminen ohjelmien muodossa | SSK2MB | ~100ms S | Tarvitaan tekstiä asiakirjojen skannausta varten | ||||||
IOcrNerPipeline |
OCR ja sen jälkeen NER yhdellä puhelulla | Molemmat mallit | 3 | ms | Teillä on kuvia ja haluatte entiteetit yhdessä vaiheessa | |||||
ITextRecognizerService |
SäännötM SK1perustainen ekstraktointi (päivämäärät,puhelimet, jne. | |||||||||
IVisionService |
FlorenceM SK1 captioning + OCR SSK3 ~450MB S | ~1-3s | SSK7 Kuvan ymmärtäminen on välttämätöntä, ei vain tekstin lukeminen CSK9 |
Jos teillä on jo teksti (PDFistä,tietokannatM SK2käyttäjän tulot ), voitte käyttää NER:tä suoraanMSC4 Tämä on nopein menettelytapa |- ilman OCR-koodia | , ilman kuvakäsittelyä |
Euroopan unionin INerService liides on yksinkertainen - yksi menetelmäM SK1
// From INerService.cs
public interface INerService
{
Task<NerResult> ExtractEntitiesAsync(string text, CancellationToken ct = default);
}
Täällä's miten käyttää sitä omassa palvelussanne:
public class MyService
{
private readonly INerService _nerService;
public MyService(INerService nerService)
{
_nerService = nerService;
}
public async Task ProcessDocumentAsync(string text)
{
var result = await _nerService.ExtractEntitiesAsync(text);
foreach (var entity in result.Entities)
{
// entity.Label: "PER", "ORG", "LOC", or "MISC"
// entity.Text: "John Smith"
// entity.Confidence: 0.9996
// entity.StartOffset / EndOffset: character positions in the source
}
}
}
Tulosmallit ovat yksinkertaisia:
// From NerResult.cs / NerEntity.cs
public class NerResult
{
public string SourceText { get; init; } = string.Empty;
public List<NerEntity> Entities { get; init; } = [];
}
public class NerEntity
{
public string Text { get; init; } = string.Empty; // "John Smith"
public string Label { get; init; } = string.Empty; // "PER", "ORG", "LOC", "MISC"
public float Confidence { get; init; } // 0.0 to 1.0
public int StartOffset { get; init; } // Where in the source text
public int EndOffset { get; init; } // End position (exclusive)
}
Ensimmäinen puhelu lataa HuggingFace-järjestelmästä BERT NER-mallin (~430MB) Toissijaiset puhelut käyttävät tallennettua mallia.
,, OCR, , ja NER käsitellään yhdessä puhelussa. IOcrNerPipeline yhdistetään IOcrService ja INerService:
// From OcrNerPipeline.cs - the actual pipeline code
public async Task<OcrNerResult> ProcessImageAsync(string imagePath, CancellationToken ct = default)
{
// Step 1: OCR (includes preprocessing automatically)
var ocrResult = await _ocrService.ExtractTextAsync(imagePath, ct);
if (string.IsNullOrWhiteSpace(ocrResult.Text))
return new OcrNerResult
{
OcrResult = ocrResult,
NerResult = new NerResult { SourceText = string.Empty }
};
// Step 2: NER on extracted text
var nerResult = await _nerService.ExtractEntitiesAsync(ocrResult.Text, ct);
return new OcrNerResult
{
OcrResult = ocrResult,
NerResult = nerResult
};
}
Käyttämällä sitä:
var pipeline = serviceProvider.GetRequiredService<IOcrNerPipeline>();
var result = await pipeline.ProcessImageAsync("invoice.png");
// What OCR found
var text = result.OcrResult.Text; // The full extracted text
var confidence = result.OcrResult.Confidence; // 0.0 to 1.0
// What NER found in that text
foreach (var entity in result.NerResult.Entities)
{
// [PER] John Smith, [ORG] Microsoft, [LOC] Seattle...
}
flowchart LR
IMG[Image bytes]
PRE["ImageSharp<br>or OpenCV"]
TESS["Tesseract<br>OCR"]
TOK["WordPiece<br>Tokenize"]
BERT["BERT NER<br>ONNX"]
REC["Recognizers<br>(optional)"]
OUT[Result]
IMG --> PRE
PRE --> TESS
TESS --> TOK
TOK --> BERT
BERT --> REC
REC --> OUT
style PRE stroke:#f60,stroke-width:3px
style BERT stroke:#f60,stroke-width:3px
style REC stroke:#f60,stroke-width:2px,stroke-dasharray: 5 5
Osa 1 oli raaka Tesseract-puheluja . KäytännössäM SK2 sekä Tesserac että Florence-2 toimivat paremmin ennalta käsiteltyjen kuvien kanssa perimmäisenä mutta täysin valinnainen - voi poistaa sen Preprocessing = "None" configissa tai --preprocess none CLI.
Euroopan unionin ImagePreprocessor käytännöt KuvaSharp (pure C
// From ImagePreprocessor.cs - the actual preprocessing steps
public byte[] Preprocess(byte[] imageBytes, PreprocessingOptions? options = null)
{
options ??= PreprocessingOptions.Default;
using var image = Image.Load<Rgba32>(imageBytes);
image.Mutate(ctx =>
{
// Step 1: Upscale small images (Tesseract wants 300+ DPI equivalent)
if (options.EnableUpscale && (image.Width < options.MinWidth || image.Height < options.MinHeight))
{
var scale = Math.Max(
(float)options.MinWidth / image.Width,
(float)options.MinHeight / image.Height);
scale = Math.Min(scale, options.MaxUpscaleFactor);
ctx.Resize((int)(image.Width * scale), (int)(image.Height * scale),
KnownResamplers.Lanczos3);
}
// Step 2: Grayscale (single channel = faster, more accurate)
if (options.EnableGrayscale)
ctx.Grayscale();
// Step 3: Contrast boost (text stands out from background)
if (options.EnableContrast && options.ContrastAmount != 1.0f)
ctx.Contrast(options.ContrastAmount);
// Step 4: Sharpen (crisp character edges)
if (options.EnableSharpen)
ctx.GaussianSharpen(options.SharpenSigma);
});
using var ms = new MemoryStream();
image.SaveAsPng(ms); // PNG = lossless, no additional artifacts
return ms.ToArray();
}
Kolme varausta on rakennettu. PreprocessingOptions luokka määrittelee ne:
// From ImagePreprocessor.cs
public static PreprocessingOptions Default => new(); // Grayscale + 1.5x contrast + sharpen
public static PreprocessingOptions Minimal => new() // Grayscale only
{
EnableContrast = false,
EnableSharpen = false,
EnableUpscale = false
};
public static PreprocessingOptions Aggressive => new() // For poor quality images
{
ContrastAmount = 1.8f,
SharpenSigma = 1.5f,
MinWidth = 1024,
MinHeight = 768,
MaxUpscaleFactor = 4.0f
};
| Ennakolta | Milloin käytettäisiin SSK2 Mitä se tekee | |
|---|---|---|
Default |
Useimmat kuvat | Sininen mittakaava + S1.5x kontrasti M+ valonpesäys МSK5 |
Minimal |
Puhtaiset skannaukset | |
Aggressive |
Heikkolaatuiset valokuvat |
Vakavasti heikennettyjen asiakirjojen osalta - vääristyneet skansit , meluisat valokuvat, hajotetut historialliset sivut |- ImageSharp-putki ei ole riittävä | EnableAdvancedPreprocessing siirretään täydelliseen OpenCV-kaasuputkeen, joka on siirretty ImageSummarizer.
OpenCV:n ennakkokäsittelyketjussa on neljä vaihetta, joista kutakin johtaa automaattinen laadunarviointi.
flowchart LR
IMG[Image]
QA["Quality<br>Assess"]
SK["Deskew"]
DN["Denoise"]
BIN["Binarize"]
OUT[Clean image]
IMG --> QA
QA --> SK
SK --> DN
DN --> BIN
BIN --> OUT
style QA stroke:#f60,stroke-width:2px
Laatuarviointi (ImageQualityAssessor) mittaa hämäryyttä, , katkeamisaskel,, melutaso,MSC3 kontrasti,M SK4 valon yhtenäisyys,, ja tekstipitoisuus,MST6 tulosten perusteella, , suosittaa, millaisia vaiheita soveltaa, jotta puhtaat kuvat vältetään tarpeettomasta käsittelystä,.
Deskew (SkewCorrector) korjaa käännetyt asiakirjat kolmen menetelmän avulla
Denois (NoiseReducer) tarjoaa Gaussian hämäryksen (nopeudetM SK2 kahdenväliset filterit (muurinmuurit-varmistaminenMSC5ei--alueelliset keinot M(yleisimmät laadunmuodotMST8 ja morfologiset toiminnotMSV9
Binarisointi (InkExtractor) muuntaa puhtaaksi mustaksi - ja-valkoiseksi käyttäen OtsuaM SK3 mukautuva kynnysarvoMSC4 Sauvolaa ( heikennettyihin historiallisiin asiakirjoihinMスク6 CLAHEa + Otsuta M( alhaiseen kontrastiinMST9 taimorfologisen taustan poistamiseenMSV10
Sovuttaa se konfiguroinnissa tai CLI:
config.EnableAdvancedPreprocessing = true;
ocrner ocr damaged-scan.png -a
BERT NER-tutkimuksessa löydetään ihmisiä, organisaatioita, sijaintojaM SK2 ja erilaisia toimijoita . mutta joitakin rakenteellisia tietoja MSC4 päivämääriäMST5 puhelinnumerojaMst6 sähköpostiaM st7 URL:itäMt8 IP-osoitteita.
Asetetaan EnableRecognizers lisätään toinen ekstraktiivinen passi käyttämällä Microsoft.Recognizers.Text. Tämä käy sen jälkeen NER ja liitteet:
| Typi | Esimerkit | ||||
|---|---|---|---|---|---|
| päivämääräTime | Lisämäärä | "42", "kolme miljoonaaM SK4 | "15%" | ||
| URL | SSK2httpsM SK3esimerkkiMSC4com", "www | ||||
| Puheelin | "555-1234", "+1 | (555) | 123-4567" | ||
| SSK2johnMSC3microsoftM SK4com" | |||||
| IP-osoite |
Tunnustaja tukee useita kulttuureja (en-usM SK2 en -gbMST4 deMSC5deMSV6 frMSP7frMSM8 jneMSL9 joten se käsittelee paikallisiaMSR10kohtaisia päivämääriä ja numerosääntöjäMSSK11
config.EnableRecognizers = true;
config.RecognizerCulture = "en-us";
ocrner ner "John Smith joined Microsoft on January 15, 2024. Call 555-1234." -r
Molemmat ekstraktiiviset menetelmät täydentävät toisiaan: BERT NER ymmärtää kontekstin ("AppleM SK2 yritys vs. "apple~" hedelmäMSC6, kun taas tunnistajat kiinnittävät luotettavasti rakenteellisia malleja, joita BERT voi jättää huomiottaMST7 OcrNerResult malli sisältää nyt valinnaisen Signals omaisuus:
public class OcrNerResult
{
public OcrResult OcrResult { get; init; } = new();
public NerResult NerResult { get; init; } = new();
public RecognizedSignals? Signals { get; init; } // Only when EnableRecognizers = true
}
Florence-2 on täysin erilainen lähestymistapa kuin Tesseract näkömalli , joka ymmärtää kokonaisen kuvan.
// From IVisionService.cs
public interface IVisionService
{
Task<VisionCaptionResult> CaptionAsync(string imagePath, bool detailed = true,
CancellationToken ct = default);
Task<VisionOcrResult> ExtractTextAsync(string imagePath,
CancellationToken ct = default);
Task<bool> IsAvailableAsync(CancellationToken ct = default);
}
Käyttämällä sitä:
var vision = serviceProvider.GetRequiredService<IVisionService>();
// Generate a caption describing the image
var caption = await vision.CaptionAsync("photo.jpg", detailed: true);
if (caption.Success)
{
// caption.Caption: "A man in a blue suit standing at a podium"
// caption.DurationMs: how long it took
}
// Extract visible text using Florence-2's built-in OCR
var ocrResult = await vision.ExtractTextAsync("screenshot.png");
if (ocrResult.Success)
{
// ocrResult.Text: the visible text Florence-2 detected
}
| Käytännöllinen tapaus | TesseractIOcrService)IVisionService) |
|
|---|---|---|
| Asiakirjaskannat | Paras valinta - nopea | |
| Kuvat merkiistä | Hyvä | Parempi - ymmärtää tapahtuman taustaa M |
| Kuvat | Hyvä | |
| Kuvan captionointi | VoikoM SK1 ei voi tehdä tätä | Paras valinta |
| Nopeus | Nopeutettu (~100msM SK2 | |
| mallikoko |
Kyse on tehokkuus: käyttää Tesseract-ohjelmaa asiakirjojen ja tekstien extrakointiin (itM SK2s 10x nopeampi M100x pienempi malli). käyttä FlorenceMSC6, kun itse asiassa tarvitaan kuva ymmärrys.
Florence-2 autoM SK1downloads its models (~450MBMSC3 first use to {ModelDirectory}/florence2/.
NER:n putkijohto noudattaa samaa kolmesta - - -vaiheesta koostuvaa prosessia, jota käsitellään yksityiskohtaisesti Osa 1: tokenisoida → päätellä → dekoda. Osuus | 1 kulkee läpi jokaisen käsitteen |- WordPiece-tokenointi |
Tässä on se, mitä paketti tuo mukanaan käsin tapahtuvan lähestymistavan lisäksi.
Osa 1's tokenizer muuntaa tekstin token ID:iksi BertNerTokenizer myös jäljitteitä kirjaimen offsetit - niin että tiedätte tarkasti, missä lähdetekstissä kutakin asiaa löydettiin
// From BertNerTokenizer.cs
// "John Smith works at Microsoft" becomes:
// [CLS] John Smith works at Micro ##soft [SEP] [PAD] ...
//
// Each token tracks its source position:
// "John" → chars 0-4
// "Smith" → chars 5-10
// "Micro" → chars 20-29 (WordPiece splits "Microsoft")
// "##soft" → chars 20-29 (same source range)
Näin NerEntity.StartOffset ja EndOffset työ - ne kartoitetaan takaisin alkuperäisessä tekstissänne täsmälliseen kirjaimen asemaan
Osa 1's decoder tuottaa kaikki entiteetit. Pakettifilteroi dekodin aikana - alhainen
// From NerService.cs
private void FlushEntity(
List<NerEntity> entities, string text,
string type, int start, int end, float confidence)
{
if (confidence < _config.MinConfidence) return; // Filter low-confidence
var entityText = text[start..end].Trim();
if (string.IsNullOrWhiteSpace(entityText)) return;
entities.Add(new NerEntity
{
Text = entityText,
Label = type,
Confidence = confidence,
StartOffset = start,
EndOffset = end
});
}
Kaikki mallit laaditaan automaattisesti ensimmäisessä käytössä. Ei tarvita hallinnollista käyttöönottoaM SK1
flowchart TD
CALL["First API call"]
CHECK{"Files exist<br>in cache?"}
YES[Use cached model]
NO["Download to .tmp file"]
MOVE["Atomic rename<br>.tmp → final"]
CALL --> CHECK
CHECK -->|Yes| YES
CHECK -->|No| NO
NO --> MOVE
MOVE --> YES
style NO stroke:#f60,stroke-width:3px
style MOVE stroke:#090,stroke-width:3px
Euroopan unionin ModelDownloader downloads from HuggingFace (NER modelM SK1 and GitHub (tessdata). .tmp malli - jos ohjelmia laaditaan keskeytetyksi, ei jätetä korruptoituneita tietoja jäljelle
// From ModelDownloader.cs - atomic download pattern
await using var fileStream = new FileStream(tempPath, FileMode.Create,
FileAccess.Write, FileShare.None, 81920, true);
// ... stream download to .tmp file ...
await fileStream.FlushAsync(ct);
fileStream.Close();
File.Move(tempPath, localPath, overwrite: true); // Atomic rename
Standardin Cache-paikka: {AppBaseDir}/models/ocrner/
models/ocrner/
ner/
model.onnx (~430MB - BERT NER)
vocab.txt (~230KB - WordPiece vocabulary)
config.json (~1KB - label mapping)
tessdata/
eng.traineddata (~4MB - English OCR data)
florence2/
... (~450MB - Vision model files)
Everything is a singleton with lazy initialization. kalliit resurssit M SK1ONNX InferenceSession, TesseractEngine, FlorenssiM SK1 malli ) luodaan ensimmäisen käytön jälkeen ja käytetään uudelleen soveltamisen keston ajaksi
flowchart TD
DI["AddOcrNer()"]
DI --> MD["ModelDownloader<br>(singleton)"]
DI --> PP["ImagePreprocessor<br>(singleton)"]
DI --> CV["OpenCvPreprocessor<br>(singleton)"]
DI --> NER["NerService<br>(singleton)"]
DI --> OCR["OcrService<br>(singleton)"]
DI --> PIPE["OcrNerPipeline<br>(singleton)"]
DI --> REC["TextRecognizerService<br>(singleton)"]
DI --> VIS["VisionService<br>(singleton)"]
MD --> NER
MD --> OCR
PP --> OCR
CV --> OCR
NER --> PIPE
OCR --> PIPE
REC --> PIPE
style DI stroke:#090,stroke-width:3px
Thread safety: kaikki palvelut SemaphoreSlim inicialisointia varten. Monien samanaikaisesti ensimmäisen käytön yhteydessä käyttävien palvelujen käyttö käynnistää vain yhden laadinnan
// From NerService.cs - lazy init pattern used by all services
private async Task EnsureInitializedAsync(CancellationToken ct)
{
if (_initialized) return; // Fast path: already loaded
await _initLock.WaitAsync(ct); // Only one thread enters
try
{
if (_initialized) return; // Double-check after lock
var paths = await _downloader.EnsureNerModelAsync(ct);
_tokenizer = new BertNerTokenizer(paths.VocabPath, _config.MaxSequenceLength);
_session = new InferenceSession(paths.ModelPath, sessionOptions);
_initialized = true;
}
finally { _initLock.Release(); }
}
Reso sisältää käännösmuodon-line-välineen, joka on rakennettu Spectre.Konsole. Se, ', on suunniteltu menestyksen huippuksi.
# NER from text (auto-detected)
ocrner "John Smith works at Microsoft in Seattle"
# OCR from an image (auto-detected)
ocrner invoice.png
# Explicit commands
ocrner ner "Marie Curie won the Nobel Prize in Stockholm"
ocrner ocr scan.png
ocrner caption photo.jpg
Älykäs eteneminen: CLI autoM SK1 havaitsee tarkoituksenne Program.cs:
// From Program.cs - smart routing logic
if (IsImageFile(args2[0]) || IsGlobPattern(args2[0]) || Directory.Exists(args2[0]))
{
args2 = ["ocr", .. args2]; // Image file → ocr command
}
else
{
args2 = ["ner", .. args2]; // Text string → ner command
}
Jos välitätte tekstistringin, se toimii NER:n mukaisesti.
| Päätöslauselma SSK1 Mitä se tekee | moottori S | Nopeus M |
|---|---|---|
ner <text> |
Tekstistä otetaan entiteetit pois | BERT NER |
ocr <path> |
OCR | |
caption <path> |
Kuvaus captioning + valinnainen OCR SSK2 FlorenceM SK3 (ONNX) |
Tesseract on standardi OCR-moottori koska se's M SK1x nopeutetaan ja optimoidaan asiakirjan tekstiin . Firenze-2 on tarpeen silloin, kun tarvitsette kuvan ymmärtämistä (captionsMSC5 scene textMST6 signien valokuvatMSV7
Tässä on todellista tulosta CLI:n käyttämisestä todellisiin esikuva-asiakirjoihin nähden.
NER tekstistä:
ocrner ner "Marie Curie won the Nobel Prize in Stockholm"
╭──────┬─────────────┬────────────┬──────────╮
│ Type │ Entity │ Confidence │ Position │
├──────┼─────────────┼────────────┼──────────┤
│ PER │ Marie Curie │ 100% │ 0-11 │
│ MISC │ Nobel Prize │ 100% │ 20-31 │
│ LOC │ Stockholm │ 100% │ 35-44 │
╰──────┴─────────────┴────────────┴──────────╯
NER:n tunnustajat - BERT-yksiköiden yhdistäminen sääntöönM SK1johdonmukainen signaalisiirto:
ocrner ner "Shelby Lucier from SCS Agency in Cambridge, UK sent an invoice on 13/02/15. Call 07981423683." -r
╭──────┬───────────────┬────────────┬──────────╮
│ Type │ Entity │ Confidence │ Position │
├──────┼───────────────┼────────────┼──────────┤
│ PER │ Shelby Lucier │ 100% │ 0-13 │
│ ORG │ SCS Agency │ 100% │ 19-29 │
│ LOC │ Cambridge │ 100% │ 33-42 │
│ LOC │ UK │ 100% │ 44-46 │
╰──────┴───────────────┴────────────┴──────────╯
── Recognized Signals ─────────────────────────
Type Text Details
DateTime 13/02/15 datetimeV2.date
Phone 07981423683
BERT-tutkimuksessa löydetään henkilöt, järjestöt ja paikat, , ja . Tunnustajat löytävät päivämäärän ja puhelinnumeron - rakenteelliset muodot, jotka hermoston verkosto ei voi luottaa saamaan aikaan
OCR skannatusta asiakirjasta (Amazonin osakkeenomistajien kirje, , skannattiin aukolla,-punch marks,):
ocrner ocr shareholder-letter.jpg -q
╭──────┬───────────────┬────────────┬──────────╮
│ Type │ Entity │ Confidence │ Position │
├──────┼───────────────┼────────────┼──────────┤
│ ORG │ Amazon │ 87% │ 285-291 │
│ PER │ Jeff │ 99% │ 293-297 │
│ ORG │ AWS │ 95% │ 984-987 │
│ LOC │ America │ 98% │ 2315-2322│
╰──────┴───────────────┴────────────┴──────────╯
OCR Confidence: 89%
Tesseract vie läheltä -verbatim-tekstiä skannatusta kirjaimesta 89% luottamuksellisella jäljittämisellä , , ja NER tunnistaa asianmukaisesti Amazonin ,
Sama skannattu osakkeenomistajien kirje, jota käsitellään molemmissa koneissa:
Tesseract (ocrner ocr)ocrner caption --ocr) |
||
|---|---|---|
| Nopeus | ||
| OCR:n tarkkuus | LähesM SK1verbatim, 89%luottamus | |
| Avainteksti | "Amazonissa on kuluneiden kahden vuoden aikana ollut tilaisuutta write many narrative. | |
| NER-yhteisöt | Jeff (PERM SK2 Amazon (ORG), AWS (ORG), Amerika SSK7LOCMSC8 M | N~/A МSK11teksti on liian hajanainen luotettaviksi NER*) |
| Luettelo | NM SK1A |
Florence-2 on näkemys malli - se ymmärtää näkökohtia , esineitä M SK2 ja alueellisia suhteita . Se ei ole koskaan suunniteltu kilpailemaan Tesseractin kanssa asiakirjan tekstin lukemisessa ymmärrys (mikä se on? kaivaus ( mitä tässä asiakirjassa sanotaan
Euroopan unionin --json lipputulokset rakentavat JSONin stdout-järjestelmään, jossa kaikki merkinnät supistuvat. - suunniteltu katkaisettavaksi muihin työkaluihin.
ocrner ner "Shelby Lucier from SCS Agency in Cambridge, UK sent an invoice on 13/02/15. Call 07981423683." -r --json
{
"command": "ner",
"success": true,
"sourceText": "Shelby Lucier from SCS Agency in Cambridge, UK...",
"entityCount": 4,
"entities": [
{ "type": "PER", "text": "Shelby Lucier", "confidence": 0.9996, "startOffset": 0, "endOffset": 13 },
{ "type": "ORG", "text": "SCS Agency", "confidence": 0.999, "startOffset": 19, "endOffset": 29 },
{ "type": "LOC", "text": "Cambridge", "confidence": 0.9975, "startOffset": 33, "endOffset": 42 },
{ "type": "LOC", "text": "UK", "confidence": 0.9991, "startOffset": 44, "endOffset": 46 }
],
"signals": {
"dateTimes": [{ "text": "13/02/15", "typeName": "datetimeV2.date" }],
"phoneNumbers": [{ "text": "07981423683" }]
}
}
Tämä tekee CLI:stä käyttökelpoisen väline LLM:ille ja agenteille. LLM voi soittaa ocrner ner "..." --json, analysoi JSON:n vastausta , ja perustelee rakenteellisia yksiköitä. jq, välittäjän kehykseen toimittaminen, tai minkä tahansa kielen lukeminen
# Pipe to jq for quick filtering
ocrner ocr invoice.png --json | jq '.results[0].entities[] | select(.type == "PER")'
# Use from Python, Node, or any language that can shell out
echo "John Smith at Microsoft" | ocrner ner --json
To save to a file instead, use -o omalla .json laajentaminen - samat rakenteelliset tiedot, kirjoitettu disktiinM SK2
ocrner ocr "scans/*.png" -o results.json
Monien kuvien käsittely glob-muodon tai luetteloiden avulla:
# All PNGs in a directory
ocrner ocr "scans/*.png" -o results.json
# All images in a folder
ocrner ocr ./documents/
# Batch captioning with Florence-2
ocrner caption "photos/*.jpg" --ocr -o captions.md
| Lippu | Sovelletaan SSK2 Kuvaus | |
|---|---|---|
--json |
ner, ocr, caption |
Structured JSON to stdout --quiet, suppresses all logging |
-c |
ner, ocr |
Vähimmäisyritysten luottamuksen raja-arvo |
--language |
ocr |
Tesseract-kieli (esimerkiksi eng, fra) |
--max-tokens |
ner, ocr |
BERT-järjestelmien enimmäispituus |
--model-dir |
ner, ocr, caption |
mallin cache directory override |
-p, --preprocess |
ocr, caption |
Ennaltakäsittelyä koskeva ennakkomääräys none, minimal, default, aggressive |
-a, --advanced-preprocess |
ocr, caption |
Käytetään OpenCV:n ennakkokäsittelyä. |
-r, --recognizers |
ner, ocr |
Sovelletaan sääntöäM SK1perustainen ekstraktointi (päivämäärät,numerotSSK4URL-osoitteetMST5puhelinetMKT6 sähköpostitMSKT7IP-osoitteitaMSCT8 SKT9 |
--culture |
ner, ocr |
en-us, de-de (defaultM SK1 en-us) |
--brief |
caption |
Generaa lyhyemmänM SK1 vähemmän yksityiskohtaisen katsauksen |
-q, --quiet |
ner, ocr, caption |
Tyynenmodus |
-o |
ner, ocr, caption |
Saavutusliitteen etenemissuunnitelma (.txt, .md, .json) |
--ocr |
caption |
Jatketaan myös OCR:tä caption-todistuksen aikana. |
--ner |
caption |
Poistaa NER:n OCR-tekstistä --ocr) |
Nykyinen NER-malli on täydellinen protectai/bert-base-NER-onnx (~430MB määrällinen Saman mallin (INT8) version olisi huomattavasti nopeampi ilman minkäänlaista virheellistä virhettä
ONNXin runtime-järjestelmässä tuetaan INT:n, 8:n ja ,:n kumulaatiota, joka yleensä vähentää mallikokoa ~4x:lla ja parantaa inferenssin nopeutta CPU:llä 2-3x:llä. NerModelRepo config-mahdollisuus tukee jo viittausta toiseen HuggingFace-repoon, joten kun kvantifioitu malli julkaistaan, muuttakaa vainM SK2
{
"OcrNer": {
"NerModelRepo": "protectai/bert-base-NER-onnx-quantized"
}
}
Järjestelmä on suunniteltu tähän - vaihtaa mallia , säilyttää sama API
Tämä paketti on yksivaiheinen kaasuputki:, yksi OCR-moottori, ,, yksi NER-malli, ,, yksi valinnainen näkemismalli,., se on suunniteltu yksinkertaiseksi ja tehokkaaksi tavalliseen tapaukseen.
Monimutkaisempien skenaarioiden osalta - lukee teksti mikä tahansa (käsin kirjoitetut huomautukset, , valotaulujen valokuvat,, alhainen, M SK3 laadukkaat kamerakatsaukset,), monikäyttöiset,M SK5 koneen OCR-yhteisymmärrys,MSC6 hämärän vastauksen löytäminen,MST7 ja rakenteellinen ekstraktointi. ilmeinenRAG. SeM SK1 missä tämän työn tuotantovaiheen version variantti, -laadunmukainen,, monimuotoinen,- elää
Florence-2 on tämän paketin nykyinen yläraja paikalliselle näkemykselle. monimuotoinen LLM - malli, joka pystyy näkemään kuvan ja perustelu luonnonkielellä. OCR:n erillisen lähettämisen sijasta + NER:n vaiheet, lähettäisitte kuvan suoraan ja pyytäisitte rakenteellista ekstraktiota
Tässä on arvio siitä, miltä API voisi näyttää.
// Hypothetical future IMultimodalService
public interface IMultimodalService
{
Task<StructuredExtractionResult> ExtractAsync(
string imagePath,
string prompt = "Extract all people, organizations, and locations from this image. Return as JSON.",
CancellationToken ct = default);
}
// Usage
var multimodal = serviceProvider.GetRequiredService<IMultimodalService>();
var result = await multimodal.ExtractAsync("business-card.jpg");
// result.Entities: [{ "John Smith", PER }, { "Acme Corp", ORG }, { "New York", LOC }]
// result.RawText: "John Smith, VP Engineering, Acme Corp, New York, NY 10001"
// result.Summary: "Business card for John Smith at Acme Corp in New York"
Pienet paikalliset multimodaaliset mallit (kuten Phi-3.5-vision tai LLaVA) on tulossa riittävän hyväksi tähän, . kaupankäynti, -off on aina samaa, M SK3 suurempi malli, \ = älykkäämpi mutta hitaampi .\ oikea valinta riippuu latenttibudjetistanne ja tarkkuusvaatimuksistanne.
flowchart LR
subgraph Staged["Staged Approach: Pick Your Level"]
T1["Tesseract OCR<br>4MB | ~100ms<br>Text extraction"]
T2["BERT NER<br>430MB | ~50ms<br>Entity extraction"]
T3["Florence-2<br>450MB | ~1-3s<br>Image understanding"]
T4["Multimodal LLM<br>2-8GB | ~5-30s<br>Full reasoning"]
end
T1 --> T2
T2 --> T3
T3 -.->|"future"| T4
style T1 stroke:#090,stroke-width:2px
style T2 stroke:#090,stroke-width:2px
style T3 stroke:#f60,stroke-width:2px
style T4 stroke:#999,stroke-width:2px,stroke-dasharray: 5 5
Jokaisella tasolla lisätään kapasiteettia koko ja latenssin kustannuksella. ilmeinenRAG on otsikko.
Tämä paketti:
Osa 1:
Riippuvuus:
Related Articles:
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.