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

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

【Mac/R/wgetコマンド】NCBIのE-utilitiesサービスを使って、RefSeqのFASTAファイルをダウンロードするTipsについて

はじめに

https://www.ncbi.nlm.nih.gov/

今回、NCBI (National Center for Biotechnology Information, アメリカ国立生物工学情報センター)のリファレンスゲノム、通称「RefSeq」のダウンロード方法についての記事を書いてみました。

NCBIウェブサイトからFTPサイト(ファイル転送プロトコル / File Transfer Protocol((ネットワーク上でファイル等の転送を行う通信プロトコルの1つです。)))を介さずに、RefSeqのFASTA形式ファイルをダウンロードします。

NCBIのRefSeqは、NCBI FTPサイトで公開されており、通常、そのウェブ・インターフェイスから取得します。 ただ、FTPサイトの動作が重かったり、そもそも、FTPサイトに公開されていないRefSeqデータもあります。 そういうときのやり方です。

https://www.ncbi.nlm.nih.gov/refseq/

また、Humanゲノムの場合だと、特設のウェブページがあって、GRCh38やGRCh37といった、RefSeqやアノテーションファイルなどが簡単に取得できます。「Human Genome Resources and Download」をクリックすれば、そのページに移動します。

https://www.ncbi.nlm.nih.gov/projects/genome/guide/human/index.shtml

この記事では、NCBIのFTPサイトを介さずに、E-utilitiesサービスを使った代替方法を取り扱います。

NCBI RefSeqのFTPサイトについて

「RefSeq: NCBI Reference Sequence Database」のカテゴリの1つである「RefSeq Access」から、 RefSeq FTPあるいはRefSeq genomes FTPの項目をクリックすることで、FTPサイトを訪れられます。

https://ftp.ncbi.nlm.nih.gov/refseq/

https://ftp.ncbi.nlm.nih.gov/genomes/refseq/

NCBIのE-utilitiesサービスを使った、RefSeqのダウンロード方法について

NCBIのE-utilitiesというサービスを利用して、RefSeqのテキストデータを取得します。

E-utilities(Entrez Programming Utilities)は、NCBIのEntrezデータベースシステムのAPIのことを言います。 現在、E-utilitiesは、ヌクレオチドおよびタンパク質配列、遺伝子レコード、3次元分子構造、生物医学文献を含む、様々な生物医学データを網羅する38つのデータベースで使われているインターフェイスのようです。

E-utilitiesは、以下のようなURL記法で利用します。 {API名}{各パラメータ}の部分が変数となっています。

https://eutils.ncbi.nlm.nih.gov/entrez/eutils/{API名}.fcgi?{各パラメータ}

今回、efetch.fcgiのAPIを使用しています。 また、データベースはnuccoreを指定して、fastaファイルを取得するようにしています。

より詳しくは、まさなみブログの「NCBIのE-utilsについて簡単にまとめてみた。」英語マニュアル「A General Introduction to the E-utilities」などを参照ください。

つづいて、RefSeqのダウンロードについての実施例を紹介します。

枯草菌(Bacillus subtilis)のRefSeqのダウンロード実行について

枯草菌について

枯草菌は、土壌や植物など、比較的どこにでもいる常在細菌の一種です。 この和名は、枯れた草の表面などからよく分離されたことから、その名前が付けられたようです。

Bacillus subtilis subsp. subtilis str. 168 complete genome (NC_000964.3)

https://www.ncbi.nlm.nih.gov/genome/?term=Bacillus%20subtilis[Organism]&cmd=DetailsSearch

上図の「Bacillus subtilis: Model organism for prokaryotic cell differentiation and development」を対象に、RefSeqのFastaファイルをダウンロードします。NCBI Reference Sequenceは、「NC_000964.3」です。

ちなみに、「Download sequence and annotation from RefSeq」の「RefSeq」をクリックすると、 FTPサイトに移動します。Bacillus subtilisのゲノムは沢山表示されます。

https://www.ncbi.nlm.nih.gov/nuccore/NC_000964.3

次に、Reference genomeのページに移動します。そして、RefSeq「NC_000964.3」のリンクをクリックします。 そうすると、「Bacillus subtilis subsp. subtilis str. 168 complete genome (NC_000964.3)」が表示されます。 さらに、FASTAのリンクをクリックすると、FASTA形式の塩基配列が表示されます。

https://www.ncbi.nlm.nih.gov/nuccore/NC_000964.3?report=fasta

この配列データをE-utilitiesサービスを用いてダウンロードします。

Rでの実行コード

まずは、wgetコマンドとR実行を組み合わせて書くと、以下のようになります。

## wgetのR実行の場合
RefSeq_id <- "NC_000964.3"
OutFile <- paste0(RefSeq_id, ".fa")

#URL作成
url <- paste0('"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nuccore&id=',
       RefSeq_id, '&rettype=fasta" -O ', OutFile)

#実行
system(paste0("wget -q ", url))

#ファイル情報表示
file.info(OutFile)
#                  size isdir mode               mtime               ctime
#NC_000964.3.fa 4275902 FALSE  644 2022-09-26 19:45:33 2022-09-27 02:32:52
#                             atime uid gid uname grname
#NC_000964.3.fa 2022-09-29 02:18:20 502  20   sas  staff

一方、純粋に、R環境のみで実行するなら、utils::download.file関数を使います。 結果は、上記と同じくなりますが。。以下のように実行します。

##utils::download.file()を使った場合
RefSeq_id <- "NC_000964.3"
OutFile <- paste0(RefSeq_id, ".fa")

#URL作成
url <- paste0("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nuccore&id=",
       RefSeq_id, "&rettype=fasta")

#実行
utils::download.file(url, OutFile, quiet = TRUE)

#ファイル情報表示
file.info(OutFile)

 

プログラム実行の結果、「NC_000964.3.fa」という名前で、4.3MBのファイルがダウンロードされます。 これくらいのファイルサイズなら、テキストエディタで余裕で開けます。

黄色ブドウ球菌(Staphylococcus aureus)のRefSeqのダウンロード実行

黄色ブドウ球菌について

黄色ブドウ球菌は、ブドウの房状に複数の細菌が集まっていることから、その名前が付けられました。 この細菌は、しばしば、食中毒の原因となります。

もっと詳しい情報は、ようこそ不思議な細菌の世界へ食中毒を起こす微生物 » 黄色ブドウ球菌とかを参考にしてください。

Staphylococcus aureus subsp. aureus NCTC 8325 chromosome, complete genome (NC_007795.1)

https://www.ncbi.nlm.nih.gov/nuccore/88193823

上図の「Staphylococcus aureus subsp. aureus NCTC 8325 chromosome, complete genome」を対象に、RefSeqのFastaファイルをダウンロードします。NCBI Reference Sequenceは、「NC_007795.1」です。

ちなみに、「Staphylococcus aureus」のFTPサイトでは何もRefSeqが表示されません。

Rでの実行コード

https://www.ncbi.nlm.nih.gov/nuccore/NC_007795.1?report=fasta

このFATSAファイルのダウンロードでは、上記のRコードを関数化したものを使います。 関数の定義と実行を以下に示します。引数は、NCBI Reference SequenceのIDを入力するだけです。

## efetch.fcgiの実行関数 download.RefSeq()
download.RefSeq <- function(NCBI_Reference_Sequence){
  #定義
  RefSeq_id <- NCBI_Reference_Sequence
  OutFile <- paste0(RefSeq_id, ".fa")
  
  #URL作成
  url <- paste0("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nuccore&id=",
         RefSeq_id, "&rettype=fasta")
  
  #実行
  utils::download.file(url, OutFile, quiet = TRUE)

  #ファイル情報表示
  file.info(OutFile)
}

#関数実行
download.RefSeq(NCBI_Reference_Sequence="NC_007795.1")
#                  size isdir mode               mtime               ctime
#NC_007795.1.fa 2861755 FALSE  644 2022-09-27 02:41:14 2022-09-27 02:41:14
#                             atime uid gid uname grname
#NC_007795.1.fa 2022-09-27 02:40:47 502  20   sas  staff

プログラム実行の結果、「NC_007795.1.fa」という名前で、 2.9MBのファイルがダウンロードされます。

まとめ

E-utilitiesとか、R言語を使うと、スマートに出来ますよね。

場合によっては、RefSeqのテキストをコピーして、 テキストエディタに貼り付けて保存すると同じことなんだけど。。。

補足

wgetのインストール

Macにwgetをインストールしていない場合には、まずは、wgetをインストールします。

ターミナル環境でインストールする場合には、

#(ターミナル)brewコマンドでのwgetのインストール
brew install wget

また、R環境でインストールする場合には、

#(R環境)brewコマンドでのwgetのインストール
system("brew install wget")

skume.net

ヒトリファレンスゲノム: GRCh38とhg38の違い

  • GRCh38は、NCBI/GRCバージョンを意味します。hg38は、UCSCバージョンを意味します。

  • GRCh38とhg38の配列情報はほぼ同じです。曖昧な塩基表記に違いがあります。hg38はNで表記される一方、GRCh38はあいまい塩基表記(R,Y等)を記述されます。

  • 両者で、ミトコンドリアの配列情報は同じで、座標のずれは全染色体通してありません。

参考資料

www.biostars.org

kazegahukeba.hatenablog.com

www.ncbi.nlm.nih.gov

https://cell-innovation.nig.ac.jp/SurfWiki/GRCh38_Hg38_defference.html

biotech-lab.org

Mac OSXでよく使う・使ったら便利なショートカット集

Macのショートカット

Macでよく使う・使ったら便利なショートカットを集めてみました。

随時更新していきます。

画面キャプチャー・スクリーンショット

全画面のスクリーンショット

⌘(コマンド) + Shift + 3

範囲を選択して、スクリーンショットする

⌘(コマンド) + Shift + 4

Finder上で隠しファイルを表示させる

Macのショートカットで、隠しファイル( . から始まるファイルやフォルダ)の表示・非表示を切り替えることができる。

Finderで表示したいフォルダを選択して、

⌘(コマンド) + Shift + . (ドット)

を同時に押すと、隠しファイルが表示される。

また、隠しファイルを非表示にするにはもう一度実行すれば良い。

ショートカットキーいろいろ

削除系のショートカットキー

(削除) ショートカットキー
1文字の削除 Delete
Ctrl (Control) + h
1単語の削除 Ctrl + w
カーソル位置から行頭まで削除 Ctrl + u
カーソル位置から行末まで削除 Ctrl + k
カーソル上の1文字削除 Ctrl + d
Terminal logをクリーンする Command + k

履歴系のショートカットキー

(履歴) ショートカットキー
一つ前のコマンド履歴 Ctrl (Control) + p
次のコマンド履歴 Ctrl + n
インクリメンタル検索 Ctrl + r

カーソルの移動系のショートカットキー

(カーソルの移動) ショートカットキー
後退 Ctrl (Control) + b
前進 Ctrl + f
行頭へ移動 Ctrl + a
行末へ移動 Ctrl + e
一語後退 Ctrl + b
一語前進 Ctrl + f

処理系のショートカットキー

(処理系) ショートカットキー
実行中のコマンドを強制終了 Ctrl (Control) + c
実行中のコマンドを一時停止 Ctrl + z
処理の停止(quit) Ctrl + \ (or ¥ )
終了、Logout Ctrl + d

その他のショートカットキー

(その他) ショートカットキー
画面をクリアする Ctrl (Control) + l
一つ前とカーソルの文字を入れ替える Ctrl + t
Enter Ctrl + m, Ctrl + j, Ctrl + o
新規Finderを開く フォルダアイコンを選択して、Command + ダブルクリック
その作業ディレクトリで、新規ターミナル起動 フォルダアイコンを選択して、option + command + t (要事前設定)

関連情報

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