Zephyrnet-logo

Inzicht in labeldetectie in facturen met behulp van OpenCV

Datum:

Introductie

Documentbeeldanalyse is de naam voor de algoritmen en methoden die worden gebruikt om de pixels in een afbeelding om te zetten in een beschrijving die een computer kan begrijpen. Optical Character Recognition, of OCR, gebruikt computervisie om de tekst in afbeeldingen te vinden en te lezen. OCR kan de uitvoer in enkele milliseconden nauwkeurig voorspellen. OCR was een van de eerste problemen die computer visie geprobeerd op te lossen, en sindsdien is er een lange weg afgelegd. Met behulp van deze OCR-modellen hebben we een manier gevonden om facturen te detecteren, zoals de naam van de leverancier, de factuurdatum, het factuurnummer, het factuurbedrag en het totale aantal artikelen. Om een ​​hoge mate van nauwkeurigheid te krijgen, gebruikten we een ensembletechniek waarbij we verschillende OCR's gebruikten om de labels afzonderlijk te detecteren en te herkennen.

leerdoelen 

Hieronder staan ​​de belangrijkste leerdoelen van dit artikel:

  1. Je leert hoe je opencv voor labeldetectie op een factuur, zoals het factuurnummer, factuurdatum, totaalbedrag, totaal aantal stuks etc.
  2. U leert hoe u de coördinaten van de tekst uit elke factuurafbeelding kunt halen.
  3. Je leert de stappen in beeld voorbewerking.
  4. U leert hoe u kunt zien welk type sjabloon een nieuwe factuur is met behulp van de sjabloonafbeeldingsdataset.
  5. Doorloop de codefragmenten om de bovenstaande doelstellingen te begrijpen.

Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon.

Inhoudsopgave

Basisarchitectuur

  • Laten we zeggen dat we labels op facturen van verschillende sjablonen moeten detecteren en een gegevensset met sjabloonlabels krijgen die bestaat uit de namen van de labels voor verschillende sjablonen.
  • Als we een gegevensset met sjabloonlabels hebben met de namen van labels voor een aantal templ.
  • De coördinaten voor de benodigde labels voor elk sjabloon worden opgeslagen in een tabel (csv-bestand).
  • Lay-outtoewijzing wordt gedaan om de afbeeldingssjabloon voor de nieuwe factuur te vinden, zodat labels voor de nieuwe factuur kunnen worden gevonden met behulp van de coördinaten die al zijn opgeslagen.
  • Nadat het sjabloon was gevonden, werden de coördinaten van de labels in de tabel (csv-bestand) opgehaald.
  • De geëxtraheerde coördinaten worden gebruikt om de labels van de nieuwe factuur te voorspellen.

Beeldvoorbewerking van facturen

Aangezien de invoer een afbeelding van een factuur is, weten we dat het voorbewerken van de afbeeldingen een zeer belangrijke stap is die ons zal helpen betere resultaten te behalen. Hiervoor hebben we Skew Correction, Binarisation, Noise Filtering en contourdetectie gebruikt als onderdeel van de voorbewerking.

#binarisation
res = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY,11,2) plt.figure(figsize=(100, 60))
plt.imshow(res,'gray')
plt.show() #noise filtering
cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21) #skew correction
import numpy as np
from skimage import io
from skimage.transform import rotate
from skimage.color import rgb2gray
from deskew import determine_skew
image = io.imread(_img)
grayscale = rgb2gray(image)
angle = determine_skew(grayscale) rotated = rotate(image, angle, resize=True) * 255
rotated=rotated.astype(np.uint8)

Contourdetectie wordt gedaan omdat de facturen in de afbeeldingen die we hebben zich op verschillende plaatsen bevinden en we ze moeten vinden. Dit gebeurde met behulp van een 'contourdetectiemethode'. Zoek de grootste omtrek van de afbeelding, snijd deze bij zodat deze past en laat deze zien. Dit werd gedaan door de functie cv2.findContours() te gebruiken om de randen te vinden en de methode cv2.contourArea() om de rand met het grootste gebied te vinden, waarna de afbeelding tot aan die rand werd bijgesneden.

contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# Find Biggest Contour
areas = [cv2.contourArea(c) for c in contours]
max_index = np.argmax(areas)
# Find approxPoly Of Biggest Contour
epsilon = 0.1 * cv2.arcLength(contours[max_index], True)
approx = cv2.approxPolyDP(contours[max_index], epsilon, True)
# Crop The Image points1 = np.float32(approx)
points = np.float32([[0, 0], [width, 0], [width, height], [0, height]])
result = cv2.warpPerspective(img, matrix, (width, height))
matrix = cv2.getPerspectiveTransform(points1, points)

Vervolgens, met EasyOCR als detectiemodel en PaddleOCR als herkenningsmodel, wordt het MultiOcr-model gebouwd om de coördinaten van de labels voor elke factuursjabloon te verkrijgen.

reader = easyocr.Reader(['en'])
ocr = PaddleOCR(lang='en') #detection
def detect_text_blocks(img_path): detection_result = reader.detect(img_path,width_ths=0.7,mag_ratio=1.5) text_coordinates = detection_result[0][0] return text_coordinates

Het MultiOcr-model vindt de coördinaten van labelnamen in de dataset van sjabloonlabels voor elke sjabloonfactuur en slaat deze op in een tabel (csv-bestand). Omdat het aantal items op een factuur kan variëren, werden de begin- en eindcoördinaten van de tabel met factuuritems in de factuurafbeelding gegeven om te voorspellen hoeveel items er op de factuur stonden.

Wanneer de grootte van de tabel met items in de afbeelding van de factuur verandert, veranderen labels zoals de positie van het "totaalbedrag". Dit komt omdat het totale bedrag na de tabel met factuuritems op elke factuur komt. Om dit probleem op te lossen, kan een relatieve positioneringsmethode worden gebruikt om het totale bedrag te raden en te detecteren. Dit kan door de coördinaten van de strings rondom het totaalbedraglabel in de factuur op te slaan. Dit wordt gedaan omdat de waarde (of naam) van de tekenreeks niet verandert, zelfs niet als de facturen verschillend zijn maar uit dezelfde sjabloon komen.

De sjabloon van een gegeven nieuwe factuur vinden

  • Om de labels van nieuwe facturen te detecteren, moeten we het sjabloon van de factuur kennen. Het doel van de documentovereenkomstmethode is om het factuursjabloon te voorspellen
  • Zoals de naam al doet vermoeden, vertelt documentovereenkomst u hoe vergelijkbaar twee documenten zijn. Documentafstand wordt gebruikt om erachter te komen hoe vergelijkbaar twee documenten zijn. Hiervoor kan de cosinusvergelijkingsmethode worden gebruikt
  • Hieruit kunnen we het sjabloon van de factuur verkrijgen waarvan de labels met deze methode moeten worden voorspeld
  • Bijvoorbeeld
"Labeldetectie
"Labeldetectie

Etiketdetectie
Op deze drie afbeeldingen wordt de documentovereenkomstmethode gebruikt. Afbeelding1 en afbeelding2 zijn van dezelfde leverancier en afbeelding3 is van een andere leverancier. De resultaten van de documentovereenkomst worden hieronder weergegeven:

  • Afbeelding1 – Afbeelding2: de afstand is 1.000072 (radialen)
  • Afbeelding1 – Afbeelding3: de afstand is 1.408562 (radialen)

Uit de resultaten van de documentovereenkomstmethode kunnen we zien dat de afstand tussen afbeelding1 en afbeelding2 kleiner is dan tussen afbeelding1 en afbeelding3. Dit betekent dat afbeeldingen 1 en 2 van dezelfde leverancier zijn.

Labeldetectie van de nieuwe factuur met behulp van de labelcoördinaten van het sjabloon

Aangezien we de sjabloon uit de tabel (csv-bestand) hebben gehaald, worden de labelcoördinaten genomen en gebruikt om factuurafbeeldingslabels te identificeren.

Voorbeeld: Wanneer een afbeelding van een factuur zoals hieronder als invoer wordt gegeven, zoekt het eerst naar het sjabloon van de factuur. De tabel (csv-bestand) wordt gebruikt om coördinaten voor de labels op te halen. De afbeeldingslabels op de factuur worden geïdentificeerd met deze labelcoördinaten.

factuur
Bron: https://gogstbill.com

Methoden om de prestaties te verbeteren

  1. Tijdens de voorverwerking kunnen verschillende drempelmethodes, zoals Global Thresholding, Adaptive Mean Thresholding en Adaptive Gaussian Thresholding, worden gebruikt om een ​​beter beeld van een factuur te krijgen
  2. Voor detectie en herkenning kan het MultiOcr-model verschillende OCR-modellen gebruiken, zoals PyTesseract, PPOCR, easyOCR, MMOCR en Keras-OCR. Het OCR-model dat de beste resultaten gaf, wordt gekozen als het uiteindelijke model
  3. In de detectiestap van het MultiOcr-model wordt hyperparameterafstemming uitgevoerd met parameters width_ths, waarmee de maximale horizontale afstand tussen twee samen te voegen begrenzingsvakken wordt ingesteld, en mag_ratio, waarmee de afbeelding omhoog of omlaag wordt geschaald op basis van de gegeven factor
  4. Verschillende methoden voor documentovereenkomsten, zoals cosinusovereenkomst en Euclidische afstand, kunnen worden gebruikt om de resultaten te verbeteren bij het voorspellen van de sjabloon

Conclusie

Tot slot stellen we met dit werk een algoritme voor voor labeldetectie van facturen met behulp van het MultiOcr-model; we zullen in staat zijn om met succes de posities van de labels voor sjablonen te detecteren, evenals de labels voor eventuele nieuwe facturen binnen de gegeven sjablonen. Hiervoor gebruikten we OCR-modellen zoals easyOCR als detectiemodel en PaddleOCR als herkenningsmodel. We zijn ook blij te kunnen zeggen dat we met dit algoritme betere resultaten kunnen geven.

Belangrijkste afhaalrestaurants van dit artikel

  1. We kunnen een nauwkeurigheid van 85% krijgen voor contourdetectie, en het multiOcr-model met EasyOcr en paddleOCR bereikt een nauwkeurigheid van ongeveer 95%.
  2. De cosinusovereenkomstbenadering bepaalt de documentovereenkomst met een precisie van 82.8%. Valse positieven kunnen optreden als twee documenten een groot aantal termen delen.
  3. We hebben de stappen voor het voorbewerken van afbeeldingen, labeldetectie van rekeningen met behulp van hun coördinaten en detectie van factuursjablonen besproken.
  4. Enkele basiscodes geleerd en het artikel afgesloten met een voorbeeld

De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt.

spot_img

Laatste intelligentie

spot_img