Entwicklung des HarmonyOS-Lernpfads – KI-Funktionsentwicklung (QR-Code-Generierung und Texterkennung)

Übersicht über die KI-Fähigkeiten

Bietet umfangreiche KI-Funktionen (Künstliche Intelligenz) für Anwendungen und unterstützt die sofort einsatzbereite Nutzung. Entwickler können KI-Funktionen flexibel und bequem wählen, um Anwendungen intelligenter zu machen.

Die freigegebenen KI-Funktionen sind in der folgenden Tabelle aufgeführt:

Fähigkeit

Einführung

QR-Code-Generierung

Geben Sie gemäß den vom Entwickler angegebenen Zeichenfolgeninformationen und der Größe des QR-Codebilds den entsprechenden Bytestrom des QR-Codebilds zurück. Der Anrufer kann über den QR-Code-Byte-Stream ein QR-Code-Bild generieren.

Universelle Texterkennung

Durch optische Eingabemethoden wie Fotografieren und Scannen wird der Text verschiedener Rechnungen, Karten, Formulare, Zeitungen, Bücher usw. in Bildinformationen umgewandelt, und dann werden die Bildinformationen in Zeicheninformationen umgewandelt, die von Computern und anderen verwendet werden können Geräte mit Texterkennungstechnologie. .

Bild super Auflösung

Bietet 1x- und 3x-Superauflösungsfunktionen, die für mobile Endgeräte geeignet sind; 1x-Superauflösung kann das Komprimierungsrauschen von Bildern entfernen, und 3x-Superauflösung kann Komprimierungsrauschen effektiv unterdrücken und bietet gleichzeitig eine dreifache Seitenlängenverstärkungsfähigkeit.

Dokumentenerkennung und -korrektur

Es werden zusätzliche Verbesserungen für den Dokument-Remake-Prozess bereitgestellt, der aus zwei Unterfunktionen besteht: Dokumenterkennung und Dokumentkorrektur.

Textbild mit Superauflösung

Die Superauflösung von Textbildern kann das Bild mit Textinhalt um das Neunfache vergrößern (Höhe und Breite um das Dreifache vergrößern) und gleichzeitig die Klarheit des Textes im Bild verbessern, was als „Superauflösung von Textbildern“ bezeichnet wird ", oder kurz "Textbild-Superauflösung".

Partizip

Für einen Eingabetext kann die Wortsegmentierung automatisch durchgeführt werden und gleichzeitig werden unterschiedliche Wortsegmentierungsgranularitäten bereitgestellt. Entwickler können die Granularität der Wortsegmentierung nach Bedarf anpassen.

Teil-of-Speech-Tagging

Ein eingegebener Text wird automatisch über die Wortart-Tagging-Schnittstelle segmentiert und für jedes Wort im Ergebnis der Wortsegmentierung wird ein korrekter Teil der Sprache markiert. Die Kennzeichnung von Wortarten bietet unterschiedliche Granularitäten der Wortsegmentierung, und Entwickler können die Granularität der Wortsegmentierung nach Bedarf anpassen.

Absichtserkennung der Assistenzklasse

Semantische Analysen und Absichtserkennung werden an Textnachrichten durchgeführt, die von Benutzern an Geräte gesendet werden, und es werden verschiedene intelligente Anwendungsszenarien abgeleitet, um Geräte intelligenter und intelligenter zu machen.

Absichtserkennung der IM-Klasse

Verwenden Sie maschinelle Lerntechnologie, um den Inhalt von Textnachrichten von IM-Anwendungen wie Benutzer-Textnachrichten oder Chat-Apps zu analysieren und die durch den Nachrichteninhalt dargestellte Absicht des Benutzers zu identifizieren.

Schlüsselwortextraktion

Der Kerninhalt, den der Text ausdrücken möchte, kann aus einer großen Menge an Informationen extrahiert werden, bei denen es sich um Entitäten mit spezifischer Bedeutung handeln kann, wie zum Beispiel: Namen von Personen, Orten, Filmen usw. Es können auch einige grundlegende, aber kritische Wörter im Text sein.

Entitätserkennung

Extrahieren Sie Entitäten mit spezifischer Bedeutung aus der natürlichen Sprache und führen Sie auf dieser Grundlage eine Reihe verwandter Vorgänge und Funktionen wie die Suche aus.

Spracherkennung

Konvertieren Sie Sprachdateien und Echtzeit-Sprachdatenströme in chinesische Zeichenfolgen mit einer Genauigkeit von über 90 % (95 % für lokale Erkennung).

Sprachübertragung

Wandeln Sie Text in Sprache um und machen Sie Ankündigungen.

veranschaulichen

Derzeit unterstützt die Funktion zur QR-Code-Generierung intelligente tragbare Geräte und Mobiltelefone; andere KI-Funktionen unterstützen nur mobile Geräte.

Übersicht über die Codegenerierung

Die Codegenerierung kann den entsprechenden Bytestrom des QR-Codebilds gemäß den vom Entwickler angegebenen Zeichenfolgeninformationen und der Größe des QR-Codebilds zurückgeben. Der Anrufer kann über den QR-Code-Byte-Stream ein QR-Code-Bild generieren.

Einschränkungen und Einschränkungen

  • Derzeit werden nur in China verkaufte Huawei-Endgeräte unterstützt.
  • Unterstützt derzeit nur die Generierung von QR-Codes (Quick Response Code). Aufgrund der Einschränkung des zweidimensionalen QR-Codealgorithmus darf die Länge der Zeichenfolgeninformationen bei der Entwicklung der Java-Sprache 2953 Zeichen nicht überschreiten; bei der Entwicklung der JS-Sprache darf die Länge der Zeichenfolgeninformationen 256 Zeichen nicht überschreiten.
  • Bei der Entwicklung in Java-Sprache darf die Breite des generierten QR-Codebilds 1920 Pixel und die Höhe 1680 Pixel nicht überschreiten. Da der QR-Code Informationen über ein quadratisches Array überträgt, wird empfohlen, dass das zweidimensionale Codebild quadratisch ist. Wenn das zweidimensionale Codebild rechteckig ist, bleibt der umgebende Bereich der QR-Code-Informationen leer.
  • Bei der Entwicklung in JS-Sprache beträgt die Mindestbreite und -höhe des generierten QR-Codebilds 200 Pixel. Wenn Breite und Höhe inkonsistent sind, wird der Mindestwert der beiden als Seitenlänge des QR-Codes und als endgültig generierter QR verwendet Der Code wird in der Mitte angezeigt. Es werden zwei Arten von QR-Codes unterstützt: Rechteck und Kreis (Rechteck ist die Standardeinstellung).

Entwicklung der Codegenerierung

Szeneneinführung

Durch die Codegenerierung können entsprechende QR-Codebilder gemäß den angegebenen Zeichenfolgeninformationen generiert werden. Beispiele für gängige Anwendungsszenarien:

  • Soziale oder Kommunikationsanwendungen: Generieren Sie einen Kontakt-QR-Code basierend auf den eingegebenen Kontaktinformationen.
  • Einkaufs- oder Zahlungsanwendungen: Generieren Sie einen Empfangs- oder Zahlungs-QR-Code entsprechend dem eingegebenen Zahlungslink.

Schnittstellenbeschreibung

Die Codegenerierung stellt die IBarcodeDetector()-Schnittstelle bereit, und die Funktionen gängiger Methoden werden wie folgt beschrieben:

Schnittstellenname

Methode

Funktionsbeschreibung

IBarcodeDetector

int discover(String barcodeInput, byte[] bitmapOutput, int width, int height);

Generieren Sie entsprechend den angegebenen Informationen und der Größe des QR-Code-Bildes den Bytestrom des QR-Code-Bildes.

IBarcodeDetector

int release();

Stoppen Sie den QR-Code-Generierungsdienst und geben Sie Ressourcen frei.

Entwicklungsschritte

1. Wenn Sie das Codegenerierungs-SDK verwenden, müssen Sie zuerst die relevanten Klassen zum Projekt hinzufügen

import ohos.ai.cv.common.ConnectionCallback;
import ohos.ai.cv.common.VisionManager;
import ohos.ai.cv.qrcode.IBarcodeDetector;

2. Definieren Sie den ConnectionCallback-Rückruf, um den Vorgang zu realisieren, nachdem die Verbindungsfähigkeits-Engine erfolgreich ist oder nicht.

ConnectionCallback connectionCallback = new ConnectionCallback() {
    @Override
    public void onServiceConnect() {
        // Do something when service connects successfully
    }

    @Override
    public void onServiceDisconnect() {
        // Do something when service connects unsuccessfully
    }
};

3. Rufen Sie die Methode VisionManager.init() auf, verwenden Sie den Kontext und den ConnectionCallback dieses Projekts als Eingabeparameter und stellen Sie eine Verbindung mit der Capability Engine her. Der Kontext sollte eine Instanz oder Unterklasse von ohos.aafwk.ability.Ability oder ohos sein .aafwk.ability.AbilitySlice-Klasseninstanz.

int result = VisionManager.init(context, connectionCallback);

4. Nachdem Sie den onServiceConnect-Rückruf zur erfolgreichen Verbindung mit dem Dienst erhalten haben, instanziieren Sie die IBarcodeDetector-Schnittstelle und verwenden Sie den Kontext dieses Projekts als Eingabeparameter

IBarcodeDetector barcodeDetector = VisionManager.getBarcodeDetector(context);

5. Definieren Sie die vom Code generierte Bildgröße und weisen Sie den Byte-Stream-Array-Speicherplatz entsprechend der Bildgröße zu.

final int SAMPLE_LENGTH = 152;
byte[] byteArray = new byte[SAMPLE_LENGTH * SAMPLE_LENGTH * 4];

6. Rufen Sie die Methode „Detect()“ von IBarcodeDetector auf, um den entsprechenden QR-Code-Bild-Bytestrom gemäß den Eingabezeichenfolgeninformationen zu generieren.

int result = barcodeDetector.detect("This is a TestCase of IBarcodeDetector", byteArray, SAMPLE_LENGTH, SAMPLE_LENGTH);

7. Wenn der Rückgabewert 0 ist, bedeutet dies, dass der Aufruf erfolgreich war. Später können Sie die API verwenden, um den dekodierten Stream in eine Bildquelle umzuwandeln. Ein kurzes Beispiel lautet wie folgt:

InputStream inputStream = new ByteArrayInputStream(byteArray);
ImageSource imageSource = ImageSource.create(inputStream, null);

8. Wenn die Codegenerierungsfunktion aufgebraucht ist, rufen Sie die release()-Methode von IBarcodeDetector auf, um Ressourcen freizugeben

result = barcodeDetector.release();

9. Rufen Sie die Methode VisionManager.destroy() auf, um die Verbindung zur Capability Engine zu trennen.

VisionManager.destroy();

Übersicht über die Texterkennung

Die Kerntechnologie der universellen Texterkennung ist OCR (Optical Character Recognition, Optical Character Recognition). OCR ist eine Art optische Eingabemethode wie Fotografieren, Scannen usw., um den gedruckten Text verschiedener Rechnungen, Karten, Formulare, Zeitungen, Bücher usw. in Bildinformationen umzuwandeln und dann das Bild mithilfe der Texterkennungstechnologie umzuwandeln Informationen in Computer und andere Geräte. Zeicheninformationstechnologie.

Einschränkungen und Einschränkungen

  • Zu den unterstützten Bildformaten gehören JPEG, JPG, PNG.
  • Die universelle Texterkennung unterstützt derzeit die folgenden Sprachen: Chinesisch, Englisch, Japanisch, Koreanisch, Russisch, Italienisch, Spanisch, Portugiesisch, Deutsch und Französisch (weitere Sprachen werden in Zukunft hinzugefügt).
  • Derzeit unterstützt es die Erkennung gedruckter Dokumente, jedoch nicht die Erkennung handschriftlicher Schriftarten.
  • Um ein optimales Erkennungsergebnis zu gewährleisten, muss beim Aufrufen der allgemeinen Texterkennungsfunktion sichergestellt werden, dass das Eingabebild eine geeignete Bildqualität (empfohlen über 720p) und ein Seitenverhältnis (empfohlen unter 2:1, was nahe bei liegt) aufweist das Seitenverhältnis des Mobiltelefonbildschirms). ). Wenn das Eingabebild eine nicht empfohlene Bildgröße hat, kann die Genauigkeit der Texterkennung beeinträchtigt sein.
  • Um ein optimales Erkennungsergebnis zu gewährleisten, wird empfohlen, dass der Winkel zwischen Text und Aufnahmewinkel im Bereich von plus oder minus 30 Grad liegt.

Entwicklung der Zeichenerkennung

Szeneneinführung

Die universelle Zeichenerkennung ist auf die folgenden Szenarien anwendbar:

  • Es kann eine Texterkennung und -erkennung für Bilder wie Dokumentreproduktionen und Street View-Reproduktionen durchführen und kann auch in andere Anwendungen integriert werden, um Texterkennungs- und -erkennungsfunktionen bereitzustellen und basierend auf den Erkennungsergebnissen Übersetzungs-, Such- und andere verwandte Dienste bereitzustellen.
  • Es kann Bilddaten aus mehreren Quellen wie Kameras und Galerien verarbeiten und eine offene Schnittstelle für die automatische Texterkennung, Textpositionserkennung in Bildern und Textinhaltsfunktionen bereitstellen;
  • Bis zu einem gewissen Grad kann es die Texterkennung in Szenen wie Textneigung, Neigung des Aufnahmewinkels, komplexen Lichtverhältnissen und komplexem Texthintergrund unterstützen.

Schnittstellenbeschreibung

Die universelle Texterkennung bietet zwei Funktionsschnittstellen: setVisionConfiguration() und discover().

Rufen Sie die Methode setVisionConfiguration() von ITextDetector auf und wählen Sie den OCR-Typ aus, der über die eingehende TextConfiguration aufgerufen werden soll.

void setVisionConfiguration(TextConfiguration textConfiguration);

In der folgenden Tabelle sind allgemeine Einstellungen für TextConfiguration aufgeführt:

Schnittstellenname

Parametername

Typ

Parameterbeschreibung

setDetectType()

Erkennungstyp

int

Definition des OCR-Engine-Typs:

TextDetectType.TYPE_TEXT_DETECT_FOCUS_SHOOT (OCR für natürliche Szenen)

Sprache einstellen()

Sprache

int

Identifizieren Sie Sprachdefinitionen:

  • TextConfiguration.AUTO (keine Sprache angegeben, Spracherkennung wird durchgeführt)
  • TextConfiguration.CHINESE (Chinesisch)
  • TextConfiguration.ENGLISH (Englisch)
  • TextConfiguration.SPANISH (Spanisch)
  • TextConfiguration.PORTUGUESE (Portugiesisch)
  • TextConfiguration.ITALIAN (Italienisch)
  • TextConfiguration.GERMAN (Deutsch)
  • TextConfiguration.FRENCH (Französisch)
  • TextConfiguration.RUSSIAN (Russisch)
  • TextConfiguration.JAPANESE (Japanisch)
  • TextConfiguration.KOREAN (Koreanisch)

Der Standardwert ist TextConfiguration.AUTO.

setProcessMode()

Modus

int

Definition des Prozessmodus:

  • VisionConfiguration.MODE_IN (gleicher Prozessaufruf)
  • VisionConfiguration.MODE_OUT (prozessübergreifender Aufruf)

Der Standardwert ist VisionConfiguration.MODE_OUT.

Rufen Sie die Methode „Detect()“ von ITextDetector auf, um das Erkennungsergebnis zu erhalten.

int detect(VisionImage image, Text result, VisionCallback<Text> visionCallBack);

In:

  • Bild ist das Eingabebild, das von OCR erkannt und erkannt werden soll.
  • Wenn visionCallback null ist, wird ein synchroner Aufruf ausgeführt, der Ergebniscode wird von der Methode zurückgegeben und die Erkennungs- und Erkennungsergebnisse werden vom Ergebnis zurückgegeben.
  • Wenn visionCallback eine gültige Rückruffunktion ist, wird die Funktion asynchron aufgerufen. Wenn die Funktion zurückkehrt, ist der Wert im Ergebnis ungültig und das tatsächliche Erkennungsergebnis wird von der Rückruffunktion zurückgegeben. Informationen zur Verwendung der Rückruffunktion finden Sie in den spezifischen Anweisungen in den Entwicklungsschritten.
  • Wenn der Aufruf des Synchronmodus erfolgreich ist, gibt die Funktion den Ergebniscode 0 zurück. Wenn die Anrufanforderung im asynchronen Modus erfolgreich gesendet wurde, gibt die Funktion den Ergebniscode 700 zurück.

Entwicklungsschritte

1. Wenn Sie das Universal Text Recognition SDK verwenden, fügen Sie dem Projekt verwandte Klassen hinzu, die die Texterkennung implementieren.

import ohos.ai.cv.common.ConnectionCallback;
import ohos.ai.cv.common.VisionCallback;
import ohos.ai.cv.common.VisionConfiguration;
import ohos.ai.cv.common.VisionImage;
import ohos.ai.cv.common.VisionManager;
import ohos.ai.cv.text.ITextDetector;
import ohos.ai.cv.text.Text;
import ohos.ai.cv.text.TextConfiguration;
import ohos.ai.cv.text.TextDetectType;
import ohos.app.Context;
import ohos.media.image.PixelMap;

2. Definieren Sie den ConnectionCallback-Rückruf, um den Vorgang zu realisieren, nachdem die Verbindungsfähigkeits-Engine erfolgreich ist oder nicht.

ConnectionCallback connectionCallback = new ConnectionCallback() {
    @Override
    public void onServiceConnect() {
        // 定义连接能力引擎成功后的操作。
    }

    @Override
    public void onServiceDisconnect() {
        // 定义连接能力引擎失败后的操作。
    }
};

3. Rufen Sie die Methode VisionManager.init() auf und verwenden Sie den Kontext dieses Projekts und den definierten ConnectionCallback-Rückruf als Eingabeparameter, um eine Verbindung mit der Capability Engine herzustellen. context sollte eine Instanz oder Unterklasseninstanz von ohos.aafwk.ability.Ability oder ohos.aafwk.ability.AbilitySlice sein.

int result = VisionManager.init(context, connectionCallback);

4. Nachdem Sie den onServiceConnect-Rückruf erhalten und erfolgreich eine Verbindung zum Dienst hergestellt haben, instanziieren Sie die ITextDetector-Schnittstelle und verwenden Sie den Kontext dieses Projekts als Eingabeparameter.

ITextDetector textDetector = VisionManager.getTextDetector(context);

5. 实例化VisionImage对象image,并传入待检测图片pixelMap。

VisionImage image = VisionImage.fromPixelMap(pixelMap);

6. 实例化Text对象text,该对象在同步模式下用于存放调用textDetector.detect()方法的结果返回码及文字识别结果。

Text text = new Text();

7. (可选) 定义VisionCallback<Text>回调。

VisionCallback<Text> callback= new VisionCallback<Text>() {
    @Override
    public void onResult(Text text) {
        // 对正确获得文字识别结果进行处理。
    }

    @Override
    public void onError(int i) {
        // 处理错误返回码。
    }

    @Override
    public void onProcessing(float v) {
        // 返回处理进度。
    }
};

说明

  • 在异步模式下,该类的onResult()方法用于获得文字识别结果Text;onError()方法用于处理错误返回码;onProcessing()方法用于返回处理进度,目前没有实现此接口的功能。
  • 同步与异步模式区别在于detect()的最后一个参数VisionCallback<Text>是否为空。若非空则为异步模式。此时会忽略自定义的Text输入(效果与传入null相同),接口调用结果一律从VisionCallback<Text>获得,自定义的Text输入不做更新。

8. 通过TextConfiguration配置textDetector()方法的运行参数,可选择识别场景、语言类型、调用模式等。跨进程模式(MODE_OUT)下调用方与能力引擎处于不同进程;同进程模式(MODE_IN)下,能力引擎在调用方进程中实例化,调用方通过反射的方式调用引擎里的通用文字识别能力。以聚焦通用文字识别,同进程英文语种检测为例:

TextConfiguration.Builder builder = new TextConfiguration.Builder();
builder.setProcessMode(VisionConfiguration.MODE_IN);
builder.setDetectType(TextDetectType.TYPE_TEXT_DETECT_FOCUS_SHOOT);
builder.setLanguage(TextConfiguration.ENGLISH);
TextConfiguration config = builder.build();
textDetector.setVisionConfiguration(config);

9. (可选)调用ITextDetector的prepare()方法。

result = textDetector.prepare();

说明

如果返回的result不为0,说明当前OCR能力准备失败,需要处理错误,不再执行之后的动作。在detect()方法中会首先调用prepare()启动引擎,如果引擎已经启动则不会再次启动。

10. 调用ITextDetector的detect()方法。

result = textDetector.detect(image, text, null); // 同步

或者

result = textDetector.detect(image, null, visionCallback); // 异步

说明

  • 同步模式调用完成时,该函数立即返回结果码;
  • 异步模式调用请求发送成功时,该函数返回结果码700。如果返回其他的结果码,说明异步调用请求不成功,需要先处理错误,此时回调函数不会被调用。
  • 如果异步模式调用请求发送成功,则OCR完成后,相应的回调函数会被自动调用。
    • 如果onResult()回调被调用,说明OCR检测识别成功,相当于同步模式结果码为0的情况。
    • 如果onError()方法被调用,则说明OCR发生了错误,具体的调用结果码将由onError()的参数接收。

结果码定义如下表:

结果码

说明

0

成功

-1

未知错误

-2

不支持的功能或接口

-3

内存分配失败或创建对象失败

-4

所需库加载失败

-10

引擎开关已经关闭

101

失败

102

超时

200

输入参数不合法(图片尺寸错误)

201

输入参数不合法(为空)

210

输入参数合法

500

服务绑定异常

521

服务绑定异常断开

522

服务已连接

600

模型文件异常

601

模型文件不存在

602

模型加载失败

700

异步调用请求发送成功

1001

神经网络处理单元错误

11. 调用ITextDetector的release()方法,释放资源。调用pixelMap的release()方法,释放图片内存。

textDetector.release();
if (pixelMap != null) {
    pixelMap.release();
    pixelMap = null;
}

说明

不再使用通用文字识别能力时,调用release()方法释放资源。

12. 调用VisionManager.destroy()方法,断开与能力引擎的连接。

VisionManager.destroy();

Guess you like

Origin blog.csdn.net/weixin_47094733/article/details/131345701