京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

Python/パイソン 初心者におすすめ入門本・参考書・AI学習書!!

はじめに

この記事では、Pythonに興味を持っている方や、これからPythonプログラミングを始めてみたい方、プログラミングに興味のある学生さんに向けて、Pythonのおすすめ入門本・参考書・AI学習書を紹介します。

Python(パイソン)は、インタープリタ型の高水準汎用プログラミング言語で、グイド・ヴァン・ロッサムにより創り出され、1991年に最初にリリースされた。

Pythonを学ぼうと検討している方には、近年注目を集めている「人工知能技術(AI)」、そのなかでも特に「深層学習(Deep learning)」に興味を持っているのではないでしょうか。。。

Pythonは機械学習や深層学習の分野で数多く支持され、同言語を使って、さまざまなアルゴリズムやプログラミングコードが開発されています。

いまや、「AIを学習したい、もしくはAI関連の職業に就きたいならPythonは習得必須」と言っても過言ではありません。

シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全

「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全」は、 9万人が選んだ人気No.1オンライン講座が超わかりやすくパワーアップして書籍されました。

同書では、海外企業でも通用する一流のプログラミング技術、世界標準のPythonスキルが一気に学べます!

図表も豊富で初心者のバイブルになるような本です。

pythonに限らずプログラミング初心者でも基本的な知識から蓄えられる内容で、おすすめです。

【R言語と画像認識】学習済みAIモデルを使って、顔認識がサクサクできた話

Rで顔認識をやってみた話

ふと思い立って調べてみたところ、R環境で、顔認識ができる深層学習の学習済みモデルがパッケージとして提供されているらしい。 早速、Rを使った顔認識の実施例についての記事を書くことにしました。 フリーソフトウェアでも、ヒトの顔認識が高い精度できてしまうって、すごい時世ですね。

ここでいう、「顔認識」とは、デジタル画像から、ヒトの顔部分を自動的に識別するAI技術を指します。 今回、デジタル画像内の顔と思われる部分を検出して、それを抜き出しするところまでRでやってみます。

顔認識の関連パッケージをセットアップする

今回、imageプロジェクトのパッケージの1つである、image.libfacedetectionを用います。 GitHubにある、このimageリポジトリでは、Rユーザーのためのコンピュータビジョンと画像認識アルゴリズムを提供しています。

また特徴として、magick, imager, EBImageなどの他のR パッケージでは実装されていない画像アルゴリズムを実行できます。 それぞれの画像認識のアルゴリズムは、ライセンスの違いにより、異なるパッケージとして提供されています。

それでは、image.libfacedetectionパッケージと、画像処理用でmagickパッケージをインストールしていきます。

#magickのインストール
install.packages("magick")
library(magick)

#image.libfacedetectionのインストール: CNN for Face Detection
install.packages("image.libfacedetection", repos = "https://bnosac.github.io/drat")
library(image.libfacedetection)

男性画像に対する顔認識の検証

image.libfacedetectionパッケージでは、デジタル画像から顔を検出する畳み込みニューラルネットワーク(CNN)を提供しています。 この深層学習のAIモデルは、事前に学習された、顔検出のモデルとなっていて、手元で学習をする必要はもはやありません。

それでは、テスト画像を読み込み、実行してみます。

#画像の読み込み
image <- image_resize(magick::image_read("http://bnosac.be/images/bnosac/blog/wikipedia-25930827182-kerry-michel.jpg"),"512x")

#画像表示
image

このような、3名の男性が写った、jpgのデジタル画像を使用します。 オリジナル画像がやや大きかったので、事前にリサイズをやっています。 続いて、この画像に対して、image.libfacedetectionの顔認識を実行します。

#顔認識の実行
faces <- image.libfacedetection::image_detect_faces(image)

#結果の重ね合わせ
plot(faces, image, border = "red", cex=1.5, lwd = 5, col = "white")

出力結果を見たところ、男性の顔部分がうまく認識されていることが分かります。 一緒にスコアが表示されていますが、98-99と高い値を示しています。

顔認識後に、顔部分をクロップ(切り出す)する

次に、magick::image_crop関数を使って、顔部分のみを切り出してみます。 切り抜いた画像はリストになっていますが、それぞれの要素を指定して、横方向に画像結合させます。

#顔の位置情報など
x = faces$detections$x
y = faces$detections$y
width = faces$detections$width
height = faces$detections$height

#クロップ実行
f <- function(x, y, width, height){
      magick::image_crop(image, geometry_area(x = x, y = y, width = width, height = height))
}
facesM <- Map(f, x, y, width, height)

#横方向に画像結合
magick::image_resize(magick::image_append(c(facesM[[1]], facesM[[2]], facesM[[3]]), stack = F), 
             geometry = "x200")

 

その結果、顔部分だけを切り出して、並べれました。若干キミ悪いですが。。

女性の画像を用いた顔認識の検証実験

女性が写ったpng画像でも検証してみました。 画像内の女性はやや下向きで、文字とかが挿し絵とかが入っているのでやや難しいと思われます。。

それではやってみましょう。

#画像の読み込み
image <- magick::image_resize(magick::image_read("https://cdn-ak.f.st-hatena.com/images/fotolife/s/skume/20220828/20220828015940.png"),"512x")

#画像表示
image

#顔認識の実行
faces <- image.libfacedetection::image_detect_faces(image)

#検出結果の重ね合わせ
plot(faces, image, border = "red", cex=1.5, lwd = 5, col = "white")

 

文字とか、色々ありましたが、女性の顔だけがうまく認識できています。 スコアは、83とやや低いですが、得られた結果は素晴らしいです!!

まとめ

Rでも顔認識がサクッとできるみたいですね。便利になりましたね。

参考 - 顔認識

github.com

www.r-bloggers.com

cran.r-project.org

nagaremo.jp

【R言語と文字認識】R環境で、OCR(光学文字認識)をやってみると、やはりの結果だった件

はじめに

さっき調べてみたら、R環境で、OCR(光学文字認識)がサクッとできるみたいとのことで、早速、記事を書いてみることにした。

OCRとは、スクリーンショットやスキャンした紙、手書きテキストの画像など、画像内からテキストを見つけ出して、文字コードに変換する技術のことです。 Rパッケージのtesseractを使うとサクッとできるみたいです。

tesseract::ocr関数を使った、画像からの文字起こし

tesseractパッケージは、100以上の言語をサポートする強力なOCRエンジンであるTesseractのRラッパーとして提供されています。このエンジンでは、検出アルゴリズムを調整し、可能な限り最良の結果を得るために、高度な設定もできるようです。

同パッケージの注釈を見ると、一般的なパターン認識としてのOCRは、コンピュータにとって非常に難しいタスクで、結果が完璧になることはほとんどなく、入力画像の質によって精度は急速に低下するのことです・・・ まぁ画像認識は一般論として、そうなんでしょうね。

そのため、入力画像を適切に品質管理することが大事なようです。

さて、OCRの実行には、Tesseractパッケージ内にocrという関数が用意されていて、それを使います。

OCR関連パッケージのセットアップ

まずは、関連パッケージをインストールします。

#tesseractのインストール
install.packages("tesseract")
library(tesseract)

#EBimageのインストール
install.packages("BiocManager")
BiocManager::install("EBImage")
library(EBImage)

文字認識して、英語を抽出する場合: 英文字のみ

さて、英語のタイプ文字の画像を使って、OCRの検証をやってみます。

まずは、英語(eng)のエンジンを設定します。

#言語設定: 英語(eng)
eng <- tesseract("eng")

#テスト画像の読み込み
Img <- EBImage::readImage(files="http://jeroen.github.io/images/testocr.png")

#テスト画像の表示
options(EBImage.display = "raster")
EBImage::display(Img)

この英字を含むテスト画像をインプットとして、次に、tesseractのOCRを実行してみます。

#OCR実行
text <- tesseract::ocr("http://jeroen.github.io/images/testocr.png", 
                       engine = eng)

#結果表示
cat(text)
#This is a lot of 12 point text to test the
#ocr code and see if it works on all types
#of file format.
#
#The quick brown dog jumped over the
#lazy fox. The quick brown dog jumped
#over the lazy fox. The quick brown dog
#jumped over the lazy fox. The quick
#brown dog jumped over the lazy fox.

text
#[1] "This is a lot of 12 point text to test the\nocr code and see if it works on all types\nof
#file format.\n\nThe quick brown dog jumped over the\nlazy fox. The quick brown dog jumped\nover
#the lazy fox. The quick brown dog\njumped over the lazy fox. The quick\nbrown dog jumped over the
#lazy fox.\n"

まぁ、テスト画像なので、ほぼ完璧に文字起こしされてますね。

どうも改行コード(\n)も出力されるみたいですね。

では、次の検証として、日本語の文字でも試してみます。

文字認識して、日本語を抽出する場合: その1 日本語文字のみ

デフォルトでは、日本語のエンジンが入っていないようなので、 手始めに、tesseract_download関数で、日本語のエンジンを入れてあげます。

直下の2行の実行で、日本語(jpn)のエンジンを設定します。

#言語設定: 日本語(jpn)
tesseract_download("jpn")
jpn <- tesseract("jpn")

#テスト画像の読み込み
imgj <- "https://raw.githubusercontent.com/kumeS/Blog/master/R_OCR/02.png"
Img <- EBImage::readImage(files=imgj)

#テスト画像の表示
options(EBImage.display = "raster")
EBImage::display(Img)

 

今回、上記のようなwikipediaの「リンゴ」の説明文を使って、日本語OCRを実行してみます。

#OCR実行
textj <- tesseract::ocr(imgj, engine = jpn)

#結果表示
cat(textj)
#リンゴとは、バラ科リンゴ属の落葉高木、またはその
#果実のこと。 植物学上はセイヨウリンゴと呼ぶ。春、
#
#白または薄氏の花が咲く。人との関わりは古く、紀元
#前から栽培されていたと見られ、16世紀以降に欧米
#
#での生産が盛んになり、日本においても平安時代には
#書物に記述がみられる。 ウィキペディア

おぉ〜〜、無事に上手くいっています!!

言語の関わらず、文字だけの画像だと、うまく行くみたいですね。

文字認識して、日本語を抽出する場合: その2 日本語 + 背景あり

さて、画像に背景がある場合に、結果はどうなるのでしょうか?

その場合も、検証してみました。

こういう画像で、以下のOCR実行をやってみました。

#言語設定: 日本語(jpn)
#tesseract_download("jpn")
#jpn <- tesseract("jpn")

#テスト画像の読み込み
imgj <- "https://cdn-ak.f.st-hatena.com/images/fotolife/s/skume/20220828/20220828015940.png"
#Img <- EBImage::readImage(files=imgj)

#テスト画像の表示
#options(EBImage.display = "raster")
#EBImage::display(Img)

#OCR実行
textj <- tesseract::ocr(imgj, engine = jpn)

#結果表示
cat(textj)
#0 い
#トマイニングをやっ      っ       ー
#てみたら、〇〇〇な         でミ
#ーー 件【その1: 夏目激        に
#ん」 を使った、テキ      SN

あらら、、、全然、テキスト変換できていませんね。

結局、背景があると、それが邪魔するようです。 「入力画像の質によって精度は急速に低下する」ということなんでしょうね。。

まとめ

今回、R環境でのOCRによる文字起こしをテーマにしてみました。

OCRの使い所ですが、経験上、辞書の索引の写真を撮って、それをテキスト変換とかなら結構使えます。

あとは、OCRよりも何方かと言えば、過去に紹介したPDFファイルのテキスト変換の方が利用シーンが多いかもしれない。

skume.net

参考資料

skume.net

Using the Tesseract OCR engine in R

dinov.sakura.ne.jp