Het gebruik van Tesseract OCR in een iOS-app

– om planklabels te lezen

Optische tekenherkenning is al een goed ingeburgerd onderwerp in zowel kunstmatige intelligentie als computer vision. Dit is om goede redenen; OCR kan worden gebruikt om fysieke gedrukte - of zelfs handgeschreven - tekst succesvol om te zetten in machineleesbare vorm. Een mogelijke toepassing hiervan zou kunnen zijn om kentekenplaten van auto's voor verschillende implementaties te lezen.

Musea maken al gebruik van machineleesbare labels op objecten of opslagplanken in de vorm van streepjescodes, QR-codes of zelfs RFID-tags. Hoewel dit heel goed werkt, vereist het wel het aanbrengen van deze nieuwe labels op objecten of planken. Wat als een museum momenteel alleen duidelijk afgedrukte labels heeft met tekst om objecten te identificeren? Zou het niet geweldig zijn als een inventarisatiebeheerprogramma, zoals Axiell Move, bestaande afgedrukte labels zou kunnen lezen, evenals machineleesbare labels zoals streepjescodes.

In onze proof-of-concept-implementatie kan men het resultaat van de OCR-app kopiëren en plakken in Axiell Move, maar in de toekomst zou een rechtstreekse integratie natuurlijk veel beter zijn.

MoveOCRIconw.Name_
IMG_0012
Instellen van Tesseract

Om onze ideeën te testen, hebben we een eenvoudige iOS-toepassing gemaakt in C# ( Xamarin) en gebruikten we Tesseract – een open-source OCR-engine – om enkele voorbeeldlabels te lezen die we uit een museum hebben gekregen. Tesseract is vrij licht (trainingsgegevens inbegrepen) en is relatief eenvoudig te gebruiken. Hoewel Tesseract zelf is geschreven in C++, is er een bestaande C#-wrapper voor iOS te vinden op hun GitHub-pagina.

Om gedrukte tekst te interpreteren, maakt u een Tesseract Engine-object aan, dat wordt geïnitieerd met een tekenreeksparameter om in te stellen in welke taal u de Engine wilt laten herkennen. Nadat u dit hebt gedaan, kunt u eenvoudig de functie 'SetImage' aanroepen, die zorgt voor de verwerking van de afbeelding en het starten van het OCR-proces. Wanneer het proces is voltooid, heeft de Engine-instantie een variabele genaamd 'Tekst' ingesteld, die de geïnterpreteerde afbeelding als een tekenreeks bevat. – Let op dat de functie 'SetImage' asynchroon is en moet worden afgewacht voordat u toegang probeert te krijgen tot het resultaat.

Tesseract implementeert de OCR als een neuraal netwerk (kunstmatige intelligentie) en heeft dus trainingsgegevens nodig om te functioneren. Er zijn opensource meertalige '.trainingdata'-bestanden beschikbaar op de Tesseract-OCR GitHub-pagina, die vooraf geconfigureerde neurale netwerken bevatten. Er zijn verschillende trainingsdatasets die kunnen worden gedownload met verschillen in nauwkeurigheid, snelheid en grootte, variërend van 3,9 tot 22,4 MB alleen voor Engelse trainingsgegevens.

Onze toepassing zou alleen omgaan met hoogcontrastblokletters, dus de meest elementaire training bleek goed te werken. We ondervonden enkele moeilijkheden bij het uitvoeren van nieuwere trainingsgegevens op (de verouderde) iOS 10.3. Voor het debuggen wilden we dat de app zou werken op een fysiek testapparaat (een iPhone 5), dus we moesten een iets oudere dataset kiezen. We liepen echter tegen meer problemen aan bij het instellen van een live camerabeeld op het scherm. Apple heeft in de loop der jaren verschillende manieren ontwikkeld om een livebeeld te verkrijgen, en hoewel elke iteratie gestroomlijnder is dan de vorige, is de versie van iOS 10.3 een beetje rommelig... Dus besloten we over te schakelen naar iOS 12.2 voor een toekomstbestendige en leesbare toepassing. Gelukkig is het bijwerken van de trainingsgegevens volledig probleemloos en kan eenvoudig worden bijgewerkt naar een nieuwere versie.

Live Camera View

Voor een live feed in IOS 12.2 hebben we de AVFoundation namespace opgenomen, waarmee je een AVCaptureSession kunt opzetten. De sessie heeft een invoer en uitvoer; met behulp van de AVCaptureDeviceInput.FromDevice()-functie krijg je de camera in het juiste formaat. Als uitvoer hebben we een AVCapturePhotoOutput-instantie gebruikt, waarmee we afbeeldingen van de live feed kunnen vastleggen. Nadat dit klaar is, kun je de AVCaptureSession toevoegen als een sublaag aan een UIView naar keuze met behulp van een nieuwe AVCaptureVideoPreviewLayer-instantie, die eenvoudig de sessie als parameter aanneemt (je moet waarschijnlijk wat knoeien met frames en grenzen om de laag goed in de UIView te laten passen!). Terwijl de sessie draait, kun je een foto maken met de CapturePhoto-functie van AVCapturePhotoOutput (– dit is een van de functies die nog niet bestond in 10.3, wat de zaken lastiger maakt dan nodig is). Hiermee wordt een gebeurtenis geactiveerd wanneer klaar, die je kunt vastleggen met een delegate – of een asynchrone delegate in ons geval, aangezien het OCR-proces onmiddellijk begint.

Om onze testtoepassing af te ronden, hebben we een alfanumerieke tekensfilter geïmplementeerd, automatisch kopiëren van het OCR-resultaat naar het klembord, en een schuifregelaar om te selecteren welk deel van de afbeelding je wilt lezen. Er kan echter veel meer functionaliteit worden toegevoegd; variërend van het uitbreiden van de huidige filteropties tot het toevoegen van een verbinding met een database om zoekopdrachten direct uit te voeren wanneer het OCR-proces is voltooid.

IMG_0013

Broncode

 – Demo-programma, de broncode voor dit 'proof of concept' project: https://github.com/bertdd/ocr-concept

Referenties

 – Tesseract OCR GitHub, hier vindt u alle benodigde downloadlinks, inclusief een korte documentatie: https://github.com/tesseract-ocr/

 – Apple AVFoundation, informatie over de klassen die worden gebruikt om video weer te geven en afbeeldingen vast te leggen: https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture

 – Xamarin UIKit, informatie over de UI-objecten die worden gebruikt om live video weer te geven: https://alm.axiell.com/collections-management-solutions/axiell-collections/

An unhandled error has occurred. Reload 🗙