冬休みの自由研究は、OCRを作ってみることにした。世間一般のOCRは、キャプチャに出てくるような文字をいかに高精度に認識できるかに関心がある感じだけど、ビジネスへの適用だと、以下みたいな限定的な条件を課すかわりにより精度を上げられた方がメリットがあるように考えた。
- 1行分の数字列を認識する。
- 認識するのは、手書きなどは除外でマシン・プリントに限定。
- 基本は数字列のみが認識できれば良い。
- 文字は、等幅フォントを仮定して良い。
実装は、まずイメージ処理で数字列から各数字を分離する。まずy方向で数字列がある領域を探す。これは黒い部分の濃度が高い部分が、しきい値を超えて固まっている部分を抜き出すことで行う。
次にx方向で数字ごとに分離する。これは、各数字の高さに対する幅の比率に仮定(今回は、50-90%)を置くことで、その範囲で各数字の分離を試みて分離境界位置の黒成分が最も少ないところで切り取る。等幅である仮定を置くことで、より高い精度で分離が可能になる。
あとは、ニューラルネットで学習したモデルを使って、分離した各数字を判定する。今回はdeepLerning4jを使用した。教師データは、とりあえずMNISTを使用した。MNISTは手書き文字なので、印字フォントだとあまり精度が出なさそうだけど、とりあえず今回は実装時間を優先。
サンプル・コードは、Dockerizeしてdocker hubでビルドしたので、Dockerがあれば簡単に試すことができる。コードは、数字の分離だけを行う機能と、ocrまで行う機能を作成した。ソースはこちら。
数字の分離は以下で行える。
$ docker run -it --rm -v /tmp:/tmp ruimo/lightocr split /tmp/005.png
引数に、pngで処理したいイメージファイルを指定する。Dockerコンテナ内から見えるようにボリューム指定が必要(-v /tmp:/tmp)。例えば以下のようなイメージを用意した場合、

/tmp/005の下に、以下のイメージが生成される。
/tmp/005/000.png: 
/tmp/005/001.png: 
/tmp/005/002.png: 
/tmp/005/003.png: 
/tmp/005/004.png: 
/tmp/005/005.png: 
/tmp/005/006.png: 
/tmp/005/007.png: 
OCRの実行は以下で行える。
$ docker run -it --rm -v /tmp:/tmp ruimo/lightocr ocr /tmp/005.png
引数に、pngで処理したいイメージファイルを指定する。Docker内から見えるようにボリューム指定が必要(-v /tmp:/tmp)。例えば上記のイメージを用意した場合、
/tmp/005.txtにOCRで認識した数字列が生成される。
32392242
毎回、MNISTをダウンロードして学習してから認識に入るのでそれなりに時間がかる。
やはりMNISTが教師データなので精度はいまいちだが、印字文字を集めて学習すれば良くあるMNISTによる認識よりも高い精度が得られそうだ。また、業務で使用するプリンタが限定できるなら、そのプリンタに特化した教師データを集めれば、より高い精度が得られるはず。
教師データ揃えて、学習や認識をRESTで行えるところまでやりたかったけど、今回は時間切れ。
第2楽章は変奏曲。
緊張感の高い2つの楽章にはさまれた、この楽章はとても暖かなテーマが変奏される。
変奏1。
変奏2
変奏3
最初のテーマに戻る。
不気味な分散和音の後、attaccaで第3楽章に流れ込む。
出だしに和音の強打があり、ppでテーマが始まり強烈な緊張感を与える。
右手で最初のテーマが奏される中で、左手側に新たな萌芽が見えてくる。
曲は、最初のテーマがこれでもかと言うほど使われる。
展開部。
右手に新たなリズムが現れて盛り上がる。
再現部の後に、最後にプレストが配置されている。最初は新たなテーマが奏される。
しかしすぐに最初のテーマの展開となる。
テーマの展開の後に、アルペジオに流れ込んで劇的に終了する。
楽譜引用はヘンレ版。
Apple Musicの方はこちら。
Facebookの広告に表示されたんだけど、なんか怪しげな部品テスタを買ってみた。いや今回ばかりは、Facebookの広告エンジンすげ〜と思った。自分が興味を持ちそうのものドンピシャ。
何せ日本への送料無料で$9.99。これならハズレ品だとしても、まぁお正月の福袋を買ったと思えばいいわけで。Order入れたのが去年の12/25で、まぁ2週間くらいかかるんだろうなと思ったら1/2に届き、まさに福袋感覚。
すっかりマイナーとなった006Pが必要なのでコンビニ行ったら、まさかの500円超え。秋月に行けば100円で買えることを知っている身としては、さすがに手を出せず、ジャンク箱をあさったらテスターのおまけで付いて来たものを発見。
ケースはアクリルで、バラバラになるので、自分で組み立ててネジ止めしなきゃいけないくて、ちょっと面倒。これ電池交換の度にバラバラになっちゃうのでやっかいだ。まぁ、考えてみると天板以外は接合部を塩化メチレン流し込んで止めちゃえばいいのかな。
というわけで、手持ちの部品を適当に見繕ってテストしてみた。まずは抵抗から。抵抗値が低い方で0.68Ω
ちゃんと測定できている。抵抗測定だと電圧降下で見るだろうから、低抵抗をきちんと測るのは大変そうなのに優秀だ。次に高抵抗側。
5.6MΩ。ここまで測定できればok問題無し。次はコンデンサ。
まずは低容量の方で22pF。さすがに、ここまで小さいと無理か。
47pFならokなので、下限は思ったより低い。次は高容量側。
0.1μFも大丈夫。日本人的には、このnFってピンと来ないのよね。仕方無いけど。
100μFもok。
なんと470μFもok。
3300μFもok。ただ、高容量になると測定に時間がかかるようになる(それでも5秒くらいか)。コンデンサ測定ではESRも表示されるのが良い。
コイル(マイクロ・インダクタ)も測定できた。
水晶振動子は無理。はい。分かってました。
シリコン・ダイオード。Vfが表示されるのが良い。
こういうダイオード・アレイもちゃんと表示されてすごい。
それならばとショットキー・バリア・ダイオード。ちゃんとVfが0.6V切っているのが分かって楽しい。って、上のダイオード・アレイもVf見るとショットキー・バリア・ダイオードだったみたい。
2SC1815は期待通り。HFEやVfも表示される。hFEという先頭だけ小文字の表記は何なんだろ。多分表示値は直流電流増幅率の方だと思われる。
MOS FETもちゃんと表示される!。ゲート容量が表示されるので、高速スイッチングが必要な時には参考になるかも。
LEDのようなVfの大きなデバイスもok。LEDの極性、普通のテスタで測るの困難なので、基盤から外したLED(リードを切ってしまって長さから極性が分からないもの)は助かりそう。
というわけで、予想外に優秀でいい意味で期待を裏切られた。測定時間も2-3秒で待たされないし、ゼロ・プレッーシャ・ソケットを使っている点も良い。テスタで部品を測定するのって、テスタ棒を確実に部品に当てるのが結構辛いのだよね。10秒くらい放置すると、オート・パワーオフになるが、再測定は普通にボタンを押せばすぐに可能で、起動時間とかは不要だった。あとは、電池がどのくらいもつのか。このゼロプレッシャ・ソケットなのだけど、全端子が使えるわけではなくて、左の3端子のみが有効みたい。抵抗みたいにピン間離れているデバイス用に、右側の端子は左から3番目の端子とショートした状態でいいんじゃないかな。まぁ、これくらいなら自分で改造しちゃえばいいのだけど。
いや本当にすごい。液晶パネルに、マイクロコントローラ、ゼロ・プレッシャ・ソケット。これ部品代だけで$9.99超えてない? しかも、良くできた測定プログラム。とても楽しませていだだきました。
最も有名なソナタの1つ。第一楽章は基本となる幾つかの音型が何度も使用される、お馴染のパターン。最初は独特なリズムを持った不気味なテーマで始まる。
その後にトリルを伴ったテーマ。この音型は、第2楽章の最初のテーマに似ている。
そして、運命の動機。このテーマも曲全体で何度も用いられる。
長調になって暖かなテーマが現れるが、実際は最初のテーマの変形。
16分音符の激しいテーマ。
展開部。最初のテーマが徹底的に展開される。
左手の八分音符の連打の上に最初のテーマが再現され、独特の緊張感を与える。
ここからアルペジオ主体で自由に激情がひとしきり表現される。
ここからアレグロに戻り、ffで運命の動機が奏されて、楽章の最後を飾る。
最初のテーマが繰り返されて静かに終わる。
楽譜引用はヘンレ版。
Apple Musicの方はこちら。
第2楽章は、モコモコとした速い音型で構成され、メロディーらしきものが無い。
最初のリピートが終わると、調が変わって最初の音型が現れる。
この右手に現れるリズムが、この後、曲全体で重要な役割を果たす。
最後にPiu Allegroとなって最初の音型が現れて、曲の終わりを告げる。
最後は例のリズムが左手で繰り返されて終わる。
楽譜引用はヘンレ版。
Apple Musicの方はこちら。
大作21番と23番の間にはさまれたこの曲は2楽章構成の短かなもの。第1楽章はロンド形式を基本にしている。ゆっくり歩くかのような最初のテーマ。
次のテーマは、オクターブを基本としたもので明確なメロディーらしきものが無く、リズムを主体としてる。
最初のテーマ。
2番目のテーマが繰り返されるが、最初よりも長さは短い。
再び最初のテーマに戻る。
最後に幻想的な新しいテーマが出てきて、ロンドらしくなってきたかと思うと、ここで静かに終わる。
楽譜引用はヘンレ版から。
Apple Musicの方はこちら。
このソナタの第2楽章は、もともとAndante Favoriが配される予定だったが、友人からの助言により、現在の序奏に置き換えられたという。
序奏の後はロンド形式だが、最初に現れる左手のテーマが曲全体を通して展開され尽くす。
トリルの上に、テーマが現れてクライマックスとなる。
ロンドなので別のテーマがぐるぐると現れるものの、それはテーマと呼ぶには曖昧で、やはり最初のテーマが曲全体を支配する。
2回目の最初のテーマ。
最初のテーマが繰り返された後は短調に転じる。
しかしここでも最初のテーマが展開される。
幻想的な場面が現れるが、ここでも最初のテーマが左手に現れる。
3回目の最初のテーマ。
3回目は、1回目の流れに似ているが、遠くへ飛び立っていくかのように発展していき、最後には、やはり最初のテーマが現れる。
最後にプレスティッシモが配置されて、技巧の限りが尽くされる。
ここでも、最初のテーマへの執着が見られる。
ppで、オクターブを高速に弾くことが要求される難所。
最後の最後もやはり最初のテーマで締めくくられる。
楽譜引用はヘンレ版から。
Apple Musicの方はこちら。
作品49とはうって変わって大規模ソナタの復活。和音の連打の中に、小さなパッセージが現れるが、これが曲全体で重要な役割を果たす。
2つ目のテーマは、対照的な柔らかい和音の上で奏でられる。
このアルペジオは一見経過句のようだが、この後、展開部で重要な役割を果たす。
このあたりはすっかりノリノリだ。
展開部。
最初は1番目のテーマが展開される。
>
次は3番目のテーマが展開される。
再現部。
最後にもう一度最初のテーマを用いた見せ場が用意されている。
楽譜引用はヘンレ版。
Apple Musicの方はこちら。
第2楽章はロンド形式のメヌエット。曲全体を通じて長調で構成されており、符点を主体とした暖かなテーマが用いられている。
最初のテーマの変形。
スケール主体の推移部が続く。
2つ目のテーマは、元気いっぱい。
付点を引き連れて最初のテーマが戻ってくる。
全く新しいテーマが現れる。ここも元気いっぱいだ。
再度最初のテーマが繰り返される。
最後の変形が曲の終わりを告げる。
楽譜引用はヘンレ版。
Apple Musicの方はこちら。