今日も微速転進

ここではないどこかへ

Python とビルド済みのOpenCVバイナリパッケージ

ビルド済みのOpenCVバイナリパッケージについてメモ書き。 あくまでもPython向けにOpenCV 3.xをインストールする方法の1つです。

macOSPython本体を使う場合の一番ズボラな方式。

非力なマシンに最適。

背景

そもそもOpenCVソースコード自体にPython用のバインディングは含まれています。ただソースからビルドするか、OpenCVのバイナリをインストール後に必要なファイルを所定の場所にコピー((すればPythonからOpenCVを使用できます。

この場合の難点はOpenCVのビルド時に検出されたPythonバージョンでしか使用できないという問題があります。

環境によっては有効化されていないモジュールがある可能性がありますがそこまでは調査していません。あしからず。

前提

github.com

前提条件は次のとおり。

この記事を書いている時点で最新版は3.4.2.17。バージョン番号はOpenCVバージョンに対応します。

現時点でOpenCVの最新版は3.4.3。このライブラリ(というかビルド済みバイナリ)は3.4.2に対応しています。

PythonバージョンとCPUアーキテクチャ別のビルド済みパッケージというのがこの記事で紹介しているPythonモジュール。

あくまでも非公式パッケージです。

メリット

このパッケージのメリットは導入が楽な点。特に別途OpenCVのインストールが不要。

デメリット

デメリットはパッケージをインストールするたびにOpenCV一式をインストールするのでディスク容量を消費する点。

ある程度汎用的な環境向けにビルドされているのであまり最適化はされていない。新しいバージョンがリリースされてから若干のタイムラグがある点にも注意が必要です。

なお、インストールに成功したからと言って動作するとは限らず、追加で依存しているライブラリのインストールが必要な場合があります。

パッケージ名

本体のみとcontribあり、GUI関連機能(highuiモジュール)ありとなしで合計4つのパッケージがある。

以下の4つのパッケージのうちどれか1つを選んでインストールする。

本体のみ

headlessの方はGUI関連機能を無効にしたパッケージ。サーバー環境向け。

contribあり

opencv_contribリポジトリを組み合わせてビルドしたパッケージ。headlessについては本体のみのパッケージと同じ。

Linux環境でcontribつきのパッケージの利用は不要な機能のための依存パッケージをインストールする必要があるので逆に面倒な可能性があります。

インストール時の注意

環境によっては追加のパッケージをインストールする必要があります。エラーメッセージから該当のファイルを含むパッケージを特定してインストールします。

macOSの場合はHomebrewでopencvパッケージが依存しているパッケージ一式をインストールすればOpenCV本体は動くはずです。具体的にはbrew info opencvを実行しRequired:という行に列挙されているパッケージのうち、python本体以外をインストール*1

参考:Raspbian Liteでビルド済みのOpenCVパッケージを使うための依存パッケージいろいろ

具体例

Python 3.7、opencv-pythonバージョンは3.4.2.17。

作業ディレクトリを作成。contribにある二値化処理アルゴリズムを試したいのでopencv-contrib-pythonをインストール。

$ mkdir work
$ cd work

pyenvなどを使う場合はこのタイミングで使用するPythonバージョンに切り替え。

venvモジュールで仮想環境を作成して有効化。

$ python3 -m venv venv
$ source venv/bin/activate

この状態でpipコマンドはpip3コマンドへのリンクになっています。

contribありのパッケージをインストールします。

$ pip install opencv-contrib-python-headless

大抵の場合はNumPyとmatplotlibも使うのでついでにインストール。

$ pip install numpy matplotlib

まとめ

他のインストール手段でインストールされるモジュール類とのconflictに注意。

こういう記事が意外なところで役に立つと思っていたりします。まあ気休めですけど。

おしまい。

詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識

詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識

*1:まあ楽ができればそれが正義

技術書を書くツールの検討メモ

メモ書き。書きかけのブログ記事が滞留しておりよろしくないのでさっさと公開しておきます。

要件

  • EPUB形式、PDFの両方を生成できること
  • テキストベースでバージョン管理システムが使えること
  • 原稿ファイルの分割をサポートしていること

できれば「コラム」のような囲み領域を使った補足情報(「囲み記事」または「カコミ」と呼ぶらしい)を入れることができると望ましい。

最悪、EPUB形式からCalibreでPDFにすることもできる。

TeX

昔は指示されたわけでもないのにレポートをLaTeXで書いた。卒論と修論LaTeXだった*1

[改訂第7版]LaTeX2ε美文書作成入門

[改訂第7版]LaTeX2ε美文書作成入門

昔はともかく流石にダイレクトにTeXは無理。

Re:View

Re:View記法を覚える必要あり。日本語のノウハウ記事が結構ある*2

テンプレートが配布されているのでとっつきやすい。

github.com

また、テンプレートを配布している団体による解説本がある。

TechBooster/C89-FirstStepReVIEW-v2: 技術書をかこう!はじめてのRe:VIEWは技術書の執筆ノウハウ本のリポジトリです

開発チームがちょっと属人的っぽいので保留。過去のしがらみによるジレンマが怖い。

qiita.com

バージョン3.0で大きな変更が入るらしいのでそれからでも遅くはなさそう。

参考:Re:VIEW 3.0への道 - Qiita

GitBook

Markdown · GitBook Toolchain Documentation

悪くはないが、囲み記事の実現方法が不明。

Pandoc(+ alpha)

Markdownの拡張でspandiv相当の機能があるらしいのでいいかも。

ビューワーが対応しているかが問題だけどCSSである程度は囲み記事を実現できるはず。

Sphinx (RestructuredText)

Overview — Sphinx 1.8.0+ documentation

literalincludeという機能で、外部ファイルの指定範囲を読み込んだりできる。ソースコードの一部を読み込んで解説する、というスタイルなら断然有利。

ただ、Sphinxは書籍作成用ではない、という話を聞いた気がする。

MDPreview

詳細不詳。リブロワークスという会社(ふりがなプログラミングの会社)のMarkdownベースのプレビューツールを使う方法。

Markdwon+CSS(+ Vivliostyle.js)からIndesign用のデータ(XML?)を生成するらしい。

PDFを生成できるみたいだけどIndesignを使っている会社で商業出版する場合以外はどうするんだろう

囲み記事用のタグなど、Markdownを一部拡張している。

lwohtsu/language-mdbp: markdown grammer for MDBP with ATOM

ブラウザでPDF生成

[2018/09/08 追記]

CSS組版。ブラウザでHTMLを表示して印刷メニューでPDFにするらしい。pandocでepubを生成させてもいいのかも。

CSSのカウンタで章番号をふるとして、目次はどうするんだろう。

関連:https://www.antenna.co.jp/AHF/ahf5/CSSInfo/CSS-Page-Tutorial.pdf

原稿データの管理

バージョン管理システムを使う前提だけど、アウトラインエディタ系のツールを使うのもありかも知れない。

Scrivener | Literature & Latte

先に章構成を固めて書くなら問題ないか。

参考記事

まとめ

悩むくらいならRe:Viewでガシガシ書いていくのがいいかも知れない。 とりあえずMarkdown形式で書き始めておけば途中でスイッチするのは不可能ではなさそう。Re:View形式に関してもMarkdown形式からの変換ツールがある。

techbooster.booth.pm

*1:高専の卒論を除く

*2:逆に言うと日本語しか無い

いまさらながらZenFone 3 Max(ZC553KL)でDSDS

Dual SIM、Dual Standby、です。購入後一年以上経ってからというのもどうかという気もしますが。

構成

  • 本体:ZenFone 3 Max(ZC553KL)
  • SIM1:microSIM(SMS対応データ通信用ドコモ回線)→4G
  • SIM2:nanoSIM(通話対応、ドコモ回線)→3G

どちらも格安SIMです。あまりかけ放題系のサービスが使えないので率直に言ってありがたみのない組み合わせとなります。

ZenFone3 MaxはSIMフリーの国内向けです。将来の移行を踏まえて音声通話用がnanoSIMにしてあります。

ZenFone3 MaxはmicroSDスロットがnanoSIM用のスロットになっています(排他利用方式)。

ZC553KLでDSDSするためにはAndorid 7.xへのアップデートが必要です。アップデートでDSDSに対応したという不思議な端末。

a244.hateblo.jp

設定手順

1枚目はすでに設定済みという前提です。

  1. SIM1を無効にしてSIM2のAPNなどを設定(「もっと見る」をタップして「無線とネットワーク」という画面に移動。「モバイルネットワーク」をタップして各種設定)
  2. SIM1を有効化する
  3. 「デュアルSIMカード設定」から各種設定
  4. 「音声呼び出し」「SMSメッセージ」「データサービスネットワーク」「優先Bluetooth通話設定」の各項目を設定

私の現在の設定は以下のようになっています。ご参考まで。

f:id:atuyosi:20180902120520j:plain:w480

動作のチェック

モバイルデータ通史をSIM1、他をSIM2にセット。SIM2は3G回線。

この状態でSIM2への受電、SMS受信とも問題なし。SMSメッセージをSIM1に設定してもSIM2あてのSMSは受信できた。

「デュアルSIM通話転送」は試していません。

ステータスバーのアンテナの状態は以下のとおり。

f:id:atuyosi:20180902120748j:plain

感想

まあ普通、という感じですね。ガラケーとの2台持ち寄りは断然便利です。

SIM2枚刺しの利便性よりもWifのあるところを探して居座るほうが有意義に思います。

コスト削減策としてはキャリア回線とデータ通信用の格安SIMというスタイルがいいのかな。

データSIMの割引期間が終わっていしまうので、しばらくしたら音声対応のSIM1枚の運用に変更する予定です。

Android 8.xへのアップデート、提供予定があるのか、はっきりしてほしい。

厚生労働省ブラック企業リスト8月版(2018年)

今月もまあ惰性のやっつけ仕事エントリです。

公開されているPDFですがファイル名が先月と同じであれれという感じですね。どうなっているんだ。

データの入手元

www.mhlw.go.jp

ファイルは労働基準関係法令違反に係る公表事案というリンクから。

先月と同じファイル名です。

データの更新のない都道府県もあるのは先月までと同様です。

「平成30年7月31日」という表記の全角数字と半角数字の使い分けはかなり気持ち悪い。

それと微妙に社名に含まれる空白の位置を変えるのはやめて欲しい > 神奈川労働局。

機械可読データ(タブ区切りテキスト形式)

厚生労働省ブラック企業リスト(2018年08月31日版) · GitHub

ブラック企業の一覧をリストアップしています。

PDFからTSVへの変換スクリプト

Convert PDF to TSV ( for Japan's MHLW illegal company list ) rev. 2

先月と同じで変更なし。

前月との比較

先月の416件から429件に増加。掲載終了が多いなか、岩手労働局と徳島労働局の+3件を筆頭に新規追加のおかげでトータルとしては持ち直した感じ。

労働局名 当月公表件数 前月公表件数 新規掲載 掲載終了 差分
北海道労働局 16 15 3 2 +1
青森労働局 8 8 0 0 +/-0
岩手労働局 11 8 3 0 +3
宮城労働局 4 4 0 0 +/-0
秋田労働局 2 4 0 2 -2
山形労働局 3 3 0 0 +/-0
福島労働局 7 8 0 1 -1
茨城労働局 7 5 2 0 +2
栃木労働局 8 7 2 1 +1
群馬労働局 5 3 5 3 +2
埼玉労働局 7 9 0 2 -2
千葉労働局 11 9 2 0 +2
東京労働局 17 17 2 2 +/-0
神奈川労働局 9 8 1 0 +1
新潟労働局 10 10 2 2 +/-0
富山労働局 6 5 1 0 +1
石川労働局 6 6 1 1 +/-0
福井労働局 7 8 0 1 -1
山梨労働局 9 9 1 1 +/-0
長野労働局 20 22 2 4 -2
岐阜労働局 14 13 2 1 +1
静岡労働局 7 8 0 1 -1
愛知労働局 30 29 3 2 +1
三重労働局 7 7 0 0 +/-0
滋賀労働局 7 8 1 2 -1
京都労働局 6 5 1 0 +1
大阪労働局 29 30 1 2 -1
兵庫労働局 12 12 4 4 +/-0
奈良労働局 8 5 3 0 +3
和歌山労働局 11 10 1 0 +1
鳥取労働局 2 2 0 0 +/-0
島根労働局 5 5 1 1 +/-0
岡山労働局 6 6 1 1 +/-0
広島労働局 18 16 4 2 +2
山口労働局 4 4 0 0 +/-0
徳島労働局 8 5 3 0 +3
香川労働局 1 1 0 0 +/-0
愛媛労働局 11 11 1 1 +/-0
高知労働局 8 7 2 1 +1
福岡労働局 15 16 2 3 -1
佐賀労働局 6 7 0 1 -1
長崎労働局 5 5 0 0 +/-0
熊本労働局 7 11 1 4 -4
大分労働局 11 10 1 0 +1
宮崎労働局 2 1 1 0 +1
鹿児島労働局 4 4 0 0 +/-0
沖縄労働局 12 10 2 0 +2

鳥取労働局は1月31日から変化なし。

先月から変化なし

鹿児島、長崎、山口、香川、三重、青森。半年以上更新のない鳥取はレジェンド。

まとめ

掲載データに大きな変化はなし。

今月も手抜きですがここまで。

労基署がやってきた! (宝島社新書)

労基署がやってきた! (宝島社新書)

Pmod HATとマイクモジュール(Pmod MIC3)

とりあえずゲットした部品を使えるようにしただけ。ものは7月末に届きました。

経緯

某コンテストの、部品提供キャンペーンに応募したらブツが送られてきたので。

みんなのラズパイコンテスト |ラズパイマガジン、 日経Linux、日経ソフトウエア 主催

応募しないと返却義務が発生するんで何とかしないといけない。

作品のアイディアはすでに固まっているのでマイクからの入力データの処理について調べさえすればあとは難しくないはず。

付属品など

本体の方はスペーサー×4。ただし両側がメスでネジが×2×4。ラジオベンチがないとバラすのに不便かも。

スペーサーは市販の片側メスのタイプを使ってます。

環境・その他

ref: ラズパイを使った試作に便利! Pmod HAT

ハード

ラズパイはRaspberry 3 model B+。

コンポーネントをつなぐ拡張基板の名称がPmod HATという名称。今回ゲットしたモジュール(子コンポーネント)はPmod MIC3というMEMSマイクモジュール。 マイク以外にもモジュールはたくさんあります。

RETIREDってEOLってことですよね、売れなかった?

USBマイクでいいんじゃないかというツッコミはなしで。

ドキュメント

ライブラリ

セットアップ

ハードウェアの接続は普通のpHATと同じようにGPIOコネクタに接続するだけ。本体をセットしたらマイクユニットを取り付ける。GNDのピンが本体側とマイクモジュール側で一致していればOK。SPIプロトコルを使うのでJAまたはJBのコネクタのどちらかに接続する。

f:id:atuyosi:20180829220035j:plain

写真はJAAに接続しています。音量調整は黄色いネジを回して調整。初期状態はミュート最小音量(感度?)。

SPIの有効化

Raspbianのセットアップは完了しているものとする。

$ sudo rasp-config

f:id:atuyosi:20180829215757j:plain:w480

特に難しくはない。忘れずに再起動する。

パッケージの追加

$ sudo apt install python3-pip python3-dev libfreetype6-dev libjpeg-dev libopenjp2-7-dev libtiff-dev build-essential

venvモジュールもインストール。

$ sudo apt install python3-venv

Python環境のセットアップとライブラリのインストール

作業ディレクトリの作成。

$ mkdir myproject
$ cd myproject

仮想環境の作成、有効化。

$ python3 -m venv venv
$ . venv/bin/activate

本命のライブラリをインストール。

$ pip install designspark.pmod

ハードウェアの注意

  • 初期状態はマイクボリュームが最小なので黄色いプラスネジを右に回す。
  • JAでもJBでもいいが、2段になっている上の段に差し込む

f:id:atuyosi:20180829215003j:plain:w480

動作チェック

リファレンスのサンプルの接続先のみ変更。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2017 RS Components Ltd
# SPDX-License-Identifier: MIT License

"""
Print a continous sound level reading out.
"""

from DesignSpark.Pmod.HAT import createPmod
import time

s = ':'
lut = [s]
for i in range(128):
    s+=':'
    lut.append(s)

if __name__ == '__main__':
    
    mic = createPmod('MIC3','JAA')
    time.sleep(0.1)
    
    try:
        while True:
            int = mic.readIntegerValue()
            #print(int)
            print(lut[int>>5])
            snd = mic.readPhysicalValue()
            #print(snd)
            
            #time.sleep(0.01)
    except KeyboardInterrupt:
        pass
    finally:
        mic.cleanup()

JBAという箇所をJAAに。

ref. 3. Basic Examples — DesignSpark.Pmod 0.2.0 documentation

動作の様子

上記のコードをsample.pyという名前で保存して、実行する際は以下のように。

$ python sample.py

f:id:atuyosi:20180829215246j:plain

音に合わせて出力される:の個数が変動する。

readIntegerValue()またはreadPhysicalValue()でそれぞれ整数、実数で値が取れる。

まとめ

とりあえず動作チェックまで。日本語の情報が殆ど無いのが残念なところ。

接続さえ間違えなければ特に難しくない。

[2018/08/31 追記]

Python経由で扱うのは限界がある。まずLinuxリアルタイムOSではないし、Pythonでマイクロ秒間隔でセンサからデータを取れるかというとちょっと微妙。

ALSA経由でデータを取れるようにするか、Cでがっつりコードを書くか、要検討。

参考URL

広告