Form Tanıma VEYA SDK'ları REST API
Bu nasıl uygulamalı kılavuzda SDK kullanarak Form Tanıma iş akışlarınıza, istediğiniz bir programlama dilinde veya uygulama akışınıza uygulama ve iş akışlarınıza REST API. Azure Form Tanıma, belgelerinizin form alanlarını, metinlerini ve tablolarını ayıklamak ve analiz etmek için makine öğrenmesini kullanan bulut tabanlı bir Azure Uygulamalı AI Hizmetidir. Teknolojiyi öğrenerek ücretsiz hizmeti kullanmalarını öneririz. Ücretsiz sayfa sayısının aylık 500 ile sınırlı olduğunu unutmayın.
Formlardan ve belgelerden yapılandırılmış verileri ayıklamak için aşağıdaki API'leri kullanabilirsiniz:
- İstemcinin kimliğini doğrulama
- Düzeni Analiz Etme
- Makbuzları analiz etme
- Kartvizitleri analiz etme
- Faturaları analiz etme
- Kimlik belgelerini analiz etme
- Özel bir modeli eğitme
- Özel modelle formları analiz etme
- Özel modelleri yönetme
Önemli
Bu proje, REST API v 2.1 olan bir form tanıyıcıyı hedefliyor.
Bu makaledeki kod, basitlik nedenlerle zaman uyumlu Yöntemler ve güvenli olmayan kimlik bilgileri depolaması kullanır.
Başvuru belgeleri | Kitaplık kaynak kodu | Paket (NuGet) | Örnekler
Önkoşullar
- Azure aboneliği- ücretsiz olarak bir tane oluşturun
- Visual Studio ıde veya .net Core'un geçerli sürümü.
- eğitim verileri kümesi içeren bir Azure Depolama blobu. Eğitim veri kümesini birlikte yerleştirmeye yönelik ipuçları ve seçenekler için bkz. özel bir model için eğitim verileri kümesi oluşturma . Bu proje için, örnek veri kümesinin eğitme klasörü altındaki dosyaları kullanabilirsiniz ( sample_data.zip indir ve Ayıkla).
- Azure aboneliğiniz olduktan sonra Azure Portal anahtarınızı ve uç noktanızı almak Için bir form tanıyıcı kaynağı oluşturun. Dağıtıldıktan sonra Kaynağa Git' i seçin.
- Uygulamanızı form tanıyıcı API 'sine bağlamak için oluşturduğunuz kaynaktaki anahtar ve uç nokta gerekir. Anahtarınızı ve uç noktanızı, daha sonra projenin altındaki koda yapıştırın.
F0Hizmeti denemek ve daha sonra üretime yönelik ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını () kullanabilirsiniz.
Ayarlanıyor
Konsol penceresinde (cmd, PowerShell veya Bash gibi), dotnet new adıyla yeni bir konsol uygulaması oluşturmak için komutunu kullanın formrecognizer-project . Bu komut, tek bir kaynak dosyası olan basit bir "Merhaba Dünya" C# projesi oluşturur: program. cs.
dotnet new console -n formrecognizer-project
Dizininizi yeni oluşturulan uygulama klasörüyle değiştirin. Uygulamayı ile oluşturabilirsiniz:
dotnet build
Derleme çıktısı hiçbir uyarı veya hata içermemelidir.
...
Build succeeded.
0 Warning(s)
0 Error(s)
...
İstemci kitaplığını yükler
Uygulama dizini içinde, aşağıdaki komutla .NET için form tanıyıcı istemci Kitaplığı ' nı yükleyeceksiniz:
dotnet add package Azure.AI.FormRecognizer --version 3.1.1
Proje dizininden, tercih ettiğiniz düzenleyicide veya IDE 'de program. cs dosyasını açın. Aşağıdaki yönergeleri ekleyin using :
using Azure;
using Azure.AI.FormRecognizer;
using Azure.AI.FormRecognizer.Models;
using Azure.AI.FormRecognizer.Training;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
Uygulamanın Program sınıfında, kaynağınızın anahtarı ve uç noktası için değişkenler oluşturun.
Önemli
Azure portala gidin. Önkoşul bölümünde oluşturduğunuz form tanıyıcı kaynağı başarıyla dağıtıldı, sonraki adımlar altındaki Kaynağa Git düğmesine tıklayın. Anahtar ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.
İşiniz bittiğinde kodu koddan kaldırmayı unutmayın ve hiçbir zaman herkese açık bir şekilde nakletmeyin. Üretim için, kimlik bilgilerinizi depolamak ve erişmek üzere güvenli yöntemler kullanın. Daha fazla bilgi için bilişsel Hizmetler güvenlik makalemize bakın .
private static readonly string endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
private static readonly string apiKey = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
private static readonly AzureKeyCredential credential = new AzureKeyCredential(apiKey);
Uygulamanın Main yönteminde, bu projede kullanılan zaman uyumsuz görevlere bir çağrı ekleyin. Bunları daha sonra uygulayacaksınız:
static void Main(string[] args) {
// new code:
var recognizeContent = RecognizeContent(recognizerClient);
Task.WaitAll(recognizeContent);
var analyzeReceipt = AnalyzeReceipt(recognizerClient, receiptUrl);
Task.WaitAll(analyzeReceipt);
var analyzeBusinessCard = AnalyzeBusinessCard(recognizerClient, bcUrl);
Task.WaitAll(analyzeBusinessCard);
var analyzeInvoice = AnalyzeInvoice(recognizerClient, invoiceUrl);
Task.WaitAll(analyzeInvoice);
var analyzeId = AnalyzeId(recognizerClient, idUrl);
Task.WaitAll(analyzeId);
var trainModel = TrainModel(trainingClient, trainingDataUrl);
Task.WaitAll(trainModel);
var trainModelWithLabels = TrainModelWithLabels(trainingClient, trainingDataUrl);
Task.WaitAll(trainModel);
var analyzeForm = AnalyzePdfForm(recognizerClient, modelId, formUrl);
Task.WaitAll(analyzeForm);
var manageModels = ManageModels(trainingClient, trainingDataUrl);
Task.WaitAll(manageModels);
}
Nesne modeli
Form tanıyıcı ile iki farklı istemci türü oluşturabilirsiniz. Birincisi, FormRecognizerClient hizmeti tanınan form alanları ve içerikleri için sorgulamak üzere kullanılır. İkincisi, FormTrainingClient tanımayı geliştirmek üzere özel modeller oluşturup yönetmek için kullanılır.
FormRecognizerClient
FormRecognizerClient için işlem sağlar:
- Özel formlarınızı çözümlemek için eğitilen özel modeller kullanarak form alanlarını ve içeriği tanıyor. Bu değerler bir nesne koleksiyonunda döndürülür
RecognizedForm. Bkz. özel formları çözümleme. - Bir modeli eğitme gerekmeden tablolar, satırlar ve sözcükler dahil form içeriğini tanıma. Form içeriği bir nesne koleksiyonunda döndürülür
FormPage. Bkz. örnek Çözümleme düzeni. - Form tanıyıcı hizmetinde önceden eğitilen bir model kullanarak ABD giriş, iş kartı, fatura ve KIMLIK belgelerinin ortak alanlarını tanıyor.
Formtraıningclient
FormTrainingClient için işlem sağlar:
- Özel modellerinizde bulunan tüm alanları ve değerleri çözümlemek için özel modelleri eğitme.
CustomFormModelModelin analiz edileceği form türlerini ve her form türü için ayıklanacak alanları gösteren bir döndürülür. - Özel formlarınızı etiketleyerek belirttiğiniz belirli alanları ve değerleri çözümlemek için özel modeller eğitimi yapın. ,
CustomFormModelModelin ayıklanacağı alanları ve her alan için tahmini doğruluğu belirten bir döndürülür. - Hesabınızda oluşturulan modelleri yönetme.
- Özel bir modeli bir form tanıyıcı kaynağından diğerine kopyalama.
Bir modeli eğitme ve özel modelleri yönetmeörneklerine bakın.
Not
Modeller ayrıca form tanıyıcı etiketleme aracıgibi bir grafik kullanıcı arabirimi kullanılarak eğitilmiş olabilir.
İstemcinin kimliğini doğrulama
Main altında adlı yeni bir yöntem oluşturun AuthenticateClient . Bu yöntemi, form tanıyıcı hizmetine isteklerinizin kimliğini doğrulamak için diğer görevlerde kullanacaksınız. Bu yöntem, AzureKeyCredential gerekirse, API anahtarını yeni istemci nesneleri oluşturmadan güncelleştirebilmeniz için nesnesini kullanır.
Önemli
Azure portal anahtarınızı ve uç noktanızı alın. Önkoşul bölümünde oluşturduğunuz form tanıyıcı kaynağı başarıyla dağıtıldı, sonraki adımlar altındaki Kaynağa Git düğmesine tıklayın. Anahtar ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.
İşiniz bittiğinde kodu koddan kaldırmayı unutmayın ve hiçbir zaman herkese açık bir şekilde nakletmeyin. Üretim için, kimlik bilgilerinizi depolamak ve erişmek üzere güvenli yöntemler kullanın. Örneğin, Azure Anahtar Kasası.
private static FormRecognizerClient AuthenticateClient()
{
var credential = new AzureKeyCredential(apiKey);
var client = new FormRecognizerClient(new Uri(endpoint), credential);
return client;
}
Eğitim istemcisinin kimliğini doğrulayan yeni bir yöntem için yukarıdaki adımları tekrarlayın.
static private FormTrainingClient AuthenticateTrainingClient()
{
var credential = new AzureKeyCredential(apiKey);
var client = new FormTrainingClient(new Uri(endpoint), credential);
return client;
}
Test için varlıkları al
Ayrıca, eğitim ve test verileriniz için URL 'lere başvurular eklemeniz gerekecektir. Bu başvuruları Program sınıfınızın köküne ekleyin.
-
özel model eğitim verilerinize yönelik SAS URL 'sini almak için Azure portal depolama kaynağına gidin ve Depolama Gezgini sekmesini seçin. Kapsayıcınıza gidin, sağ tıklayın ve paylaşılan erişim Imzasını al' ı seçin. Depolama hesabının kendisi için değil, kapsayıcınıza yönelik SAS almak önemlidir. Okuma, yazma, silme ve Listeleme izinlerinin işaretli olduğundan emin olun ve Oluştur' a tıklayın. Sonra URL bölümündeki değeri geçici bir konuma kopyalayın. Şu biçimde olmalıdır:
https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.
Ardından, BLOB depolama kapsayıcısında tek bir belgenin SAS URL 'sini almak için yukarıdaki adımları tekrarlayın. Geçici bir konuma da kaydedin.
Son olarak, aşağıda yer alan örnek görüntünün URL 'sini kaydedin ( GitHubde mevcuttur).
string trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE";
string formUrl = "PASTE_YOUR_FORM_RECOGNIZER_FORM_URL_HERE";
string receiptUrl = "https://docs.microsoft.com/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg";
string bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg";
string invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
string idUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg";
Düzeni çözümle
Belge içindeki tabloları, satırları ve sözcükleri, bir modeli eğmenize gerek kalmadan analiz etmek için form tanıyıcısı 'nı kullanabilirsiniz. Döndürülen değer bir Formpage nesneleri koleksiyonudur: gönderilen belgedeki her sayfa için bir tane. Düzen ayıklama hakkında daha fazla bilgi için bkz. Düzen kavramsal Kılavuzu.
Belirli bir URL 'deki bir dosyanın içeriğini çözümlemek için StartRecognizeContentFromUri yöntemini kullanın.
private static async Task RecognizeContent(FormRecognizerClient recognizerClient)
{
var invoiceUri = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
FormPageCollection formPages = await recognizerClient
.StartRecognizeContentFromUri(new Uri(invoiceUri))
.WaitForCompletionAsync();
İpucu
Ayrıca, yerel bir dosyadan içerik alabilirsiniz. Startrecognizecontent gibi Formrecognizerclient yöntemlerine bakın. veya, yerel görüntüleri ilgilendiren senaryolar için GitHub örnek koda bakın.
Bu görevin geri kalanı, içerik bilgilerini konsola yazdırır.
foreach (FormPage page in formPages)
{
Console.WriteLine($"Form Page {page.PageNumber} has {page.Lines.Count} lines.");
for (int i = 0; i < page.Lines.Count; i++)
{
FormLine line = page.Lines[i];
Console.WriteLine($" Line {i} has {line.Words.Count} word{(line.Words.Count > 1 ? "s" : "")}, and text: '{line.Text}'.");
}
for (int i = 0; i < page.Tables.Count; i++)
{
FormTable table = page.Tables[i];
Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (FormTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains text: '{cell.Text}'.");
}
}
}
}
Çıktı
Form Page 1 has 18 lines.
Line 0 has 1 word, and text: 'Contoso'.
Line 1 has 1 word, and text: 'Address:'.
Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
Line 3 has 4 words, and text: '1 Redmond way Suite'.
Line 4 has 3 words, and text: '1020 Enterprise Way'.
Line 5 has 3 words, and text: '6000 Redmond, WA'.
Line 6 has 3 words, and text: 'Sunnayvale, CA 87659'.
Line 7 has 1 word, and text: '99243'.
Line 8 has 2 words, and text: 'Invoice Number'.
Line 9 has 2 words, and text: 'Invoice Date'.
Line 10 has 3 words, and text: 'Invoice Due Date'.
Line 11 has 1 word, and text: 'Charges'.
Line 12 has 2 words, and text: 'VAT ID'.
Line 13 has 1 word, and text: '34278587'.
Line 14 has 1 word, and text: '6/18/2017'.
Line 15 has 1 word, and text: '6/24/2017'.
Line 16 has 1 word, and text: '$56,651.49'.
Line 17 has 1 word, and text: 'PT'.
Table 0 has 2 rows and 6 columns.
Cell (0, 0) contains text: 'Invoice Number'.
Cell (0, 1) contains text: 'Invoice Date'.
Cell (0, 2) contains text: 'Invoice Due Date'.
Cell (0, 3) contains text: 'Charges'.
Cell (0, 5) contains text: 'VAT ID'.
Cell (1, 0) contains text: '34278587'.
Cell (1, 1) contains text: '6/18/2017'.
Cell (1, 2) contains text: '6/24/2017'.
Cell (1, 3) contains text: '$56,651.49'.
Cell (1, 5) contains text: 'PT'.
Alındıları analiz etme
Bu bölümde, önceden eğitilen bir makbuz modeli kullanılarak ABD makbuzlarından ortak alanların nasıl analiz edileceği ve ayıklanacağı gösterilmektedir. Makbuz analizi hakkında daha fazla bilgi için bkz. alındılar kavramsal Kılavuzu.
Bir URL 'den alındıları çözümlemek için StartRecognizeReceiptsFromUri yöntemini kullanın.
private static async Task AnalyzeReceipt(
FormRecognizerClient recognizerClient, string receiptUri)
{
RecognizedFormCollection receipts = await recognizerClient.StartRecognizeReceiptsFromUri(new Uri(receiptUrl)).WaitForCompletionAsync();
İpucu
Ayrıca, yerel alındı görüntülerini analiz edebilirsiniz. StartRecognizeReceipts gibi Formrecognizerclient yöntemlerine bakın. veya, yerel görüntüleri ilgilendiren senaryolar için GitHub örnek koda bakın.
Döndürülen değer bir RecognizedForm nesne koleksiyonudur: gönderilen belgedeki her sayfa için bir tane. Aşağıdaki kod, belirtilen URI 'de alış irsaliyesini işler ve ana alanları ve değerleri konsola yazdırır.
foreach (RecognizedForm receipt in receipts)
{
FormField merchantNameField;
if (receipt.Fields.TryGetValue("MerchantName", out merchantNameField))
{
if (merchantNameField.Value.ValueType == FieldValueType.String)
{
string merchantName = merchantNameField.Value.AsString();
Console.WriteLine($"Merchant Name: '{merchantName}', with confidence {merchantNameField.Confidence}");
}
}
FormField transactionDateField;
if (receipt.Fields.TryGetValue("TransactionDate", out transactionDateField))
{
if (transactionDateField.Value.ValueType == FieldValueType.Date)
{
DateTime transactionDate = transactionDateField.Value.AsDate();
Console.WriteLine($"Transaction Date: '{transactionDate}', with confidence {transactionDateField.Confidence}");
}
}
FormField itemsField;
if (receipt.Fields.TryGetValue("Items", out itemsField))
{
if (itemsField.Value.ValueType == FieldValueType.List)
{
foreach (FormField itemField in itemsField.Value.AsList())
{
Console.WriteLine("Item:");
if (itemField.Value.ValueType == FieldValueType.Dictionary)
{
IReadOnlyDictionary<string, FormField> itemFields = itemField.Value.AsDictionary();
FormField itemNameField;
if (itemFields.TryGetValue("Name", out itemNameField))
{
if (itemNameField.Value.ValueType == FieldValueType.String)
{
string itemName = itemNameField.Value.AsString();
Console.WriteLine($" Name: '{itemName}', with confidence {itemNameField.Confidence}");
}
}
FormField itemTotalPriceField;
if (itemFields.TryGetValue("TotalPrice", out itemTotalPriceField))
{
if (itemTotalPriceField.Value.ValueType == FieldValueType.Float)
{
float itemTotalPrice = itemTotalPriceField.Value.AsFloat();
Console.WriteLine($" Total Price: '{itemTotalPrice}', with confidence {itemTotalPriceField.Confidence}");
}
}
}
}
}
}
FormField totalField;
if (receipt.Fields.TryGetValue("Total", out totalField))
{
if (totalField.Value.ValueType == FieldValueType.Float)
{
float total = totalField.Value.AsFloat();
Console.WriteLine($"Total: '{total}', with confidence '{totalField.Confidence}'");
}
}
}
}
Çıktı
Form Page 1 has 18 lines.
Line 0 has 1 word, and text: 'Contoso'.
Line 1 has 1 word, and text: 'Address:'.
Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
Line 3 has 4 words, and text: '1 Redmond way Suite'.
Line 4 has 3 words, and text: '1020 Enterprise Way'.
Line 5 has 3 words, and text: '6000 Redmond, WA'.
Line 6 has 3 words, and text: 'Sunnayvale, CA 87659'.
Line 7 has 1 word, and text: '99243'.
Line 8 has 2 words, and text: 'Invoice Number'.
Line 9 has 2 words, and text: 'Invoice Date'.
Line 10 has 3 words, and text: 'Invoice Due Date'.
Line 11 has 1 word, and text: 'Charges'.
Line 12 has 2 words, and text: 'VAT ID'.
Line 13 has 1 word, and text: '34278587'.
Line 14 has 1 word, and text: '6/18/2017'.
Line 15 has 1 word, and text: '6/24/2017'.
Line 16 has 1 word, and text: '$56,651.49'.
Line 17 has 1 word, and text: 'PT'.
Table 0 has 2 rows and 6 columns.
Cell (0, 0) contains text: 'Invoice Number'.
Cell (0, 1) contains text: 'Invoice Date'.
Cell (0, 2) contains text: 'Invoice Due Date'.
Cell (0, 3) contains text: 'Charges'.
Cell (0, 5) contains text: 'VAT ID'.
Cell (1, 0) contains text: '34278587'.
Cell (1, 1) contains text: '6/18/2017'.
Cell (1, 2) contains text: '6/24/2017'.
Cell (1, 3) contains text: '$56,651.49'.
Cell (1, 5) contains text: 'PT'.
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
Name: '8GB RAM (Black)', with confidence 0.916
Total Price: '999', with confidence 0.559
Item:
Name: 'SurfacePen', with confidence 0.858
Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
İş kartlarını çözümle
Bu bölümde, önceden eğitilen bir model kullanarak Ingilizce iş kartlarından ortak alanların nasıl analiz edileceği ve ayıklanacağı gösterilmektedir. İş kartı analizi hakkında daha fazla bilgi için bkz. iş kartları kavramsal Kılavuzu.
Bir URL 'den iş kartlarını çözümlemek için StartRecognizeBusinessCardsFromUriAsync yöntemini kullanın.
private static async Task AnalyzeBusinessCard(
FormRecognizerClient recognizerClient, string bcUrl) {
RecognizedFormCollection businessCards = await recognizerClient.StartRecognizeBusinessCardsFromUriAsync(bcUrl).WaitForCompletionAsync();
İpucu
Ayrıca, yerel alındı görüntülerini analiz edebilirsiniz. Startrecognizebusinesscarlar gibi Formrecognizerclient yöntemlerine bakın. veya, yerel görüntüleri ilgilendiren senaryolar için GitHub örnek koda bakın.
Aşağıdaki kod, belirtilen URI 'de iş kartını işler ve ana alanları ve değerleri konsola yazdırır.
foreach(RecognizedForm businessCard in businessCards) {
FormField ContactNamesField;
if (businessCard.Fields.TryGetValue("ContactNames", out ContactNamesField)) {
if (ContactNamesField.Value.ValueType == FieldValueType.List) {
foreach(FormField contactNameField in ContactNamesField.Value.AsList()) {
Console.WriteLine($ "Contact Name: {contactNameField.ValueData.Text}");
if (contactNameField.Value.ValueType == FieldValueType.Dictionary) {
IReadOnlyDictionary < string,
FormField > contactNameFields = contactNameField.Value.AsDictionary();
FormField firstNameField;
if (contactNameFields.TryGetValue("FirstName", out firstNameField)) {
if (firstNameField.Value.ValueType == FieldValueType.String) {
string firstName = firstNameField.Value.AsString();
Console.WriteLine($ " First Name: '{firstName}', with confidence {firstNameField.Confidence}");
}
}
FormField lastNameField;
if (contactNameFields.TryGetValue("LastName", out lastNameField)) {
if (lastNameField.Value.ValueType == FieldValueType.String) {
string lastName = lastNameField.Value.AsString();
Console.WriteLine($ " Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
}
}
}
}
}
}
FormField jobTitlesFields;
if (businessCard.Fields.TryGetValue("JobTitles", out jobTitlesFields)) {
if (jobTitlesFields.Value.ValueType == FieldValueType.List) {
foreach(FormField jobTitleField in jobTitlesFields.Value.AsList()) {
if (jobTitleField.Value.ValueType == FieldValueType.String) {
string jobTitle = jobTitleField.Value.AsString();
Console.WriteLine($ " Job Title: '{jobTitle}', with confidence {jobTitleField.Confidence}");
}
}
}
}
FormField departmentFields;
if (businessCard.Fields.TryGetValue("Departments", out departmentFields)) {
if (departmentFields.Value.ValueType == FieldValueType.List) {
foreach(FormField departmentField in departmentFields.Value.AsList()) {
if (departmentField.Value.ValueType == FieldValueType.String) {
string department = departmentField.Value.AsString();
Console.WriteLine($ " Department: '{department}', with confidence {departmentField.Confidence}");
}
}
}
}
FormField emailFields;
if (businessCard.Fields.TryGetValue("Emails", out emailFields)) {
if (emailFields.Value.ValueType == FieldValueType.List) {
foreach(FormField emailField in emailFields.Value.AsList()) {
if (emailField.Value.ValueType == FieldValueType.String) {
string email = emailField.Value.AsString();
Console.WriteLine($ " Email: '{email}', with confidence {emailField.Confidence}");
}
}
}
}
FormField websiteFields;
if (businessCard.Fields.TryGetValue("Websites", out websiteFields)) {
if (websiteFields.Value.ValueType == FieldValueType.List) {
foreach(FormField websiteField in websiteFields.Value.AsList()) {
if (websiteField.Value.ValueType == FieldValueType.String) {
string website = websiteField.Value.AsString();
Console.WriteLine($ " Website: '{website}', with confidence {websiteField.Confidence}");
}
}
}
}
FormField mobilePhonesFields;
if (businessCard.Fields.TryGetValue("MobilePhones", out mobilePhonesFields)) {
if (mobilePhonesFields.Value.ValueType == FieldValueType.List) {
foreach(FormField mobilePhoneField in mobilePhonesFields.Value.AsList()) {
if (mobilePhoneField.Value.ValueType == FieldValueType.PhoneNumber) {
string mobilePhone = mobilePhoneField.Value.AsPhoneNumber();
Console.WriteLine($ " Mobile phone number: '{mobilePhone}', with confidence {mobilePhoneField.Confidence}");
}
}
}
}
FormField otherPhonesFields;
if (businessCard.Fields.TryGetValue("OtherPhones", out otherPhonesFields)) {
if (otherPhonesFields.Value.ValueType == FieldValueType.List) {
foreach(FormField otherPhoneField in otherPhonesFields.Value.AsList()) {
if (otherPhoneField.Value.ValueType == FieldValueType.PhoneNumber) {
string otherPhone = otherPhoneField.Value.AsPhoneNumber();
Console.WriteLine($ " Other phone number: '{otherPhone}', with confidence {otherPhoneField.Confidence}");
}
}
}
}
FormField faxesFields;
if (businessCard.Fields.TryGetValue("Faxes", out faxesFields)) {
if (faxesFields.Value.ValueType == FieldValueType.List) {
foreach(FormField faxField in faxesFields.Value.AsList()) {
if (faxField.Value.ValueType == FieldValueType.PhoneNumber) {
string fax = faxField.Value.AsPhoneNumber();
Console.WriteLine($ " Fax phone number: '{fax}', with confidence {faxField.Confidence}");
}
}
}
}
FormField addressesFields;
if (businessCard.Fields.TryGetValue("Addresses", out addressesFields)) {
if (addressesFields.Value.ValueType == FieldValueType.List) {
foreach(FormField addressField in addressesFields.Value.AsList()) {
if (addressField.Value.ValueType == FieldValueType.String) {
string address = addressField.Value.AsString();
Console.WriteLine($ " Address: '{address}', with confidence {addressField.Confidence}");
}
}
}
}
FormField companyNamesFields;
if (businessCard.Fields.TryGetValue("CompanyNames", out companyNamesFields)) {
if (companyNamesFields.Value.ValueType == FieldValueType.List) {
foreach(FormField companyNameField in companyNamesFields.Value.AsList()) {
if (companyNameField.Value.ValueType == FieldValueType.String) {
string companyName = companyNameField.Value.AsString();
Console.WriteLine($ " Company name: '{companyName}', with confidence {companyNameField.Confidence}");
}
}
}
}
}
}
Faturaları analiz etme
Bu bölümde, önceden eğitilen bir model kullanılarak satış faturalarından ortak alanların nasıl analiz edileceği ve ayıklanacağı gösterilmektedir. Fatura analizi hakkında daha fazla bilgi için bkz. Fatura kavramsal Kılavuzu.
Bir URL 'den faturaları çözümlemek için StartRecognizeInvoicesFromUriAsync yöntemini kullanın.
private static async Task AnalyzeInvoice(
FormRecognizerClient recognizerClient, string invoiceUrl) {
var options = new RecognizeInvoicesOptions() {
Locale = "en-US"
};
RecognizedFormCollection invoices = await recognizerClient.StartRecognizeInvoicesFromUriAsync(invoiceUrl, options).WaitForCompletionAsync();
İpucu
Yerel fatura görüntülerini da analiz edebilirsiniz. Startrecognizeınices gibi Formrecognizerclient yöntemlerine bakın. veya, yerel görüntüleri ilgilendiren senaryolar için GitHub örnek koda bakın.
Aşağıdaki kod, belirtilen URI 'de faturayı işler ve ana alanları ve değerleri konsola yazdırır.
RecognizedForm invoice = invoices.Single();
FormField invoiceIdField;
if (invoice.Fields.TryGetValue("InvoiceId", out invoiceIdField)) {
if (invoiceIdField.Value.ValueType == FieldValueType.String) {
string invoiceId = invoiceIdField.Value.AsString();
Console.WriteLine($ " Invoice Id: '{invoiceId}', with confidence {invoiceIdField.Confidence}");
}
}
FormField invoiceDateField;
if (invoice.Fields.TryGetValue("InvoiceDate", out invoiceDateField)) {
if (invoiceDateField.Value.ValueType == FieldValueType.Date) {
DateTime invoiceDate = invoiceDateField.Value.AsDate();
Console.WriteLine($ " Invoice Date: '{invoiceDate}', with confidence {invoiceDateField.Confidence}");
}
}
FormField dueDateField;
if (invoice.Fields.TryGetValue("DueDate", out dueDateField)) {
if (dueDateField.Value.ValueType == FieldValueType.Date) {
DateTime dueDate = dueDateField.Value.AsDate();
Console.WriteLine($ " Due Date: '{dueDate}', with confidence {dueDateField.Confidence}");
}
}
FormField vendorNameField;
if (invoice.Fields.TryGetValue("VendorName", out vendorNameField)) {
if (vendorNameField.Value.ValueType == FieldValueType.String) {
string vendorName = vendorNameField.Value.AsString();
Console.WriteLine($ " Vendor Name: '{vendorName}', with confidence {vendorNameField.Confidence}");
}
}
FormField vendorAddressField;
if (invoice.Fields.TryGetValue("VendorAddress", out vendorAddressField)) {
if (vendorAddressField.Value.ValueType == FieldValueType.String) {
string vendorAddress = vendorAddressField.Value.AsString();
Console.WriteLine($ " Vendor Address: '{vendorAddress}', with confidence {vendorAddressField.Confidence}");
}
}
FormField customerNameField;
if (invoice.Fields.TryGetValue("CustomerName", out customerNameField)) {
if (customerNameField.Value.ValueType == FieldValueType.String) {
string customerName = customerNameField.Value.AsString();
Console.WriteLine($ " Customer Name: '{customerName}', with confidence {customerNameField.Confidence}");
}
}
FormField customerAddressField;
if (invoice.Fields.TryGetValue("CustomerAddress", out customerAddressField)) {
if (customerAddressField.Value.ValueType == FieldValueType.String) {
string customerAddress = customerAddressField.Value.AsString();
Console.WriteLine($ " Customer Address: '{customerAddress}', with confidence {customerAddressField.Confidence}");
}
}
FormField customerAddressRecipientField;
if (invoice.Fields.TryGetValue("CustomerAddressRecipient", out customerAddressRecipientField)) {
if (customerAddressRecipientField.Value.ValueType == FieldValueType.String) {
string customerAddressRecipient = customerAddressRecipientField.Value.AsString();
Console.WriteLine($ " Customer address recipient: '{customerAddressRecipient}', with confidence {customerAddressRecipientField.Confidence}");
}
}
FormField invoiceTotalField;
if (invoice.Fields.TryGetValue("InvoiceTotal", out invoiceTotalField)) {
if (invoiceTotalField.Value.ValueType == FieldValueType.Float) {
float invoiceTotal = invoiceTotalField.Value.AsFloat();
Console.WriteLine($ " Invoice Total: '{invoiceTotal}', with confidence {invoiceTotalField.Confidence}");
}
}
}
KIMLIK belgelerini çözümle
Bu bölümde, form tanıyıcı önceden oluşturulmuş KIMLIK modelini kullanarak devlet tarafından verilen tanımlama belgelerinden önemli bilgilerin nasıl analiz edileceği ve ayıklanacağı gösterilmektedir. KIMLIK belgesi analizi hakkında daha fazla bilgi için bkz. önceden oluşturulmuş kimlik modelimiz kavramsal Kılavuzu.
URI 'den KIMLIK belgelerini çözümlemek için StartRecognizeIdentityDocumentsFromUriAsync yöntemini kullanın.
private static async Task AnalyzeId(
FormRecognizerClient recognizerClient, string idUrl) {
RecognizedFormCollection identityDocument = await recognizerClient.StartRecognizeIdDocumentsFromUriAsync(idUrl).WaitForCompletionAsync();
İpucu
Yerel KIMLIK belge görüntülerini da analiz edebilirsiniz. Startrecognizeıdentitydocumentsasync gibi Formrecognizerclient yöntemlerine bakın. ayrıca, yerel görüntüleri ilgilendiren senaryolar için GitHub örnek koda bakın.
Aşağıdaki kod, belirtilen URI 'de KIMLIK belgesini işler ve ana alanları ve değerleri konsola yazdırır.
RecognizedForm identityDocument = identityDocuments.Single();
if (identityDocument.Fields.TryGetValue("Address", out FormField addressField)) {
if (addressField.Value.ValueType == FieldValueType.String) {
string address = addressField.Value.AsString();
Console.WriteLine($ "Address: '{address}', with confidence {addressField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("CountryRegion", out FormField countryRegionField)) {
if (countryRegionField.Value.ValueType == FieldValueType.CountryRegion) {
string countryRegion = countryRegionField.Value.AsCountryRegion();
Console.WriteLine($ "CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("DateOfBirth", out FormField dateOfBirthField)) {
if (dateOfBirthField.Value.ValueType == FieldValueType.Date) {
DateTime dateOfBirth = dateOfBirthField.Value.AsDate();
Console.WriteLine($ "Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("DateOfExpiration", out FormField dateOfExpirationField)) {
if (dateOfExpirationField.Value.ValueType == FieldValueType.Date) {
DateTime dateOfExpiration = dateOfExpirationField.Value.AsDate();
Console.WriteLine($ "Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("DocumentNumber", out FormField documentNumberField)) {
if (documentNumberField.Value.ValueType == FieldValueType.String) {
string documentNumber = documentNumberField.Value.AsString();
Console.WriteLine($ "Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
}
RecognizedForm identityDocument = identityDocuments.Single();
if (identityDocument.Fields.TryGetValue("Address", out FormField addressField)) {
if (addressField.Value.ValueType == FieldValueType.String) {
string address = addressField.Value.AsString();
Console.WriteLine($ "Address: '{address}', with confidence {addressField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("CountryRegion", out FormField countryRegionField)) {
if (countryRegionField.Value.ValueType == FieldValueType.CountryRegion) {
string countryRegion = countryRegionField.Value.AsCountryRegion();
Console.WriteLine($ "CountryRegion: '{countryRegion}', with confidence {countryRegionField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("DateOfBirth", out FormField dateOfBirthField)) {
if (dateOfBirthField.Value.ValueType == FieldValueType.Date) {
DateTime dateOfBirth = dateOfBirthField.Value.AsDate();
Console.WriteLine($ "Date Of Birth: '{dateOfBirth}', with confidence {dateOfBirthField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("DateOfExpiration", out FormField dateOfExpirationField)) {
if (dateOfExpirationField.Value.ValueType == FieldValueType.Date) {
DateTime dateOfExpiration = dateOfExpirationField.Value.AsDate();
Console.WriteLine($ "Date Of Expiration: '{dateOfExpiration}', with confidence {dateOfExpirationField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("DocumentNumber", out FormField documentNumberField)) {
if (documentNumberField.Value.ValueType == FieldValueType.String) {
string documentNumber = documentNumberField.Value.AsString();
Console.WriteLine($ "Document Number: '{documentNumber}', with confidence {documentNumberField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("FirstName", out FormField firstNameField)) {
if (firstNameField.Value.ValueType == FieldValueType.String) {
string firstName = firstNameField.Value.AsString();
Console.WriteLine($ "First Name: '{firstName}', with confidence {firstNameField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("LastName", out FormField lastNameField)) {
if (lastNameField.Value.ValueType == FieldValueType.String) {
string lastName = lastNameField.Value.AsString();
Console.WriteLine($ "Last Name: '{lastName}', with confidence {lastNameField.Confidence}");
}
}
if (identityDocument.Fields.TryGetValue("Region", out FormField regionfield)) {
if (regionfield.Value.ValueType == FieldValueType.String) {
string region = regionfield.Value.AsString();
Console.WriteLine($ "Region: '{region}', with confidence {regionfield.Confidence}");
}
}
Özel bir modeli eğitme
Bu bölümde, bir modelin kendi verilerinize nasıl eğulacağı gösterilmektedir. Eğitilen bir model, özgün form belgesindeki anahtar/değer ilişkilerini içeren yapılandırılmış verileri çıktısını alabilir. Modeli eğdikten sonra, bunu test edebilir ve yeniden eğitebilir ve sonunda, gereksinimlerinize göre daha fazla formdan verileri güvenilir bir şekilde çıkarmak için kullanabilirsiniz.
Not
Modelleri, form tanıyıcı örnek etiketleme aracıgibi bir grafik kullanıcı arabirimi ile de eğitebilirsiniz.
Etiketler olmadan bir modeli eğitme
Eğitim belgelerini el ile etiketlemeden özel formlarınızda bulunan tüm alanları ve değerleri çözümlemek için özel modeller eğitme. Aşağıdaki yöntem, belirli bir belge kümesi üzerinde bir model TRAIN ve modelin durumunu konsola yazdırır.
private static async Task<String> TrainModel(
FormTrainingClient trainingClient, string trainingDataUrl)
{
CustomFormModel model = await trainingClient
.StartTrainingAsync(new Uri(trainingDataUrl), useTrainingLabels: false)
.WaitForCompletionAsync();
Console.WriteLine($"Custom Model Info:");
Console.WriteLine($" Model Id: {model.ModelId}");
Console.WriteLine($" Model Status: {model.Status}");
Console.WriteLine($" Training model started on: {model.TrainingStartedOn}");
Console.WriteLine($" Training model completed on: {model.TrainingCompletedOn}");
Döndürülen CustomFormModel nesne, modelin çözümleyebileceğiniz form türleri ve her form türünden ayıklayabileceğiniz alanlar hakkındaki bilgileri içerir. Aşağıdaki kod bloğu bu bilgileri konsola yazdırır.
foreach (CustomFormSubmodel submodel in model.Submodels)
{
Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
foreach (CustomFormModelField field in submodel.Fields.Values)
{
Console.Write($" FieldName: {field.Name}");
if (field.Label != null)
{
Console.Write($", FieldLabel: {field.Label}");
}
Console.WriteLine("");
}
}
Son olarak, sonraki adımlarda kullanmak üzere eğitilen model KIMLIĞINI döndürün.
return model.ModelId;
}
Çıktı
Bu yanıt okunabilirlik için kesildi.
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
Name: '8GB RAM (Black)', with confidence 0.916
Total Price: '999', with confidence 0.559
Item:
Name: 'SurfacePen', with confidence 0.858
Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Form Page 1 has 18 lines.
Line 0 has 1 word, and text: 'Contoso'.
Line 1 has 1 word, and text: 'Address:'.
Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
Line 3 has 4 words, and text: '1 Redmond way Suite'.
Line 4 has 3 words, and text: '1020 Enterprise Way'.
...
Table 0 has 2 rows and 6 columns.
Cell (0, 0) contains text: 'Invoice Number'.
Cell (0, 1) contains text: 'Invoice Date'.
Cell (0, 2) contains text: 'Invoice Due Date'.
Cell (0, 3) contains text: 'Charges'.
...
Custom Model Info:
Model Id: 95035721-f19d-40eb-8820-0c806b42798b
Model Status: Ready
Training model started on: 8/24/2020 6:36:44 PM +00:00
Training model completed on: 8/24/2020 6:36:50 PM +00:00
Submodel Form Type: form-95035721-f19d-40eb-8820-0c806b42798b
FieldName: CompanyAddress
FieldName: CompanyName
FieldName: CompanyPhoneNumber
...
Custom Model Info:
Model Id: e7a1181b-1fb7-40be-bfbe-1ee154183633
Model Status: Ready
Training model started on: 8/24/2020 6:36:44 PM +00:00
Training model completed on: 8/24/2020 6:36:52 PM +00:00
Submodel Form Type: form-0
FieldName: field-0, FieldLabel: Additional Notes:
FieldName: field-1, FieldLabel: Address:
FieldName: field-2, FieldLabel: Company Name:
FieldName: field-3, FieldLabel: Company Phone:
FieldName: field-4, FieldLabel: Dated As:
FieldName: field-5, FieldLabel: Details
FieldName: field-6, FieldLabel: Email:
FieldName: field-7, FieldLabel: Hero Limited
FieldName: field-8, FieldLabel: Name:
FieldName: field-9, FieldLabel: Phone:
...
Etiketler içeren bir modeli eğitme
Ayrıca, eğitim belgelerini el ile etiketleyerek özel modeller de eğitebilirsiniz. Etiketlerle eğitim, bazı senaryolarda daha iyi performansa yol açar. Etiketlerle eğitebilmeniz için, \<filename\>.pdf.labels.json eğitim belgelerinin yanı sıra BLOB depolama kapsayıcıda özel etiket bilgi dosyalarına () sahip olmanız gerekir. Form tanıyıcı örnek etiketleme aracı , bu etiket dosyalarını oluşturmanıza yardımcı olmak için bir kullanıcı arabirimi sağlar. Bunu yaptıktan sonra, StartTrainingAsync uselabels parametresini olarak ayarlanan parametre ile çağırabilirsiniz true .
private static async Task<Guid> TrainModelWithLabelsAsync(
FormRecognizerClient trainingClient, string trainingDataUrl)
{
CustomFormModel model = await trainingClient
.StartTrainingAsync(new Uri(trainingDataUrl), useTrainingLabels: true)
.WaitForCompletionAsync();
Console.WriteLine($"Custom Model Info:");
Console.WriteLine($" Model Id: {model.ModelId}");
Console.WriteLine($" Model Status: {model.Status}");
Console.WriteLine($" Training model started on: {model.TrainingStartedOn}");
Console.WriteLine($" Training model completed on: {model.TrainingCompletedOn}");
Döndürülen, CustomFormModel modelin ayıklayabileceğiniz alanları, her bir alandaki tahmini doğruluğunu gösterir. Aşağıdaki kod bloğu bu bilgileri konsola yazdırır.
foreach (CustomFormSubmodel submodel in model.Submodels)
{
Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
foreach (CustomFormModelField field in submodel.Fields.Values)
{
Console.Write($" FieldName: {field.Name}");
if (field.Label != null)
{
Console.Write($", FieldLabel: {field.Label}");
}
Console.WriteLine("");
}
}
return model.ModelId;
}
Çıktı
Bu yanıt okunabilirlik için kesildi.
Form Page 1 has 18 lines.
Line 0 has 1 word, and text: 'Contoso'.
Line 1 has 1 word, and text: 'Address:'.
Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
Line 3 has 4 words, and text: '1 Redmond way Suite'.
Line 4 has 3 words, and text: '1020 Enterprise Way'.
Line 5 has 3 words, and text: '6000 Redmond, WA'.
...
Table 0 has 2 rows and 6 columns.
Cell (0, 0) contains text: 'Invoice Number'.
Cell (0, 1) contains text: 'Invoice Date'.
Cell (0, 2) contains text: 'Invoice Due Date'.
...
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
Name: '8GB RAM (Black)', with confidence 0.916
Total Price: '999', with confidence 0.559
Item:
Name: 'SurfacePen', with confidence 0.858
Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Custom Model Info:
Model Id: 63c013e3-1cab-43eb-84b0-f4b20cb9214c
Model Status: Ready
Training model started on: 8/24/2020 6:42:54 PM +00:00
Training model completed on: 8/24/2020 6:43:01 PM +00:00
Submodel Form Type: form-63c013e3-1cab-43eb-84b0-f4b20cb9214c
FieldName: CompanyAddress
FieldName: CompanyName
FieldName: CompanyPhoneNumber
FieldName: DatedAs
FieldName: Email
FieldName: Merchant
...
Formları özel bir model ile analiz etme
Bu bölümde, kendi formlarınız ile eğitilen modeller kullanılarak özel form türlerinizde anahtar/değer bilgilerinin ve diğer içeriklerin nasıl ayıklanacağı gösterilmektedir.
Önemli
Bu senaryoyu uygulamak için, KIMLIĞINI aşağıdaki yönteme geçirebilmeniz için zaten bir model eğitilmeniz gerekir.
StartRecognizeCustomFormsFromUriYöntemini kullanacaksınız.
// Analyze PDF form data
private static async Task AnalyzePdfForm(
FormRecognizerClient recognizerClient, String modelId, string formUrl)
{
RecognizedFormCollection forms = await recognizerClient
.StartRecognizeCustomFormsFromUri(modelId, new Uri(formUrl))
.WaitForCompletionAsync();
İpucu
Yerel bir dosyayı da analiz edebilirsiniz. Startrecognizeccustomforms gibi Formrecognizerclient yöntemlerine bakın. veya, yerel görüntüleri ilgilendiren senaryolar için GitHub örnek koda bakın.
Döndürülen değer bir RecognizedForm nesne koleksiyonudur: gönderilen belgedeki her sayfa için bir tane. Aşağıdaki kod, analiz sonuçlarını konsola yazdırır. Her tanınan alanı ve karşılık gelen değeri, Güvenirlik puanı ile birlikte yazdırır.
foreach (RecognizedForm form in forms)
{
Console.WriteLine($"Form of type: {form.FormType}");
foreach (FormField field in form.Fields.Values)
{
Console.WriteLine($"Field '{field.Name}: ");
if (field.LabelData != null)
{
Console.WriteLine($" Label: '{field.LabelData.Text}");
}
Console.WriteLine($" Value: '{field.ValueData.Text}");
Console.WriteLine($" Confidence: '{field.Confidence}");
}
Console.WriteLine("Table data:");
foreach (FormPage page in form.Pages)
{
for (int i = 0; i < page.Tables.Count; i++)
{
FormTable table = page.Tables[i];
Console.WriteLine($"Table {i} has {table.RowCount} rows and {table.ColumnCount} columns.");
foreach (FormTableCell cell in table.Cells)
{
Console.WriteLine($" Cell ({cell.RowIndex}, {cell.ColumnIndex}) contains {(cell.IsHeader ? "header" : "text")}: '{cell.Text}'");
}
}
}
}
}
Çıktı
Bu yanıt okunabilirlik için kesildi.
Custom Model Info:
Model Id: 9b0108ee-65c8-450e-b527-bb309d054fc4
Model Status: Ready
Training model started on: 8/24/2020 7:00:31 PM +00:00
Training model completed on: 8/24/2020 7:00:32 PM +00:00
Submodel Form Type: form-9b0108ee-65c8-450e-b527-bb309d054fc4
FieldName: CompanyAddress
FieldName: CompanyName
FieldName: CompanyPhoneNumber
...
Form Page 1 has 18 lines.
Line 0 has 1 word, and text: 'Contoso'.
Line 1 has 1 word, and text: 'Address:'.
Line 2 has 3 words, and text: 'Invoice For: Microsoft'.
Line 3 has 4 words, and text: '1 Redmond way Suite'.
...
Table 0 has 2 rows and 6 columns.
Cell (0, 0) contains text: 'Invoice Number'.
Cell (0, 1) contains text: 'Invoice Date'.
Cell (0, 2) contains text: 'Invoice Due Date'.
...
Merchant Name: 'Contoso Contoso', with confidence 0.516
Transaction Date: '6/10/2019 12:00:00 AM', with confidence 0.985
Item:
Name: '8GB RAM (Black)', with confidence 0.916
Total Price: '999', with confidence 0.559
Item:
Name: 'SurfacePen', with confidence 0.858
Total Price: '99.99', with confidence 0.386
Total: '1203.39', with confidence '0.774'
Custom Model Info:
Model Id: dc115156-ce0e-4202-bbe4-7426e7bee756
Model Status: Ready
Training model started on: 8/24/2020 7:00:31 PM +00:00
Training model completed on: 8/24/2020 7:00:41 PM +00:00
Submodel Form Type: form-0
FieldName: field-0, FieldLabel: Additional Notes:
FieldName: field-1, FieldLabel: Address:
FieldName: field-2, FieldLabel: Company Name:
FieldName: field-3, FieldLabel: Company Phone:
FieldName: field-4, FieldLabel: Dated As:
...
Form of type: custom:form
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
Value: '$56,651.49
Confidence: '0.249
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
Value: 'PT
Confidence: '0.245
Field 'Azure.AI.FormRecognizer.Models.FieldValue:
Value: '99243
Confidence: '0.114
...
Özel modelleri yönetme
Bu bölümde, hesabınızda depolanan özel modellerin nasıl yönetileceği gösterilmektedir. Aşağıdaki yöntem içinde birden çok işlem gerçekleştirirsiniz:
private static async Task ManageModels(
FormTrainingClient trainingClient, string trainingFileUrl)
{
Formtanıyıcı kaynak hesabındaki modellerin sayısını denetleyin
Aşağıdaki kod bloğu, form tanıyıcı hesabınıza kaç modelin kaydedildiğini denetler ve hesap limitine göre karşılaştırır.
// Check number of models in the FormRecognizer account,
// and the maximum number of models that can be stored.
AccountProperties accountProperties = trainingClient.GetAccountProperties();
Console.WriteLine($"Account has {accountProperties.CustomModelCount} models.");
Console.WriteLine($"It can have at most {accountProperties.CustomModelLimit} models.");
Çıktı
Account has 20 models.
It can have at most 5000 models.
Şu anda kaynak hesapta depolanan modelleri listeleyin
Aşağıdaki kod bloğu, hesabınızdaki geçerli modelleri listeler ve ayrıntılarını konsola yazdırır.
Pageable<CustomFormModelInfo> models = trainingClient.GetCustomModels();
foreach (CustomFormModelInfo modelInfo in models)
{
Console.WriteLine($"Custom Model Info:");
Console.WriteLine($" Model Id: {modelInfo.ModelId}");
Console.WriteLine($" Model Status: {modelInfo.Status}");
Console.WriteLine($" Training model started on: {modelInfo.TrainingStartedOn}");
Console.WriteLine($" Training model completed on: {modelInfo.TrainingCompletedOn}");
}
Çıktı
Bu yanıt okunabilirlik için kesildi.
Custom Model Info:
Model Id: 05932d5a-a2f8-4030-a2ef-4e5ed7112515
Model Status: Creating
Training model started on: 8/24/2020 7:35:02 PM +00:00
Training model completed on: 8/24/2020 7:35:02 PM +00:00
Custom Model Info:
Model Id: 150828c4-2eb2-487e-a728-60d5d504bd16
Model Status: Ready
Training model started on: 8/24/2020 7:33:25 PM +00:00
Training model completed on: 8/24/2020 7:33:27 PM +00:00
Custom Model Info:
Model Id: 3303e9de-6cec-4dfb-9e68-36510a6ecbb2
Model Status: Ready
Training model started on: 8/24/2020 7:29:27 PM +00:00
Training model completed on: 8/24/2020 7:29:36 PM +00:00
Modelin KIMLIĞINI kullanarak belirli bir modeli al
Aşağıdaki kod bloğu yeni bir model ( model eğitme bölümünde olduğu gibi) ve kimliğini kullanarak ikinci bir başvuru alır.
// Create a new model to store in the account
CustomFormModel model = await trainingClient.StartTrainingAsync(
new Uri(trainingFileUrl)).WaitForCompletionAsync();
// Get the model that was just created
CustomFormModel modelCopy = trainingClient.GetCustomModel(model.ModelId);
Console.WriteLine($"Custom Model {modelCopy.ModelId} recognizes the following form types:");
foreach (CustomFormSubmodel submodel in modelCopy.Submodels)
{
Console.WriteLine($"Submodel Form Type: {submodel.FormType}");
foreach (CustomFormModelField field in submodel.Fields.Values)
{
Console.Write($" FieldName: {field.Name}");
if (field.Label != null)
{
Console.Write($", FieldLabel: {field.Label}");
}
Console.WriteLine("");
}
}
Çıktı
Bu yanıt okunabilirlik için kesildi.
Custom Model Info:
Model Id: 150828c4-2eb2-487e-a728-60d5d504bd16
Model Status: Ready
Training model started on: 8/24/2020 7:33:25 PM +00:00
Training model completed on: 8/24/2020 7:33:27 PM +00:00
Submodel Form Type: form-150828c4-2eb2-487e-a728-60d5d504bd16
FieldName: CompanyAddress
FieldName: CompanyName
FieldName: CompanyPhoneNumber
FieldName: DatedAs
FieldName: Email
FieldName: Merchant
FieldName: PhoneNumber
FieldName: PurchaseOrderNumber
FieldName: Quantity
FieldName: Signature
FieldName: Subtotal
FieldName: Tax
FieldName: Total
FieldName: VendorName
FieldName: Website
...
Kaynak hesabındaki bir modeli silme
Ayrıca, KIMLIĞINE başvurarak hesabınızdan bir modeli silebilirsiniz. Bu adım, yöntemi de kapatır.
// Delete the model from the account.
trainingClient.DeleteModel(model.ModelId);
}
Uygulamayı çalıştırma
Uygulamayı komut ile uygulama dizininizden çalıştırın dotnet run .
dotnet run
Kaynakları temizleme
Bilişsel hizmetler aboneliğini temizlemek ve kaldırmak istiyorsanız, kaynağı veya kaynak grubunu silebilirsiniz. Kaynak grubunun silinmesi, onunla ilişkili diğer tüm kaynakları da siler.
Sorun giderme
.NET SDK kullanarak bilişsel hizmetler form tanıyıcı istemci kitaplığıyla etkileşim kurarken, hizmet tarafından döndürülen hatalar bir ile sonuçlanır RequestFailedException . Bunlar, bir REST API isteği tarafından döndürülen HTTP durum kodunu içerir.
Örneğin, geçersiz bir URI ile bir makbuz görüntüsü gönderirseniz, 400 "bozuk istek" belirten bir hata döndürülür.
try
{
RecognizedReceiptCollection receipts = await client.StartRecognizeReceiptsFromUri(new Uri(receiptUri)).WaitForCompletionAsync();
}
catch (RequestFailedException e)
{
Console.WriteLine(e.ToString());
}
İşlemin istemci istek KIMLIĞI gibi ek bilgilerin günlüğe kaydedileceğini görürsünüz.
Message:
Azure.RequestFailedException: Service request failed.
Status: 400 (Bad Request)
Content:
{"error":{"code":"FailedToDownloadImage","innerError":
{"requestId":"8ca04feb-86db-4552-857c-fde903251518"},
"message":"Failed to download image from input URL."}}
Headers:
Transfer-Encoding: chunked
x-envoy-upstream-service-time: REDACTED
apim-request-id: REDACTED
Strict-Transport-Security: REDACTED
X-Content-Type-Options: REDACTED
Date: Mon, 20 Apr 2020 22:48:35 GMT
Content-Type: application/json; charset=utf-8
Sonraki adımlar
Bu proje için, modelleri eğitmek ve formları farklı yollarla analiz etmek üzere tanıyıcı .NET istemci kitaplığı formunu kullandınız. Daha sonra, daha iyi eğitim veri kümesi oluşturma ve daha doğru modeller üretme hakkında ipuçları edinin.
Bu proje için örnek kod GitHubkullanılabilir.
Önemli
- Bu proje, sürüm Form Tanıma REST API 2.1'i hedefler.
Başvuru belgeleri | Kitaplık kaynak kodu | Paket (Maven) | Örnekler
Önkoşullar
- Azure aboneliği - Ücretsiz bir abonelik oluşturun
- Java Development Kit'in (JDK) geçerli sürümü
- Gradle derleme aracıveya başka bir bağımlılık yöneticisi.
- Azure aboneliğinize sahip olduktan sonra, Form Tanıma uç noktanızı almak için Form Tanıma kaynağı Azure portal kaynak oluşturun. Dağıtımdan sonra Kaynağa git'i seçin.
- Uygulamanıza api'sini bağlamak için, oluşturmakta olduğu kaynakta yer alan anahtara ve uç Form Tanıma gerekir. Anahtarınızı ve uç noktanızı aşağıdaki koda yapıştırın.
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek üzere ücretsiz fiyatlandırma katmanını (
F0) kullanabilirsiniz.
- Azure Depolama veri kümesi içeren bir Azure depolama blobu. Eğitim veri kümenizi bir araya toplamaya yardımcı olacak ipuçları ve seçenekler için bkz. Özel model için eğitim veri kümesi oluşturma. Bu proje için, örnek veri kümesi eğitin klasörünün altındaki dosyaları kullanabilirsiniz (dosyaları indirip sample_data.zip).
Ayarlama
Yeni bir Gradle projesi oluşturma
Konsol penceresinde (cmd, PowerShell veya Bash gibi) uygulama için yeni bir dizin oluşturun ve bu dizine gidin.
mkdir myapp && cd myapp
Komutunu gradle init çalışma dizinden çalıştırın. Bu komut, çalışma zamanında uygulama oluşturmak ve yapılandırmak için kullanılan build.gradle.kts dahil olmak üzere Gradle için temel derleme dosyaları oluşturacak.
gradle init --type basic
DSL seçmeniz istendiğinde Kotlin'i seçin.
İstemci kitaplığını yükleme
Bu proje Gradle bağımlılık yöneticisini kullanır. İstemci kitaplığını ve diğer bağımlılık yöneticilerine ilişkin bilgileri Maven Merkezi Deposu'nda bulabilirsiniz.
Projenizin build.gradle.kts dosyasında, gerekli eklentilerin ve ayarların yanı sıra bir deyimi olarak implementation istemci kitaplığını da dahil edin.
plugins {
java
application
}
application {
mainClass.set("FormRecognizer")
}
repositories {
mavenCentral()
}
dependencies {
implementation(group = "com.azure", name = "azure-ai-formrecognizer", version = "3.1.1")
}
Java dosyası oluşturma
Çalışma dizininize aşağıdaki komutu çalıştırın:
mkdir -p src/main/java
Yeni klasöre gidin ve FormRecognizer.java adlı bir dosya oluşturun. Tercih ettiğiniz düzenleyicide veya IDE'de açın ve aşağıdaki import deyimlerini ekleyin:
import com.azure.ai.formrecognizer.*;
import com.azure.ai.formrecognizer.training.*;
import com.azure.ai.formrecognizer.models.*;
import com.azure.ai.formrecognizer.training.models.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.Context;
import com.azure.core.util.polling.SyncPoller;
Uygulamanın FormRecognizer sınıfında, kaynağınız anahtarı ve uç noktası için değişkenler oluşturun.
static final String key = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
static final String endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
Önemli
Azure portala gidin. Önkoşullar Form Tanıma oluşturduğunuz kaynak başarıyla dağıtılırsa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesine tıklayın. Anahtarınızı ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.
Bitirilen anahtarı kodunuzdan kaldırmayı unutmayın ve hiçbir zaman herkese açık şekilde yayınlayamayabilirsiniz. Üretim için, kimlik bilgilerinizi depolamak ve erişmek için güvenli yöntemler kullanın. Daha fazla bilgi için bkz. Bilişsel Hizmetler güvenliği.
Uygulamanın ana yönteminde, bu projede kullanılan yöntemler için çağrılar ekleyin. Bu çağrıları daha sonra tanımlayabilirsiniz. Eğitim ve test verileriniz için URL'lere başvurular da eklemeniz gerekir.
-
özel model eğitim verilerinize yönelik SAS URL 'sini almak için Azure portal depolama kaynağına gidin ve Depolama Gezgini sekmesini seçin. Kapsayıcınıza gidin, sağ tıklayın ve paylaşılan erişim Imzasını al' ı seçin. Depolama hesabının kendisi için değil, kapsayıcınıza yönelik SAS almak önemlidir. Okuma, yazma, silme ve Listeleme izinlerinin işaretli olduğundan emin olun ve Oluştur' a tıklayın. Sonra URL bölümündeki değeri geçici bir konuma kopyalayın. Şu biçimde olmalıdır:
https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.
Test etmek üzere bir formun URL'sini almak için yukarıdaki adımları kullanarak blob depolamada tek bir belgenin SAS URL'sini edinebilirsiniz. Veya başka bir yerde bulunan belgenin URL'sini de alırsınız.
Makbuz görüntüsünün URL'sini de almak için yukarıdaki yöntemi kullanın.
String trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE";
String formUrl = "PASTE_YOUR_FORM_RECOGNIZER_FORM_URL_HERE";
String receiptUrl = "https://docs.microsoft.com/azure/cognitive-services/form-recognizer/media" + "/contoso-allinone.jpg";
String bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg";
String invoiceUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/forms/Invoice_1.pdf";
String idUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg"
// Call Form Recognizer scenarios:
System.out.println("Get form content...");
GetContent(recognizerClient, formUrl);
System.out.println("Analyze receipt...");
AnalyzeReceipt(recognizerClient, receiptUrl);
System.out.println("Analyze business card...");
AnalyzeBusinessCard(recognizerClient, bcUrl);
System.out.println("Analyze invoice...");
AnalyzeInvoice(recognizerClient, invoiceUrl);
System.out.println("Analyze id...");
AnalyzeId(recognizerClient, idUrl);
System.out.println("Train Model with training data...");
String modelId = TrainModel(trainingClient, trainingDataUrl);
System.out.println("Analyze PDF form...");
AnalyzePdfForm(recognizerClient, modelId, formUrl);
System.out.println("Manage models...");
ManageModels(trainingClient, trainingDataUrl);
Nesne modeli
Bu Form Tanıma iki farklı istemci türü oluşturabilirsiniz. İlki, FormRecognizerClient tanınan form alanları ve içerikle hizmeti sorgulamak için kullanılır. İkincisi, FormTrainingClient tanımayı geliştirmek için özel modeller oluşturmak ve yönetmek için kullanır.
FormRecognizerClient
FormRecognizerClient şunların işlemlerini sağlar:
- Özel formlarınızı analiz etmek için eğitilmiş özel modelleri kullanarak form alanlarını ve içeriği tanıma. Bu değerler bir nesne koleksiyonunda
RecognizedFormdöndürülür. Bkz. Özel formları analiz etme. - Model eğitmeden tablolar, satırlar ve sözcükler gibi form içeriğini tanıma. Form içeriği bir nesne koleksiyonunda
FormPagedöndürülür. Bkz. Örnek Düzeni analiz etme. - Form Tanıma hizmette önceden eğitilmiş bir model kullanarak ABD makbuzları, kartvizitler, faturalar ve kimlik belgelerinden ortak Form Tanıma tanıma.
FormTrainingClient
FormTrainingClient şunların işlemlerini sağlar:
- Özel formlar içinde bulunan tüm alanları ve değerleri analiz etmek için özel modelleri eğitin.
CustomFormModelModelin analiz edilecek form türlerini ve her form türü için ayıklayacak alanları belirten bir döndürülür. - Özel formlarınızı etiketleerek belirttiğiniz belirli alanları ve değerleri analiz etmek için özel modelleri eğitin.
CustomFormModelModelin ayıkeceği alanları ve her alan için tahmini doğruluğu belirten bir döndürülür. - Hesabınızla oluşturulan modelleri yönetme.
- Özel modeli bir kaynaktan Form Tanıma diğerine kopyalama.
Not
Modeller, Form Tanıma Etiketleme Aracı gibi bir grafik kullanıcı arabirimi kullanılarak da eğitilebilirsiniz.
İstemcinin kimliğini doğrulama
Ana yönteminizin en üstüne aşağıdaki kodu ekleyin. Burada, yukarıda tanımlandığı abonelik değişkenlerini kullanarak iki istemci nesnesi kimliğini doğrulayabilirsiniz. Gerekirse yeni istemci nesneleri oluşturmadan API anahtarını güncelleştirebilirsiniz.
FormRecognizerClient recognizerClient = new FormRecognizerClientBuilder()
.credential(new AzureKeyCredential(key)).endpoint(endpoint).buildClient();
FormTrainingClient trainingClient = new FormTrainingClientBuilder().credential(new AzureKeyCredential(key))
.endpoint(endpoint).buildClient();
Düzeni analiz etme
Bir modeli Form Tanıma gerek kalmadan belgelerde tabloları, satırları ve sözcükleri analiz etmek için Form Tanıma'i kullanabilirsiniz. Düzen ayıklama hakkında daha fazla bilgi için bkz. Düzen kavramsal kılavuzu.
Bir dosyanın içeriğini verilen URL'de analiz etmek için beginRecognizeContentFromUrl yöntemini kullanın.
private static void GetContent(FormRecognizerClient recognizerClient, String invoiceUri) {
String analyzeFilePath = invoiceUri;
SyncPoller<FormRecognizerOperationResult, List<FormPage>> recognizeContentPoller = recognizerClient
.beginRecognizeContentFromUrl(analyzeFilePath);
List<FormPage> contentResult = recognizeContentPoller.getFinalResult();
İpucu
Ayrıca yerel bir dosyadan içerik de eldeebilirsiniz. BeginRecognizeContent gibi FormRecognizerClient yöntemlerine bakın. Veya yerel görüntüleri içeren senaryolar için GitHub örnek koda bakın.
Döndürülen değer FormPage nesneleri koleksiyonudur: gönderilen belgedeki her sayfa için bir koleksiyondur. Aşağıdaki kod bu nesnelerde de aynı şekilde ilerler ve ayıklanan anahtar/değer çiftlerini ve tablo verilerini yazdırır.
contentResult.forEach(formPage -> {
// Table information
System.out.println("----Recognizing content ----");
System.out.printf("Has width: %f and height: %f, measured with unit: %s.%n", formPage.getWidth(),
formPage.getHeight(), formPage.getUnit());
formPage.getTables().forEach(formTable -> {
System.out.printf("Table has %d rows and %d columns.%n", formTable.getRowCount(),
formTable.getColumnCount());
formTable.getCells().forEach(formTableCell -> {
System.out.printf("Cell has text %s.%n", formTableCell.getText());
});
System.out.println();
});
});
}
Çıktı
Get form content...
----Recognizing content ----
Has width: 8.500000 and height: 11.000000, measured with unit: inch.
Table has 2 rows and 6 columns.
Cell has text Invoice Number.
Cell has text Invoice Date.
Cell has text Invoice Due Date.
Cell has text Charges.
Cell has text VAT ID.
Cell has text 458176.
Cell has text 3/28/2018.
Cell has text 4/16/2018.
Cell has text $89,024.34.
Cell has text ET.
Makbuzları analiz etme
Bu bölümde, önceden eğitilmiş bir makbuz modeli kullanılarak ABD makbuzlarından ortak alanların nasıl analiz ve ayıklanası gösterilmiş olur. Makbuz analizi hakkında daha fazla bilgi için Makbuzlar kavramsal kılavuzuna bakın.
Bir URI'den gelen makbuzları analiz etmek için beginRecognizeReceiptsFromUrl yöntemini kullanın.
private static void AnalyzeReceipt(FormRecognizerClient recognizerClient, String receiptUri) {
SyncPoller<FormRecognizerOperationResult, List<RecognizedForm>> syncPoller = recognizerClient
.beginRecognizeReceiptsFromUrl(receiptUri);
List<RecognizedForm> receiptPageResults = syncPoller.getFinalResult();
İpucu
Yerel makbuz görüntülerini de analiz edersiniz. BeginRecognizeReceipts gibi FormRecognizerClient yöntemlerine bakın. Veya yerel görüntüleri içeren senaryolar için GitHub örnek koda bakın.
Döndürülen değer, gönderilen belgedeki her sayfa için bir tane olan RecognizedReceipt nesneleri koleksiyonudur. Sonraki kod bloğu, makbuzlarda yeniden çalışır ve ayrıntılarını konsola yazdırır.
for (int i = 0; i < receiptPageResults.size(); i++) {
RecognizedForm recognizedForm = receiptPageResults.get(i);
Map<String, FormField> recognizedFields = recognizedForm.getFields();
System.out.printf("----------- Recognized Receipt page %d -----------%n", i);
FormField merchantNameField = recognizedFields.get("MerchantName");
if (merchantNameField != null) {
if (FieldValueType.STRING == merchantNameField.getValue().getValueType()) {
String merchantName = merchantNameField.getValue().asString();
System.out.printf("Merchant Name: %s, confidence: %.2f%n", merchantName,
merchantNameField.getConfidence());
}
}
FormField merchantAddressField = recognizedFields.get("MerchantAddress");
if (merchantAddressField != null) {
if (FieldValueType.STRING == merchantAddressField.getValue().getValueType()) {
String merchantAddress = merchantAddressField.getValue().asString();
System.out.printf("Merchant Address: %s, confidence: %.2f%n", merchantAddress,
merchantAddressField.getConfidence());
}
}
FormField transactionDateField = recognizedFields.get("TransactionDate");
if (transactionDateField != null) {
if (FieldValueType.DATE == transactionDateField.getValue().getValueType()) {
LocalDate transactionDate = transactionDateField.getValue().asDate();
System.out.printf("Transaction Date: %s, confidence: %.2f%n", transactionDate,
transactionDateField.getConfidence());
}
}
Sonraki kod bloğu, makbuzda algılanan tek tek öğelerde yeniden çalışır ve ayrıntılarını konsola yazdırır.
FormField receiptItemsField = recognizedFields.get("Items");
if (receiptItemsField != null) {
System.out.printf("Receipt Items: %n");
if (FieldValueType.LIST == receiptItemsField.getValue().getValueType()) {
List<FormField> receiptItems = receiptItemsField.getValue().asList();
receiptItems.stream()
.filter(receiptItem -> FieldValueType.MAP == receiptItem.getValue().getValueType())
.map(formField -> formField.getValue().asMap())
.forEach(formFieldMap -> formFieldMap.forEach((key, formField) -> {
if ("Name".equals(key)) {
if (FieldValueType.STRING == formField.getValue().getValueType()) {
String name = formField.getValue().asString();
System.out.printf("Name: %s, confidence: %.2fs%n", name,
formField.getConfidence());
}
}
if ("Quantity".equals(key)) {
if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
Float quantity = formField.getValue().asFloat();
System.out.printf("Quantity: %f, confidence: %.2f%n", quantity,
formField.getConfidence());
}
}
if ("Price".equals(key)) {
if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
Float price = formField.getValue().asFloat();
System.out.printf("Price: %f, confidence: %.2f%n", price,
formField.getConfidence());
}
}
if ("TotalPrice".equals(key)) {
if (FieldValueType.FLOAT == formField.getValue().getValueType()) {
Float totalPrice = formField.getValue().asFloat();
System.out.printf("Total Price: %f, confidence: %.2f%n", totalPrice,
formField.getConfidence());
}
}
}));
}
}
}
}
Çıktı
Analyze receipt...
----------- Recognized Receipt page 0 -----------
Merchant Name: Contoso Contoso, confidence: 0.62
Merchant Address: 123 Main Street Redmond, WA 98052, confidence: 0.99
Transaction Date: 2020-06-10, confidence: 0.90
Receipt Items:
Name: Cappuccino, confidence: 0.96s
Quantity: null, confidence: 0.957s]
Total Price: 2.200000, confidence: 0.95
Name: BACON & EGGS, confidence: 0.94s
Quantity: null, confidence: 0.927s]
Total Price: null, confidence: 0.93
Kartvizitleri analiz etme
Bu bölümde, önceden eğitilmiş bir model kullanılarak İngilizce kartvizitlerden ortak alanların nasıl analiz ve ayıklanası gösterilmiş. Kartvizit analizi hakkında daha fazla bilgi için kartvizit kavramsal kılavuzuna bakın.
BIR URL'den kartvizitleri analiz etmek için yöntemini beginRecognizeBusinessCardsFromUrl kullanın.
private static void AnalyzeBusinessCard(FormRecognizerClient recognizerClient, String bcUrl) {
SyncPoller < FormRecognizerOperationResult,
List < RecognizedForm >> recognizeBusinessCardPoller = client.beginRecognizeBusinessCardsFromUrl(businessCardUrl);
List < RecognizedForm > businessCardPageResults = recognizeBusinessCardPoller.getFinalResult();
İpucu
Ayrıca yerel kartvizit görüntülerini de analiz edersiniz. BeginRecognizeBusinessCards gibi FormRecognizerClient yöntemlerine bakın. Veya yerel görüntüleri içeren senaryolar için GitHub örnek koda bakın.
Döndürülen değer, belgedeki her kart için bir tane olan RecognizedForm nesneleri koleksiyonudur. Aşağıdaki kod, verilen URI'de kartviziti işler ve büyük alanları ve değerleri konsola yazdırır.
for (int i = 0; i < businessCardPageResults.size(); i++) {
RecognizedForm recognizedForm = businessCardPageResults.get(i);
Map < String,
FormField > recognizedFields = recognizedForm.getFields();
System.out.printf("----------- Recognized business card info for page %d -----------%n", i);
FormField contactNamesFormField = recognizedFields.get("ContactNames");
if (contactNamesFormField != null) {
if (FieldValueType.LIST == contactNamesFormField.getValue().getValueType()) {
List < FormField > contactNamesList = contactNamesFormField.getValue().asList();
contactNamesList.stream().filter(contactName - >FieldValueType.MAP == contactName.getValue().getValueType()).map(contactName - >{
System.out.printf("Contact name: %s%n", contactName.getValueData().getText());
return contactName.getValue().asMap();
}).forEach(contactNamesMap - >contactNamesMap.forEach((key, contactName) - >{
if ("FirstName".equals(key)) {
if (FieldValueType.STRING == contactName.getValue().getValueType()) {
String firstName = contactName.getValue().asString();
System.out.printf("\tFirst Name: %s, confidence: %.2f%n", firstName, contactName.getConfidence());
}
}
if ("LastName".equals(key)) {
if (FieldValueType.STRING == contactName.getValue().getValueType()) {
String lastName = contactName.getValue().asString();
System.out.printf("\tLast Name: %s, confidence: %.2f%n", lastName, contactName.getConfidence());
}
}
}));
}
}
FormField jobTitles = recognizedFields.get("JobTitles");
if (jobTitles != null) {
if (FieldValueType.LIST == jobTitles.getValue().getValueType()) {
List < FormField > jobTitlesItems = jobTitles.getValue().asList();
jobTitlesItems.stream().forEach(jobTitlesItem - >{
if (FieldValueType.STRING == jobTitlesItem.getValue().getValueType()) {
String jobTitle = jobTitlesItem.getValue().asString();
System.out.printf("Job Title: %s, confidence: %.2f%n", jobTitle, jobTitlesItem.getConfidence());
}
});
}
}
FormField departments = recognizedFields.get("Departments");
if (departments != null) {
if (FieldValueType.LIST == departments.getValue().getValueType()) {
List < FormField > departmentsItems = departments.getValue().asList();
departmentsItems.stream().forEach(departmentsItem - >{
if (FieldValueType.STRING == departmentsItem.getValue().getValueType()) {
String department = departmentsItem.getValue().asString();
System.out.printf("Department: %s, confidence: %.2f%n", department, departmentsItem.getConfidence());
}
});
}
}
FormField emails = recognizedFields.get("Emails");
if (emails != null) {
if (FieldValueType.LIST == emails.getValue().getValueType()) {
List < FormField > emailsItems = emails.getValue().asList();
emailsItems.stream().forEach(emailsItem - >{
if (FieldValueType.STRING == emailsItem.getValue().getValueType()) {
String email = emailsItem.getValue().asString();
System.out.printf("Email: %s, confidence: %.2f%n", email, emailsItem.getConfidence());
}
});
}
}
FormField websites = recognizedFields.get("Websites");
if (websites != null) {
if (FieldValueType.LIST == websites.getValue().getValueType()) {
List < FormField > websitesItems = websites.getValue().asList();
websitesItems.stream().forEach(websitesItem - >{
if (FieldValueType.STRING == websitesItem.getValue().getValueType()) {
String website = websitesItem.getValue().asString();
System.out.printf("Web site: %s, confidence: %.2f%n", website, websitesItem.getConfidence());
}
});
}
}
FormField mobilePhones = recognizedFields.get("MobilePhones");
if (mobilePhones != null) {
if (FieldValueType.LIST == mobilePhones.getValue().getValueType()) {
List < FormField > mobilePhonesItems = mobilePhones.getValue().asList();
mobilePhonesItems.stream().forEach(mobilePhonesItem - >{
if (FieldValueType.PHONE_NUMBER == mobilePhonesItem.getValue().getValueType()) {
String mobilePhoneNumber = mobilePhonesItem.getValue().asPhoneNumber();
System.out.printf("Mobile phone number: %s, confidence: %.2f%n", mobilePhoneNumber, mobilePhonesItem.getConfidence());
}
});
}
}
FormField otherPhones = recognizedFields.get("OtherPhones");
if (otherPhones != null) {
if (FieldValueType.LIST == otherPhones.getValue().getValueType()) {
List < FormField > otherPhonesItems = otherPhones.getValue().asList();
otherPhonesItems.stream().forEach(otherPhonesItem - >{
if (FieldValueType.PHONE_NUMBER == otherPhonesItem.getValue().getValueType()) {
String otherPhoneNumber = otherPhonesItem.getValue().asPhoneNumber();
System.out.printf("Other phone number: %s, confidence: %.2f%n", otherPhoneNumber, otherPhonesItem.getConfidence());
}
});
}
}
FormField faxes = recognizedFields.get("Faxes");
if (faxes != null) {
if (FieldValueType.LIST == faxes.getValue().getValueType()) {
List < FormField > faxesItems = faxes.getValue().asList();
faxesItems.stream().forEach(faxesItem - >{
if (FieldValueType.PHONE_NUMBER == faxesItem.getValue().getValueType()) {
String faxPhoneNumber = faxesItem.getValue().asPhoneNumber();
System.out.printf("Fax phone number: %s, confidence: %.2f%n", faxPhoneNumber, faxesItem.getConfidence());
}
});
}
}
FormField addresses = recognizedFields.get("Addresses");
if (addresses != null) {
if (FieldValueType.LIST == addresses.getValue().getValueType()) {
List < FormField > addressesItems = addresses.getValue().asList();
addressesItems.stream().forEach(addressesItem - >{
if (FieldValueType.STRING == addressesItem.getValue().getValueType()) {
String address = addressesItem.getValue().asString();
System.out.printf("Address: %s, confidence: %.2f%n", address, addressesItem.getConfidence());
}
});
}
}
FormField companyName = recognizedFields.get("CompanyNames");
if (companyName != null) {
if (FieldValueType.LIST == companyName.getValue().getValueType()) {
List < FormField > companyNameItems = companyName.getValue().asList();
companyNameItems.stream().forEach(companyNameItem - >{
if (FieldValueType.STRING == companyNameItem.getValue().getValueType()) {
String companyNameValue = companyNameItem.getValue().asString();
System.out.printf("Company name: %s, confidence: %.2f%n", companyNameValue, companyNameItem.getConfidence());
}
});
}
}
}
}
Faturaları analiz etme
Bu bölümde, önceden eğitilmiş bir model kullanılarak satış faturalarından ortak alanların nasıl analiz ve ayıklanası gösterilmiş olur. Fatura analizi hakkında daha fazla bilgi için bkz. Fatura kavramsal kılavuzu.
BIR URL'den faturaları analiz etmek için yöntemini beginRecognizeInvoicesFromUrl kullanın.
private static void AnalyzeInvoice(FormRecognizerClient recognizerClient, String invoiceUrl) {
SyncPoller < FormRecognizerOperationResult,
List < RecognizedForm >> recognizeInvoicesPoller = client.beginRecognizeInvoicesFromUrl(invoiceUrl);
List < RecognizedForm > recognizedInvoices = recognizeInvoicesPoller.getFinalResult();
İpucu
Yerel faturaları da analiz etmek için kullanabilirsiniz. BeginRecognizeInvoices gibi FormRecognizerClient yöntemlerine bakın. Veya yerel görüntüleri içeren senaryolar için GitHub örnek koda bakın.
Döndürülen değer, belgedeki her fatura için bir tane olan RecognizedForm nesneleri koleksiyonudur. Aşağıdaki kod, verilen URI'de faturayı işler ve büyük alanları ve değerleri konsola yazdırır.
for (int i = 0; i < recognizedInvoices.size(); i++) {
RecognizedForm recognizedInvoice = recognizedInvoices.get(i);
Map < String,
FormField > recognizedFields = recognizedInvoice.getFields();
System.out.printf("----------- Recognized invoice info for page %d -----------%n", i);
FormField vendorNameField = recognizedFields.get("VendorName");
if (vendorNameField != null) {
if (FieldValueType.STRING == vendorNameField.getValue().getValueType()) {
String merchantName = vendorNameField.getValue().asString();
System.out.printf("Vendor Name: %s, confidence: %.2f%n", merchantName, vendorNameField.getConfidence());
}
}
FormField vendorAddressField = recognizedFields.get("VendorAddress");
if (vendorAddressField != null) {
if (FieldValueType.STRING == vendorAddressField.getValue().getValueType()) {
String merchantAddress = vendorAddressField.getValue().asString();
System.out.printf("Vendor address: %s, confidence: %.2f%n", merchantAddress, vendorAddressField.getConfidence());
}
}
FormField customerNameField = recognizedFields.get("CustomerName");
if (customerNameField != null) {
if (FieldValueType.STRING == customerNameField.getValue().getValueType()) {
String merchantAddress = customerNameField.getValue().asString();
System.out.printf("Customer Name: %s, confidence: %.2f%n", merchantAddress, customerNameField.getConfidence());
}
}
FormField customerAddressRecipientField = recognizedFields.get("CustomerAddressRecipient");
if (customerAddressRecipientField != null) {
if (FieldValueType.STRING == customerAddressRecipientField.getValue().getValueType()) {
String customerAddr = customerAddressRecipientField.getValue().asString();
System.out.printf("Customer Address Recipient: %s, confidence: %.2f%n", customerAddr, customerAddressRecipientField.getConfidence());
}
}
FormField invoiceIdField = recognizedFields.get("InvoiceId");
if (invoiceIdField != null) {
if (FieldValueType.STRING == invoiceIdField.getValue().getValueType()) {
String invoiceId = invoiceIdField.getValue().asString();
System.out.printf("Invoice Id: %s, confidence: %.2f%n", invoiceId, invoiceIdField.getConfidence());
}
}
FormField invoiceDateField = recognizedFields.get("InvoiceDate");
if (customerNameField != null) {
if (FieldValueType.DATE == invoiceDateField.getValue().getValueType()) {
LocalDate invoiceDate = invoiceDateField.getValue().asDate();
System.out.printf("Invoice Date: %s, confidence: %.2f%n", invoiceDate, invoiceDateField.getConfidence());
}
}
FormField invoiceTotalField = recognizedFields.get("InvoiceTotal");
if (customerAddressRecipientField != null) {
if (FieldValueType.FLOAT == invoiceTotalField.getValue().getValueType()) {
Float invoiceTotal = invoiceTotalField.getValue().asFloat();
System.out.printf("Invoice Total: %.2f, confidence: %.2f%n", invoiceTotal, invoiceTotalField.getConfidence());
}
}
}
}
Kimlik belgelerini analiz etme
Bu bölümde, önceden oluşturulmuş kimlik modeli kullanılarak kamu tarafından verilen kimlik belgelerinden (dünya genelindeki passportlar ve ABD sürücü lisansları) önemli bilgileri analiz Form Tanıma ve ayıklama adımları yer almaktadır. Kimlik belgesi analizi hakkında daha fazla bilgi için önceden oluşturulmuş tanımlama modeli kavramsal kılavuzumuza bakın.
Bir URI'den kimlik belgelerini analiz etmek için yöntemini beginRecognizeIdentityDocumentsFromUrl kullanın.
private static void AnalyzeId(FormRecognizerClient client, String idUrl) {
SyncPoller < FormRecognizerOperationResult,
List < RecognizedForm >> analyzeIdentityDocumentPoller = client.beginRecognizeIdentityDocumentsFromUrl(licenseDocumentUrl);
List < RecognizedForm > identityDocumentResults = analyzeIdentityDocumentPoller.getFinalResult();
İpucu
Ayrıca yerel kimlik belgesi görüntülerini de analiz edersiniz. BeginRecognizeIdentityDocuments gibi FormRecognizerClient yöntemlerine bakın. Ayrıca yerel görüntüleri içeren senaryolar için GitHub örnek koda bakın.
Aşağıdaki kod, verilen URI'deki Kimlik belgesini işler ve büyük alanları ve değerleri konsola yazdırır.
for (int i = 0; i < identityDocumentResults.size(); i++) {
RecognizedForm recognizedForm = identityDocumentResults.get(i);
Map < String,
FormField > recognizedFields = recognizedForm.getFields();
System.out.printf("----------- Recognized license info for page %d -----------%n", i);
FormField addressField = recognizedFields.get("Address");
if (addressField != null) {
if (FieldValueType.STRING == addressField.getValue().getValueType()) {
String address = addressField.getValue().asString();
System.out.printf("Address: %s, confidence: %.2f%n", address, addressField.getConfidence());
}
}
FormField countryRegionFormField = recognizedFields.get("CountryRegion");
if (countryRegionFormField != null) {
if (FieldValueType.STRING == countryRegionFormField.getValue().getValueType()) {
String countryRegion = countryRegionFormField.getValue().asCountryRegion();
System.out.printf("Country or region: %s, confidence: %.2f%n", countryRegion, countryRegionFormField.getConfidence());
}
}
FormField dateOfBirthField = recognizedFields.get("DateOfBirth");
if (dateOfBirthField != null) {
if (FieldValueType.DATE == dateOfBirthField.getValue().getValueType()) {
LocalDate dateOfBirth = dateOfBirthField.getValue().asDate();
System.out.printf("Date of Birth: %s, confidence: %.2f%n", dateOfBirth, dateOfBirthField.getConfidence());
}
}
FormField dateOfExpirationField = recognizedFields.get("DateOfExpiration");
if (dateOfExpirationField != null) {
if (FieldValueType.DATE == dateOfExpirationField.getValue().getValueType()) {
LocalDate expirationDate = dateOfExpirationField.getValue().asDate();
System.out.printf("Document date of expiration: %s, confidence: %.2f%n", expirationDate, dateOfExpirationField.getConfidence());
}
}
FormField documentNumberField = recognizedFields.get("DocumentNumber");
if (documentNumberField != null) {
if (FieldValueType.STRING == documentNumberField.getValue().getValueType()) {
String documentNumber = documentNumberField.getValue().asString();
System.out.printf("Document number: %s, confidence: %.2f%n", documentNumber, documentNumberField.getConfidence());
}
}
FormField firstNameField = recognizedFields.get("FirstName");
if (firstNameField != null) {
if (FieldValueType.STRING == firstNameField.getValue().getValueType()) {
String firstName = firstNameField.getValue().asString();
System.out.printf("First Name: %s, confidence: %.2f%n", firstName, documentNumberField.getConfidence());
}
}
FormField lastNameField = recognizedFields.get("LastName");
if (lastNameField != null) {
if (FieldValueType.STRING == lastNameField.getValue().getValueType()) {
String lastName = lastNameField.getValue().asString();
System.out.printf("Last name: %s, confidence: %.2f%n", lastName, lastNameField.getConfidence());
}
}
FormField regionField = recognizedFields.get("Region");
if (regionField != null) {
if (FieldValueType.STRING == regionField.getValue().getValueType()) {
String region = regionField.getValue().asString();
System.out.printf("Region: %s, confidence: %.2f%n", region, regionField.getConfidence());
}
}
}
Özel bir modeli eğitme
Bu bölümde modeli kendi verilerinizle eğitebilirsiniz. Eğitilen bir model, özgün form belgesinde anahtar/değer ilişkilerini içeren yapılandırılmış veriler çıkışı sağlar. Modeli eğitdikten sonra test etmek ve yeniden eğitmek ve sonunda daha fazla formdan verileri ihtiyaçlarınıza göre güvenilir bir şekilde ayıklamak için kullanabilirsiniz.
Not
Ayrıca, Form Tanıma Örnek Etiketleme aracı gibi bir grafik kullanıcı arabirimiyle modelleri eğitebilirsiniz.
Etiket olmadan modeli eğitin
Eğitim belgelerini el ile etiketlemeden özel formlarda bulunan tüm alanları ve değerleri analiz etmek için özel modelleri eğitin.
Aşağıdaki yöntem, bir modeli verilen belge kümesinde eğitiyor ve modelin durumunu konsola yazdıriyor.
private static String TrainModel(FormTrainingClient trainingClient, String trainingDataUrl) {
SyncPoller<FormRecognizerOperationResult, CustomFormModel> trainingPoller = trainingClient
.beginTraining(trainingDataUrl, false);
CustomFormModel customFormModel = trainingPoller.getFinalResult();
// Model Info
System.out.printf("Model Id: %s%n", customFormModel.getModelId());
System.out.printf("Model Status: %s%n", customFormModel.getModelStatus());
System.out.printf("Training started on: %s%n", customFormModel.getTrainingStartedOn());
System.out.printf("Training completed on: %s%n%n", customFormModel.getTrainingCompletedOn());
Döndürülen CustomFormModel nesnesi, modelin çözümleyene form türleri ve her form türünden ayıklayabilirsiniz alanları hakkında bilgi içerir. Aşağıdaki kod bloğu bu bilgileri konsola yazdırır.
System.out.println("Recognized Fields:");
// looping through the subModels, which contains the fields they were trained on
// Since the given training documents are unlabeled, we still group them but
// they do not have a label.
customFormModel.getSubmodels().forEach(customFormSubmodel -> {
// Since the training data is unlabeled, we are unable to return the accuracy of
// this model
System.out.printf("The subModel has form type %s%n", customFormSubmodel.getFormType());
customFormSubmodel.getFields().forEach((field, customFormModelField) -> System.out
.printf("The model found field '%s' with label: %s%n", field, customFormModelField.getLabel()));
});
Son olarak, bu yöntem modelin benzersiz kimliğini döndürür.
return customFormModel.getModelId();
}
Çıktı
Train Model with training data...
Model Id: 20c3544d-97b4-49d9-b39b-dc32d85f1358
Model Status: ready
Training started on: 2020-08-31T16:52:09Z
Training completed on: 2020-08-31T16:52:23Z
Recognized Fields:
The subModel has form type form-0
The model found field 'field-0' with label: Address:
The model found field 'field-1' with label: Charges
The model found field 'field-2' with label: Invoice Date
The model found field 'field-3' with label: Invoice Due Date
The model found field 'field-4' with label: Invoice For:
The model found field 'field-5' with label: Invoice Number
The model found field 'field-6' with label: VAT ID
Etiketleri olan bir modeli eğitin
Eğitim belgelerini el ile etiketleerek de özel modelleri eğitebilirsiniz. Etiketlerle eğitim, bazı senaryolarda daha iyi performansa neden olur. Etiketlerle eğitmek için blob depolama kapsayıcınıza eğitim belgeleriyle birlikte özel etiket bilgileri <filename> dosyalarına (.pdf.labels.json) sahip olmak gerekir. Örnek Form Tanıma aracı, bu etiket dosyalarını oluşturmanıza yardımcı olacak bir kullanıcı arabirimi sağlar. Bunları olduktan sonra, useTrainingLabels parametresi olarak ayarlanmış şekilde beginTraining yöntemini çağırebilirsiniz. true
private static String TrainModelWithLabels(FormTrainingClient trainingClient, String trainingDataUrl) {
// Train custom model
String trainingSetSource = trainingDataUrl;
SyncPoller<FormRecognizerOperationResult, CustomFormModel> trainingPoller = trainingClient
.beginTraining(trainingSetSource, true);
CustomFormModel customFormModel = trainingPoller.getFinalResult();
// Model Info
System.out.printf("Model Id: %s%n", customFormModel.getModelId());
System.out.printf("Model Status: %s%n", customFormModel.getModelStatus());
System.out.printf("Training started on: %s%n", customFormModel.getTrainingStartedOn());
System.out.printf("Training completed on: %s%n%n", customFormModel.getTrainingCompletedOn());
Döndürülen CustomFormModel, modelin ayıklayabilirsiniz alanları ve her alanda tahmini doğruluğunu gösterir. Aşağıdaki kod bloğu bu bilgileri konsola yazdırır.
// looping through the subModels, which contains the fields they were trained on
// The labels are based on the ones you gave the training document.
System.out.println("Recognized Fields:");
// Since the data is labeled, we are able to return the accuracy of the model
customFormModel.getSubmodels().forEach(customFormSubmodel -> {
System.out.printf("The subModel with form type %s has accuracy: %.2f%n", customFormSubmodel.getFormType(),
customFormSubmodel.getAccuracy());
customFormSubmodel.getFields()
.forEach((label, customFormModelField) -> System.out.printf(
"The model found field '%s' to have name: %s with an accuracy: %.2f%n", label,
customFormModelField.getName(), customFormModelField.getAccuracy()));
});
return customFormModel.getModelId();
}
Çıktı
Train Model with training data...
Model Id: 20c3544d-97b4-49d9-b39b-dc32d85f1358
Model Status: ready
Training started on: 2020-08-31T16:52:09Z
Training completed on: 2020-08-31T16:52:23Z
Recognized Fields:
The subModel has form type form-0
The model found field 'field-0' with label: Address:
The model found field 'field-1' with label: Charges
The model found field 'field-2' with label: Invoice Date
The model found field 'field-3' with label: Invoice Due Date
The model found field 'field-4' with label: Invoice For:
The model found field 'field-5' with label: Invoice Number
The model found field 'field-6' with label: VAT ID
Özel modelle formları analiz etme
Bu bölümde, kendi formlarınızı kullanarak eğitilmiş modelleri kullanarak özel form türlerinden anahtar/değer bilgilerini ve diğer içerikleri ayıklamayı gösterir.
Önemli
Bu senaryoyu uygulamak için modeli aşağıdaki yönteme geçirebilirsiniz. Model eğitma bölümüne bakın.
beginRecognizeCustomFormsFromUrl yöntemini kullanasiniz.
// Analyze PDF form data
private static void AnalyzePdfForm(FormRecognizerClient formClient, String modelId, String pdfFormUrl) {
SyncPoller<FormRecognizerOperationResult, List<RecognizedForm>> recognizeFormPoller = formClient
.beginRecognizeCustomFormsFromUrl(modelId, pdfFormUrl);
List<RecognizedForm> recognizedForms = recognizeFormPoller.getFinalResult();
İpucu
Yerel bir dosyayı da analiz edersiniz. BeginRecognizeCustomForms gibi FormRecognizerClient yöntemlerine bakın. Veya yerel görüntüleri içeren senaryolar için GitHub örnek koda bakın.
Döndürülen değer, gönderilen belgedeki her sayfa için bir tane olan RecognizedForm nesneleri koleksiyonudur. Aşağıdaki kod, analiz sonuçlarını konsola yazdırır. Tanınan her alanı ve karşılık gelen değeri ve bir güven puanını yazdırır.
for (int i = 0; i < recognizedForms.size(); i++) {
final RecognizedForm form = recognizedForms.get(i);
System.out.printf("----------- Recognized custom form info for page %d -----------%n", i);
System.out.printf("Form type: %s%n", form.getFormType());
form.getFields().forEach((label, formField) ->
// label data is populated if you are using a model trained with unlabeled data,
// since the service needs to make predictions for labels if not explicitly
// given to it.
System.out.printf("Field '%s' has label '%s' with a confidence " + "score of %.2f.%n", label,
formField.getLabelData().getText(), formField.getConfidence()));
}
}
Çıktı
Analyze PDF form...
----------- Recognized custom form info for page 0 -----------
Form type: form-0
Field 'field-0' has label 'Address:' with a confidence score of 0.91.
Field 'field-1' has label 'Invoice For:' with a confidence score of 1.00.
Field 'field-2' has label 'Invoice Number' with a confidence score of 1.00.
Field 'field-3' has label 'Invoice Date' with a confidence score of 1.00.
Field 'field-4' has label 'Invoice Due Date' with a confidence score of 1.00.
Field 'field-5' has label 'Charges' with a confidence score of 1.00.
Field 'field-6' has label 'VAT ID' with a confidence score of 1.00.
Özel modelleri yönetme
Bu bölümde, hesapta depolanan özel modellerin nasıl yönetlandığı açıklanıyor. Aşağıdaki kod, örnek olarak tüm model yönetim görevlerini tek bir yöntemde yapar. Başlangıç olarak aşağıdaki yöntem imzasını kopyalayın:
private static void ManageModels(FormTrainingClient trainingClient, String trainingFileUrl) {
FormRecognizer kaynak hesabında model sayısını denetleme
Aşağıdaki kod bloğu, hesap hesabınıza kaç model Form Tanıma ve bunu hesap sınırıyla karşılaştırıldığında denetler.
AtomicReference<String> modelId = new AtomicReference<>();
// First, we see how many custom models we have, and what our limit is
AccountProperties accountProperties = trainingClient.getAccountProperties();
System.out.printf("The account has %s custom models, and we can have at most %s custom models",
accountProperties.getCustomModelCount(), accountProperties.getCustomModelLimit());
Çıktı
The account has 12 custom models, and we can have at most 250 custom models
Kaynak hesabında şu anda depolanan modelleri listele
Aşağıdaki kod bloğu, hesabınızdaki geçerli modelleri listeler ve ayrıntılarını konsola yazdırır.
// Next, we get a paged list of all of our custom models
PagedIterable<CustomFormModelInfo> customModels = trainingClient.listCustomModels();
System.out.println("We have following models in the account:");
customModels.forEach(customFormModelInfo -> {
System.out.printf("Model Id: %s%n", customFormModelInfo.getModelId());
// get custom model info
modelId.set(customFormModelInfo.getModelId());
CustomFormModel customModel = trainingClient.getCustomModel(customFormModelInfo.getModelId());
System.out.printf("Model Id: %s%n", customModel.getModelId());
System.out.printf("Model Status: %s%n", customModel.getModelStatus());
System.out.printf("Training started on: %s%n", customModel.getTrainingStartedOn());
System.out.printf("Training completed on: %s%n", customModel.getTrainingCompletedOn());
customModel.getSubmodels().forEach(customFormSubmodel -> {
System.out.printf("Custom Model Form type: %s%n", customFormSubmodel.getFormType());
System.out.printf("Custom Model Accuracy: %.2f%n", customFormSubmodel.getAccuracy());
if (customFormSubmodel.getFields() != null) {
customFormSubmodel.getFields().forEach((fieldText, customFormModelField) -> {
System.out.printf("Field Text: %s%n", fieldText);
System.out.printf("Field Accuracy: %.2f%n", customFormModelField.getAccuracy());
});
}
});
});
Çıktı
Bu yanıt okunabilirlik için kesildi.
We have following models in the account:
Model Id: 0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Model Id: 0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Model Status: ready
Training started on: 2020-06-04T18:33:08Z
Training completed on: 2020-06-04T18:33:10Z
Custom Model Form type: form-0b048b60-86cc-47ec-9782-ad0ffaf7a5ce
Custom Model Accuracy: 1.00
Field Text: invoice date
Field Accuracy: 1.00
Field Text: invoice number
Field Accuracy: 1.00
...
Kaynak hesabından model silme
Ayrıca, kimliğine başvurarak modeli hesabınızdan silebilirsiniz.
// Delete Custom Model
System.out.printf("Deleted model with model Id: %s, operation completed with status: %s%n", modelId.get(),
trainingClient.deleteModelWithResponse(modelId.get(), Context.NONE).getStatusCode());
}
Uygulamayı çalıştırma
Ana proje dizininize geri gidin. Ardından, aşağıdaki komutla uygulamayı derleme:
gradle build
Uygulamayı şu hedefle run çalıştırın:
gradle run
Kaynakları temizleme
Bilişsel Hizmetler aboneliğini temizlemek ve kaldırmak için kaynağı veya kaynak grubunu silebilirsiniz. Kaynak grubunun silinmesi, kaynak grubuyla ilişkilendirilmiş diğer tüm kaynakları da siler.
Sorun giderme
Form Tanıma özel durumlar ErrorResponseException oluşturur. Örneğin, geçersiz bir dosya kaynağı URL'si sağlamayı denersanız, hatanın nedenini ErrorResponseException belirten bir hata ile bir ortaya çıkar. Aşağıdaki kod parçacığında hata, özel durum yakalanarak ve hatayla ilgili ek bilgiler görüntü tarafından doğru şekilde işleniyor.
try {
formRecognizerClient.beginRecognizeContentFromUrl("invalidSourceUrl");
} catch (ErrorResponseException e) {
System.out.println(e.getMessage());
}
İstemci günlüğünü etkinleştirme
Java için Azure SDK'ları, uygulama hatalarını gidermeye ve çözümlerini hızlandırmak için tutarlı bir günlük hikayesi sunar. Üretilen günlükler, kök sorunun bulunmasına yardımcı olmak için terminal durumuna ulaşmadan önce uygulamanın akışını yakalar. Günlüğe kaydetmeyi etkinleştirme hakkında rehberlik için günlük wiki'sini görüntüleme.
Sonraki adımlar
Bu proje için, modelleri eğitmek ve formları Form Tanıma analiz etmek için Java istemci kitaplığını kullandınız. Ardından, daha iyi bir eğitim veri kümesi oluşturma ve daha doğru modeller üretmeye yardımcı olacak ipuçları hakkında bilgi edinmek için.
Bu projenin örnek kodu (ve daha fazlası) GitHub.
Önemli
Bu proje, sürüm Form Tanıma REST API 2.1'i hedefler.
Başvuru belgeleri | Kitaplık kaynak kodu | Paket (npm) | Örnekler
Önkoşullar
- Azure aboneliği - Ücretsiz bir abonelik oluşturun
- Node.js'nin geçerli sürümü
- Azure Depolama veri kümesi içeren bir Azure depolama blobu. Eğitim veri kümenizi bir araya toplamaya yardımcı olacak ipuçları ve seçenekler için bkz. Özel model için eğitim veri kümesi oluşturma. Bu proje için, örnek veri kümesi eğitin klasörünün altındaki dosyaları kullanabilirsiniz (dosyaları indirip sample_data.zip).
- Azure aboneliğinize sahip olduktan sonra, Form Tanıma uç noktanızı almak için Form Tanıma kaynağı Azure portal kaynak oluşturun. Dağıtımdan sonra Kaynağa git'i seçin.
- Uygulamanıza api'sini bağlamak için, oluşturmakta olduğu kaynakta yer alan anahtara ve uç Form Tanıma gerekir. Anahtarınızı ve uç noktanızı daha sonra projesinde aşağıdaki koda yapıştırabilirsiniz
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek üzere ücretsiz fiyatlandırma katmanını (
F0) kullanabilirsiniz.
Ayarlama
Yeni bir Node.js uygulaması oluşturma
Konsol penceresinde (cmd, PowerShell veya Bash gibi) uygulama için yeni bir dizin oluşturun ve bu dizine gidin.
mkdir myapp && cd myapp
komutunu npm init çalıştırarak bir dosya ile düğüm uygulaması package.json oluşturun.
npm init
İstemci kitaplığını yükleme
ai-form-recognizerNPM paketini yükleyin:
npm install @azure/ai-form-recognizer
Uygulamanın package.json dosyası bağımlılıklarla güncelleştirilir.
adlı bir dosya index.js oluşturun, dosyayı açın ve aşağıdaki kitaplıkları içeri aktarın:
const { FormRecognizerClient, FormTrainingClient, AzureKeyCredential } = require("@azure/ai-form-recognizer");
const fs = require("fs");
Kaynağınıza azure uç noktası ve anahtarı için değişkenler oluşturun.
const apiKey = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE";
const endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE";
Önemli
Azure portala gidin. Önkoşullar Form Tanıma oluşturduğunuz kaynak başarıyla dağıtılırsa, Sonraki Adımlar'ın altındaki Kaynağa Git düğmesine tıklayın. Anahtarınızı ve uç noktanızı kaynağın anahtar ve uç nokta sayfasında, kaynak yönetimi altında bulabilirsiniz.
Bitirilen anahtarı kodunuzdan kaldırmayı unutmayın ve hiçbir zaman herkese açık şekilde yayınlayamayabilirsiniz. Üretim için, kimlik bilgilerinizi depolamak ve erişmek için güvenli yöntemler kullanın. Daha fazla bilgi için Bilişsel Hizmetler güvenlik makalemize bakın.
Nesne modeli
Bu Form Tanıma iki farklı istemci türü oluşturabilirsiniz. İlki, FormRecognizerClient tanınan form alanları ve içerikle hizmeti sorgulamak için kullanılır. İkincisi, FormTrainingClient tanımayı geliştirmek için özel modeller oluşturmak ve yönetmek için kullanılır.
FormRecognizerClient
FormRecognizerClient şunların işlemlerini sağlar:
- Özel formlarınızı analiz etmek için eğitilmiş özel modelleri kullanarak form alanlarını ve içeriği tanıma. Bu değerler bir nesne koleksiyonunda
RecognizedFormdöndürülür. - Model eğitmeden tablolar, satırlar ve sözcükler gibi form içeriğini tanıma. Form içeriği bir nesne koleksiyonunda
FormPagedöndürülür. - Form Tanıma hizmette önceden eğitilmiş bir model kullanarak ABD makbuzları, kartvizitler, faturalar ve kimlik belgelerinden ortak Form Tanıma tanıma.
FormTrainingClient
FormTrainingClient şunların işlemlerini sağlar:
- Özel formlar içinde bulunan tüm alanları ve değerleri analiz etmek için özel modelleri eğitin.
CustomFormModelModelin analiz edilecek form türlerini ve her form türü için ayıklayacak alanları belirten bir döndürülür. Daha fazla bilgi için, hizmetin etiketsiz model eğitimiyle ilgili belgelerine bakın. - Özel formlarınızı etiketleerek belirttiğiniz belirli alanları ve değerleri analiz etmek için özel modelleri eğitin.
CustomFormModelModelin ayıkeceği alanları ve her bir alan için tahmini doğruluğu belirten bir döndürülür. Eğitim veri kümesine etiket uygulama hakkında daha ayrıntılı bir açıklama için hizmetin etiketli model eğitimi belgelerine bakın. - Hesabınızla oluşturulan modelleri yönetme.
- Özel modeli bir kaynaktan Form Tanıma diğerine kopyalama.
Not
Modeller, Form Tanıma Etiketleme Aracı gibi bir grafik kullanıcı arabirimi kullanılarak da eğitilebilirsiniz.
İstemcinin kimliğini doğrulama
Tanımlandığı abonelik değişkenlerini kullanarak bir istemci nesnesinin kimliğini doğrulama. Gerekirse yeni istemci AzureKeyCredential nesneleri oluşturmadan API anahtarını güncelleştirebilirsiniz. Ayrıca bir eğitim istemcisi nesnesi de oluşturabilirsiniz.
const trainingClient = new FormTrainingClient(endpoint, new AzureKeyCredential(apiKey));
const client = new FormRecognizerClient(endpoint, new AzureKeyCredential(apiKey));
Test için varlıkları al
Eğitim ve test verileriniz için URL'lere başvurular da eklemeniz gerekir.
-
özel model eğitim verilerinize yönelik SAS URL 'sini almak için Azure portal depolama kaynağına gidin ve Depolama Gezgini sekmesini seçin. Kapsayıcınıza gidin, sağ tıklayın ve paylaşılan erişim Imzasını al' ı seçin. Depolama hesabının kendisi için değil, kapsayıcınıza yönelik SAS almak önemlidir. Okuma, yazma, silme ve Listeleme izinlerinin işaretli olduğundan emin olun ve Oluştur' a tıklayın. Sonra URL bölümündeki değeri geçici bir konuma kopyalayın. Şu biçimde olmalıdır:
https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.
Aşağıdaki örneklerde yer alan örnek ve makbuz görüntülerini kullanın (GitHub'da da kullanılabilir)veya blob depolamada tek bir belgenin SAS URL'sini almak için yukarıdaki adımları kullanabilirsiniz.
Düzeni analiz etme
Bir modeli Form Tanıma gerek kalmadan belgelerde tabloları, satırları ve sözcükleri analiz etmek için Form Tanıma'i kullanabilirsiniz. Düzen ayıklama hakkında daha fazla bilgi için bkz. Düzen kavramsal kılavuzu. Bir dosyanın içeriğini verilen bir URI'de analiz etmek için yöntemini beginRecognizeContentFromUrl kullanın.
async function recognizeContent() {
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
const poller = await client.beginRecognizeContentFromUrl(formUrl);
const pages = await poller.pollUntilDone();
if (!pages || pages.length === 0) {
throw new Error("Expecting non-empty list of pages!");
}
for (const page of pages) {
console.log(
`Page ${page.pageNumber}: width ${page.width} and height ${page.height} with unit ${page.unit}`
);
for (const table of page.tables) {
for (const cell of table.cells) {
console.log(`cell [${cell.rowIndex},${cell.columnIndex}] has text ${cell.text}`);
}
}
}
}
recognizeContent().catch((err) => {
console.error("The sample encountered an error:", err);
});
İpucu
Ayrıca, beginRecognizeContent gibi FormRecognizerClient yöntemleriyle yerel bir dosyadan içerik de elde edersiniz.
Çıktı
Page 1: width 8.5 and height 11 with unit inch
cell [0,0] has text Invoice Number
cell [0,1] has text Invoice Date
cell [0,2] has text Invoice Due Date
cell [0,3] has text Charges
cell [0,5] has text VAT ID
cell [1,0] has text 34278587
cell [1,1] has text 6/18/2017
cell [1,2] has text 6/24/2017
cell [1,3] has text $56,651.49
cell [1,5] has text PT
Makbuzları analiz etme
Bu bölümde, önceden eğitilmiş bir makbuz modeli kullanılarak ABD makbuzlarından ortak alanların nasıl analiz ve ayıklan bir şekilde ayıklanları gösterilmiş olur. Makbuz analizi hakkında daha fazla bilgi için Makbuzlar kavramsal kılavuzuna bakın.
Bir URI'den gelen makbuzları analiz etmek için yöntemini beginRecognizeReceiptsFromUrl kullanın. Aşağıdaki kod, verilen URI'de bir makbuzu işler ve büyük alanları ve değerleri konsola yazdırır.
async function recognizeReceipt() {
receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png";
const poller = await client.beginRecognizeReceiptsFromUrl(receiptUrl, {
onProgress: (state) => { console.log(`status: ${state.status}`); }
});
const receipts = await poller.pollUntilDone();
if (!receipts || receipts.length <= 0) {
throw new Error("Expecting at lease one receipt in analysis result");
}
const receipt = receipts[0];
console.log("First receipt:");
const receiptTypeField = receipt.fields["ReceiptType"];
if (receiptTypeField.valueType === "string") {
console.log(` Receipt Type: '${receiptTypeField.value || "<missing>"}', with confidence of ${receiptTypeField.confidence}`);
}
const merchantNameField = receipt.fields["MerchantName"];
if (merchantNameField.valueType === "string") {
console.log(` Merchant Name: '${merchantNameField.value || "<missing>"}', with confidence of ${merchantNameField.confidence}`);
}
const transactionDate = receipt.fields["TransactionDate"];
if (transactionDate.valueType === "date") {
console.log(` Transaction Date: '${transactionDate.value || "<missing>"}', with confidence of ${transactionDate.confidence}`);
}
const itemsField = receipt.fields["Items"];
if (itemsField.valueType === "array") {
for (const itemField of itemsField.value || []) {
if (itemField.valueType === "object") {
const itemNameField = itemField.value["Name"];
if (itemNameField.valueType === "string") {
console.log(` Item Name: '${itemNameField.value || "<missing>"}', with confidence of ${itemNameField.confidence}`);
}
}
}
}
const totalField = receipt.fields["Total"];
if (totalField.valueType === "number") {
console.log(` Total: '${totalField.value || "<missing>"}', with confidence of ${totalField.confidence}`);
}
}
recognizeReceipt().catch((err) => {
console.error("The sample encountered an error:", err);
});
İpucu
Ayrıca, beginRecognizeReceipts gibi FormRecognizerClient yöntemleriyle yerel makbuz görüntülerini analiz de edersiniz.
Çıktı
status: notStarted
status: running
status: succeeded
First receipt:
Receipt Type: 'Itemized', with confidence of 0.659
Merchant Name: 'Contoso Contoso', with confidence of 0.516
Transaction Date: 'Sun Jun 09 2019 17:00:00 GMT-0700 (Pacific Daylight Time)', with confidence of 0.985
Item Name: '8GB RAM (Black)', with confidence of 0.916
Item Name: 'SurfacePen', with confidence of 0.858
Total: '1203.39', with confidence of 0.774
Kartvizitleri analiz etme
Bu bölümde, önceden eğitilmiş bir model kullanılarak İngilizce dilindeki kartvizitlerden ortak alanların nasıl analiz ve ayıklanası gösterilmiş. Kartvizit analizi hakkında daha fazla bilgi için kartvizit kavramsal kılavuzuna bakın.
BIR URL'den kartvizitleri analiz etmek için yöntemini beginRecognizeBusinessCardsFromURL kullanın.
async function recognizeBusinessCards() {
bcUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/businessCard.png";
const poller = await client.beginRecognizeBusinessCardsFromUrl(bcUrl, {
onProgress: (state) => {
console.log(`status: ${state.status}`);
}
});
const [businessCard] = await poller.pollUntilDone();
if (businessCard === undefined) {
throw new Error("Failed to extract data from at least one business card.");
}
const contactNames = businessCard.fields["ContactNames"].value;
if (Array.isArray(contactNames)) {
console.log("- Contact Names:");
for (const contactName of contactNames) {
if (contactName.valueType === "object") {
const firstName = contactName.value?.["FirstName"].value ?? "<no first name>";
const lastName = contactName.value?.["LastName"].value ?? "<no last name>";
console.log(` - ${firstName} ${lastName} (${contactName.confidence} confidence)`);
}
}
}
printSimpleArrayField(businessCard, "CompanyNames");
printSimpleArrayField(businessCard, "Departments");
printSimpleArrayField(businessCard, "JobTitles");
printSimpleArrayField(businessCard, "Emails");
printSimpleArrayField(businessCard, "Websites");
printSimpleArrayField(businessCard, "Addresses");
printSimpleArrayField(businessCard, "MobilePhones");
printSimpleArrayField(businessCard, "Faxes");
printSimpleArrayField(businessCard, "WorkPhones");
printSimpleArrayField(businessCard, "OtherPhones");
}
// Helper function to print array field values.
function printSimpleArrayField(businessCard, fieldName) {
const fieldValues = businessCard.fields[fieldName]?.value;
if (Array.isArray(fieldValues)) {
console.log(`- ${fieldName}:`);
for (const item of fieldValues) {
console.log(` - ${item.value ?? "<no value>"} (${item.confidence} confidence)`);
}
} else if (fieldValues === undefined) {
console.log(`No ${fieldName} were found in the document.`);
} else {
console.error(
`Error: expected field "${fieldName}" to be an Array, but it was a(n) ${businessCard.fields[fieldName].valueType}`
);
}
}
recognizeBusinessCards().catch((err) => {
console.error("The sample encountered an error:", err);
});
İpucu
Ayrıca, beginRecognizeBusinessCards gibi FormRecognizerClient yöntemleriyle yerel kartvizit görüntülerini analiz de edersiniz.
Faturaları analiz etme
Bu bölümde, önceden eğitilmiş bir model kullanılarak satış faturalarından ortak alanların nasıl analiz ve ayıklanası gösterilmiş olur. Fatura analizi hakkında daha fazla bilgi için bkz. Fatura kavramsal kılavuzu.
Url'den faturaları analiz etmek için yöntemini beginRecognizeInvoicesFromUrl kullanın.
async function recognizeInvoices() {
invoiceUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/invoice_sample.jpg";
const poller = await client.beginRecognizeInvoicesFromUrl(invoiceUrl, {
onProgress: (state) => {
console.log(`status: ${state.status}`);
}
});
const [invoice] = await poller.pollUntilDone();
if (invoice === undefined) {
throw new Error("Failed to extract data from at least one invoice.");
}
// Helper function to print fields.
function fieldToString(field) {
const {
name,
valueType,
value,
confidence
} = field;
return `${name} (${valueType}): '${value}' with confidence ${confidence}'`;
}
console.log("Invoice fields:");
for (const [name, field] of Object.entries(invoice.fields)) {
if (field.valueType !== "array" && field.valueType !== "object") {
console.log(`- ${name} ${fieldToString(field)}`);
}
}
let idx = 0;
console.log("- Items:");
const items = invoice.fields["Items"]?.value;
for (const item of items ?? []) {
const value = item.value;
const subFields = [
"Description",
"Quantity",
"Unit",
"UnitPrice",
"ProductCode",
"Date",
"Tax",
"Amount"
]
.map((fieldName) => value[fieldName])
.filter((field) => field !== undefined);
console.log(
[
` - Item #${idx}`,
// Now we will convert those fields into strings to display
...subFields.map((field) => ` - ${fieldToString(field)}`)
].join("\n")
);
}
}
recognizeInvoices().catch((err) => {
console.error("The sample encountered an error:", err);
});
İpucu
Ayrıca, beginRecognizeInvoices gibi FormRecognizerClient yöntemleriyle yerel makbuz görüntülerini analizebilirsiniz.
Kimlik belgelerini analiz etme
Bu bölümde, önceden oluşturulmuş kimlik modeli kullanılarak devlet tarafından verilen kimlik belgelerinden (dünya genelindeki passportlar ve ABD sürücü lisansları) önemli bilgileri analiz Form Tanıma ayıklama adımları yer almaktadır. Kimlik belgesi analizi hakkında daha fazla bilgi için önceden oluşturulmuş tanımlama modeli kavramsal kılavuzumuza bakın.
URL'deki kimlik belgelerini analiz etmek için yöntemini beginRecognizeIdDocumentsFromUrl kullanın.
async function recognizeIdDocuments() {
idUrl = "https://github.com/Azure-Samples/cognitive-services-REST-api-samples/curl/form-recognizer/id-license.jpg";
const poller = await client.beginRecognizeIdDocumentsFromUrl(idUrl, {
onProgress: (state) => {
console.log(`status: ${state.status}`);
}
});
const [idDocument] = await poller.pollUntilDone();
if (idDocument === undefined) {
throw new Error("Failed to extract data from at least one identity document.");
}
console.log("Document Type:", idDocument.formType);
console.log("Identity Document Fields:");
function printField(fieldName) {
// Fields are extracted from the `fields` property of the document result
const field = idDocument.fields[fieldName];
console.log(
`- ${fieldName} (${field?.valueType}): '${field?.value ?? "<missing>"}', with confidence ${field?.confidence
}`
);
}
printField("FirstName");
printField("LastName");
printField("DocumentNumber");
printField("DateOfBirth");
printField("DateOfExpiration");
printField("Sex");
printField("Address");
printField("Country");
printField("Region");
}
recognizeIdDocuments().catch((err) => {
console.error("The sample encountered an error:", err);
});
Özel bir modeli eğitme
Bu bölümde modeli kendi verilerinizle eğitebilirsiniz. Eğitilen bir model, özgün form belgesinde anahtar/değer ilişkilerini içeren yapılandırılmış veriler çıkışını verir. Modeli eğitdikten sonra test etmek ve yeniden eğitmek ve sonunda daha fazla formdan ihtiyaçlarınıza göre güvenilir bir şekilde veri ayıklamak için kullanabilirsiniz.
Not
Ayrıca, Form Tanıma Örnek Etiketleme aracı gibi bir grafik kullanıcı arabirimi (GUI) ile modelleri eğitebilirsiniz.
Etiket olmadan modeli eğitin
Eğitim belgelerini el ile etiketlemeden özel formlar içinde bulunan tüm alanları ve değerleri analiz etmek için özel modelleri eğitin.
Aşağıdaki işlev, modeli verilen belge kümesinde eğitiyor ve modelin durumunu konsola yazdıriyor.
async function trainModel() {
const containerSasUrl = "<SAS-URL-of-your-form-folder-in-blob-storage>";
const poller = await trainingClient.beginTraining(containerSasUrl, false, {
onProgress: (state) => { console.log(`training status: ${state.status}`); }
});
const model = await poller.pollUntilDone();
if (!model) {
throw new Error("Expecting valid training result!");
}
console.log(`Model ID: ${model.modelId}`);
console.log(`Status: ${model.status}`);
console.log(`Training started on: ${model.trainingStartedOn}`);
console.log(`Training completed on: ${model.trainingCompletedOn}`);
if (model.submodels) {
for (const submodel of model.submodels) {
// since the training data is unlabeled, we are unable to return the accuracy of this model
console.log("We have recognized the following fields");
for (const key in submodel.fields) {
const field = submodel.fields[key];
console.log(`The model found field '${field.name}'`);
}
}
}
// Training document information
if (model.trainingDocuments) {
for (const doc of model.trainingDocuments) {
console.log(`Document name: ${doc.name}`);
console.log(`Document status: ${doc.status}`);
console.log(`Document page count: ${doc.pageCount}`);
console.log(`Document errors: ${doc.errors}`);
}
}
}
trainModel().catch((err) => {
console.error("The sample encountered an error:", err);
});
Çıktı
Aşağıda, JavaScript SDK'dan edinilen eğitim verileriyle eğitilmiş bir modelin çıkışı verilmiştir. Bu örnek çıktı okunabilirlik için kesildi.
training status: creating
training status: ready
Model ID: 9d893595-1690-4cf2-a4b1-fbac0fb11909
Status: ready
Training started on: Thu Aug 20 2020 20:27:26 GMT-0700 (Pacific Daylight Time)
Training completed on: Thu Aug 20 2020 20:27:37 GMT-0700 (Pacific Daylight Time)
We have recognized the following fields
The model found field 'field-0'
The model found field 'field-1'
The model found field 'field-2'
The model found field 'field-3'
The model found field 'field-4'
The model found field 'field-5'
The model found field 'field-6'
The model found field 'field-7'
...
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors:
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors:
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors:
...
Etiketleri olan bir modeli eğitin
Eğitim belgelerini el ile etiketleerek de özel modelleri eğitebilirsiniz. Etiketlerle eğitim, bazı senaryolarda daha iyi performansa neden olur. Etiketlerle eğitmek için blob depolama kapsayıcınıza eğitim belgeleriyle birlikte özel etiket bilgileri dosyalarına ( \<filename\>.pdf.labels.json ) sahip olmak gerekir. Örnek Form Tanıma aracı, bu etiket dosyalarını oluşturmanıza yardımcı olacak bir kullanıcı arabirimi sağlar. Bunları olduktan sonra parametresi olarak beginTraining ayarlanmış şekilde uselabels yöntemini true çağırebilirsiniz.
async function trainModelLabels() {
const containerSasUrl = "<SAS-URL-of-your-form-folder-in-blob-storage>";
const poller = await trainingClient.beginTraining(containerSasUrl, true, {
onProgress: (state) => { console.log(`training status: ${state.status}`); }
});
const model = await poller.pollUntilDone();
if (!model) {
throw new Error("Expecting valid training result!");
}
console.log(`Model ID: ${model.modelId}`);
console.log(`Status: ${model.status}`);
console.log(`Training started on: ${model.trainingStartedOn}`);
console.log(`Training completed on: ${model.trainingCompletedOn}`);
if (model.submodels) {
for (const submodel of model.submodels) {
// since the training data is unlabeled, we are unable to return the accuracy of this model
console.log("We have recognized the following fields");
for (const key in submodel.fields) {
const field = submodel.fields[key];
console.log(`The model found field '${field.name}'`);
}
}
}
// Training document information
if (model.trainingDocuments) {
for (const doc of model.trainingDocuments) {
console.log(`Document name: ${doc.name}`);
console.log(`Document status: ${doc.status}`);
console.log(`Document page count: ${doc.pageCount}`);
console.log(`Document errors: ${doc.errors}`);
}
}
}
trainModelLabels().catch((err) => {
console.error("The sample encountered an error:", err);
});
Çıktı
Aşağıda, JavaScript SDK'sı ile kullanılabilen eğitim verileriyle eğitilmiş bir modelin çıkışı verilmiştir. Bu örnek çıktı okunabilirlik için kesildi.
training status: creating
training status: ready
Model ID: 789b1b37-4cc3-4e36-8665-9dde68618072
Status: ready
Training started on: Thu Aug 20 2020 20:30:37 GMT-0700 (Pacific Daylight Time)
Training completed on: Thu Aug 20 2020 20:30:43 GMT-0700 (Pacific Daylight Time)
We have recognized the following fields
The model found field 'CompanyAddress'
The model found field 'CompanyName'
The model found field 'CompanyPhoneNumber'
The model found field 'DatedAs'
...
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: undefined
...
Özel modelle formları analiz etme
Bu bölümde, kendi formlarınızı kullanarak eğitilmiş modelleri kullanarak özel form türlerinden anahtar/değer bilgilerini ve diğer içerikleri ayıklamayı gösterir.
Önemli
Bu senaryoyu uygulamak için modeli aşağıdaki yönteme geçirebilirsiniz. Model eğitma bölümüne bakın.
yöntemini beginRecognizeCustomFormsFromUrl kullanasiniz. Döndürülen değer, gönderilen belgedeki RecognizedForm her sayfa için bir nesne koleksiyonudur.
async function recognizeCustom() {
// Model ID from when you trained your model.
const modelId = "<modelId>";
const formUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png";
const poller = await client.beginRecognizeCustomForms(modelId, formUrl, {
onProgress: (state) => { console.log(`status: ${state.status}`); }
});
const forms = await poller.pollUntilDone();
console.log("Forms:");
for (const form of forms || []) {
console.log(`${form.formType}, page range: ${form.pageRange}`);
console.log("Pages:");
for (const page of form.pages || []) {
console.log(`Page number: ${page.pageNumber}`);
console.log("Tables");
for (const table of page.tables || []) {
for (const cell of table.cells) {
console.log(`cell (${cell.rowIndex},${cell.columnIndex}) ${cell.text}`);
}
}
}
console.log("Fields:");
for (const fieldName in form.fields) {
// each field is of type FormField
const field = form.fields[fieldName];
console.log(
`Field ${fieldName} has value '${field.value}' with a confidence score of ${field.confidence}`
);
}
}
}
recognizeCustom().catch((err) => {
console.error("The sample encountered an error:", err);
});
İpucu
Ayrıca, beginRecognizeCustomForms gibi FormRecognizerClient yöntemleriyle yerel dosyaları analiz de edersiniz.
Çıktı
status: notStarted
status: succeeded
Forms:
custom:form, page range: [object Object]
Pages:
Page number: 1
Tables
cell (0,0) Invoice Number
cell (0,1) Invoice Date
cell (0,2) Invoice Due Date
cell (0,3) Charges
cell (0,5) VAT ID
cell (1,0) 34278587
cell (1,1) 6/18/2017
cell (1,2) 6/24/2017
cell (1,3) $56,651.49
cell (1,5) PT
Fields:
Field Merchant has value 'Invoice For:' with a confidence score of 0.116
Field CompanyPhoneNumber has value '$56,651.49' with a confidence score of 0.249
Field VendorName has value 'Charges' with a confidence score of 0.145
Field CompanyAddress has value '1 Redmond way Suite 6000 Redmond, WA' with a confidence score of 0.258
Field CompanyName has value 'PT' with a confidence score of 0.245
Field Website has value '99243' with a confidence score of 0.114
Field DatedAs has value 'undefined' with a confidence score of undefined
Field Email has value 'undefined' with a confidence score of undefined
Field PhoneNumber has value 'undefined' with a confidence score of undefined
Field PurchaseOrderNumber has value 'undefined' with a confidence score of undefined
Field Quantity has value 'undefined' with a confidence score of undefined
Field Signature has value 'undefined' with a confidence score of undefined
Field Subtotal has value 'undefined' with a confidence score of undefined
Field Tax has value 'undefined' with a confidence score of undefined
Field Total has value 'undefined' with a confidence score of undefined
Özel modelleri yönetme
Bu bölümde, hesapta depolanan özel modellerin nasıl yönetlandığı açıklanıyor. Aşağıdaki kod, örnek olarak tüm model yönetim görevlerini tek bir işlevde yapar.
Model sayısını al
Aşağıdaki kod bloğu, şu anda hesapta olan model sayısını alır.
async function countModels() {
// First, we see how many custom models we have, and what our limit is
const accountProperties = await trainingClient.getAccountProperties();
console.log(
`Our account has ${accountProperties.customModelCount} custom models, and we can have at most ${accountProperties.customModelLimit} custom models`
);
}
countModels().catch((err) => {
console.error("The sample encountered an error:", err);
});
Hesapta modellerin listesini al
Aşağıdaki kod bloğu, modelin ne zaman oluşturulduğunda ve geçerli durumuyla ilgili bilgiler de dahil olmak üzere, hesapta kullanılabilir modellerin tam listesini sağlar.
async function listModels() {
// returns an async iteratable iterator that supports paging
const result = trainingClient.listCustomModels();
let i = 0;
for await (const modelInfo of result) {
console.log(`model ${i++}:`);
console.log(modelInfo);
}
}
listModels().catch((err) => {
console.error("The sample encountered an error:", err);
});
Çıktı
model 0:
{
modelId: '453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e',
status: 'invalid',
trainingStartedOn: 2020-08-20T22:28:52.000Z,
trainingCompletedOn: 2020-08-20T22:28:53.000Z
}
model 1:
{
modelId: '628739de-779c-473d-8214-d35c72d3d4f7',
status: 'ready',
trainingStartedOn: 2020-08-20T23:16:51.000Z,
trainingCompletedOn: 2020-08-20T23:16:59.000Z
}
model 2:
{
modelId: '789b1b37-4cc3-4e36-8665-9dde68618072',
status: 'ready',
trainingStartedOn: 2020-08-21T03:30:37.000Z,
trainingCompletedOn: 2020-08-21T03:30:43.000Z
}
model 3:
{
modelId: '9d893595-1690-4cf2-a4b1-fbac0fb11909',
status: 'ready',
trainingStartedOn: 2020-08-21T03:27:26.000Z,
trainingCompletedOn: 2020-08-21T03:27:37.000Z
}
Sayfaya göre model kimliklerinin listesini al
Bu kod bloğu, modellerin ve model kimliklerinin sayfalı bir listesini sağlar.
async function listModelsByPage() {
// using `byPage()`
i = 1;
for await (const response of trainingClient.listCustomModels().byPage()) {
for (const modelInfo of response.modelList) {
console.log(`model ${i++}: ${modelInfo.modelId}`);
}
}
}
listModelsByPage().catch((err) => {
console.error("The sample encountered an error:", err);
});
Çıktı
model 1: 453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e
model 2: 628739de-779c-473d-8214-d35c72d3d4f7
model 3: 789b1b37-4cc3-4e36-8665-9dde68618072
Model kimliğine göre al
Aşağıdaki işlev bir model kimliği alır ve eşleşen model nesnesini alır. Bu işlev varsayılan olarak çağrılmaz.
async function getModel(modelId) {
// Now we'll get the first custom model in the paged list
const model = await client.getCustomModel(modelId);
console.log("--- First Custom Model ---");
console.log(`Model Id: ${model.modelId}`);
console.log(`Status: ${model.status}`);
console.log("Documents used in training:");
for (const doc of model.trainingDocuments || []) {
console.log(`- ${doc.name}`);
}
}
Kaynak hesabından model silme
Ayrıca, kimliğine başvurarak modeli hesabınızdan silebilirsiniz. Bu işlev, verilen kimlikle modeli siler. Bu işlev varsayılan olarak çağrılmaz.
async function deleteModel(modelId) {
await client.deleteModel(modelId);
try {
const deleted = await client.getCustomModel(modelId);
console.log(deleted);
} catch (err) {
// Expected
console.log(`Model with id ${modelId} has been deleted`);
}
}
Çıktı
Model with id 789b1b37-4cc3-4e36-8665-9dde68618072 has been deleted
Uygulamayı çalıştırma
Proje dosyanız üzerinde node komutunu kullanarak uygulamayı çalıştırın.
node index.js
Kaynakları temizleme
Bilişsel Hizmetler aboneliğini temizlemek ve kaldırmak için kaynağı veya kaynak grubunu silebilirsiniz. Kaynak grubunun silinmesi, kaynak grubuyla ilişkilendirilmiş diğer tüm kaynakları da siler.
Sorun giderme
Günlükleri etkinleştirme
Bu kitaplığı kullanırken hata ayıklama günlüklerini görmek için aşağıdaki ortam değişkenlerini ayarlayın.
export DEBUG=azure*
Günlükleri etkinleştirme hakkında daha ayrıntılı yönergeler için paket @azure/logger belgelerine bakın.
Sonraki adımlar
Bu proje için, modelleri eğitmek Form Tanıma formları farklı şekillerde analiz etmek için JavaScript istemci kitaplığını kullandınız. Ardından, daha iyi bir eğitim veri kümesi oluşturma ve daha doğru modeller üretmeye yardımcı olacak ipuçları hakkında bilgi edinmek için.
Ayrıca bkz.
Form Tanıma nedir? <<<<<<< HEAD:articles/applied-ai-services/form-recognizer/includes/how-to-guides/javascript-sdk.md
Bu projeden alınan örnek kod, GitHub. =======
Bu kılavuzdan alınan örnek kod, GitHub.
103f7cf9752d7b4e4c9bf3da2c3649ad27ebfd2f:articles/applied-ai-services/form-recognizer/includes/quickstarts/javascript-sdk.md
Önemli
- Bu proje, 2,1 sürümünü REST API tanıyıcısını hedefliyor.
Başvuru belgeleri | Kitaplık kaynak kodu | Paket (Pypı) | Örnekler
Önkoşullar
- Azure aboneliği- ücretsiz olarak bir tane oluşturun
- Python 3.x
- Python yüklemeniz PIP'yi içermelidir. Komut satırında komutunu çalıştırarak PIP 'nin yüklenip yüklenmediğini kontrol edebilirsiniz
pip --version. Python 'un en son sürümünü yükleyerek PIP 'yi alın.
- Python yüklemeniz PIP'yi içermelidir. Komut satırında komutunu çalıştırarak PIP 'nin yüklenip yüklenmediğini kontrol edebilirsiniz
- eğitim verileri kümesi içeren bir Azure Depolama blobu. Eğitim veri kümesini birlikte yerleştirmeye yönelik ipuçları ve seçenekler için bkz. özel bir model için eğitim verileri kümesi oluşturma . Dosyaları, örnek veri kümesinin eğitme klasörü altında ( sample_data.zip indir ve Ayıkla) kullanabilirsiniz.
- Azure aboneliğiniz olduktan sonra Azure Portal anahtarınızı ve uç noktanızı almak Için bir form tanıyıcı kaynağı oluşturun. Dağıtıldıktan sonra Kaynağa Git' i seçin.
- Uygulamanızı form tanıyıcı API 'sine bağlamak için oluşturduğunuz kaynaktaki anahtar ve uç nokta gerekir. Anahtarınızı ve uç noktanızı aşağıdaki koda yapıştırın.
F0Hizmeti denemek ve daha sonra üretime yönelik ücretli bir katmana yükseltmek için ücretsiz fiyatlandırma katmanını () kullanabilirsiniz.
Ayarlanıyor
İstemci kitaplığını yükler
Python yükledikten sonra, form tanıyıcı istemci kitaplığı 'nın en son sürümünü ile yükleyebilirsiniz:
pip install azure-ai-formrecognizer
Yeni bir Python uygulaması oluşturma
form-recognizer.pyTercih ettiğiniz düzenleyicide veya IDE 'de adlı yeni bir Python uygulaması oluşturun. Ardından aşağıdaki kitaplıkları içeri aktarın.
import os
from azure.core.exceptions import ResourceNotFoundError
from azure.ai.formrecognizer import FormRecognizerClient
from azure.ai.formrecognizer import FormTrainingClient
from azure.core.credentials import AzureKeyCredential
Kaynağınızın Azure uç noktası ve anahtarı için değişkenler oluşturun.
endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"
key = "PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE"
Nesne modeli
Form tanıyıcı ile iki farklı istemci türü oluşturabilirsiniz. İlki, form_recognizer_client hizmeti form alanlarını ve içeriğini tanımak üzere sorgulamak için kullanılır. İkincisi, form_training_client tanımayı geliştirmek üzere özel modeller oluşturmak ve yönetmek için kullanılır.
FormRecognizerClient
form_recognizer_client için işlem sağlar:
- Özel formlarınızı çözümlemek için eğitilen özel modeller kullanarak form alanlarını ve içeriği tanıma.
- Bir modeli eğitme gerekmeden tablolar, satırlar ve sözcükler dahil form içeriğini tanıma.
- Form tanıyıcı hizmetinde önceden eğitilen bir makbuz modeli kullanarak, genel alanları Makbuzlardan tanıyor.
Formtraıningclient
form_training_client için işlem sağlar:
- Özel modellerinizde bulunan tüm alanları ve değerleri çözümlemek için özel modelleri eğitme. Etiketli model eğitimine yönelik hizmetin belgelerinebakın.
- Özel formlarınızı etiketleyerek belirttiğiniz belirli alanları ve değerleri çözümlemek için özel modeller eğitimi yapın. Etiketli model eğitiminde hizmetin belgelerinebakın.
- Hesabınızda oluşturulan modelleri yönetme.
- Özel bir modeli bir form tanıyıcı kaynağından diğerine kopyalama.
Not
Modeller ayrıca form tanıyıcı etiketleme aracıgibi bir grafik kullanıcı arabirimi kullanılarak eğitilmiş olabilir.
İstemcinin kimliğini doğrulama
Burada, yukarıda tanımladığınız abonelik değişkenlerini kullanarak iki istemci nesnesinin kimlik doğrulamasını yapacaksınız. Gerektiğinde, API anahtarını yeni istemci nesneleri oluşturmadan güncelleştirebilmeniz için bir AzureKeyCredential nesnesi kullanacaksınız.
form_recognizer_client = FormRecognizerClient(endpoint, AzureKeyCredential(key))
form_training_client = FormTrainingClient(endpoint, AzureKeyCredential(key))
Test için varlıkları al
Eğitim ve test verileriniz için URL 'lere başvuru eklemeniz gerekir.
-
özel model eğitim verilerinize yönelik SAS URL 'sini almak için Azure portal depolama kaynağına gidin ve Depolama Gezgini sekmesini seçin. Kapsayıcınıza gidin, sağ tıklayın ve paylaşılan erişim Imzasını al' ı seçin. Depolama hesabının kendisi için değil, kapsayıcınıza yönelik SAS almak önemlidir. Okuma, yazma, silme ve Listeleme izinlerinin işaretli olduğundan emin olun ve Oluştur' a tıklayın. Sonra URL bölümündeki değeri geçici bir konuma kopyalayın. Şu biçimde olmalıdır:
https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.
aşağıdaki örneklere dahil edilen örnek form ve alış görüntülerini kullanın ( GitHub de mevcuttur veya blob depolamada tek bir belgenin SAS URL 'sini almak için yukarıdaki adımları kullanabilirsiniz.
Not
Bu projedeki kod parçacıkları, URL 'Ler tarafından erişilen uzak formları kullanır. Bunun yerine yerel form belgelerini işlemek istiyorsanız, başvuru belgelerindeki ilgili yöntemlere ve örneklerebakın.
Düzeni çözümle
Belge içindeki tabloları, satırları ve sözcükleri, bir modeli eğmenize gerek kalmadan analiz etmek için form tanıyıcısı 'nı kullanabilirsiniz. Düzen ayıklama hakkında daha fazla bilgi için bkz. Düzen kavramsal Kılavuzu.
Belirli bir URL 'deki bir dosyanın içeriğini çözümlemek için begin_recognize_content_from_url yöntemini kullanın. Döndürülen değer bir FormPage nesne koleksiyonudur: gönderilen belgedeki her sayfa için bir tane. Aşağıdaki kod bu nesneler boyunca yinelenir ve ayıklanan anahtar/değer çiftlerini ve tablo verilerini yazdırır.
formUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/forms/Form_1.jpg"
poller = form_recognizer_client.begin_recognize_content_from_url(formUrl)
page = poller.result()
table = page[0].tables[0] # page 1, table 1
print("Table found on page {}:".format(table.page_number))
for cell in table.cells:
print("Cell text: {}".format(cell.text))
print("Location: {}".format(cell.bounding_box))
print("Confidence score: {}\n".format(cell.confidence))
İpucu
Ayrıca, gibi Formrecognizerclient yöntemleriyle yerel görüntülerden içerik de alabilirsiniz begin_recognize_content .
Çıktı
Table found on page 1:
Cell text: Invoice Number
Location: [Point(x=0.5075, y=2.8088), Point(x=1.9061, y=2.8088), Point(x=1.9061, y=3.3219), Point(x=0.5075, y=3.3219)]
Confidence score: 1.0
Cell text: Invoice Date
Location: [Point(x=1.9061, y=2.8088), Point(x=3.3074, y=2.8088), Point(x=3.3074, y=3.3219), Point(x=1.9061, y=3.3219)]
Confidence score: 1.0
Cell text: Invoice Due Date
Location: [Point(x=3.3074, y=2.8088), Point(x=4.7074, y=2.8088), Point(x=4.7074, y=3.3219), Point(x=3.3074, y=3.3219)]
Confidence score: 1.0
Cell text: Charges
Location: [Point(x=4.7074, y=2.8088), Point(x=5.386, y=2.8088), Point(x=5.386, y=3.3219), Point(x=4.7074, y=3.3219)]
Confidence score: 1.0
...
Alındıları analiz etme
Bu bölümde, önceden eğitilen bir makbuz modeli kullanılarak ABD makbuzlarından ortak alanların nasıl analiz edileceği ve ayıklanacağı gösterilmektedir. Makbuz analizi hakkında daha fazla bilgi için bkz. alındılar kavramsal Kılavuzu. Bir URL 'den alındıları çözümlemek için begin_recognize_receipts_from_url yöntemini kullanın.
receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png"
poller = form_recognizer_client.begin_recognize_receipts_from_url(receiptUrl)
result = poller.result()
for receipt in result:
for name, field in receipt.fields.items():
if name == "Items":
print("Receipt Items:")
for idx, items in enumerate(field.value):
print("...Item #{}".format(idx + 1))
for item_name, item in items.value.items():
print("......{}: {} has confidence {}".format(item_name, item.value, item.confidence))
else:
print("{}: {} has confidence {}".format(name, field.value, field.confidence))
İpucu
Yerel alındı görüntülerini, gibi Formrecognizerclient yöntemleriyle de analiz edebilirsiniz begin_recognize_receipts .
Çıktı
ReceiptType: Itemized has confidence 0.659
MerchantName: Contoso Contoso has confidence 0.516
MerchantAddress: 123 Main Street Redmond, WA 98052 has confidence 0.986
MerchantPhoneNumber: None has confidence 0.99
TransactionDate: 2019-06-10 has confidence 0.985
TransactionTime: 13:59:00 has confidence 0.968
Receipt Items:
...Item #1
......Name: 8GB RAM (Black) has confidence 0.916
......TotalPrice: 999.0 has confidence 0.559
...Item #2
......Quantity: None has confidence 0.858
......Name: SurfacePen has confidence 0.858
......TotalPrice: 99.99 has confidence 0.386
Subtotal: 1098.99 has confidence 0.964
Tax: 104.4 has confidence 0.713
Total: 1203.39 has confidence 0.774
İş kartlarını çözümle
Bu bölümde, önceden eğitilen bir model kullanarak Ingilizce iş kartlarından ortak alanların nasıl analiz edileceği ve ayıklanacağı gösterilmektedir. İş kartı analizi hakkında daha fazla bilgi için bkz. iş kartları kavramsal Kılavuzu.
Bir URL 'den iş kartlarını çözümlemek için begin_recognize_business_cards_from_url yöntemini kullanın.
bcUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_forms/business_cards/business-card-english.jpg"
poller = form_recognizer_client.begin_recognize_business_cards_from_url(bcUrl)
business_cards = poller.result()
for idx, business_card in enumerate(business_cards):
print("--------Recognizing business card #{}--------".format(idx+1))
contact_names = business_card.fields.get("ContactNames")
if contact_names:
for contact_name in contact_names.value:
print("Contact First Name: {} has confidence: {}".format(
contact_name.value["FirstName"].value, contact_name.value["FirstName"].confidence
))
print("Contact Last Name: {} has confidence: {}".format(
contact_name.value["LastName"].value, contact_name.value["LastName"].confidence
))
company_names = business_card.fields.get("CompanyNames")
if company_names:
for company_name in company_names.value:
print("Company Name: {} has confidence: {}".format(company_name.value, company_name.confidence))
departments = business_card.fields.get("Departments")
if departments:
for department in departments.value:
print("Department: {} has confidence: {}".format(department.value, department.confidence))
job_titles = business_card.fields.get("JobTitles")
if job_titles:
for job_title in job_titles.value:
print("Job Title: {} has confidence: {}".format(job_title.value, job_title.confidence))
emails = business_card.fields.get("Emails")
if emails:
for email in emails.value:
print("Email: {} has confidence: {}".format(email.value, email.confidence))
websites = business_card.fields.get("Websites")
if websites:
for website in websites.value:
print("Website: {} has confidence: {}".format(website.value, website.confidence))
addresses = business_card.fields.get("Addresses")
if addresses:
for address in addresses.value:
print("Address: {} has confidence: {}".format(address.value, address.confidence))
mobile_phones = business_card.fields.get("MobilePhones")
if mobile_phones:
for phone in mobile_phones.value:
print("Mobile phone number: {} has confidence: {}".format(phone.value, phone.confidence))
faxes = business_card.fields.get("Faxes")
if faxes:
for fax in faxes.value:
print("Fax number: {} has confidence: {}".format(fax.value, fax.confidence))
work_phones = business_card.fields.get("WorkPhones")
if work_phones:
for work_phone in work_phones.value:
print("Work phone number: {} has confidence: {}".format(work_phone.value, work_phone.confidence))
other_phones = business_card.fields.get("OtherPhones")
if other_phones:
for other_phone in other_phones.value:
print("Other phone number: {} has confidence: {}".format(other_phone.value, other_phone.confidence))
İpucu
Yerel iş kartı görüntülerini, gibi Formrecognizerclient yöntemleriyle de analiz edebilirsiniz begin_recognize_business_cards .
Faturaları analiz etme
Bu bölümde, önceden eğitilen bir model kullanılarak satış faturalarından ortak alanların nasıl analiz edileceği ve ayıklanacağı gösterilmektedir. Fatura analizi hakkında daha fazla bilgi için bkz. Fatura kavramsal Kılavuzu.
Bir URL 'den faturaları çözümlemek için begin_recognize_invoices_from_url yöntemini kullanın.
invoiceUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/simple-invoice.png"
poller = form_recognizer_client.begin_recognize_invoices_from_url(invoiceUrl)
invoices = poller.result()
for idx, invoice in enumerate(invoices):
print("--------Recognizing invoice #{}--------".format(idx+1))
vendor_name = invoice.fields.get("VendorName")
if vendor_name:
print("Vendor Name: {} has confidence: {}".format(vendor_name.value, vendor_name.confidence))
vendor_address = invoice.fields.get("VendorAddress")
if vendor_address:
print("Vendor Address: {} has confidence: {}".format(vendor_address.value, vendor_address.confidence))
customer_name = invoice.fields.get("CustomerName")
if customer_name:
print("Customer Name: {} has confidence: {}".format(customer_name.value, customer_name.confidence))
customer_address = invoice.fields.get("CustomerAddress")
if customer_address:
print("Customer Address: {} has confidence: {}".format(customer_address.value, customer_address.confidence))
customer_address_recipient = invoice.fields.get("CustomerAddressRecipient")
if customer_address_recipient:
print("Customer Address Recipient: {} has confidence: {}".format(customer_address_recipient.value, customer_address_recipient.confidence))
invoice_id = invoice.fields.get("InvoiceId")
if invoice_id:
print("Invoice Id: {} has confidence: {}".format(invoice_id.value, invoice_id.confidence))
invoice_date = invoice.fields.get("InvoiceDate")
if invoice_date:
print("Invoice Date: {} has confidence: {}".format(invoice_date.value, invoice_date.confidence))
invoice_total = invoice.fields.get("InvoiceTotal")
if invoice_total:
print("Invoice Total: {} has confidence: {}".format(invoice_total.value, invoice_total.confidence))
due_date = invoice.fields.get("DueDate")
if due_date:
print("Due Date: {} has confidence: {}".format(due_date.value, due_date.confidence))
İpucu
Yerel fatura görüntülerini, gibi Formrecognizerclient yöntemleriyle de analiz edebilirsiniz begin_recognize_invoices .
KIMLIK belgelerini çözümle
Bu bölümde, form tanıyıcı önceden oluşturulmuş KIMLIK modelini kullanarak devlet tarafından verilen tanımlama belgelerinden önemli bilgilerin nasıl analiz edileceği ve ayıklanacağı gösterilmektedir. KIMLIK belgesi analizi hakkında daha fazla bilgi için bkz. önceden oluşturulmuş kimlik modelimiz kavramsal Kılavuzu.
URL 'den KIMLIK belgelerini çözümlemek için begin_recognize_id_documents_from_url yöntemini kullanın.
idURL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-REST-api-samples/master/curl/form-recognizer/id-license.jpg"
for idx, id_document in enumerate(id_documents):
print("--------Recognizing ID document #{}--------".format(idx+1))
first_name = id_document.fields.get("FirstName")
if first_name:
print("First Name: {} has confidence: {}".format(first_name.value, first_name.confidence))
last_name = id_document.fields.get("LastName")
if last_name:
print("Last Name: {} has confidence: {}".format(last_name.value, last_name.confidence))
document_number = id_document.fields.get("DocumentNumber")
if document_number:
print("Document Number: {} has confidence: {}".format(document_number.value, document_number.confidence))
dob = id_document.fields.get("DateOfBirth")
if dob:
print("Date of Birth: {} has confidence: {}".format(dob.value, dob.confidence))
doe = id_document.fields.get("DateOfExpiration")
if doe:
print("Date of Expiration: {} has confidence: {}".format(doe.value, doe.confidence))
sex = id_document.fields.get("Sex")
if sex:
print("Sex: {} has confidence: {}".format(sex.value, sex.confidence))
address = id_document.fields.get("Address")
if address:
print("Address: {} has confidence: {}".format(address.value, address.confidence))
country_region = id_document.fields.get("CountryRegion")
if country_region:
print("Country/Region: {} has confidence: {}".format(country_region.value, country_region.confidence))
region = id_document.fields.get("Region")
if region:
print("Region: {} has confidence: {}".format(region.value, region.confidence))
İpucu
Ayrıca, KIMLIK belgesi görüntülerini, gibi Formrecognizerclient yöntemleriyle de analiz edebilirsiniz begin_recognize_identity_documents .
Özel bir modeli eğitme
Bu bölümde, bir modelin kendi verilerinize nasıl eğulacağı gösterilmektedir. Eğitilen bir model, özgün form belgesindeki anahtar/değer ilişkilerini içeren yapılandırılmış verileri çıktısını alabilir. Modeli eğdikten sonra, bunu test edebilir ve yeniden eğitebilir ve sonunda, gereksinimlerinize göre daha fazla formdan verileri güvenilir bir şekilde çıkarmak için kullanabilirsiniz.
Not
Modelleri, form tanıyıcı örnek etiketleme aracıgibi bir grafik kullanıcı arabirimi ile de eğitebilirsiniz.
Etiketler olmadan bir modeli eğitme
Eğitim belgelerini el ile etiketlemeden özel formlarınızda bulunan tüm alanları ve değerleri çözümlemek için özel modeller eğitme.
Aşağıdaki kod, begin_training belirli bir belge kümesi üzerinde bir modeli eğitme işleviyle birlikte eğitim istemcisini kullanır. Döndürülen CustomFormModel nesne, modelin çözümleyebileceğiniz form türleri ve her form türünden ayıklayabileceğiniz alanlar hakkındaki bilgileri içerir. Aşağıdaki kod bloğu bu bilgileri konsola yazdırır.
# To train a model you need an Azure Storage account.
# Use the SAS URL to access your training files.
trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE"
poller = form_training_client.begin_training(trainingDataUrl, use_training_labels=False)
model = poller.result()
print("Model ID: {}".format(model.model_id))
print("Status: {}".format(model.status))
print("Training started on: {}".format(model.training_started_on))
print("Training completed on: {}".format(model.training_completed_on))
print("\nRecognized fields:")
for submodel in model.submodels:
print(
"The submodel with form type '{}' has recognized the following fields: {}".format(
submodel.form_type,
", ".join(
[
field.label if field.label else name
for name, field in submodel.fields.items()
]
),
)
)
# Training result information
for doc in model.training_documents:
print("Document name: {}".format(doc.name))
print("Document status: {}".format(doc.status))
print("Document page count: {}".format(doc.page_count))
print("Document errors: {}".format(doc.errors))
Çıktı
Python SDK'da bulunan eğitim verileriyle eğitilen bir modelin çıktısı aşağıda verilmiştir.
Model ID: 628739de-779c-473d-8214-d35c72d3d4f7
Status: ready
Training started on: 2020-08-20 23:16:51+00:00
Training completed on: 2020-08-20 23:16:59+00:00
Recognized fields:
The submodel with form type 'form-0' has recognized the following fields: Additional Notes:, Address:, Company Name:, Company Phone:, Dated As:, Details, Email:, Hero Limited, Name:, Phone:, Purchase Order, Purchase Order #:, Quantity, SUBTOTAL, Seattle, WA 93849 Phone:, Shipped From, Shipped To, TAX, TOTAL, Total, Unit Price, Vendor Name:, Website:
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_4.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_5.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Etiketler içeren bir modeli eğitme
Ayrıca, eğitim belgelerini el ile etiketleyerek özel modeller de eğitebilirsiniz. Etiketlerle eğitim, bazı senaryolarda daha iyi performansa yol açar. Döndürülen, CustomFormModel modelin ayıklayabileceğiniz alanları, her bir alandaki tahmini doğruluğunu gösterir. Aşağıdaki kod bloğu bu bilgileri konsola yazdırır.
Önemli
Etiketlerle eğitebilmeniz için, \<filename\>.pdf.labels.json eğitim belgelerinin yanı sıra BLOB depolama kapsayıcıda özel etiket bilgi dosyalarına () sahip olmanız gerekir. Form tanıyıcı örnek etiketleme aracı , bu etiket dosyalarını oluşturmanıza yardımcı olmak için bir kullanıcı arabirimi sağlar. Bunu yaptıktan sonra begin_training işlevi, use_training_labels parametresi olarak ayarlanmış şekilde çağırabilirsiniz true .
# To train a model you need an Azure Storage account.
# Use the SAS URL to access your training files.
trainingDataUrl = "PASTE_YOUR_SAS_URL_OF_YOUR_FORM_FOLDER_IN_BLOB_STORAGE_HERE"
poller = form_training_client.begin_training(trainingDataUrl, use_training_labels=True)
model = poller.result()
trained_model_id = model.model_id
print("Model ID: {}".format(trained_model_id))
print("Status: {}".format(model.status))
print("Training started on: {}".format(model.training_started_on))
print("Training completed on: {}".format(model.training_completed_on))
print("\nRecognized fields:")
for submodel in model.submodels:
print(
"The submodel with form type '{}' has recognized the following fields: {}".format(
submodel.form_type,
", ".join(
[
field.label if field.label else name
for name, field in submodel.fields.items()
]
),
)
)
# Training result information
for doc in model.training_documents:
print("Document name: {}".format(doc.name))
print("Document status: {}".format(doc.status))
print("Document page count: {}".format(doc.page_count))
print("Document errors: {}".format(doc.errors))
Çıktı
Python SDK'da bulunan eğitim verileriyle eğitilen bir modelin çıktısı aşağıda verilmiştir.
Model ID: ae636292-0b14-4e26-81a7-a0bfcbaf7c91
Status: ready
Training started on: 2020-08-20 23:20:56+00:00
Training completed on: 2020-08-20 23:20:57+00:00
Recognized fields:
The submodel with form type 'form-ae636292-0b14-4e26-81a7-a0bfcbaf7c91' has recognized the following fields: CompanyAddress, CompanyName, CompanyPhoneNumber, DatedAs, Email, Merchant, PhoneNumber, PurchaseOrderNumber, Quantity, Signature, Subtotal, Tax, Total, VendorName, Website
Document name: Form_1.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_2.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_3.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_4.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Document name: Form_5.jpg
Document status: succeeded
Document page count: 1
Document errors: []
Formları özel bir model ile analiz etme
Bu bölümde, kendi formlarınız ile eğitilen modeller kullanılarak özel form türlerinizde anahtar/değer bilgilerinin ve diğer içeriklerin nasıl ayıklanacağı gösterilmektedir.
Önemli
Bu senaryoyu uygulamak için, KIMLIĞINI aşağıdaki yönteme geçirebilmeniz için zaten bir model eğitilmeniz gerekir. Modeli eğitme bölümüne bakın.
begin_recognize_custom_forms_from_urlYöntemini kullanacaksınız. Döndürülen değer bir RecognizedForm nesne koleksiyonudur: gönderilen belgedeki her sayfa için bir tane. Aşağıdaki kod, analiz sonuçlarını konsola yazdırır. Her tanınan alanı ve karşılık gelen değeri, Güvenirlik puanı ile birlikte yazdırır.
poller = form_recognizer_client.begin_recognize_custom_forms_from_url(
model_id=trained_model_id, form_url=formUrl)
result = poller.result()
for recognized_form in result:
print("Form type: {}".format(recognized_form.form_type))
for name, field in recognized_form.fields.items():
print("Field '{}' has label '{}' with value '{}' and a confidence score of {}".format(
name,
field.label_data.text if field.label_data else name,
field.value,
field.confidence
))
İpucu
Yerel görüntüleri de analiz edebilirsiniz. Gibi Formrecognizerclient yöntemlerine bakın begin_recognize_custom_forms . veya, yerel görüntüleri ilgilendiren senaryolar için GitHub örnek koda bakın.
Çıktı
Önceki örnekteki modeli kullanarak aşağıdaki çıktı sağlanır.
Form type: form-ae636292-0b14-4e26-81a7-a0bfcbaf7c91
Field 'Merchant' has label 'Merchant' with value 'Invoice For:' and a confidence score of 0.116
Field 'CompanyAddress' has label 'CompanyAddress' with value '1 Redmond way Suite 6000 Redmond, WA' and a confidence score of 0.258
Field 'Website' has label 'Website' with value '99243' and a confidence score of 0.114
Field 'VendorName' has label 'VendorName' with value 'Charges' and a confidence score of 0.145
Field 'CompanyPhoneNumber' has label 'CompanyPhoneNumber' with value '$56,651.49' and a confidence score of 0.249
Field 'CompanyName' has label 'CompanyName' with value 'PT' and a confidence score of 0.245
Field 'DatedAs' has label 'DatedAs' with value 'None' and a confidence score of None
Field 'Email' has label 'Email' with value 'None' and a confidence score of None
Field 'PhoneNumber' has label 'PhoneNumber' with value 'None' and a confidence score of None
Field 'PurchaseOrderNumber' has label 'PurchaseOrderNumber' with value 'None' and a confidence score of None
Field 'Quantity' has label 'Quantity' with value 'None' and a confidence score of None
Field 'Signature' has label 'Signature' with value 'None' and a confidence score of None
Field 'Subtotal' has label 'Subtotal' with value 'None' and a confidence score of None
Field 'Tax' has label 'Tax' with value 'None' and a confidence score of None
Field 'Total' has label 'Total' with value 'None' and a confidence score of None
Özel modelleri yönetme
Bu bölümde, hesabınızda depolanan özel modellerin nasıl yönetileceği gösterilmektedir.
Formtanıyıcı kaynak hesabındaki modellerin sayısını denetleyin
Aşağıdaki kod bloğu, form tanıyıcı hesabınıza kaç modelin kaydedildiğini denetler ve hesap limitine göre karşılaştırır.
account_properties = form_training_client.get_account_properties()
print("Our account has {} custom models, and we can have at most {} custom models".format(
account_properties.custom_model_count, account_properties.custom_model_limit
))
Çıktı
Our account has 5 custom models, and we can have at most 5000 custom models
Şu anda kaynak hesapta depolanan modelleri listeleyin
Aşağıdaki kod bloğu, hesabınızdaki geçerli modelleri listeler ve ayrıntılarını konsola yazdırır. Ayrıca ilk modele bir başvuru kaydeder.
# Next, we get a paged list of all of our custom models
custom_models = form_training_client.list_custom_models()
print("We have models with the following ids:")
# Let's pull out the first model
first_model = next(custom_models)
print(first_model.model_id)
for model in custom_models:
print(model.model_id)
Çıktı
Test hesabı için örnek bir çıktı aşağıda verilmiştir.
We have models with the following ids:
453cc2e6-e3eb-4e9f-aab6-e1ac7b87e09e
628739de-779c-473d-8214-d35c72d3d4f7
ae636292-0b14-4e26-81a7-a0bfcbaf7c91
b4b5df77-8538-4ffb-a996-f67158ecd305
c6309148-6b64-4fef-aea0-d39521452699
Modelin KIMLIĞINI kullanarak belirli bir modeli al
Aşağıdaki kod bloğu, önceki bölümden kaydedilen model KIMLIĞINI kullanır ve model hakkındaki ayrıntıları almak için onu kullanır.
custom_model = form_training_client.get_custom_model(model_id=trained_model_id)
print("Model ID: {}".format(custom_model.model_id))
print("Status: {}".format(custom_model.status))
print("Training started on: {}".format(custom_model.training_started_on))
print("Training completed on: {}".format(custom_model.training_completed_on))
Çıktı
Önceki örnekte oluşturulan özel modelin örnek çıktısı aşağıda verilmiştir.
Model ID: ae636292-0b14-4e26-81a7-a0bfcbaf7c91
Status: ready
Training started on: 2020-08-20 23:20:56+00:00
Training completed on: 2020-08-20 23:20:57+00:00
Kaynak hesabındaki bir modeli silme
Ayrıca, KIMLIĞINE başvurarak hesabınızdan bir modeli silebilirsiniz. Bu kod, önceki bölümde kullanılan modeli siler.
form_training_client.delete_model(model_id=custom_model.model_id)
try:
form_training_client.get_custom_model(model_id=custom_model.model_id)
except ResourceNotFoundError:
print("Successfully deleted model with id {}".format(custom_model.model_id))
Uygulamayı çalıştırma
Uygulamayı python aşağıdaki komutla çalıştırın:
python form-recognizer.py
Kaynakları temizleme
Bilişsel hizmetler aboneliğini temizlemek ve kaldırmak istiyorsanız, kaynağı veya kaynak grubunu silebilirsiniz. Kaynak grubunun silinmesi, onunla ilişkili diğer tüm kaynakları da siler.
Sorun giderme
Genel
Form tanıyıcı istemci kitaplığı, Azure Core'da tanımlanan özel durumları yükseltir.
Günlüğe Kaydetme
Bu kitaplık günlüğe kaydetmek için Standart günlük kitaplığını kullanır. HTTP oturumları (URL 'Ler, üstbilgiler vb.) hakkındaki temel bilgiler BILGI düzeyinde günlüğe kaydedilir.
İstek/yanıt gövdeleri ve redaksiyonu kaldırma üst bilgileri de dahil olmak üzere ayrıntılı hata ayıklama düzeyinde günlüğe kaydetme, logging_enable anahtar sözcük bağımsız değişkeni olan bir istemcide etkinleştirilebilir:
import sys
import logging
from azure.ai.formrecognizer import FormRecognizerClient
from azure.core.credentials import AzureKeyCredential
# Create a logger for the 'azure' SDK
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)
# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
endpoint = "PASTE_YOUR_FORM_RECOGNIZER_ENDPOINT_HERE"
credential = AzureKeyCredential("PASTE_YOUR_FORM_RECOGNIZER_SUBSCRIPTION_KEY_HERE")
# This client will log detailed information about its HTTP sessions, at DEBUG level
form_recognizer_client = FormRecognizerClient(endpoint, credential, logging_enable=True)
Benzer şekilde, logging_enable istemci için etkinleştirilmediğinde bile tek bir işlem için ayrıntılı günlük kaydını etkinleştirebilir:
receiptUrl = "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/master/sdk/formrecognizer/azure-ai-formrecognizer/tests/sample_forms/receipt/contoso-receipt.png"
poller = form_recognizer_client.begin_recognize_receipts_from_url(receiptUrl, logging_enable=True)
GitHub REST örnekleri
- Belgelerden metin, seçim işaretleri ve tablo yapısını Ayıkla
- Özel modeller eğitme ve form verilerini ayıklama
- Faturalardan verileri Ayıkla
- Satış makbuzlarından veri ayıklama
- Kartvizitlerden veri ayıklama
Sonraki adımlar
Bu proje için, modelleri eğitmek ve formları farklı yollarla analiz etmek üzere tanıyıcı Python istemci kitaplığı formunu kullandınız. Daha sonra, daha iyi eğitim veri kümesi oluşturma ve daha doğru modeller üretme hakkında ipuçları edinin.
Bu proje için örnek kod GitHubbulunabilir.
Not
- Bu proje, Form Tanıma yürütmek için cURL kullanarak Azure Form Tanıma API sürüm 2.1'REST API hedefler.
| Form Tanıma REST API | Azure REST API başvurusu |
Önkoşullar
- cURL yüklü.
- PowerShell sürüm 6.0+veya benzer bir komut satırı uygulaması.
- Azure aboneliği - Ücretsiz bir abonelik oluşturun
- Bir Depolama veri kümesi içeren bir Azure depolama blobu. Eğitim veri kümenizi bir araya toplamaya yardımcı olacak ipuçları ve seçenekler için bkz. Özel model için eğitim veri kümesi oluşturma. Örnek veri kümesi eğitin klasörünün altındaki dosyaları kullanabilirsiniz (dosyaları indirip ayık sample_data.zip).
- Azure aboneliğinize sahip olduktan sonra, Form Tanıma uç noktanızı almak için Form Tanıma kaynağı Azure portal kaynak oluşturun. Dağıtımdan sonra Kaynağa git'i seçin.
- Uygulamanıza api'sini bağlamak için, kaynakta yer alan anahtara ve uç Form Tanıma gerekir. Anahtarınızı ve uç noktanızı daha sonra projesinde aşağıdaki koda yapıştırabilirsiniz
- Hizmeti denemek ve daha sonra üretim için ücretli bir katmana yükseltmek üzere ücretsiz fiyatlandırma katmanını (
F0) kullanabilirsiniz. <<<<<<< HEAD:articles/applied-ai-services/form-recognizer/includes/how-to-guides/rest-api.md
- Makbuz görüntüsünün URL'si. Örnek bir görüntü kullanabilirsiniz.
- Kartvizit görüntüsünün URL'si. Örnek bir görüntü kullanabilirsiniz.
- Fatura görüntüsünün URL'si. Örnek bir belge kullanabilirsiniz.
- Kimlik belgesinin görüntüsünün URL'si. Örnek bir görüntü kullanabilirsiniz. =======
- Makbuz görüntüsünün URL'si. Bu hızlı başlangıç için örnek bir görüntü kullanabilirsiniz.
- Kartvizit görüntüsünün URL'si. Bu hızlı başlangıç için örnek bir görüntü kullanabilirsiniz.
- Fatura görüntüsünün URL'si. Bu hızlı başlangıç için örnek bir belge kullanabilirsiniz.
- Kimlik belgesinin görüntüsünün URL'si. Örnek bir görüntü kullanabilirsiniz
103f7cf9752d7b4e4c9bf3da2c3649ad27ebfd2f:articles/applied-ai-services/form-recognizer/includes/quickstarts/rest-api.md
Düzeni analiz etme
Model eğitmeden Form Tanıma, seçim işaretlerini, metinleri ve yapıyı analiz etmek ve ayıklamak için Form Tanıma'i kullanabilirsiniz. Düzen ayıklama hakkında daha fazla bilgi için bkz. Düzen kavramsal kılavuzu. Komutunu çalıştırmadan önce şu değişiklikleri yapın:
- yerine
{endpoint}kendi aboneliğinizi almak için Form Tanıma değiştirin. - yerine
{subscription key}önceki adımda kopyalanan abonelik anahtarını alın. - yerine
\"{your-document-url}örnek URL'lerden birini değiştirin.
İstek
curl -v -i POST "https://{endpoint}/formrecognizer/v2.1/layout/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{'source': '{your-document-url}'}"
Operation-Location
202 (Success)Operation-Location üst bilgisi içeren bir yanıt alırsınız. Bu üst bilgi değeri, zaman uyumsuz işlem durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz bir sonuç kimliği içerir:
https:// service/formrecognizer/v2.1/layout/analyzeResults/{resultId}.
Aşağıdaki örnekte URL'nin bir parçası olarak, sonrasındaki dize analyzeResults/ sonuç kimliğidir.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Düzen sonuçlarını al
Düzeni Çözümle API'sini çağırdıktan sonra, işlem durumunu ve ayıklanan verileri almak için Get Analyze Layout Result API'sini çağırabilirsiniz. Komutunu çalıştırmadan önce şu değişiklikleri yapın:
- yerine
{endpoint}kendi aboneliğinizi almak için Form Tanıma değiştirin. - yerine
{subscription key}önceki adımda kopyalanan abonelik anahtarını alın. - yerine
{resultId}önceki adımda yer alan sonuç kimliğini girin.
İstek
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/layout/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"
Sonuçları inceleme
200 (success)JSON içeriğiyle bir yanıt alırsınız.
Aşağıdaki fatura görüntüsüne ve karşılık gelen JSON çıkışına bakın.
- Düğüm,
"readResults"sayfada ilgili sınırlayıcı kutu yerleşimine sahip her metin satırı içerir. - Düğüm, her seçim işaretini (onay kutusu, radyo işareti) ve durumunun
selectionMarks"seçili" veya "seçilmemiş" olup olmadığını gösterir. - bölümü
"pageResults"ayıklanan tabloları içerir. Her tablo için metin, satır ve sütun dizini, kapsayan satır ve sütun, sınırlayıcı kutu ve daha fazlası ayıklanır.
Yanıt gövdesi
Bu çıkış kolaylık sağlamak için kısaltıldı. üzerinde tam örnek çıktıya GitHub.
{
"status": "succeeded",
"createdDateTime": "2020-08-20T20:40:50Z",
"lastUpdatedDateTime": "2020-08-20T20:40:55Z",
"analyzeResult": {
"version": "2.1.0",
"readResults": [
{
"page": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"lines": [
{
"boundingBox": [
0.5826,
0.4411,
2.3387,
0.4411,
2.3387,
0.7969,
0.5826,
0.7969
],
"text": "Contoso, Ltd.",
"words": [
{
"boundingBox": [
0.5826,
0.4411,
1.744,
0.4411,
1.744,
0.7969,
0.5826,
0.7969
],
"text": "Contoso,",
"confidence": 1
},
{
"boundingBox": [
1.8448,
0.4446,
2.3387,
0.4446,
2.3387,
0.7631,
1.8448,
0.7631
],
"text": "Ltd.",
"confidence": 1
}
]
},
...
]
}
],
"selectionMarks": [
{
"boundingBox": [
3.9737,
3.7475,
4.1693,
3.7475,
4.1693,
3.9428,
3.9737,
3.9428
],
"confidence": 0.989,
"state": "selected"
},
...
]
}
],
"pageResults": [
{
"page": 1,
"tables": [
{
"rows": 5,
"columns": 5,
"cells": [
{
"rowIndex": 0,
"columnIndex": 0,
"text": "Training Date",
"boundingBox": [
0.5133,
4.2167,
1.7567,
4.2167,
1.7567,
4.4492,
0.5133,
4.4492
],
"elements": [
"#/readResults/0/lines/12/words/0",
"#/readResults/0/lines/12/words/1"
]
},
...
]
},
...
]
}
]
}
}
Makbuzları analiz etme
Bu bölümde, önceden eğitilmiş bir makbuz modeli kullanılarak ABD makbuzlarından ortak alanların nasıl analiz ve ayıklanası gösterilmiş olur. Makbuz analizi hakkında daha fazla bilgi için Makbuzlar kavramsal kılavuzuna bakın. Makbuz analizine başlamak için aşağıdaki cURL komutunu kullanarak Makbuz Analizi API'sini arayın. Komutunu çalıştırmadan önce şu değişiklikleri yapın:
- yerine
{endpoint}kendi aboneliğinizi almak için Form Tanıma değiştirin. - yerine
{your receipt URL}makbuz görüntüsünün URL adresini yazın. - yerine
{subscription key>önceki adımda kopyalanan abonelik anahtarını alın.
İstek
curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/prebuilt/receipt/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{your receipt URL}'}"
Operation-Location
202 (Success)Operation-Location üst bilgisi içeren bir yanıt alırsınız. Bu üst bilgi değeri, zaman uyumsuz işlem durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz bir sonuç kimliği içerir:
https:// service/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}
Aşağıdaki örnekte, sonraki dize operations/ sonuç kimliğidir:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/receipt/operations/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Makbuz sonuçlarını alma
Makbuz Analizi API'sini çağırdıktan sonra, işlem durumunu ve ayıklanan verileri almak için Get Analyze Receipt Result API'sini çağırabilirsiniz. Komutunu çalıştırmadan önce şu değişiklikleri yapın:
- yerine
{endpoint}kendi abonelik anahtarınızı almak için Form Tanıma değiştirin. Bu sayfayı kaynak Form Tanıma sekmesinde bulabilirsiniz. - yerine
{resultId}önceki adımda yer alan sonuç kimliğini girin. {subscription key}değerini abonelik anahtarınızla değiştirin.
İstek
curl -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/receipt/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"
Yanıtı inceleme
200 (Success)JSON çıkışıyla bir yanıt alırsınız. İlk alan "status" olan , işlemi durumunu gösterir. İşlem tamamlanmazsa değeri veya olur ve API'yi el ile veya betik "status" "running" aracılığıyla yeniden "notStarted" çağırmanız gerekir. Çağrılar arasında bir saniye veya daha fazla aralık önerilir.
Düğüm "readResults" tanınan tüm metni içerir (isteğe bağlı includeTextDetails parametresini olarak ayarlayarak). true Metin sayfaya, satıra ve ardından tek tek sözcüklere göre düzenlenmiştir. Düğüm, "documentResults" modelin keşfettikleri makbuza özgü değerleri içerir. Vergi, toplam, satıcı adresi gibi yararlı anahtar/değer çiftlerini burada bulabilirsiniz.
Aşağıdaki makbuz görüntüsüne ve buna karşılık gelen JSON çıkışına bakın.

Yanıt gövdesi
Bu çıkış okunabilirlik için kısaltıldı. GitHub tüm örnek çıktısınabakın.
{
"status":"succeeded",
"createdDateTime":"2019-12-17T04:11:24Z",
"lastUpdatedDateTime":"2019-12-17T04:11:32Z",
"analyzeResult":{
"version":"2.1.0",
"readResults":[
{
"page":1,
"angle":0.6893,
"width":1688,
"height":3000,
"unit":"pixel",
"language":"en",
"lines":[
{
"text":"Contoso",
"boundingBox":[
635,
510,
1086,
461,
1098,
558,
643,
604
],
"words":[
{
"text":"Contoso",
"boundingBox":[
639,
510,
1087,
461,
1098,
551,
646,
604
],
"confidence":0.955
}
]
},
...
]
}
],
"documentResults":[
{
"docType":"prebuilt:receipt",
"pageRange":[
1,
1
],
"fields":{
"ReceiptType":{
"type":"string",
"valueString":"Itemized",
"confidence":0.692
},
"MerchantName":{
"type":"string",
"valueString":"Contoso Contoso",
"text":"Contoso Contoso",
"boundingBox":[
378.2,
292.4,
1117.7,
468.3,
1035.7,
812.7,
296.3,
636.8
],
"page":1,
"confidence":0.613,
"elements":[
"#/readResults/0/lines/0/words/0",
"#/readResults/0/lines/1/words/0"
]
},
"MerchantAddress":{
"type":"string",
"valueString":"123 Main Street Redmond, WA 98052",
"text":"123 Main Street Redmond, WA 98052",
"boundingBox":[
302,
675.8,
848.1,
793.7,
809.9,
970.4,
263.9,
852.5
],
"page":1,
"confidence":0.99,
"elements":[
"#/readResults/0/lines/2/words/0",
"#/readResults/0/lines/2/words/1",
"#/readResults/0/lines/2/words/2",
"#/readResults/0/lines/3/words/0",
"#/readResults/0/lines/3/words/1",
"#/readResults/0/lines/3/words/2"
]
},
"MerchantPhoneNumber":{
"type":"phoneNumber",
"valuePhoneNumber":"+19876543210",
"text":"987-654-3210",
"boundingBox":[
278,
1004,
656.3,
1054.7,
646.8,
1125.3,
268.5,
1074.7
],
"page":1,
"confidence":0.99,
"elements":[
"#/readResults/0/lines/4/words/0"
]
},
"TransactionDate":{
"type":"date",
"valueDate":"2019-06-10",
"text":"6/10/2019",
"boundingBox":[
265.1,
1228.4,
525,
1247,
518.9,
1332.1,
259,
1313.5
],
"page":1,
"confidence":0.99,
"elements":[
"#/readResults/0/lines/5/words/0"
]
},
"TransactionTime":{
"type":"time",
"valueTime":"13:59:00",
"text":"13:59",
"boundingBox":[
541,
1248,
677.3,
1261.5,
668.9,
1346.5,
532.6,
1333
],
"page":1,
"confidence":0.977,
"elements":[
"#/readResults/0/lines/5/words/1"
]
},
"Items":{
"type":"array",
"valueArray":[
{
"type":"object",
"valueObject":{
"Quantity":{
"type":"number",
"text":"1",
"boundingBox":[
245.1,
1581.5,
300.9,
1585.1,
295,
1676,
239.2,
1672.4
],
"page":1,
"confidence":0.92,
"elements":[
"#/readResults/0/lines/7/words/0"
]
},
"Name":{
"type":"string",
"valueString":"Cappuccino",
"text":"Cappuccino",
"boundingBox":[
322,
1586,
654.2,
1601.1,
650,
1693,
317.8,
1678
],
"page":1,
"confidence":0.923,
"elements":[
"#/readResults/0/lines/7/words/1"
]
},
"TotalPrice":{
"type":"number",
"valueNumber":2.2,
"text":"$2.20",
"boundingBox":[
1107.7,
1584,
1263,
1574,
1268.3,
1656,
1113,
1666
],
"page":1,
"confidence":0.918,
"elements":[
"#/readResults/0/lines/8/words/0"
]
}
}
},
...
]
},
"Subtotal":{
"type":"number",
"valueNumber":11.7,
"text":"11.70",
"boundingBox":[
1146,
2221,
1297.3,
2223,
1296,
2319,
1144.7,
2317
],
"page":1,
"confidence":0.955,
"elements":[
"#/readResults/0/lines/13/words/1"
]
},
"Tax":{
"type":"number",
"valueNumber":1.17,
"text":"1.17",
"boundingBox":[
1190,
2359,
1304,
2359,
1304,
2456,
1190,
2456
],
"page":1,
"confidence":0.979,
"elements":[
"#/readResults/0/lines/15/words/1"
]
},
"Tip":{
"type":"number",
"valueNumber":1.63,
"text":"1.63",
"boundingBox":[
1094,
2479,
1267.7,
2485,
1264,
2591,
1090.3,
2585
],
"page":1,
"confidence":0.941,
"elements":[
"#/readResults/0/lines/17/words/1"
]
},
"Total":{
"type":"number",
"valueNumber":14.5,
"text":"$14.50",
"boundingBox":[
1034.2,
2617,
1387.5,
2638.2,
1380,
2763,
1026.7,
2741.8
],
"page":1,
"confidence":0.985,
"elements":[
"#/readResults/0/lines/19/words/0"
]
}
}
}
]
}
}
İş kartlarını çözümle
Bu bölümde, önceden eğitilen bir model kullanarak Ingilizce iş kartlarından ortak alanların nasıl analiz edileceği ve ayıklanacağı gösterilmektedir. İş kartı analizi hakkında daha fazla bilgi için bkz. iş kartları kavramsal Kılavuzu. Bir iş kartını çözümlemeye başlamak için aşağıdaki kıvrımlı komutunu kullanarak Iş kartını çözümle API 'sini çağırabilirsiniz. Komutu çalıştırmadan önce Şu değişiklikleri yapın:
{endpoint}Form tanıyıcı aboneliğiniz ile edindiğiniz uç noktayla değiştirin.{your business card URL}Bir makbuz RESMININ URL adresiyle değiştirin.{subscription key}Önceki adımdan kopyaladığınız abonelik anahtarıyla değiştirin.
İstek
curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/prebuilt/businessCard/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{your receipt URL}'}"
Operation-Location
202 (Success) İşlem konumu üst bilgisi içeren bir yanıt alacaksınız. Bu üstbilginin değeri, zaman uyumsuz işlemin durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz bir sonuç KIMLIĞI içerir:
https:// biliveservıce/formtanıyıcı/v 2.1/önceden oluşturulmuş/businessCard/analiz Zeresults/{resultıd}
Aşağıdaki örnekte, URL 'nin bir parçası olarak, sonraki dize analyzeResults/ sonuç kimliğidir.
https://cognitiveservice/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
İş kartı sonuçlarını al
Çözümle Iş kartı API 'sini çağırdıktan sonra, işlemin durumunu ve ayıklanan verileri almak Için analiz Iş kartı sonucunu al API 'sini çağırabilirsiniz. Komutu çalıştırmadan önce Şu değişiklikleri yapın:
{endpoint}Form tanıyıcı abonelik anahtarınızla edindiğiniz uç noktayla değiştirin. Bunu, form tanıyıcı kaynağına genel bakış sekmesinde bulabilirsiniz.{resultId}Önceki adımdan elde edilen sonuç kimliğiyle değiştirin.{subscription key}değerini abonelik anahtarınızla değiştirin.
curl -v -X GET https://{endpoint}/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/{resultId}"
-H "Ocp-Apim-Subscription-Key: {subscription key}"
Yanıtı inceleme
200 (Success)JSON çıkışıyla bir yanıt alacaksınız.
"readResults"Düğüm, tüm tanınan metni içerir. Metin sayfaya, sonra satıra, sonra da tek sözcüklere göre düzenlenir. "documentResults"Düğüm, modelin bulduğu iş kartına özgü değerleri içerir. Burada şirket adı, ilk adı, soyadı, telefon numarası vb. gibi yararlı iletişim bilgileri bulabilirsiniz.

Bu örnek JSON çıktısı okunabilirlik için kısaltıldı. GitHub tüm örnek çıktısınabakın.
{
"status": "succeeded",
"createdDateTime":"2021-02-09T18:14:05Z",
"lastUpdatedDateTime":"2021-02-09T18:14:10Z",
"analyzeResult": {
"version": "2.1.0",
"readResults": [
{
"page":1,
"angle":-16.6836,
"width":4032,
"height":3024,
"unit":"pixel"
}
],
"documentResults": [
{
"docType": "prebuilt:businesscard",
"pageRange": [
1,
1
],
"fields": {
"ContactNames": {
"type": "array",
"valueArray": [
{
"type": "object",
"valueObject": {
"FirstName": {
"type": "string",
"valueString": "Avery",
"text": "Avery",
"boundingBox": [
703,
1096,
1134,
989,
1165,
1109,
733,
1206
],
"page": 1
},
"text": "Dr. Avery Smith",
"boundingBox": [
419.3,
1154.6,
1589.6,
877.9,
1618.9,
1001.7,
448.6,
1278.4
],
"confidence": 0.993
}
]
},
"Emails": {
"type": "array",
"valueArray": [
{
"type": "string",
"valueString": "avery.smith@contoso.com",
"text": "avery.smith@contoso.com",
"boundingBox": [
2107,
934,
2917,
696,
2935,
764,
2126,
995
],
"page": 1,
"confidence": 0.99
}
]
},
"Websites": {
"type": "array",
"valueArray": [
{
"type": "string",
"valueString": "https://www.contoso.com/",
"text": "https://www.contoso.com/",
"boundingBox": [
2121,
1002,
2992,
755,
3014,
826,
2143,
1077
],
"page": 1,
"confidence": 0.995
}
]
}
}
}
]
}
}
Betiği, Iş kartını çözümle işlemi tamamlanana kadar konsola gönderilecek yanıtları yazdırır.
Faturaları analiz etme
Belirli bir fatura belgesinden alan metnini ve anlam değerlerini ayıklamak için form tanıyıcısı 'nı kullanabilirsiniz. Bir faturayı çözümlemeye başlamak için aşağıdaki kıvrımlı komutunu kullanın. Fatura analizi hakkında daha fazla bilgi için bkz. Fatura kavramsal Kılavuzu. Bir faturayı çözümlemeye başlamak için aşağıdaki kıvrımlı komutunu kullanarak fatura API 'sini Çözümle seçeneğini çağırın. Komutu çalıştırmadan önce Şu değişiklikleri yapın:
{endpoint}Form tanıyıcı aboneliğiniz ile edindiğiniz uç noktayla değiştirin.{your invoice URL}Fatura BELGESININ URL adresiyle değiştirin.{subscription key}değerini abonelik anahtarınızla değiştirin.
İstek
curl -v -i POST https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{'source': '{your invoice URL}'}"
Operation-Location
202 (Success) İşlem konumu üst bilgisi içeren bir yanıt alacaksınız. Bu üstbilginin değeri, zaman uyumsuz işlemin durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz bir sonuç KIMLIĞI içerir:
https:// biliveservice/formtanıyıcı/v 2.1/önceden oluşturulmuş/makbuz/analiz Zeresults/{resultıd}
Aşağıdaki örnekte, URL 'nin bir parçası olarak, sonraki dize analyzeResults/ sonuç kimliğidir:
https://cognitiveservice/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Fatura sonuçlarını al
Faturayı çözümle API 'sini çağırdıktan sonra, işlemin durumunu ve ayıklanan verileri almak Için Fatura sonucunu al API 'sini çağırın. Komutu çalıştırmadan önce Şu değişiklikleri yapın:
{endpoint}Form tanıyıcı abonelik anahtarınızla edindiğiniz uç noktayla değiştirin. Bunu, form tanıyıcı kaynağına genel bakış sekmesinde bulabilirsiniz.{resultId}Önceki adımdan elde edilen sonuç kimliğiyle değiştirin.{subscription key}değerini abonelik anahtarınızla değiştirin.
İstek
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/invoice/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"
Yanıtı inceleme
200 (Success)JSON çıkışıyla bir yanıt alacaksınız.
"readResults"Alan, faturadan çıkarılan her metin satırını içerir.- ,
"pageResults"Faturadan çıkarılan tabloları ve seçimler işaretlerini içerir. "documentResults"Alan, faturanın en ilgili bölümlerinin anahtar/değer bilgilerini içerir.
Aşağıdaki fatura belgesine ve buna karşılık gelen JSON çıktısına bakın.
Yanıt gövdesi
Bu JSON içeriği okunabilirlik için kısaltıldı. GitHub tüm örnek çıktısınabakın.
{
"status": "succeeded",
"createdDateTime": "2020-11-06T23:32:11Z",
"lastUpdatedDateTime": "2020-11-06T23:32:20Z",
"analyzeResult": {
"version": "2.1.0",
"readResults": [{
"page": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch"
}],
"pageResults": [{
"page": 1,
"tables": [{
"rows": 3,
"columns": 4,
"cells": [{
"rowIndex": 0,
"columnIndex": 0,
"text": "QUANTITY",
"boundingBox": [0.4953,
5.7306,
1.8097,
5.7306,
1.7942,
6.0122,
0.4953,
6.0122]
},
{
"rowIndex": 0,
"columnIndex": 1,
"text": "DESCRIPTION",
"boundingBox": [1.8097,
5.7306,
5.7529,
5.7306,
5.7452,
6.0122,
1.7942,
6.0122]
},
...
],
"boundingBox": [0.4794,
5.7132,
8.0158,
5.714,
8.0118,
6.5627,
0.4757,
6.5619]
},
{
"rows": 2,
"columns": 6,
"cells": [{
"rowIndex": 0,
"columnIndex": 0,
"text": "SALESPERSON",
"boundingBox": [0.4979,
4.963,
1.8051,
4.963,
1.7975,
5.2398,
0.5056,
5.2398]
},
{
"rowIndex": 0,
"columnIndex": 1,
"text": "P.O. NUMBER",
"boundingBox": [1.8051,
4.963,
3.3047,
4.963,
3.3124,
5.2398,
1.7975,
5.2398]
},
...
],
"boundingBox": [0.4976,
4.961,
7.9959,
4.9606,
7.9959,
5.5204,
0.4972,
5.5209]
}]
}],
"documentResults": [{
"docType": "prebuilt:invoice",
"pageRange": [1,
1],
"fields": {
"AmountDue": {
"type": "number",
"valueNumber": 610,
"text": "$610.00",
"boundingBox": [7.3809,
7.8153,
7.9167,
7.8153,
7.9167,
7.9591,
7.3809,
7.9591],
"page": 1,
"confidence": 0.875
},
"BillingAddress": {
"type": "string",
"valueString": "123 Bill St, Redmond WA, 98052",
"text": "123 Bill St, Redmond WA, 98052",
"boundingBox": [0.594,
4.3724,
2.0125,
4.3724,
2.0125,
4.7125,
0.594,
4.7125],
"page": 1,
"confidence": 0.997
},
"BillingAddressRecipient": {
"type": "string",
"valueString": "Microsoft Finance",
"text": "Microsoft Finance",
"boundingBox": [0.594,
4.1684,
1.7907,
4.1684,
1.7907,
4.2837,
0.594,
4.2837],
"page": 1,
"confidence": 0.998
},
...
}
}]
}
}
Kimlik (ID) belgelerini çözümle
Bir tanımlama belgesini çözümlemeye başlamak için aşağıdaki kıvrımlı komutunu kullanın. KIMLIK belgesi analizi hakkında daha fazla bilgi için bkz. kimlik belgeleri kavramsal Kılavuzu. Bir KIMLIK belgesini çözümlemeye başlamak için aşağıdaki kıvrımlı komutunu kullanarak kimlik belgesini çözümle API 'sini çağırın. Komutu çalıştırmadan önce Şu değişiklikleri yapın:
{endpoint}Form tanıyıcı aboneliğiniz ile edindiğiniz uç noktayla değiştirin.{your ID document URL}Bir makbuz RESMININ URL adresiyle değiştirin.{subscription key}Önceki adımdan kopyaladığınız abonelik anahtarıyla değiştirin.
İstek
curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/prebuilt/idDocument/analyze" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{your ID document URL}'}"
Operation-Location
202 (Success) İşlem konumu üst bilgisi içeren bir yanıt alacaksınız. Bu üstbilginin değeri, zaman uyumsuz işlemin durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz bir sonuç KIMLIĞI içerir:
https:// biliveservice/formtanıyıcı/v 2.1/önceden oluşturulmuş/Belgetıd/analiz Zeresults/{resultıd}
Aşağıdaki örnekte, sonraki dize analyzeResults/ sonuç kimliğidir:
https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/prebuilt/idDocument/analyzeResults/83d0137b-28e1-4051-98ce-42bd21f77ae0
KIMLIĞI çözümle belge sonucunu al
Kimlik belgesini çözümle API 'sini çağırdıktan sonra, işlemin durumunu ve ayıklanan verileri almak Için kodu çözümle kimlik belgesi sonucu API 'sini çağırın. Komutu çalıştırmadan önce Şu değişiklikleri yapın:
{endpoint}Form tanıyıcı abonelik anahtarınızla edindiğiniz uç noktayla değiştirin. Bunu, form tanıyıcı kaynağına genel bakış sekmesinde bulabilirsiniz.{resultId}Önceki adımdan elde edilen sonuç kimliğiyle değiştirin.{subscription key}değerini abonelik anahtarınızla değiştirin.
İstek
curl -X GET "https://{endpoint}/formrecognizer/v2.1/prebuilt/businessCard/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"
Yanıtı inceleme
200 (Success)JSON çıkışıyla bir yanıt alacaksınız. İlk alan, "status" , işlemin durumunu gösterir. İşlem tamamlanmadıysa, değeri ya da olur "status" "running" ve siz "notStarted" değeri alıncaya kadar el ile veya bir komut dosyası aracılığıyla API 'yi yeniden çağırmanız gerekir succeeded . Çağrılar arasında bir saniye veya daha fazla Aralık önerilir.
"readResults"Alan, kimlik belgesinden ayıklanan her metin satırını içerir."documentResults"Alan, her biri giriş belgesinde algılanan BIR kimlik belgesini temsil eden bir nesne dizisi içerir.
Aşağıda örnek bir KIMLIK belgesi ve buna karşılık gelen JSON çıktısı verilmiştir
Yanıt gövdesi
{
"status": "succeeded",
"createdDateTime": "2021-04-13T17:24:52Z",
"lastUpdatedDateTime": "2021-04-13T17:24:55Z",
"analyzeResult": {
"version": "2.1.0",
"readResults": [
{
"page": 1,
"angle": -0.2823,
"width": 450,
"height": 294,
"unit": "pixel"
}
],
"documentResults": [
{
"docType": "prebuilt:idDocument:driverLicense",
"docTypeConfidence": 0.995,
"pageRange": [
1,
1
],
"fields": {
"Address": {
"type": "string",
"valueString": "123 STREET ADDRESS YOUR CITY WA 99999-1234",
"text": "123 STREET ADDRESS YOUR CITY WA 99999-1234",
"boundingBox": [
158,
151,
326,
151,
326,
177,
158,
177
],
"page": 1,
"confidence": 0.965
},
"CountryRegion": {
"type": "countryRegion",
"valueCountryRegion": "USA",
"confidence": 0.99
},
"DateOfBirth": {
"type": "date",
"valueDate": "1958-01-06",
"text": "01/06/1958",
"boundingBox": [
187,
133,
272,
132,
272,
148,
187,
149
],
"page": 1,
"confidence": 0.99
},
"DateOfExpiration": {
"type": "date",
"valueDate": "2020-08-12",
"text": "08/12/2020",
"boundingBox": [
332,
230,
414,
228,
414,
244,
332,
245
],
"page": 1,
"confidence": 0.99
},
"DocumentNumber": {
"type": "string",
"valueString": "LICWDLACD5DG",
"text": "LIC#WDLABCD456DG",
"boundingBox": [
162,
70,
307,
68,
307,
84,
163,
85
],
"page": 1,
"confidence": 0.99
},
"FirstName": {
"type": "string",
"valueString": "LIAM R.",
"text": "LIAM R.",
"boundingBox": [
158,
102,
216,
102,
216,
116,
158,
116
],
"page": 1,
"confidence": 0.985
},
"LastName": {
"type": "string",
"valueString": "TALBOT",
"text": "TALBOT",
"boundingBox": [
160,
86,
213,
85,
213,
99,
160,
100
],
"page": 1,
"confidence": 0.987
},
"Region": {
"type": "string",
"valueString": "Washington",
"confidence": 0.99
},
"Sex": {
"type": "string",
"valueString": "M",
"text": "M",
"boundingBox": [
226,
190,
232,
190,
233,
201,
226,
201
],
"page": 1,
"confidence": 0.99
}
}
}
]
}
}
Özel bir modeli eğitme
özel bir modeli eğitebilmeniz için bir Azure Depolama blobundan bir eğitim verileri kümesine ihtiyacınız vardır. Aynı türde/yapıda en az beş adet doldurulmuş form (PDF belgesi ve/veya resim) gereklidir. Eğitim verilerinizi birlikte yerleştirmeye yönelik ipuçları ve seçenekler için bkz. özel bir model için eğitim verileri kümesi oluşturma .
Etiketli veriler olmadan eğitim varsayılan işlemdir ve daha basittir. Alternatif olarak, daha önce eğitim verilerinizin bazılarını veya tümünü el ile etiketleyebilirsiniz. Bu daha karmaşık bir işlemdir, ancak daha iyi eğitilen bir model ile sonuçlanır.
Not
Modelleri, form tanıyıcı örnek etiketleme aracıgibi bir grafik kullanıcı arabirimi ile de eğitebilirsiniz.
Etiketler olmadan bir modeli eğitme
Azure Blob kabınızda bulunan belgelerle bir form tanıyıcı modeli eğitmek için aşağıdaki kıvrımlı komutunu çalıştırarak özel model eğitimi API 'sini çağırın. Komutu çalıştırmadan önce Şu değişiklikleri yapın:
{endpoint}Form tanıyıcı aboneliğiniz ile edindiğiniz uç noktayla değiştirin.{subscription key}Önceki adımdan kopyaladığınız abonelik anahtarıyla değiştirin.{SAS URL}Azure Blob depolama kapsayıcısının paylaşılan erişim imzası (SAS) URL 'si ile değiştirin. özel model eğitim verilerinize yönelik SAS URL 'sini almak için Azure portal depolama kaynağına gidin ve Depolama Gezgini sekmesini seçin. Kapsayıcınıza gidin, sağ tıklayın ve paylaşılan erişim Imzasını al' ı seçin. Depolama hesabının kendisi için değil, kapsayıcınıza yönelik SAS almak önemlidir. Okuma, yazma, silme ve Listeleme izinlerinin işaretli olduğundan emin olun ve Oluştur' a tıklayın. Sonra URL bölümündeki değeri geçici bir konuma kopyalayın. Şu biçimde olmalıdır:https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.
İstek
curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/custom/models" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{SAS URL}'}"
Konum
201 (Success)Bir konum üst bilgisine sahip bir yanıt alacaksınız. Bu üstbilginin değeri, işlemin durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz yeni eğitilen modelin model KIMLIĞINI içerir:
https://{Endpoint}/formtanıyıcı/v 2.1/özel/modeller/{ModelId}
Aşağıdaki örnekte, URL 'nin bir parçası olarak, sonraki dize models/ model kimliği olur.
https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/77d8ecad-b8c1-427e-ac20-a3fe4af503e9
Etiketler içeren bir modeli eğitme
Etiketlerle eğitebilmeniz için, \<filename\>.pdf.labels.json eğitim belgelerinin yanı sıra BLOB depolama kapsayıcıda özel etiket bilgi dosyalarına () sahip olmanız gerekir. Form tanıyıcı örnek etiketleme aracı , bu etiket dosyalarını oluşturmanıza yardımcı olmak için bir kullanıcı arabirimi sağlar. Bunu yaptıktan sonra, JSON gövdesinde olarak ayarlanmış parametresi ile özel model API 'Sini eğitebilirsiniz "useLabelFile" true .
Komutu çalıştırmadan önce Şu değişiklikleri yapın:
{endpoint}Form tanıyıcı aboneliğiniz ile edindiğiniz uç noktayla değiştirin.{subscription key}Önceki adımdan kopyaladığınız abonelik anahtarıyla değiştirin.{SAS URL}Azure Blob depolama kapsayıcısının paylaşılan erişim imzası (SAS) URL 'si ile değiştirin. özel model eğitim verilerinize yönelik SAS URL 'sini almak için Azure portal depolama kaynağına gidin ve Depolama Gezgini sekmesini seçin. Kapsayıcınıza gidin, sağ tıklayın ve paylaşılan erişim Imzasını al' ı seçin. Depolama hesabının kendisi için değil, kapsayıcınıza yönelik SAS almak önemlidir. Okuma, yazma, silme ve Listeleme izinlerinin işaretli olduğundan emin olun ve Oluştur' a tıklayın. Sonra URL bölümündeki değeri geçici bir konuma kopyalayın. Şu biçimde olmalıdır:https://<storage account>.blob.core.windows.net/<container name>?<SAS value>.
İstek
curl -i -X POST "https://{endpoint}/formrecognizer/v2.1/custom/models" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{ 'source': '{SAS URL}', 'useLabelFile':true}"
Konum
201 (Success)Bir konum üst bilgisine sahip bir yanıt alacaksınız. Bu üstbilginin değeri, işlemin durumunu sorgulamak ve sonuçları almak için kullanabileceğiniz yeni eğitilen modelin model KIMLIĞINI içerir:
https://{Endpoint}/formtanıyıcı/v 2.1/özel/modeller/{ModelId}
Aşağıdaki örnekte, URL 'nin bir parçası olarak, sonraki dize models/ model kimliği olur.
https://westus.api.cognitive.microsoft.com/formrecognizer/v2.1/custom/models/4da0bf8e-5325-467c-93bb-9ff13d5f72a2
Eğitim sonuçlarını al
Eğitme işlemini başlattıktan sonra, eğitim durumunu denetlemek için özel model al ' ı kullanın. Eğitim durumunu denetlemek için model KIMLIĞINI API isteğine geçirin:
{endpoint}Form tanıyıcı abonelik anahtarınızla edindiğiniz uç noktayla değiştirin.{subscription key}Abonelik anahtarınızla değiştirin{model ID}Önceki adımda aldığınız model kimliğiyle değiştirin
İstek
curl -X GET "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}"
Formları özel bir model ile analiz etme
Daha sonra, yeni eğitilen modelinizi kullanarak bir belgeyi analiz edebilir ve alanları ve tabloları buradan ayıklayın. Aşağıdaki kıvrımlı komutunu çalıştırarak formu çözümle API 'sini çağırın. Komutu çalıştırmadan önce Şu değişiklikleri yapın:
{endpoint}Form tanıyıcı abonelik anahtarınızdan edindiğiniz uç noktayla değiştirin. Bunu, form tanıyıcı kaynağına genel bakış sekmesinde bulabilirsiniz.{model ID}Önceki bölümde aldığınız model kimliğiyle değiştirin.{SAS URL}Azure Storage 'daki dosyanız için BIR SAS URL 'si ile değiştirin. Eğitim bölümündeki adımları izleyin, ancak tüm blob kapsayıcısı için bir SAS URL 'SI almak yerine, çözümlemek istediğiniz belirli dosya için bir tane alın.{subscription key}değerini abonelik anahtarınızla değiştirin.
İstek
curl -v "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}/analyze?includeTextDetails=true" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" -d "{ 'source': '{SAS URL}' } "
202 (Success) İşlem konumu üst bilgisi olan bir yanıt alacaksınız. Bu üstbilginin değeri, Çözümle işleminin sonuçlarını izlemek için kullanacağınız bir sonuç KIMLIĞI içerir:
https:// biliveservice/formtanıyıcı/v 2.1/özel/modeller/{ModelId}/analiz Zeresults/{resultıd}
Aşağıdaki örnekte, URL 'nin bir parçası olarak, sonraki dize analyzeResults/ sonuç kimliğidir.
https://cognitiveservice/formrecognizer/v2/layout/analyzeResults/54f0b076-4e38-43e5-81bd-b85b8835fdfb
Sonraki adım için bu sonuç KIMLIĞINI kaydedin.
Analiz sonuçlarını al
Çözümle işleminin sonuçlarını sorgulamak için analiz formu sonucunu al API 'sini çağırın.
{endpoint}Form tanıyıcı abonelik anahtarınızdan edindiğiniz uç noktayla değiştirin. Bunu, form tanıyıcı kaynağına genel bakış sekmesinde bulabilirsiniz.{result ID}Önceki bölümde ALDıĞıNıZ kimlik ile değiştirin.{subscription key}değerini abonelik anahtarınızla değiştirin.
İstek
curl -X GET "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}/analyzeResults/{resultId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"
200 (Success)Aşağıdaki biçimde BIR JSON gövdesi ile yanıt alacaksınız. Çıktı basitlik için kısaltıldı. "status"En alttaki alana dikkat edin. "succeeded"Analiz işlemi tamamlandığında bu değer olacaktır. Çözümle işlemi tamamlanmadıysa, komutu yeniden çalıştırarak hizmeti tekrar sorgulamanızı gerekir. Çağrılar arasında bir saniye veya daha fazla Aralık önerilir.
Etiketler olmadan eğitilen özel modellerde, anahtar/değer çifti ilişkilendirmeleri ve tabloları "pageResults" JSON çıktısının düğümüdür. Etiketlerle eğitilen özel modellerde, anahtar/değer çifti ilişkilendirmeleri "documentResults" düğümüdür. Ayrıca, ıncludetekxtdetails URL parametresi aracılığıyla düz metin ayıklama belirttiyseniz, "readResults" düğüm belgedeki tüm metinlerin içeriğini ve konumlarını gösterir.
Bu örnek JSON çıktısı kolaylık sağlaması için kısaltıldı. GitHub tüm örnek çıktısınabakın.
Yanıt gövdesi
{
"status": "succeeded",
"createdDateTime": "2020-08-21T01:13:28Z",
"lastUpdatedDateTime": "2020-08-21T01:13:42Z",
"analyzeResult": {
"version": "2.1.0",
"readResults": [
{
"page": 1,
"angle": 0,
"width": 8.5,
"height": 11,
"unit": "inch",
"lines": [
{
"text": "Project Statement",
"boundingBox": [
5.0444,
0.3613,
8.0917,
0.3613,
8.0917,
0.6718,
5.0444,
0.6718
],
"words": [
{
"text": "Project",
"boundingBox": [
5.0444,
0.3587,
6.2264,
0.3587,
6.2264,
0.708,
5.0444,
0.708
]
},
{
"text": "Statement",
"boundingBox": [
6.3361,
0.3635,
8.0917,
0.3635,
8.0917,
0.6396,
6.3361,
0.6396
]
}
]
},
...
]
}
],
"pageResults": [
{
"page": 1,
"keyValuePairs": [
{
"key": {
"text": "Date:",
"boundingBox": [
6.9833,
1.0615,
7.3333,
1.0615,
7.3333,
1.1649,
6.9833,
1.1649
],
"elements": [
"#/readResults/0/lines/2/words/0"
]
},
"value": {
"text": "9/10/2020",
"boundingBox": [
7.3833,
1.0802,
7.925,
1.0802,
7.925,
1.174,
7.3833,
1.174
],
"elements": [
"#/readResults/0/lines/3/words/0"
]
},
"confidence": 1
},
...
],
"tables": [
{
"rows": 5,
"columns": 5,
"cells": [
{
"text": "Training Date",
"rowIndex": 0,
"columnIndex": 0,
"boundingBox": [
0.6944,
4.2779,
1.5625,
4.2779,
1.5625,
4.4005,
0.6944,
4.4005
],
"confidence": 1,
"rowSpan": 1,
"columnSpan": 1,
"elements": [
"#/readResults/0/lines/15/words/0",
"#/readResults/0/lines/15/words/1"
],
"isHeader": true,
"isFooter": false
},
...
]
}
],
"clusterId": 0
}
],
"documentResults": [],
"errors": []
}
}
Sonuçları geliştirme
Düğüm altındaki "confidence" her anahtar/değer sonucu için değerleri "pageResults" inceler. Ayrıca, düğümdeki metin okuma işlemine "readResults" karşılık gelen güven puanlarına da bakmalısiniz. Okuma sonuçlarının güveni, anahtar/değer ayıklama sonuçlarının güvenini etkilemez, bu nedenle her ikisini de denetlemelisiniz.
- Okuma işlemi için güven puanı düşükse, giriş belgelerinizin kalitesini iyileştirmeyi deneyin (bkz. Giriş gereksinimleri).
- Anahtar/değer ayıklama işlemi için güven puanları düşükse, analiz edilirken kullanılan belgelerin eğitim kümesinde kullanılan belgelerle aynı türde olduğundan emin olur. Eğitim kümesinde belgelerin görünümü farklı ise, bunları farklı klasörlere bölmeyi ve her varyasyon için bir model eğitmeyi göz önünde bulundurabilirsiniz.
Hedefleyilen güven puanları kullanım örnek durumuna bağlıdır, ancak genellikle %80 veya üzeri bir puanı hedeflemek iyi bir uygulamadır. Tıbbi kayıtların veya fatura hesaplarının okunması gibi daha hassas durumlarda %100 puan önerilir.
Özel modelleri yönetme
Özel modellerin bir listesini alın
Aboneliğinize ait olan tüm özel modellerin bir listesini döndürmek için aşağıdaki komutta özel modeller API 'sini Listele ' i kullanın.
{endpoint}Form tanıyıcı aboneliğiniz ile edindiğiniz uç noktayla değiştirin.{subscription key}Önceki adımdan kopyaladığınız abonelik anahtarıyla değiştirin.
İstek
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/custom/models?op=full"
-H "Ocp-Apim-Subscription-Key: {subscription key}"
Yanıt gövdesi
200Aşağıdaki gıbı JSON verileri ile başarılı bir yanıt alırsınız. "modelList"Öğesi, oluşturulan tüm modellerinizi ve bunların bilgilerini içerir.
{
"summary": {
"count": 0,
"limit": 0,
"lastUpdatedDateTime": "string"
},
"modelList": [
{
"modelId": "string",
"status": "creating",
"createdDateTime": "string",
"lastUpdatedDateTime": "string"
}
],
"nextLink": "string"
}
Belirli bir modeli al
Belirli bir özel model hakkında ayrıntılı bilgi almak için aşağıdaki komutta özel model al API 'sini kullanın.
{endpoint}Form tanıyıcı aboneliğiniz ile edindiğiniz uç noktayla değiştirin.{subscription key}Önceki adımdan kopyaladığınız abonelik anahtarıyla değiştirin.{modelId}Aramak istediğiniz özel MODELIN kimliğiyle değiştirin.
İstek
curl -v -X GET "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"
İstek gövdesi
200Aşağıdaki gıbı JSON verileri ile başarılı bir yanıt alırsınız.
{
"modelInfo": {
"modelId": "string",
"status": "creating",
"createdDateTime": "string",
"lastUpdatedDateTime": "string"
},
"keys": {
"clusters": {}
},
"trainResult": {
"trainingDocuments": [
{
"documentName": "string",
"pages": 0,
"errors": [
"string"
],
"status": "succeeded"
}
],
"fields": [
{
"fieldName": "string",
"accuracy": 0.0
}
],
"averageModelAccuracy": 0.0,
"errors": [
{
"message": "string"
}
]
}
}
Kaynak hesabındaki bir modeli silme
Ayrıca, KIMLIĞINE başvurarak hesabınızdan bir modeli silebilirsiniz. Bu komut, önceki bölümde kullanılan modeli silmek için özel model silme API 'sini çağırır.
{endpoint}Form tanıyıcı aboneliğiniz ile edindiğiniz uç noktayla değiştirin.{subscription key}Önceki adımdan kopyaladığınız abonelik anahtarıyla değiştirin.{modelId}Aramak istediğiniz özel MODELIN kimliğiyle değiştirin.
İstek
curl -v -X DELETE "https://{endpoint}/formrecognizer/v2.1/custom/models/{modelId}" -H "Ocp-Apim-Subscription-Key: {subscription key}"
204Modelinizin silinmek üzere işaretlenip işaretlenmediğini belirten bir başarı yanıtı alacaksınız. Model yapıtları 48 saat içinde kaldırılacak.
Sonraki adımlar
Bu proje için form tanıyıcı REST API formları farklı yollarla analiz etmek için kullandınız. Daha ayrıntılı bilgi edinmek için, başvuru belgelerini inceleyerek form tanıyıcı API 'sini inceleyin.