Python 및 AWS를 사용하여 광학 문자 인식 시작하기

이 블로그에서는 AWS Textract를 사용하여 사진에서 문서의 텍스트를 스캔 및 추출하고 JSON 출력 응답을 얻습니다. 또한 Python과 함께 AWS 람다 함수를 사용하여 백엔드를 구축할 것입니다.



이전 블로그Serverless AWS Textract Document Scanner를 읽었다면 Node.js를 사용하여 AWS Textract를 실행하는 엔드포인트를 생성했음을 알 수 있습니다. 그러나 파이썬으로 전환해야만 해결되는 몇 가지 문제가 있었습니다. 예를 들어 node.js를 사용하여 앱을 실행하는 동안 직면한 가장 큰 문제 중 하나는 요청 시간이 너무 길다는 것이었습니다. 경우에 따라 응답 완료에 최대 30초가 걸릴 수 있습니다. 당신이 알 수 있듯이 그것은 끔찍합니다. 그래서 내 스택을 node.js에서 Python으로 전환하기로 결정했고 이제 평균 요청 실행 시간이 25초에서 2초로 떨어졌습니다. 꽤 멋지죠? 알아요. 어떻게 할 수 있는지 봅시다.

1. Python을 사용하여 서버리스로 백엔드 설정



서버리스 작동 방식을 이미 알고 있다고 가정하면 AWS Textract와 그 흐름을 계속 진행할 수 있습니다. 노드가 포함된 서버리스에 익숙하지 않은 경우 총을 던지지 말고 tutshere를 확인하십시오.

괜찮아. 서버리스를 빠르게 설정해 보겠습니다.

sls create --template aws-python --path myService


다음 종속성이 설치되어 있는지 확인하십시오.
  • 보토3
  • json

  • 노트



    계속하기 전에 명심해야 할 사항
  • 이 작업에 대한 적절한 권한이 있는지 확인하십시오.
  • 해당 지역을 확인하고
  • 버킷 URL이 정확한지 확인하십시오.

  • 2. 이제 AWS SDK가 구성되면 Textract용 코드를 작성할 수 있습니다.




    import json
    import boto3
    
    def textractAnalyzer(event, context):
        bucket="YOUR_BUCKET_NAME"
        document = json.loads(event['body'])['fileKey']
        client = boto3.client('textract')
    
        #process using S3 object
        response = client.detect_document_text(
            Document={'S3Object': {'Bucket': bucket, 'Name': document}})
    
        #Get the text blocks
        blocks=response['Blocks']
    
        # All Text By Line
        texts_by_line = dataPurifierByLine(blocks)
    
        return {
            'statusCode': 200,
            'body': json.dumps({
                "fileKey": document,
                "textByLine": texts_by_line,
                "texTractblocks" : blocks ## Full response from textract
            }),
        }
    
    def dataPurifierByLine(blocks):
        result = []
        for block in blocks:
            if block['BlockType'] == "LINE":
                entry = {
                    "line": block['Text'],
                    "confidence": block['Confidence']
                }
                result.append(entry)
        return result
    


    다음 코드는 s3/public/**에서 특정 키가 있는 파일을 찾은 다음 Textract 분석을 실행합니다.

    3. 코드 배포


    sls deploy끝점을 찾으십시오. 저에게는 다음과 같습니다.

    4. 다음 단계에서는 테스트에 사용할 수 있도록 파일을 버킷에 수동으로 드롭합니다.


  • S3로 이동,
  • /public
  • 으로 이동
  • 그런 다음 img 파일을 업로드합니다
  • .




    이 오래된 영수증을 사용하고 있습니다.


    5. 마지막으로 우편 배달부에서 테스트합니다.



    유효 탑재량:

        "fileKey" : "public/demo.jpeg"
    


  • 시간 초과 오류가 발생하면 .yml 파일에서 기능 시간 초과를 30초로 변경합니다.
  • 반환되는 데이터 유형을 볼 수 있습니다. 이 데모에서는 모든 줄을 가져와 배열에 함께 추가하겠습니다.

  • 응답은 다음과 같아야 합니다.

    {
        "fileKey": "public/demo.jpeg",
        "textByLine": [
            {
                "line": "01/027 APPROVED - THANK YOU",
                "confidence": 99.5232162475586
            },
            .
            .
            .
            .
        ],
        "texTractblocks": [
            {
                "BlockType": "PAGE",
                "Geometry": {
                    "BoundingBox": {
                        "Width": 0.8844140768051147,
                        "Height": 0.8354079723358154,
                        "Left": 0.048781704157590866,
                        "Top": 0.15526676177978516
                    },
                    "Polygon": [
                        {
                            "X": 0.07131516188383102,
                            "Y": 0.1597394049167633
                        },
                        {
                            "X": 0.9331957697868347,
                            "Y": 0.15526676177978516
                        },
                        {
                            "X": 0.9245083928108215,
                            "Y": 0.9906747341156006
                        },
                        {
                            "X": 0.048781704157590866,
                            "Y": 0.9588059782981873
                        }
                    ]
                },
                "Id": "9b384b8d-dcb8-4596-8511-af18659a9787",
                "Relationships": [
                    {
                        "Type": "CHILD",
                        "Ids": [
                            "250a9339-d1ed-4c21-ad50-5a2154cd89da",
                            "aac798f2-3c05-41a2-979c-869509b53d58",
                            "eb878ad4-8b37-415d-b6ac-8cc909dab0a3",
                            "376c375f-94d1-47b7-9f4e-a9fb203043f2",
                            "628dbdd6-1225-43c9-867c-9a83ea91e1ae",
                            "aecacbf9-8727-4334-a904-6795df9c455b",
                            "c8e51b32-d010-4300-8e98-6002d6e5eee3",
                            "20e6422a-16c0-41b6-be2d-6c0c9d09ed44",
                            "82bfdb0d-20bd-407f-bc3b-33aef24fc097",
                            "aa3125fd-2e2d-48a5-9416-84ef7a987976",
                            "10ec162e-a937-4cd2-87d5-6d6b9205d719",
                            "b05a2ece-0a7f-4e65-87e5-fe4e49277f25",
                            "561f5c75-bbb4-4dc6-8660-fbc3f7386f9c",
                            "665bb6fe-8ac9-44b3-af49-189ac3ea7757",
                            "5d42a676-0621-42ad-89ff-7a16873290c4",
                            "bdb02d6e-3b80-4913-8359-ef7e70068582",
                            "28691f75-aef5-418d-8519-1d05bb991fda",
                            "8c4b9208-c2c5-4ad8-96a6-35e962043fbd"
                        ]
                    }
                ]
            },
            .
            .
            .
    }
    


    그게 다야!

    다음 단계



    다음 주에는 이 앱을 계속 사용하고 Flutter와 AWS Amplify를 사용하여 프런트 엔드를 구축할 것입니다.
  • Flutter를 고소하기 위해 AWS Amplify를 설정합니다.
  • 사진을 찍도록 카메라를 설정합니다.
  • 완료되면 사진을 확인하고 S3 스토어로 보내드립니다.
  • 람다 함수를 트리거하고 프런트 엔드로 응답을 다시 보냅니다.
  • 좋은 웹페이지 즐겨찾기