Python ログ出力抑制 デコレータ

出力を抑制するデコレータ。 Python 3.7.4、ctypesを使ったライブラリ呼び出しで動作を確認(darknet.py)。 # 標準出力・標準エラー出力の抑制 def silent(verbose=False): def _silent(func): def wrapper(*args, **kwargs): if not verbose: devnull = open(os.devnull, 'w') stdout = os.dup(1) stderr = os.dup(2) os.dup2(devnull.fileno(), 1) os.dup2(devnull.fileno(), 2) res = func(*args, **kwargs) if not verbose: os.dup2(stdout, 1) os.dup2(stderr, 2) devnull.close() return res return wrapper return _silent 使い方のイメージ(デコレータなせいで長くなってしまう、デコレータじゃなくて単純にコールバック風に関数を呼び出すラップ関数作ってもいいかも…)。 def func(verbose=False): @silent(verbose=verbose) def _func(): cfunc() funcA() _func() funcB() 参考 Cの共有ライブラリがPythonの標準出力に印刷されないようにするにはどうすればいいですか? - コードログ ctypes - How do I prevent a C shared library to print on stdout in python? - Stack Overflow 標準出力を黙らせるデコレーター - Qiita Pythonのデコレータについて - Qiita Capturing print output from shared library called from python with ctypes module - Stack Overflow

2019年9月25日 · aoirint

SSBUFrameAnalyzer v3

History GitHub - aoirint/SSBUFrameAnalyzer SSBUFrameAnalyzer · えやみぐさ SSBUFrameAnalyzer v2 · えやみぐさ What’s New 「ストック」を取得できるようにした(精度イマイチ) 3ストックまで想定(4ストック以上は未実装) 一応団体戦考慮してストックごとにキャラクター推定 精度イマイチな原因かも:背景、ファイター順によってちょっと決め打ち座標がズレてる、画像が小さすぎる→大きく補間してからHOG? 勇者(Hero)のデータを追加(v3のdictionary) コマンド出てるときは(顔に被るから)邪魔で難しいと思う… GitHub - aoirint/SSBUFrameAnalyzer at v3 TODO ファイター数の推定 bboxのズレ解消 bboxの自動算出 残タイムの推定 画面中のファイター位置の推定 深層学習(YOLO/R-CNN系かセグメンテーション)になりそう、データがない… 精度向上 normalizeしたり、コントラスト上げたり、周辺ぼかすフィルタ掛けたりしたら精度上がらないかな チャージ・残量系キャラ(ルフレ、クラウド、リトル・マック、インクリング、ジョーカー、勇者他?)のチャージ・残量推定 ステージの推定(データ…)

2019年8月5日 · aoirint

SSBUFrameAnalyzer v2

GitHub - aoirint/SSBUFrameAnalyzer いまのところ、スマブラSPのスクリーンショットから「ダメージ値」・「おなまえ」・「キャラ名」を取得できる(ただし2,3,4人対戦のみ)。 「おなまえ」の取得精度は微妙。アルファベットだったら少し精度いいかも? SSBUFrameAnalyzer · えやみぐさ 「キャラ名」の取得 ダメージ値と同じくHOG特徴量で最近傍(knnに拡張できる)。データには対戦中のキャラ顔画像を使用。 一応(大きく)モデル違うやつ(色変えただけ以外、ex. むらびと、ポケモントレーナー、ルフレ♂♀、クッパJr.など)はデータ用意してるけど、確認はしてない。漏れあるかも。 Example 1 ['マリオ', 'マリオ', 'マリオ'] [5.536537823295048, 6.301248636752482, 6.390935400999263] ['ドンキーコング', 'ディディーコング', 'ルキナ'] [5.539215799855154, 9.311677857638966, 9.606319879292924] {'fighters': {0: {'chara_name': 'マリオ', 'name': 'ぷれしいやー', 'damage': 0.0}, 1: {'chara_name': 'ドンキーコング', 'name': 'DONKEY KONG', 'damage': 0.0}}} FPS: 2.286091 (0.437428 s) Example 2 ['マリオ', 'マリオ', 'マリオ'] [5.971331723619266, 6.220896989804241, 6.286527104504024] ['ドンキーコング', 'ディディーコング', 'ロボット'] [5.520510947750764, 9.599002436376757, 9.670321221911154] ['リンク', 'ルキナ', 'シュルク'] [5.455176600531569, 8.748479515310487, 8.780689053687928] {'fighters': {0: {'chara_name': 'マリオ', 'name': 'tbここ', 'damage': 0.0}, 1: {'chara_name': 'ドンキーコング', 'name': 'DONKEY KONG', 'damage': 0.0}, 2: {'chara_name': 'リンク', 'name': '1旧い|', 'damage': 0.0}}} FPS: 1.381940 (0.723621 s) Example 3 ['マリオ', 'マリオ', 'マリオ'] [5.5006358082686555, 5.74951932443511, 5.7915505642106995] ['ドンキーコング', 'ディディーコング', 'ルキナ'] [4.692127133850047, 9.475091942436732, 9.545288243557097] ['リンク', 'シュルク', 'ルキナ'] [4.3889363397440455, 8.67419528745303, 8.707431208635597] ['サムス', 'ダークサムス', 'ケン'] [4.181132231378159, 8.547772471042341, 8.683606629158557] {'fighters': {0: {'chara_name': 'マリオ', 'name': '1に', 'damage': 0.0}, 1: {'chara_name': 'ドンキーコング', 'name': 'IDONKEY KONG', 'damage': 0.0}, 2: {'chara_name': 'リンク', 'name': 'LINK', 'damage': 0.0}, 3: {'chara_name': 'サムス', 'name': 'SAMUS', 'damage': 0.0}}} FPS: 1.227384 (0.814741 s)

2019年7月21日 · aoirint

SSBUFrameAnalyzer

About GitHub - aoirint/SSBUFrameAnalyzer いまのところ、スマブラSPのスクリーンショットから「ダメージ値」・「おなまえ」を取得できる(ただし2人対戦のみ)。フルで毎フレーム処理できるほどのFPS出ないと思う。 適当なSSで動かした目安FPS(ノートPC): 2.766284 (0.361496 s) 基本的にターゲットの場所を(座標決め打ちで)切り抜いて処理にかけてる。 ダメージ値の取得 HOG特徴量使ったk-nnにしたけど、適当に確認して(写真と違ってノイズ入らないし、バリエーションも少ない)問題なさそうだったのでとりあえずTop1しか使ってない。すごい。 (被ダメージ・ふっとびで)エフェクトかかると取れなくなるだろうけど、自動化するなら前フレーム維持/スキップでいいと思って考慮してない。 参照データ数減らせばちょっと速くなるだろうけど、OCRの方が負荷大では(試合中にほぼおなまえ変わらないし、別にいいのか? 団体戦?)。 おなまえの取得 Tesseract使ってOCR。たまに精度あやしいけどだいたいOK。すごい。 か→が、ぷ→ふ、みたいに濁点/半濁点に弱そう。 おなまえの長さ上限10文字までいけると思う(ひらがな10文字はためしてOK)。 TODO ファイター数の推定 どうすればいいんだ。(自動化して連続的にとるなら)一回推定すればいい気がするから、遅延気にせずHOG系の枠を一通り試行してうまくいった組み合わせを採用? 各種bboxの自動算出 ファイター種類(キャラクター)の推定 HOGでいけるだろうけど、データ集めが面倒 ストック数の推定 ホカホカ(高被ダメージ)のときエフェクトが重なるのがあぶない 残タイムの推定 タイム∞のとき表示されない例外 背景ころころ変わるので精度出そうと思ったらknnな気がする…… Example {'fighters': {0: {'name': 'ふれいやー', 'damage': 141.3}, 1: {'name': 'KOOPA', 'damage': 101.5}}} FPS: 2.499149 (0.400136 s) 濁点/半濁点は苦手…。プレイヤー→フレイヤーさん。

2019年7月21日 · aoirint

ログ監視 Python watchdog(ログローテーション未完成)

アプリケーションのログファイルを監視するシステムをつくる。 ファイルの更新をきっかけにコマンド実行 (python編) - Qiita ログ監視スクリプト - Qiita 上の2つをがっちゃんこしたやつを作った。ファイルの変更監視はwatchdog、読み取りはふつうのIO。 ※ うーん、ログローテーション対応が微妙かも from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import time import os from stat import * class FileWatchHandler(FileSystemEventHandler): def __init__(self, path): self.path = os.path.realpath(path) self.fp = None self.fpos = None self.init() filesize = os.stat(self.path)[ST_SIZE] self.fp.seek(filesize) # ファイル末尾 self.fpos = filesize def init(self): fp = self.fp if fp: fp.close() fp = open(self.path, 'r') self.fp = fp self.fpos = None def on_created(self, event): if event.src_path == self.path: print('reset') self.init() def on_modified(self, event): if event.src_path == self.path: print('modified') self.tail_f() def tail_f(self): if self.fpos: self.fp.seek(self.fpos) while True: self.fpos = self.fp.tell() line = self.fp.readline() if not line: break self.analyze(line) def analyze(self, line): # TODO: print('!', line) def close(self): self.fp.close() path = 'test.txt' handler = FileWatchHandler(path) observer = Observer() observer.schedule(handler, os.path.dirname(os.path.realpath(path))) observer.start() try: observer.join() except KeyboardInterrupt: pass observer.stop() handler.close() print('closed') ※ ちょっと修正してみたけど、やっぱり微妙 ...

2019年7月10日 · aoirint

Open JTalk mpg123

Open JTalkの出力したwavをmpg123で再生したらエラー出た。 [src/libmpg123/layer1.c:30] error: Illegal bit allocation value. [src/libmpg123/layer1.c:171] error: Aborting layer I decoding after step one. ffmpegでmp3に変換して再生するとok。mpg123では同じくエラーで変換できなかった。 ffmpeg -i b.wav b.mp3 mpg123 b.mp3 ffmpegのinfo Guessed Channel Layout for Input Stream #0.0 : mono Input #0, wav, from 'b.wav': Duration: 00:00:01.17, bitrate: 768 kb/s Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, mono, s16, 768 kb/s Input #0, mp3, from 'b.mp3': Metadata: encoder : Lavf57.56.101 Duration: 00:00:01.20, start: 0.023021, bitrate: 65 kb/s Stream #0:0: Audio: mp3, 48000 Hz, mono, s16p, 64 kb/s ffmpeg -i b.wav c.wav これもダメ ...

2019年5月25日 · aoirint

Open JTalk

# Open JTalk Test # python3 # exec `apt install open-jtalk open-jtalk-mecab-naist-jdic` # get `mei_normal.htsvoice` from http://www.mmdagent.jp/ import subprocess p = subprocess.Popen('open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m mei/mei_normal.htsvoice -r 1.0 -ow /dev/stdout', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) text = 'こんにちは' out, err = p.communicate(text.encode('utf-8')) print(text) print(err) # outにwavのバイナリが入ってる。必要に応じてここ変えてね with open('b.wav', 'wb') as fp: fp.write(out) subprocess で shell=True でリストを与えたときの挙動 - Qiita 合成音声(Open Jtalk)でwavファイルを作成しないで再生する - Qiita python - input directly in process.communicate() in subprocess library - Stack Overflow subprocessについて調べたメモ - Qiita Debian Jessie に OpenJtalk を入れてテキストを読み上げてみた - 残しときます(自分用) 日本語音声合成Open JTalkをPythonから実行する - 動かざることバグの如し mmdagent.jp Open JTalk - HMM-based Text-to-Speech System See also mpg123

2019年5月25日 · aoirint

Java 11 JRE付きエクスポート

あんまり分かってないけど、とりあえずJRE付きでエクスポートまではできた。 Java 9以降のこと Oracle Java(JDK)のリリースモデルが変わった Public JRE(Oracleが無償配布してたJRE)がなくなった Oracle JDKの配布が有償のみになる(Java 11以降) 来月にはJava 10が登場し、9月にはJava 11が登場予定。新しいリリースモデルを採用した今後のJava、入手方法やサポート期間はこう変わる(OpenJDKに関する追記あり) - Publickey これまでの実行可能Jar Javaランタイム(JRE)を同梱しなくても、システムにインストールされたPublic JREで実行できた これから システムにJREがない 同様に実行できるようにするには、JREをアプリケーションに同梱する必要がある(?) これまでもrt.jarがJREの同梱された形としてあったはず Jigsawモジュールシステム Java 9以降導入されたJavaの依存関係システム。 依存関係はmodule-info.javaファイルに記述する。 module sample.module { requires java.base; // 不要(省略可) } モジュールシステムを学ぶ - Qiita 実行可能Jarのエクスポート(Maven、JREなし) Java 8まで、こんな感じだった。 Maven pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example.sample</groupId> <artifactId>Sample</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>8</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.1</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>com.example.sample.Main</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project> JREの生成(手動、module-info使用) アプリケーション配布用に小さなJREを作る Jigsaw 勉強メモ - Qiita コンパイルしたクラスファイルのディレクトリを指定 ...

2019年2月6日 · aoirint

json, bson, sqlite3 IOの実験メモ

Windows 10 Python 3.6.6 bson==0.5.7 SSD JSON import json import random import time file = 'test.tmp' N = 500 # Generate start = time.time() entries = [] for i in range(N): title = ''.join([ chr(random.randint(ord('あ'), ord('ん')+1)) for i in range(32) ]) body = ''.join([ chr(random.randint(ord('あ'), ord('ん')+1)) for i in range(30000) ]) entries.append({ 'id': i, 'title': title, 'body': body, }) data = { 'entries': entries, } end = time.time() print('Generate: %.1fs' % (end - start, )) Generate: 38.6s import os # Write start = time.time() with open(file, 'w', encoding='utf-8') as fp: json.dump(data, fp, ensure_ascii=False) end = time.time() print('Write: %.3fs' % (end - start, )) print('%.2fMB' % (os.path.getsize(file)/(1024**2), )) # Read start = time.time() with open(file, 'r', encoding='utf-8') as fp: data = json.load(fp) end = time.time() print('Read: %.3fs' % (end - start, )) Write: 0.252s 42.98MB Read: 0.214s BSON pip install bson import bson # Write start = time.time() s = bson.dumps(data) print('%.2fMB' % (len(s)/(1024**2), )) dumpEnd = time.time() with open(file, 'wb') as fp: fp.write(s) end = time.time() print('Write: %.3fs (Dump: %.3fs)' % (end - start, dumpEnd - start)) # Read start = time.time() with open(file, 'rb') as fp: s = fp.read() loadStart = time.time() data = bson.loads(s) end = time.time() print('Read: %.3fs (Load: %.3fs)' % (end - start, end - loadStart)) 42.98MB Write: 0.830s (Dump: 0.638s) Read: 0.156s (Load: 0.095s) SQLite3 import sqlite3 if os.path.exists(file): os.unlink(file) start = time.time() with sqlite3.connect(file) as db: cur = db.cursor() cur.execute( 'CREATE TABLE entries(id INTEGER AUTO INCREMENT, title TEXT, body TEXT)' ) for entry in data['entries']: cur.execute( 'INSERT INTO entries VALUES(?,?,?)', ( entry['id'], entry['title'], entry['body'], ), ) end = time.time() print('Write: %.3fs' % (end - start, )) start = time.time() with sqlite3.connect(file) as db: cur = db.cursor() results = [] for row in cur.execute('SELECT * FROM entries'): results.append(row) end = time.time() print('Read: %.3fs' % (end - start, )) print('%.2fMB' % (os.path.getsize(file)/(1024**2), )) db.close() Write: 1.093s Read: 0.243s 43.22MB

2018年12月15日 · aoirint

HOG特徴量の計算(Scikit-image)

pip install scikit-image from skimage.feature import hog import numpy as np size = 32 channel = 1 image = np.random.randn(size, size, channel) feature = hog(image) print(feature.shape) print(feature) デフォルト(勾配方向数9, セルサイズ8, ブロックサイズ3)では32x32の画像に対して324次元のHOG特徴量が出力される。 出力例 (324,) [0.01877925 0.00125122 0.00899619 0.00630656 0.01330613 0.0150924 ... 0.00763393 0.01668535 0.01852621 0.01204107 0.00433798 0.01147866] 画像からHOG特徴量の抽出 - Qiita https://web.archive.org/web/20170917002713/http://qiita.com/mikaji/items/3e3f85e93d894b4645f7 ドキュメント: https://scikit-image.org/docs/dev/api/skimage.feature.html#skimage.feature.hog

2018年12月15日 · aoirint