[파이썬] 이미지 속 문자 인식한 것을 음성 파일로 변환해주기

컴퓨터비전/python|2020. 1. 22. 02:36

지난 포스팅에서 예고해드린대로, 오늘은 OCR을 통해 인식한 텍스트를 음성 파일로 바꿔주는 작업을 해보겠습니다. 텍스트를 음성 파일로 바꿔주기 위해서(Text to speech), 저는 여러 사용 가능한 Text to speech 툴 중에서 gTTS라는 모듈을 사용하도록 하겠습니다. gTTS 모듈은 Google Text to Speech API를 사용하기 때문에, gTTS라는 이름이 붙었습니다. 

 

gTTS는 다음과 같은 명령어로 설치할 수 있습니다. 

sudo pip3 install gTTS

 

 

오늘은 다음과 같은 이미지의 텍스트를 인식해서 사람 목소리로 읽어준 것을 mp3 파일로 저장해보겠습니다. 

 

 

 

 

작성한 코드는 다음과 같습니다. 코드를 실행하기 전에 Pillow 패키지 내의 Image 클래스를 활용하기 위해서 Pillow도 설치해주셔야 합니다.

sudo pip3 install Pillow

 

자, 그럼 아래 코드를 작성 또는 복.붙.하시고 실행해보세요. 

from gtts import gTTS
from PIL import Image
import pytesseract

# OCR 실행해서 찾아낸 문자열을 OCR_text라는 변수에 대입
OCR_text = pytesseract.image_to_string(Image.open('bskyvision.jpg'), lang = 'Hangul') 

# OCR_text를 터미널에 출력
print(OCR_text)

# OCR_text를 speech로 변환해서 mp3 파일로 저장
tts = gTTS(text=OCR_text, lang='ko')
tts.save("bskyvision.mp3")

 

 

우선 터미널에 출력된 텍스트는 다음과 같습니다. 글씨가 엉망이라 그런지 몰라도 웃기게 인식했네요.ㅋㅋ

 

 

 

 

자 그럼 text to speech를 실행해서 mp3 파일로 저장한 것을 확인해보겠습니다. 

 

 

bskyvision.mp3
0.02MB

 

 

들어보시면 아시겠지만, 인식된 문자열을 남자 목소리로 잘 읽어주죠? ㅎㅎ

 

OCR과 text to speech를 잘 활용하면 재밌는 어플리케이션을 많이 만들어낼 수 있을 것 같습니다. 또한 시각 장애가 있는 분들께 조금이나마 도움이 될만한 것들을 만들어낼 수 있을 것도 같구요. 

 

항상 질문과 지적은 환영입니다. 빠르게 답변하도록 노력하고 있으니, 댓글 남겨주세요.^^ 

 

 

 

<참고자료>

[1] https://kamang-it.tistory.com/entry/PIL-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%95%98%EA%B8%B0image-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%ED%95%98%EA%B8%B0, PIL 다운로드하기(image 라이브러리 다운로드 하기, pillow 라이브러리 다운로드 하기)

[2] http://pythonstudy.xyz/python/article/406-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%B2%98%EB%A6%AC-Pillow

댓글()

[파이썬] 모듈과 패키지 의미 간단 정리

컴퓨터비전/python|2020. 1. 22. 00:38

안녕하세요. 컴퓨터 비전 블로그, bskyvision입니다.^^ 

 

항상 새로운 분야를 공부하는 데 있어서 첫 난관은 낯선 단어들입니다. 이러한 단어들을 하나씩 정복해가다보면 그 분야에 대한 이해가 사뭇 깊어짐을 알 수 있습니다. 파이썬을 다루다보면 모듈, 패키지라는 단어들을 자주 접하게 되는데, 오늘은 이 단어들이 의미하는 바에 대해 간략히 정리하도록 하겠습니다. 

 

역시 stack overflow에 이 둘의 차이에 대해 물으신 분이 계시군요. ㅎㅎ (stack overflow는 전세계 개발자들의 네이버 지식인과 같은 공간입니다. 누군가 질문하고 누군가 답변하고. 상당히 유용한 정보를 많이 얻을 수 있으니 코딩, 개발에 관심이 있으신 분들은 이 친구와 친숙해지시길 추천드립니다.^^)

 

https://stackoverflow.com/questions/7948494/whats-the-difference-between-a-python-module-and-a-python-package

 

What's the difference between a Python module and a Python package?

What's the difference between a Python module and a Python package? See also: What's the difference between "package" and "module" (for other languages)

stackoverflow.com

 

가장 많은 사람들이 추천한 답변과 아래 참고자료들을 종합해서 모듈과 패키지에 대해 요약 정리해보겠습니다.  

 

특정 기능을 수행하는 어떤 하나의 파이썬 파일을 모듈(module)로 볼 수 있습니다. 패키지(package)는 이러한 파이썬 모듈들의 집합입니다. 모듈이 하나의 파이썬 파일이라면, 패키지는 파이썬 파일들을 포함하고 있는 디렉토리입니다. 그런데 일반적인 디렉토리와 구분짓기 위해서 디렉토리 안에 __init__.py 파일을 포함하고 있습니다. 그러니까 어떤 디렉토리가 여러개의 파이썬 파일들을 포함하고 있더라도, __init__.py 파일을 가지고 있지 않으면 그것은 그냥 디렉토리일 뿐입니다. 

 

질문과 지적은 항상 환영입니다.^^ 댓글로 남겨주시면 빠르게 답변해드리도록 노력하겠습니다. 

 

 

<참고자료>

[1] https://dojang.io/mod/page/view.php?id=2441, 파이썬 코딩 도장, "Unit 44. 모듈과 패키지 사용하기"

[2] https://doitnow-man.tistory.com/146, 즐거운인생 (실패 또하나의 성공), "[python] 9. 모듈과 패키지"

댓글()

[파이썬] 이미지 속 문자 검출 및 인식하기(OCR)

컴퓨터비전/python|2020. 1. 21. 01:45

안녕하세요. 컴퓨터비전 블로그 bskyvision.com의 심교훈입니다. 오늘은 이미지 속에 존재하는 문자를 검출해서 인식하는 것에 대해서 다루려고 합니다. 이러한 기술을 OCR(optical character recognition, 광학 문자 인식)이라고 부릅니다. 

 

OCR과 관련해서 가장 유명한 패키지는 Tesseract OCR입니다. 오늘은 Tesseract OCR을 파이썬에서 사용하는 법에 대해 다루도록 하겠습니다. 

 

먼저 Tesseract OCR 패키지를 설치해줘야합니다.

sudo apt install tesseract-ocr

 

그리고 한글 텍스트를 다루고 싶다면, 다음과 같이 명령해줘야합니다.

sudo apt-get install tesseract-ocr-script-hang tesseract-ocr-script-hang-vert

 

또한 파이썬에서 Tesseract OCR을 사용하기 위해서는 pytesseract도 설치해줘야합니다. 

sudo pip3 install pytesseract

 

자, 그럼 이제 준비는 끝났고, 바로 OCR을 해보겠습니다. 저는 제가 최근에 읽은 책인 <프레임>의 첫페이지를 사진찍어서, 테스트 이미지 파일로 선정했습니다. 그 이미지 파일 이름은 test.JPG로 했습니다. 

 

출처: <프레임> 6 page

 

아래와 같은 단 한줄의 명령어면 위 이미지 속 문자를 인식해낼 수 있습니다. 

tesseract test.JPG stdout -l Hangul

 

 

이 명령어는 터미널에 인식한 문자들이 출력되게 해줍니다. 다음과 같이 인식했습니다. 사진을 조금 비뚤어지게 찍어서 그런지 몰라도 부분적으로만 인식이 되었지만, 어느 정도 인식해냈음을 확인할 수 있습니다. 

 

 

만약 인식한 문자를 메모장 파일에 저장하고 싶으면 다음과 같이 명령해주면 됩니다. stdout 대신에 생성해서 저장할 메모장 파일 이름을 써줍니다. 

tesseract test.JPG OCR_result -l Hangul

 

 

다음과 같이 메모장 파일에 잘 쓰여졌습니다. 

 

 

다음 시간에는 Tesseract OCR을 가지고 좀 더 재밌는 예제를 만들어보겠습니다. 예고를 드린다면, 문자를 인식해서 음성으로 들려주는 예제를 다뤄보겠습니다. 

 

 

 

<참고자료>

[1] https://www.howtoforge.com/tutorial/tesseract-ocr-installation-and-usage-on-ubuntu-16-04/, Tesseract OR: Installation and Usage Ubuntu 16.04

[2] https://www.pyimagesearch.com/2017/07/10/using-tesseract-ocr-python/, pyimagesearch, "Using Tesseract OCR with Python"

[3] https://webnautes.tistory.com/947, 멈춤보다 천천히라도, "파이썬에서 pytesseract를 사용하여 문자 인식(OCR)하기"

 

댓글()

[파이썬] 선형 회귀의 업그레이드 버전2, 라쏘 회귀

컴퓨터비전/python|2020. 1. 20. 23:26

 

오늘은 지난 시간에 선형 회귀의 업그레이드 버전1인 릿지 회귀에 이어 업그레이드 버전2인 라쏘 회귀에 대해 다루도록 하겠습니다. 선형 회귀, 릿지 회귀, 라쏘 회귀에 대해서 이 글을 읽고 이해가 안되신다면 다음 글들을 참고하시면 좀 더 자세한 내용을 확인하실 수 있습니다. 

 

선형 회귀(linear regression)과 라쏘(Lasso)

[파이썬] 선형 회귀(linear regression)

[파이썬] 선형 회귀의 업그레이드 버전1, 릿지 회귀

 

라쏘 회귀는 릿지 회귀와 매우 유사합니다. 모든 것이 동일하고 다른 것은 제약 조건 뿐입니다. 릿지 회귀에서 가중치들의 제곱의 합에 $\alpha$를 곱한 것이 제약 조건이었다면, 라쏘 회귀에서는 가중치들의 절대값의 합에 $\alpha$를 곱한 것이 제약 조건입니다. 

 

릿지 회귀: $\frac{1}{n}\sum_{i=1}^{n}\left ( y_i - \hat{y}_i \right )^2 + \alpha\sum_{j=1}^{m}w_j^2$

 

라쏘 회귀: $\frac{1}{n}\sum_{i=1}^{n}\left ( y_i - \hat{y}_i \right )^2 + \alpha\sum_{j=1}^{m}|w_j|$

 

릿지 회귀에 붙은 제약 조건을 전문용어로 L2-norm이라고 불리고, 라쏘 회귀에 붙은 제약 조건은 L1-norm이라고 불립니다. 낯선 용어라 해서 너무 두려워 마시고 그냥 그렇게 부르구나 하고 넘어가셔도 좋습니다. 

 

릿지 회귀의 경우 이전 포스팅에 언급했던 것과 같이 최적의 가중치들은 특성들을 0에 가깝게 만드는 방향으로 진행됩니다. 반면, 라쏘 회귀의 경우 몇몇 특성들이 아예 0이 되어버립니다. 즉, 릿지 회귀의 경우 특성들의 영향력을 낮추는 반면, 라쏘 회귀는 몇몇 특성들을 아예 무력화시켜버립니다. 파라미터 $\alpha$값에 따라 무력화되는 특성들의 갯수가 달라집니다.

 

자, 그럼 지난 시간에 이용한 보스턴 주택가격 데이터셋에서 라쏘 회귀의 성능을 평가해보도록 하겠습니다. 우선 라쏘 회귀의 파라미터 $\alpha$를 초기값인 1로 놓고 실행해보겠습니다. 파이썬 코드는 다음과 같습니다. 아래 코드를 설치하기 위해서는 numpy, mglearn, matplotlib, scikit-learn 등의 파이썬 패키지가 필요한데, 본인의 컴퓨터에 어떤 패키지가 설치되어있는지 헷갈릴 수 있으니 일단 코드를 실행시켜서 에러난 것을 토대로 하나씩 설치하는 것도 좋은 방법입니다. 

import numpy as np
import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.load_extended_boston() # 보스턴 주택가격 데이터셋 불러오기

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 데이터셋을 훈련셋과 테스트셋으로 분리

lasso = Lasso().fit(X_train, y_train) # 라쏘 회귀 모델 훈련

print("training set score: {:.2f}".format(lasso.score(X_train, y_train))) # 훈련셋 결정계수
print("test set score: {:.2f}".format(lasso.score(X_test, y_test))) # 테스트셋 결정계수
print("the number of the used features: {}".format(np.sum(lasso.coef_ != 0))) # 사용된 특성갯수

 

 

 

훈련셋 점수와 테스트셋 점수가 매우 안좋죠? 그리고 사용된 특성의 갯수를 보니 단 4개입니다. 105개의 특성이 존재하는데 101개를 제외시켜버린 것입니다. 따라서, 파라미터를 조정해줄 필요가 있습니다. 라쏘 회귀는 적어도 선형 회귀와 비슷한 결과를 낼 수 있는 놈이기 때문입니다. 과소적합인 상황 같으니 모델의 복잡도를 높여주기 위해서, 1보다 작은 $\alpha$ 값들을 시도해보겠습니다. 0.1, 0.01, 0.001을 해보겠습니다. 다음과 같이 $\alpha$ 값을 설정해줄 수 있습니다. 

 

lasso = Lasso(alpha=0.01).fit(X_train, y_train) # 라쏘 회귀 모델 훈련

 

 

어떤 값일 때 최적인지 확인해보겠습니다. 

 

라쏘 회귀 성능 (alpha = 0.1일 때)
라쏘 회귀 성능 (alpha = 0.01일 때)
라쏘 회귀 성능 (alpha = 0.001일 때)

 

보시다시피 $\alpha$값을 낮추니 성능이 확 좋아졌죠? 그리고 0.01일 때 대략 최적인 것으로 보입니다. 또 주목할만한 것은 $\alpha$를 낮출수록 사용된 특성의 갯수가 늘어났다는 것입니다. 그만큼 복잡도가 높아진 것이죠.

 

지난 시간에 해본 릿지 회귀와 비교해서 보스턴 주택가격 데이터셋에서 성능은 거의 비슷한 것으로 보입니다. 데이터셋에 따라 더 좋은 성능을 내는 것을 골라서 사용하시면 되겠습니다. 

 

항상 질문과 지적은 환영입니다. 빠르게 답변드리고 있으니, 댓글 남겨주세요.^^ 

 

 

<참고자료>

[1] 안드레아스 뮐러, 세라 가이도 지음, 박해선 옮김, "파이썬 라이브러리를 활용한 머신러닝", 한빛미디어(2017)

댓글()

[파이썬] 선형 회귀의 업그레이드 버전1, 릿지 회귀

컴퓨터비전/python|2020. 1. 20. 03:38

지난 시간에 파이썬에 대해 선형 회귀를 실행하는 코드에 대해 살펴봤습니다. 오늘은 지난 시간에 예고한 것처럼 선형 회귀를 업그레이드한 것인 릿지 회귀에 대해 다루도록 하겠습니다. 선형 회귀에 대해 익숙치 않은 분들은 오늘 이 글을 보시기 전에 아래 두 포스팅을 보고 오시길 추천드립니다. 

 

선형 회귀(linear regression) 그리고 라쏘(Lasso)

[파이썬] 선형 회귀(linear regression)  

 

데이터의 특성이 단 하나일 경우에는 선형 회귀나 릿지 회귀나 다를 것이 없습니다. 똑같은 성능을 보입니다. 그러나 특성이 다수일 경우에는 릿지 회귀가 좀 더 잘 작동할 가능성이 큽니다. 릿지 회귀는 선형 회귀와 달리 모델의 복잡도를 조정할 수 있기 때문입니다. 복잡도를 조정할 수 있다는 말은 사용자가 설정 가능한 파라미터가 있다는 뜻으로 받아들이셔도 좋습니다.

 

선형 회귀의 경우  최적의 가중치들을 선택하기 위해서 타깃값과 예측값의 차를 제곱해서 평균낸 것, 즉 평균제곱오차(mean squared error, MSE)를 최소로 만드는 가중치들을 찾습니다.

 

평균제곱오차

 

릿지 회귀는 여기에다가 제약 조건을 덧붙입니다. "그 가중치들의 절대값들을 가능한 한 작게 만들어라!" 따라서 릿지 회귀는 다음과 같은 식을 최소로 만드는 가중치들을 찾습니다. 

 

여기서 alpha가 사용자가 설정할 수 있는 파라미터입니다. 

 

그런데 이러한 제약 조건을 붙임으로 얻을 수 있는 효과는 무엇일까요? 만약 alpha 값을 크게 설정해주면 그만큼 가중치들의 절대값들은 작아져야합니다. 그러면 그만큼 기울기가 줄어들겠죠? 기울기가 줄어든다는 말은 특성들이 출력에 미치는 영향력이 줄어든다고 볼 수 있습니다. 즉, 현재 특성들에 덜 의존하겠다는 뜻으로 볼 수 있습니다. 반대로 alpha 값을 작게 설정해주면 가중치들의 절대값들은 조금 커지게 됩니다. 만약 alpha 값을 줄이고 줄여서 0에 가깝게 설정해준다면 사실상 선형 회귀와 동일해지겠죠. alpha가 커지면 커질수록 과소적합이 될 가능성이, alpha가 작으면 작을수록 과대적합이 될 가능성이 커집니다. 따라서 적정한 alpha값을 찾아주는 것은 바로 릿지 회귀를 사용하는 사람의 책임이 됩니다. 

 

자 그럼 이제 릿지 회귀의 성능이 선형 회귀와 비교해서 어떤가를 살펴보겠습니다. 이를 위해 보스턴 주택가격 데이터셋을 활용하겠습니다. 이 데이터셋은 506개의 샘플을 갖고 있고, 각 샘플은 105개의 특성을 갖고 있습니다.

 

먼저 기존의 선형 회귀의 성능이 어떤지 확인해보도록 하겠습니다. 파이썬 코드는 다음과 같이 작성했습니다. 

 

import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.load_extended_boston() # 보스턴 주택가격 데이터셋 불러오기

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 데이터셋을 훈련셋과 테스트셋으로 분리

lr = LinearRegression().fit(X_train, y_train) # 선형 회귀 모델 훈련

print("training set score: {:.2f}".format(lr.score(X_train, y_train))) # 훈련셋 결정계수
print("test set score: {:.2f}".format(lr.score(X_test, y_test))) # 테스트셋 결정계수

 

이 코드를 실행했을 때 터미널에 출력되는 결과입니다. 

 

선형 회귀 성능

 

훈련셋의 점수는 0.95로 상당히 높은 반면에, 테스트셋 점수는 0.61로 좋지 않습니다. 게다가 두 점수의 차이가 크기 때문에 과대적합된 상태입니다. 그렇지만 선형 회귀 모델은 설정가능한 파라미터가 없기 때문에 이 문제를 해결할 방법이 없습니다. 

 

그러면 동일한 데이터셋에서 릿지 회귀는 어떤 성능을 내는지 확인해보겠습니다. 파이썬 코드는 다음과 같이 작성했습니다. 우선 파라미터 alpha를 디폴트 값(alpha = 1)으로 설정했습니다. 

 

import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge 
from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.load_extended_boston() # 보스턴 주택가격 데이터셋 불러오기

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 데이터셋을 훈련셋과 테스트셋으로 분리

ridge = Ridge().fit(X_train, y_train) # 릿지 회귀 모델 훈련

print("training set score: {:.2f}".format(ridge.score(X_train, y_train))) # 훈련셋 결정계수
print("test set score: {:.2f}".format(ridge.score(X_test, y_test))) # 테스트셋 결정계수

 

릿지 회귀 성능 (alpha = 1)

 

선형 회귀 모델에 비해 테스트셋 점수가 0.61에서 0.75로 많이 좋아진 것을 알 수 있습니다. 그럼 디폴트값 말고 여러 값을 대입해서 최적의 alpha 값을 찾아보도록 하겠습니다. 

 

alpha = 1보다 큰 값들인 alpha = 2, alpha = 5, alpha = 10으로 설정해보겠습니다. 위 파이썬 코드에서 다음 한 줄만 바꿔주면 됩니다. 

ridge = Ridge(alpha=2).fit(X_train, y_train) # 릿지 회귀 모델 훈련

 

릿지 회귀 (alpha = 2)
릿지 회귀 (alpha = 5)
릿지 회귀 (alpha = 10)

 

alpha가 1에서 커질수록 오히려 성능이 나빠진것을 확인할 수 있습니다. 따라서 최적의 alpha 값을 찾기 위해서는 alpha값을 줄여가야 합니다. 따라서 alpha를 0.5, 0.1, 0.01과 같은 값으로 설정해보겠습니다. 

 

릿지 회귀 (alpha = 0.5)
릿지 회귀 (alpha = 0.1)
릿지 회귀 (alpha = 0.01)

결과를 통해 알 수 있는 것은 0.5, 0.1로 작아질수록 성능이 좋아지다가 어느 순간부터 다시 나빠집니다. 따라서 alpha = 0.1을 최적의 파라미터값으로 설정해줄 수 있습니다. 물론 더 미세하게 값을 바꿔가면서 최적의 alpha 값을 찾을 수 있겠지만, 이 정도로만 하겠습니다.^^

 

그럼 최종적으로 선형 회귀와 릿지 회귀 성능을 비교해보겠습니다. 

 

주목해야할 것은 훈련셋 점수가 아니라 테스트셋 점수이므로, 0.77의 결정계수를 가지는 릿지 회귀가 0.61의 선형 회귀보다 보스턴 주택가격 데이터셋에서 우수한 성능을 낸다고 판단할 수 있습니다. (이 결과를 가지고 모든 데이터셋에서 릿지 회귀가 선형 회귀보다 낫다고 단정지을 수는 없습니다.)

 

다음 시간에는 선형 회귀의 또다른 업그레이드 버전, 라쏘 회귀에 대해 다루도록 하겠습니다. 언제나 질문과 지적은 환영합니다. 댓글 남겨주세요.^^ 

댓글()