コロナ社「Pythonで学ぶ実践画像・音声処理入門」本のレビュー

# はじめに

「[Pythonで学ぶ実践画像・音声処理入門](http://www.coronasha.co.jp/np/isbn/9784339009026/)」を読んでみたので、そのレビューを書きたいと思います。
最近、Python関係の書籍が色々なところから出版されていて、どれを読むか悩むと思います。
そこで、このレビューでは書籍内容をまとめ、どういった人が読むべきか述べようと思います。

<a href="https://www.amazon.co.jp/Python%E3%81%A7%E5%AD%A6%E3%81%B6%E5%AE%9F%E8%B7%B5%E7%94%BB%E5%83%8F%E3%83%BB%E9%9F%B3%E5%A3%B0%E5%87%A6%E7%90%86%E5%85%A5%E9%96%80-%E4%BC%8A%E8%97%A4-%E5%85%8B%E4%BA%98/dp/4339009024"><img width="150" alt="Pythonで学ぶ実践画像・音声処理入門" src="https://qiita-image-store.s3.amazonaws.com/0/184122/1108ec20-4e66-91b6-7c6c-32fff7a914f5.jpeg"></a>


## 書籍の特徴

1. Pythonを通じて画像処理・音声処理の基礎を習得できる
2. 画像処理・音声処理を題材としてPythonの数値計算の基礎を習得できる
3. 機械学習のためのハンドクラフト特徴の作り方の基礎を習得できる

1は書籍名の通りで、実際の音声データや画像データを対象に、各信号処理の手法がどのように機能するかを実装しながら学べます。

2は、裏返しですが、信号処理の基礎を学ぶ過程で、Pythonの数値計算のライブラリであるNumpy、および可視化ライブラリMatplotlibの機能を学ぶことができます。個人的にはこちらの方が重要だと思います。信号処理のこれまでの書籍は、内部のアルゴリズムをC言語で実装する方法が書かれています。しかし、データ分析では「***内部のアルゴリズムをゼロからスクラッチする***」というより、「***OSSをいかに効率よく使って、早く知見を得るか***」というのが重要です。もちろん、内部の実装を知ることは処理の高速化を行う上で必要ですが、この書籍のターゲットではないと思っています。

3は、上記データ分析の文脈の上で、機械学習を用いるときの特徴量設計の基礎が学べます。最近は、深層学習が猛威を振るい、論文の実験結果にSVMなどのトラディショナルな手法が出てくることが少なくはなりましたが、私は比較を行う上で、必ずハンドクラフトな特徴量を用いた場合の実験結果を載せるべきだと思っています。
そうでないと、深層学習で上手くいかった場合に、それがトラディショナルな手法でも起こり得る問題なのか、はたまた深層学習特有の問題なのか切り分けが付かないと思います。最近の論文ではこの部分の考察が甘く、どのネットワーク構造で精度が出たかかばかりを述べてあり、知見が積み上がっていないように感じます。そういった意味で、トラディショナルな機械学習を実践する上でのハンドクラフト特徴の作り方が学べます。

### 注意事項

この書籍では、深層学習は扱っていません。そのため、その部分を学びたいと考えるのなら、他の書籍を読むとよいです。画像系であれば「[ゼロから作るDeep Learning](https://www.oreilly.co.jp/books/9784873117584/)」が読みやすいです。音声系はこれというのはないのですが、LSTMやEncoder-Decoderモデルを使って系列処理に取り組むという意味では、「[詳解 ディープラーニング](https://book.mynavi.jp/manatee/books/detail/id=72424)」がおすすめです。

# 書籍の内容

音声・画像のデータ構造に始まって、各種データ分析に必要な解析手法があがっています。最後に、それらを使って分類問題を解くといった形になっています。

- データ構造と基本処理
 - Numpy, Matplotlibの使い方
 - 波形、画像、動画データの構造　
 - 波形の重ね合わせ
 - 画像のマスク処理
- 周波数解析
 - 1次元、2次元フーリエ変換
 - スペクトログラム
 - ハニング窓による前処理
- フィルタ
 - 移動平均フィルタ
 - ハイパスフィルタ
 - ローパスフィルタ
 - ソーベルフィルタ
- 類似度
 - 相互相関 
 - コサイン類似度 
- 周波数変調
 - 信号の複素数表現
 - 正弦波による周波数変調 
- 幾何学的処理
 - 同次座標表現
 - アフィン変換
- 分類
 - 特徴量（短時間エネルギー、零交差）
 - k-近傍法を用いた分類
 - 多次元正規文分布を用いた分類

まず、一次元の信号である音声データの分析方法を説明してから、そこから二次元の信号である画像データの分析方法を説明する感じになっています。そして、理論を説明した後、それを実践するコードの解説をしています。

# レビューと感想

信号処理の教科書で書かれているような内容を網羅的にまとめられています。それぞれの分析手法を試すのに、どのように実装するかが解説してあり、一通り読めば実験をする際に困ることはほとんどないかと思います。ただ、紙面の都合上、実行結果が書かれていなかったり、関数の詳しい仕様が書かれていなかったりするので、その部分はドキュメントを読んで、各自試す必要があるかなと思います。また、書いてある内容としては、初歩的な内容なため、既に経験を積んでいて、信号処理を応用的なことに使いたいと思う人には物足りなく感じるかもしれません。

データ構造など基礎的なことから説明されてあり、そもそも信号がどう表現されていて、プログラム上でどのように扱われているかを最初に説明されていることがよかったです。そして、信号処理の定番であるフーリエ変換について、スペクトルが捉えるものがどういった現象かを、Matplotlibでの可視化結果を踏まえて説明しているのがよかったです。この部分なんとなく使っている人が多い気がするので、再確認する意味でも読むことをおすすめします。また、フーリエ変換を行う上でのよくある問題に対して、ハニング窓を使って前処理をする方法が書かれてありよかったです。
そのあとに、インパルス応答の考え方から、代表的なフィルタの説明がされており、各種フィルタをどう使うべきかが分かりました。また、周波数変調に関して、時間変化と伴に波形がどう変化するかを可視化を踏まえて説明してありよかったです。

そして、具体的にどう使うべきかの応用例として、緑地か海かというような衛星画像の画素の分類であったり、信号中で音のあるフレームを抽出する方法などが書かれているところが良かったです。これらの分析手法は、最終的な使い方に紐付いて信号からどういった特徴を抽出するべきか決まるので、そこへのイメージが繋がるように書かれていたのはよかったです。ただ、書かれている内容はとても初歩的なものなので、もう少し高度な応用に対して、どう特徴量と分類器を選択するべきかなどが書かれているとよかったです。実はこの部分がとても重要で、ハンドクラフトな特徴を用いる場合、その特徴を決めるハイパーパラメータが多くなってしまい、結果として学習が上手くいかないことがあるため、その部分に関して専門家の意見がまとめられているとよかったです。

## まとめ

信号処理の初学者が一人立ちして研究・開発を行うための入門書としては非常に優れています。また、NumpyやMatplotlibなどの、データ分析では必須となっているライブラリの使い方を実践を伴い学べるのは非常に良いです。恐らく、本書で書かれているような信号処理の内容をPythonで説明しているのは邦書ではこの書籍ぐらいではないでしょうか。

ただ、基礎的な内容を手厚くした分、理論やライブラリの使いこなしの部分が薄くなっているので、各種ドキュメントを読んで補足する必要があります。信号処理の理論に関しては、「[例解 ディジタル信号処理入門](https://www.coronasha.co.jp/np/isbn/9784339008579/)」を読むとよいかもしれません。各種ライブラリの使いこなしに関しては、「[Pythonによるデータ分析入門](https://www.oreilly.co.jp/books/9784873116556/)」がよくまとまっています。