45
52

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【iOS】はじめてのPyto

Last updated at Posted at 2020-02-24

はじめに

iOSのPython環境で最も有名なのはPythonistaだと思います。個人的にPythonistaは、

  • 更新が2年以上無い(2020/2/24現在)(2020/3/9追記:Pythonista v3.3がリリースされました)
  • 対応ライブラリが少ない(Pandasが使えない)

という点が引っかかり、購入を見送っていました。ある日、日経ソフトウェアに「Pyto」というアプリが紹介されており、検索してみるとPythonistaと比較して、以下の点が魅力的だったので購入しました。

  • 更新頻度が高い
  • Pandasに加え、sklearn、skimage、OpenCVも使える
  • Pythonistaと同様にiOS用のGUIアプリの作成が可能(iOS13以降)

この記事ではPytoの使い方や基本的な機能について説明します。

追記

2021/2/22
Pytoには3日間の無料トライアル版があります。
記事中の画像と内容の一部を最新のものに差し替えました。

環境

初回投稿時

iPad pro11(2018)64GB (iOS13.3.1)
Pyto(11.4)

2021/2/22投稿時

iPad pro11 (2018) 64GB (iOS14.3)
Pyto(16.0.1)
※おまけのmobilenetの画像は差し替えていませんが、動作は確認済みです。

使い方

起動画面・ファイル選択画面

IMG_0343_edit.PNG
IMG_0378.PNG

初回はアプリを起動すると、ファイルを選択する画面になります。任意の場所のファイルを開くか、新規作成を行います。画像1枚目の青矢印のボタンを押すことで、画像2枚目のようにアプリの各機能にアクセスできるようになります。アプリの設定は画像2枚目の歯車ボタンです。

対話モード(REPL)

IMG_0353.PNG

対話モードです。コードは下のテキストボックスに入力します。対話モードでもmatplotlibのグラフ表示が可能です。

Run module (python -m)

IMG_0357.PNG

.pyファイルを実行できます。上の画面ではpipを実行していますが、pip showでパッケージの情報を表示することはできませんでした。また、インストール済みのパッケージを確認するためにpip listを実行しましたが、後述するPyPiで後からインストールしたパッケージしか表示されませんでした。

PyPI

IMG_0379.PNG
IMG_0355.PNG
IMG_0356.PNG

PyPIを使ってインストールされているライブラリのバージョンを確認したり、新たにライブラリを追加することができます。ただし、追加できるのはpure pythonのものに限るそうです。seabornはインストールできましたが、tensorflow、pyaudioはインストールできませんでした。

Pytoでサポートされているライブラリ(scikit-image, OpenCV等)は、初回実行時にダウンロード・インストールされます。よって、インターネット環境のない場所で使用する場合はあらかじめダウンロードしておく必要があります。すべてのライブラリをダウンロードする場合は「Settings」の「Download All」を実行します。

IMG_0364.PNG

上の図ではインストールしたseabornを使ってpairplotを実行しています。Pytoでmatplotlibやseabornを使う際は、plt.clf()を最後に記述しないと複数回実行時にグラフが重なってしまいます。

サンプルコード

IMG_0359.PNG

OpenCV、scikit-learn、GUIモジュール等を使ったサンプルコードが入っています。

Loaded modules

IMG_0358.PNG

読み込んだことのあるモジュールが表示されます。そのモジュールのソースコードも表示できます。何に使うのかはよくわかりません。

Settings

IMG_0350.PNG
IMG_0351.PNG

エディタの設定画面です。ソフトタブ(スペースタブ)に対応しています。また、エディタの外観も数種類から選んだり、カスタマイズすることが可能です。サポートされているサードパーティ製ライブラリの一括ダウンロードもここで行います。

エディタ画面

IMG_0381.PNG

エディタ画面です。右下に歯車マークがありますが、これはアプリの設定ではありません。Siriに編集中のファイルを登録したり、カレントディレクトリを変更したりできます。左下のリストアイコンはエディタアクションで、ファイルに対して何か実行できるそうです。その隣のブックマークアイコンはPytoのドキュメントです。Pytoのパッケージ(GUIツールなど)の使い方が書いてあります。このドキュメントはインターネット上に公開されており、こちらから確認できます。

上部のボタンは左から順に「メニューサイドバーを開く」、「検索・置換」、「コードのアウトライン表示」、「デバッグ(pdb)」、「実行」です。

Arguments, Current Directory, Add to Siri,

IMG_0365.PNG

add-to-siri, arguments, current directoryを設定できます。argumentsではプログラム実行時に渡す引数を設定できます。

current directoryではカレントディレクトリを変更することができます。変更すると警告が出ますが、カレントディレクトリ変更後も問題なく実行できます。ここで選択したディレクトリには編集権限がつき、ファイルの参照・変更が可能となります。ローカルのファイルを読み込めない時はここでフォルダ選択すると読み込めるようになるかもしれません。

Editor actions

IMG_0369.PNG

Editor actionsです。デフォルトで2to3とblackが用意されています。

アウトライン表示

IMG_0367.PNG

ソースコード内のモジュール、クラス、関数のアウトライン表示・検索が可能です。横に表示されている数字は行番号です。

ドキュメント

IMG_0361.PNG

ドキュメントです。公開されているこちらと同じものです。右上の「V」のようなボタンでスプリットビューになります。

IMG_0362.PNG

ドキュメントをスプリットビューにしたところ。

補完

IMG_0363.PNG

補完が可能です。タップで選択するか、Tabキーで候補から選んでEnterで確定します。

フォルダロック

IMG_0344_edit.PNG

初めて使用するフォルダは初期状態では参照・変更できないようになっています。この場合は右下の鍵マークを押し、現在のディレクトリを選択することで参照・変更が可能となります。

キーボード

IMG_0373.PNG

ソフトウェアキーボードはiOSのデフォルトです。PytoではTabキー以外の拡張キーは用意されていません。これはiPhoneでも同じなので、iPhoneでプログラムを書くのは少し厳しいです。

外部キーボード(Bluetoothキーボード等)は難なく使えます。コメントアウト、逆インデント、実行等のショートカットキーも使用でき、そこそこ快適です。一括コメントアウトは複数行を選択した状態で[Cmd]+[Shift]+[C]を押すと可能です。

おまけ

OpenCVにはdnnモジュールが含まれているので、試しにMobilenetを動かしてみました。ソースコードはhttp://asukiaaa.blogspot.com/2018/03/opencvdnnpythonmobilenet.html からお借りし、Pyto用に少し書き直しました。カメラはiPadの外カメラです。
動作は問題無く、フレームレートもカクツキを感じないレベルでした。正直、iOSアプリの上でMobilenetが動くとは思っていなかったので、驚きました。
7F93B6F4-F29B-4BCC-A1E9-071D864BE627.png

[2020/4/22追記] Mobilenetの使い方について

MobileNetの学習済みデータは、こちらに含まれる

  • mobilenet_v2.caffemodel
  • mobilenet_v2_deploy.prototxt
  • synset.txt

を使用させていただきました。iOS13以降であればzipの展開が可能なので、zip形式でダウンロードします。

次に上記ファイルを任意のフォルダに展開します。私は、

python_code(適当なフォルダ)
├── MobileNet-Caffe-master
│   ├── mobilenet_v2.caffemodel
│   ├── mobilenet_v2_deploy.prototxt
│   └── synset.txt
├── mobilenet.py(実行ファイル)

としました。場所によってはアクセス許可が必要になるかもしれません。

使わせていただいたソースコードはコマンドライン引数でファイルを指定されています。pytoでは引数の指定が可能ですが、私は以下のようにプログラム内に直接書きました。

import os
from cv2 import dnn

modelfolder = "./MobileNet-Caffe-master"  # 学習済みデータの入ったフォルダ
net = dnn.readNetFromCaffe(os.path.join(modelfolder, "mobilenet_v2_deploy.prototxt"), os.path.join(modelfolder, "mobilenet_v2.caffemodel"))
with open(os.path.join(modelfolder, "synset.txt"), "r") as f:
    classNames = f.readlines()
showPreview = True

あとは以下の点を書き換えると動くと思います。

  • cv2.autorotateを使用する(デバイスの向きに合わせて画像を回転してくれる)
  • cv2.destroyAllWindowsおよびcv2.waitKeyは書かない
  • print関数は全てコメントアウトする
# autorotateの書き方
import cv2

device = 0
cap = cv2.VideoCapture(device)
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        continue
    frame = cv2.autorotate(frame, device)  # この部分を追加
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

その他

  • ユニバーサルアプリ(iPhone, iPad両対応)である
  • デバッガ(pdb)が使える
  • csv、画像の読み込みはローカルでも問題なかった
  • matplotlibのグラフ重なりはplt.clf()で解決できる(前述)
  • PytoのGUIモジュールはpythonistaとほぼ同じ書き方ができる?
  • ~~syntax highlightが少しおかしい(「おまけ」の18行目、20行目など)~~v11.5で修正されました
  • 折り返された行は新しい行扱いになる(自動でインデントされなかったり、行の途中なのにコメントアウトできてしまう。バグ?)
  • 閉じ括弧「)」を自動で付けてくれるが、自分で書くと2重になってしまう(vscodeみたいに括弧の外に出してくれない)(2020/8/16追記(v12.5):改善されていました)
  • pythonistaほどGUIに強くない(GUI作成ツールでパーツ配置できない)
  • 動作が不安定でよく落ちる
  • v16.0.1現在、skimageのioが使えない

GUIアプリ作成を重視するならPythonista、処理を重視するならPytoといった感じでしょうか。PythonistaにあってPytoに無いライブラリもあるので、ドキュメント等で内蔵ライブラリの比較を行うと良いと思います。

Pytoはこれからも発展していきそうなので、とても期待できるアプリだと感じました。

リンク

Pyto公式サイト:https://pyto.app/
Pytoドキュメント:https://pyto.readthedocs.io/en/latest/

45
52
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
52

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?