이미지에서 텍스트 읽기
OCR(광학 인식)은 이미지와 문서에서 텍스트 읽기를 처리하는 Computer Vision 하위 서비스입니다. Azure AI 비전 서비스는 텍스트를 읽기 위한 API를 제공하며, 이 연습에서 살펴볼 것입니다.
이 과정용 리포지토리 복제
이 과정용 코드 리포지토리를 아직 복제하지 않았으면 복제해야 합니다.
- Visual Studio Code 시작
- 팔레트를 열고(Shift+Ctrl+P) Git: Clone 명령을 실행하여
https://github.com/MicrosoftLearning/mslearn-ai-vision
리포지토리를 로컬 폴더(아무 폴더나 관계없음)에 복제합니다. - 리포지토리가 복제되면 Visual Studio Code에서 폴더를 엽니다.
-
리포지토리의 C# 코드 프로젝트를 지원하는 추가 파일이 설치되는 동안 기다립니다.
참고: 빌드 및 디버깅에 필요한 자산을 추가하라는 메시지가 표시되면 나중에를 선택합니다. 폴더에서 Azure 함수 프로젝트를 발견했습니다라는 메시지가 표시되면 해당 메시지를 안전하게 닫을 수 있습니다.
Azure AI 서비스 리소스 프로비전
구독에 아직 없는 경우 Azure AI 서비스 리소스를 프로비전해야 합니다.
https://portal.azure.com
의 Azure Portal을 열고 Azure 구독과 연관된 Microsoft 계정을 사용하여 로그인합니다.- 상단 검색 창에서 Azure AI 서비스를 검색하고 Azure AI 서비스를 선택한 후 다음 설정을 사용하여 Azure AI 서비스 다중 서비스 계정 리소스를 만듭니다.
- 구독: ‘Azure 구독’
- 리소스 그룹: 리소스 그룹 선택 또는 만들기(제한된 구독을 사용 중이라면 새 리소스 그룹을 만들 권한이 없을 수도 있으므로 제공된 리소스 그룹 사용)**
- 지역: 미국 동부, 프랑스 중부, 한국 중부, 북유럽, 동남 아시아, 서유럽, 미국 서부 또는 동아시아 중에서 선택*
- 이름: 고유 이름 입력
- 가격 책정 계층: 표준 S0
*Azure AI 비전 4.0 기능은 현재 이 지역에서만 사용할 수 있습니다.
- 필요한 확인란을 선택하고 리소스를 만듭니다.
- 배포가 완료될 때까지 기다린 다음, 배포 세부 정보를 봅니다.
- 리소스가 배포되면 해당 리소스로 이동하여 키 및 엔드포인트 페이지를 확인합니다. 다음 절차에서 이 페이지에 표시되는 키 중 하나와 엔드포인트가 필요합니다.
Azure AI 비전 SDK 사용 준비
이 연습에서는 Azure AI 비전 SDK를 사용해 텍스트를 읽는 부분 구현 클라이언트 애플리케이션을 완성합니다.
참고: C# 또는 Python용 SDK 사용을 선택할 수 있습니다. 다음 단계에서는 기본 설정 언어에 적합한 작업을 수행합니다.
- Visual Studio Code의 탐색기 창에서 Labfiles\05-ocr 폴더를 찾은 다음 언어 기본 설정에 따라 C-Sharp 또는 Python 폴더를 확장합니다.
-
read-text 폴더를 마우스 오른쪽 단추로 클릭하고 통합 터미널을 엽니다. 그런 다음, 언어 선택에 적절한 명령을 실행하여 Azure AI 비전 SDK 패키지를 설치합니다.
C#
dotnet add package Azure.AI.Vision.ImageAnalysis -v 1.0.0-beta.3
참고: 개발 키트 확장을 설치하라는 메시지가 표시되면 메시지를 안전하게 닫을 수 있습니다.
Python
pip install azure-ai-vision-imageanalysis==1.0.0b3
-
read-text 폴더의 내용을 표시하여 구성 설정용 파일이 포함되어 있음을 확인합니다.
- C#: appsettings.json
- Python: .env
구성 파일을 열고 Azure AI 서비스 리소스용 엔드포인트 및 인증 키를 반영하여 해당 파일에 포함된 구성 값을 업데이트합니다. 변경 내용을 저장합니다.
Azure AI 비전 SDK를 사용하여 이미지에서 텍스트 읽기
Azure AI 비전 SDK의 기능 중 하나는 이미지에서 텍스트를 읽는 것입니다. 이 연습에서는 Azure AI 비전 SDK를 사용하여 이미지에서 텍스트를 읽는 부분 구현 클라이언트 애플리케이션을 완료합니다.
-
read-text 폴더에는 클라이언트 애플리케이션용 코드 파일이 포함되어 있습니다.
- C#: Program.cs
- Python: read-text.py
코드 파일을 열고 파일 맨 윗부분의 기존 네임스페이스 참조 아래에 있는 네임스페이스 가져오기 주석을 찾습니다. 그런 다음 이 주석 아래에 다음 언어별 코드를 추가하여 Azure AI 비전 SDK를 사용하는 데 필요한 네임스페이스를 가져옵니다.
C#
// Import namespaces using Azure.AI.Vision.ImageAnalysis;
Python
# import namespaces from azure.ai.vision.imageanalysis import ImageAnalysisClient from azure.ai.vision.imageanalysis.models import VisualFeatures from azure.core.credentials import AzureKeyCredential
-
클라이언트 애플리케이션용 코드 파일의 Main 함수에서 구성 설정 로드를 위한 코드가 제공되었습니다. 그런 다음 Azure AI 비전 클라이언트 인증 주석을 찾습니다. 그런 다음, 이 주석 아래에 다음 언어별 코드를 추가하여 Azure AI 비전 클라이언트 개체를 만들고 인증합니다.
C#
// Authenticate Azure AI Vision client ImageAnalysisClient client = new ImageAnalysisClient( new Uri(aiSvcEndpoint), new AzureKeyCredential(aiSvcKey));
Python
# Authenticate Azure AI Vision client cv_client = ImageAnalysisClient( endpoint=ai_endpoint, credential=AzureKeyCredential(ai_key) )
-
Main 함수에서 방금 추가한 코드 아래에서 코드는 이미지 파일의 경로를 지정한 다음 이미지 경로를 GetTextRead 함수에 전달합니다. 이 함수는 아직 완전히 구현되지 않았습니다.
-
GetTextRead 함수의 본문에 일부 코드를 추가해 보겠습니다. 이미지 분석 기능을 사용하여 이미지의 텍스트 읽기라는 주석을 찾습니다. 그런 다음, 이 주석 아래에 다음 언어별 코드를 추가하여
Analyze
함수를 호출할 때 시각적 기능이 지정됨을 확인합니다.C#
// Use Analyze image function to read text in image ImageAnalysisResult result = client.Analyze( BinaryData.FromStream(stream), // Specify the features to be retrieved VisualFeatures.Read); stream.Close(); // Display analysis results if (result.Read != null) { Console.WriteLine($"Text:"); // Prepare image for drawing System.Drawing.Image image = System.Drawing.Image.FromFile(imageFile); Graphics graphics = Graphics.FromImage(image); Pen pen = new Pen(Color.Cyan, 3); foreach (var line in result.Read.Blocks.SelectMany(block => block.Lines)) { // Return the text detected in the image } // Save image String output_file = "text.jpg"; image.Save(output_file); Console.WriteLine("\nResults saved in " + output_file + "\n"); }
Python
# Use Analyze image function to read text in image result = cv_client.analyze( image_data=image_data, visual_features=[VisualFeatures.READ] ) # Display the image and overlay it with the extracted text if result.read is not None: print("\nText:") # Prepare image for drawing image = Image.open(image_file) fig = plt.figure(figsize=(image.width/100, image.height/100)) plt.axis('off') draw = ImageDraw.Draw(image) color = 'cyan' for line in result.read.blocks[0].lines: # Return the text detected in the image # Save image plt.imshow(image) plt.tight_layout(pad=0) outputfile = 'text.jpg' fig.savefig(outputfile) print('\n Results saved in', outputfile)
-
GetTextRead 함수에서 방금 추가한 코드의 이미지에서 검색된 텍스트 반환 주석 아래에 다음 코드를 추가합니다(이 코드는 이미지 텍스트를 콘솔에 인쇄하고 이미지의 텍스트를 강조 표시하는 이미지 text.jpg를 생성함).
C#
// Return the text detected in the image Console.WriteLine($" '{line.Text}'"); // Draw bounding box around line var drawLinePolygon = true; // Return the position bounding box around each line // Return each word detected in the image and the position bounding box around each word with the confidence level of each word // Draw line bounding polygon if (drawLinePolygon) { var r = line.BoundingPolygon; Point[] polygonPoints = { new Point(r[0].X, r[0].Y), new Point(r[1].X, r[1].Y), new Point(r[2].X, r[2].Y), new Point(r[3].X, r[3].Y) }; graphics.DrawPolygon(pen, polygonPoints); }
Python
# Return the text detected in the image print(f" {line.text}") drawLinePolygon = True r = line.bounding_polygon bounding_polygon = ((r[0].x, r[0].y),(r[1].x, r[1].y),(r[2].x, r[2].y),(r[3].x, r[3].y)) # Return the position bounding box around each line # Return each word detected in the image and the position bounding box around each word with the confidence level of each word # Draw line bounding polygon if drawLinePolygon: draw.polygon(bounding_polygon, outline=color, width=3)
-
read-text/images 폴더에서 Lincoln.jpg를 선택하여 코드가 처리하는 파일을 봅니다.
-
애플리케이션용 코드 파일의 Main 함수에서 사용자가 메뉴 옵션 1을 선택하면 실행되는 코드를 살펴봅니다. 이 코드는 GetTextRead 함수를 호출하여 Lincoln.jpg 이미지 파일의 경로를 전달합니다.
-
변경 내용을 저장하고 read-text 폴더의 통합 터미널로 돌아와서 다음 명령을 입력하여 프로그램을 실행합니다.
C#
dotnet run
Python
python read-text.py
-
메시지가 표시되면 1을 입력하고 출력을 살펴봅니다. 출력은 이미지에서 추출된 텍스트입니다.
-
read-text 폴더에서 text.jpg 이미지를 선택하고 각 텍스트 줄 주위에 다각형이 있는 것을 확인했습니다.
-
Visual Studio Code의 코드 파일로 돌아가서 각 줄 주위의 위치 경계 상자 반환 주석을 찾습니다. 그런 다음, 이 주석 아래에 다음 코드를 추가합니다.
C#
// Return the position bounding box around each line Console.WriteLine($" Bounding Polygon: [{string.Join(" ", line.BoundingPolygon)}]");
Python
# Return the position bounding box around each line print(" Bounding Polygon: {}".format(bounding_polygon))
-
변경 내용을 저장하고 read-text 폴더의 통합 터미널로 돌아와서 다음 명령을 입력하여 프로그램을 실행합니다.
C#
dotnet run
Python
python read-text.py
-
메시지가 표시되면 1을 입력하고 출력값을 관찰하며, 이 출력은 이미지의 각 텍스트 줄과 이미지의 해당 위치여야 합니다.
-
Visual Studio Code의 코드 파일로 돌아가서 이미지에서 감지된 각 단어와 각 단어의 신뢰도 수준을 사용하여 각 단어 주위의 위치 경계 상자 반환 주석을 찾습니다. 그런 다음, 이 주석 아래에 다음 코드를 추가합니다.
C#
// Return each word detected in the image and the position bounding box around each word with the confidence level of each word foreach (DetectedTextWord word in line.Words) { Console.WriteLine($" Word: '{word.Text}', Confidence {word.Confidence:F4}, Bounding Polygon: [{string.Join(" ", word.BoundingPolygon)}]"); // Draw word bounding polygon drawLinePolygon = false; var r = word.BoundingPolygon; Point[] polygonPoints = { new Point(r[0].X, r[0].Y), new Point(r[1].X, r[1].Y), new Point(r[2].X, r[2].Y), new Point(r[3].X, r[3].Y) }; graphics.DrawPolygon(pen, polygonPoints); }
Python
# Return each word detected in the image and the position bounding box around each word with the confidence level of each word for word in line.words: r = word.bounding_polygon bounding_polygon = ((r[0].x, r[0].y),(r[1].x, r[1].y),(r[2].x, r[2].y),(r[3].x, r[3].y)) print(f" Word: '{word.text}', Bounding Polygon: {bounding_polygon}, Confidence: {word.confidence:.4f}") # Draw word bounding polygon drawLinePolygon = False draw.polygon(bounding_polygon, outline=color, width=3)
-
변경 내용을 저장하고 read-text 폴더의 통합 터미널로 돌아와서 다음 명령을 입력하여 프로그램을 실행합니다.
C#
dotnet run
Python
python read-text.py
-
메시지가 표시되면 1을 입력하고 출력값을 관찰하며, 이 출력은 이미지의 각 텍스트 단어와 이미지의 해당 위치여야 합니다. 각 단어의 신뢰도 수준도 어떻게 반환되는지 확인합니다.
-
read-text 폴더에서 text.jpg 이미지를 선택하고 각 단어 주위에 다각형이 있는 것을 확인했습니다.
Azure AI 비전 SDK를 사용하여 이미지에서 필기 텍스트 읽기
이전 연습에서는 이미지에서 잘 정의된 텍스트를 읽었지만 때로는 손으로 쓴 메모나 종이의 텍스트를 읽을 수도 있습니다. 좋은 소식은 Azure AI 비전 SDK가 잘 정의된 텍스트를 읽는 데 사용한 것과 동일한 정확한 코드를 사용하여 필기 텍스트를 읽을 수도 있다는 것입니다. 이전 연습과 동일한 코드를 사용하지만 이번에는 다른 이미지를 사용합니다.
-
read-text/images 폴더에서 Note.jpg를 선택하여 코드가 처리하는 파일을 봅니다.
-
애플리케이션용 코드 파일의 Main 함수에서 사용자가 메뉴 옵션 2를 선택하면 실행되는 코드를 살펴봅니다. 이 코드는 GetTextRead 함수를 호출하여 Note.jpg 이미지 파일의 경로를 전달합니다.
-
read-text 폴더의 통합 터미널에서 다음 명령을 입력하여 프로그램을 실행합니다.
C#
dotnet run
Python
python read-text.py
-
메시지가 표시되면 2를 입력하고 출력을 살펴봅니다. 출력은 노트 이미지에서 추출된 텍스트입니다.
-
read-text 폴더에서 text.jpg 이미지를 선택하고 노트의 각 단어 주위에 다각형이 있는 것을 확인했습니다.
리소스 정리
다른 학습 모듈을 위해 이 랩에서 만들어진 Azure 리소스를 사용하지 않는 경우 해당 리소스를 삭제하여 추가 요금이 발생하지 않도록 할 수 있습니다. 이 경우 가능한 방법은 다음과 같습니다.
-
https://portal.azure.com
의 Azure Portal을 열고 Azure 구독과 연관된 Microsoft 계정을 사용하여 로그인합니다. -
상단 검색 창에서 Azure AI 서비스 다중 서비스 계정을 검색하고 이 랩에서 만든 Azure AI 서비스 다중 서비스 계정 리소스를 선택합니다.
-
리소스 페이지에서 삭제를 선택하고 지침에 따라 리소스를 삭제합니다.
자세한 정보
Azure AI 비전 서비스를 사용하여 텍스트를 읽는 방법에 대한 자세한 내용은 Azure AI 비전 설명서를 참조하세요.