idekazuki / diary Goto Github PK
View Code? Open in Web Editor NEW記録
記録
本日から闇雲に問題を解いていくのではなく、既存サイトをもとにカテゴリ分けされた問題を解いていく。
最初は2分探索アルゴリズムをpythonで実装する方法について調査する。
pythonでは2分探索ライブラリとしてbisectが用意されているのでこれを参考にする。
biscect_leftはソート済みのリストに順序を崩さずに数字を挿入するため関数。挿入位置を探索するために二分探索アルゴリズムを使用している。同じ数字がすでにある場合その数字の左に挿入される。コードは以下の通り。参照https://github.com/python/cpython/blob/3.7/Lib/bisect.py
def bisect_left(a, x, lo=0, hi=None):
"""Return the index where to insert item x in list a, assuming a is sorted.
The return value i is such that all e in a[:i] have e < x, and all e in
a[i:] have e >= x. So if x already appears in the list, a.insert(x) will
insert just before the leftmost x already there.
Optional args lo (default 0) and hi (default len(a)) bound the
slice of a to be searched.
"""
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo+hi)//2
if a[mid] < x: lo = mid+1
else: hi = mid
return lo
探索範囲としてlo hiが指定可能。デフォルトでは入力リスト全体となる。
今日の予定
atcoder ARC A問題最低10問
pytorchによる発展ディープラーニング2章まで
C - 高橋君の給料
chokudaiさんのtwitterで今日の1問なるものが始まったのでやってみた。
N = int(input())
B = [[] for _ in range(N)]
for n in range(N - 1):
tmp = input()
B[int(tmp)-1].append(n+1)
def salary(taka):
maxv = 0
minv = 10e11
if len(B[taka]) == 0:
return 1
else:
for i in B[taka]:
tmp = salary(i)
maxv = max(maxv, tmp)
minv = min(minv, tmp)
return maxv + minv + 1
ans = salary(0)
if ans == 1:
ans = 3
print(ans)
pathlibについて
https://qiita.com/meznat/items/a1cc61edb1e340d0b1a2
from pathlib import Path
パスの生成
Path.cwd() :現在のパス
Path.home() :ホームディレクトリのパス
パスの操作 p=Path("own path")
p.parent | 親ディレクトリ |
---|---|
p.name | 末尾の名前を取得 |
p.parents | 親要素の配列 |
p.exists() | パスの存在確認 |
p.is_dir() | ディレクトリだったらTrue |
p.is_file() | ファイルだったらTrue |
p.rmdir() | 空のディレクトリなら削除 |
p.mkdir(parents=False, exist_ok=False) | ディレクトリの作成. parents=Trueなら親フォルダも作る,exist_ok=Trueならすでにディレクトリが存在していてもNo Error |
p.glob(pattern) | patternにマッチする要素を検索 |
list(p.glob(pattern)) | glob検索結果を取得 |
p.resolve() | 絶対パスに変換 |
p.open() | ファイルを開く |
str(p) | テキスト表示 |
ナップザック問題2
vではなくwの最小値を格納していく
N, W = map(int, input().split())
I = [list(map(int, input().split())) for _ in range(N)]
MAX_V = sum(v for v, _ in I)
dp = [W+1] * (MAX_V + 1)
dp[0] = 0
for v, w in I:
for j in range(MAX_V, v-1, -1):
dp[j] = min(dp[j-v] + w, dp[j])
for i in range(MAX_V, -1, -1):
if dp[i] <= W:
print(i)
break
https://developer.amazon.com/ja/docs/custom-skills/create-the-interaction-model-for-your-skill.html
インテントとは、ユーザーの音声によるリクエストを満たすアクションのこと。インテントでは、スロットという引数を任意で使用することもできます。(Alexaではインテントは、インテントスキーマと呼ばれるJSON構造で指定されます。)
例:
旅行を計画するインテント(PlanMyTrip
)の場合、以下のような発話を作成できる
金曜日に旅行に行きます
京都に行きたい
次の金曜日、神戸から京都に行きたい
神戸から京都にドライブしています
京都でハイキングするためにドライブ中です
...(など)
この中で変数情報を表す単語またはフレーズに注目する。これがインテントのスロットになる(太字)。
金曜日に旅行に行きます
京都に行きたい
次の金曜日、神戸から京都に行きたい
神戸から京都にドライブしています
京都でハイキングするためにドライブ中です
単語またはフレーズごとにスロットを作成して、元の単語を波括弧に入れたスロット名に置き換える。
例えば以下のようになる。
{travelDate}に旅行に行きます
{toCity}に行きたい
{travelDate}、{fromCity}から{toCity}に行きたい
{fromCity}から{toCity}に{travelMode}ドライブしています
{toCity}で{activity}するために{travelMode}中です
git のvideo-classification-3d-cnn-pytorchのコードを実行してみた。
使い方:実行するとき --mode score --mode feature の2つのモードが存在する。
score は予測クラスラベルとその予測スコアが表示される。
feature はあまりわからなかったが座標がおそらく出ている
input をvim で開いて入力の動画ファイル名を記述する複数扱うときは改行して記述する必要がある。
pretrain 済みのモデルデータは先日調べた方法 #14 でgoogle drive からdownloadすれば良い
今回はresnet18を用意した。デフォルトのモデルはresnet32になっているので--model_depthを変更する必要がある。実行時に --model_depth 18 と追記した。
最初はエラーが出たがFFmpeg, FFprobe関連のエラーだった。うちの研究室のversionが2000〜2005年版ととても古かったので入れなおすことに。
以下のコマンドを実行するが実行権限が必要なため直接/usr/local/bin/以下にコピーできなかった。(教授しかいじれないようになってる)
wget https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-3.3.4-64bit-static.tar.xz
tar xvf ffmpeg-release-64bit-static.tar.xz
cd ./ffmpeg-3.3.3-64bit-static/; sudo cp ffmpeg ffprobe /usr/local/bin;
そこで自分の作業領域に落としてパスを通した。
setenv PATH /home/yanai-lab/ide-k/ide-k/ffmpeg-3.3.4-64bit-static:${PATH}
これで実行したところきちんと動作を確認できた。
https://blog.amedama.jp/entry/2015/11/28/000432
functools.partial()について
関数やクラスの引数の一部を固定した新しいオブジェクトを作ることができる。
def add(x, y):
return x + y
import functools
add_1 = functools.partial(add, x=1)
print(add_1(3))
>>>4
with torch.no_grad():
メモリが溢れてしまっていたので解決さくとして計算高速化のための勾配保持をやめるための関数
上記のサイトのコードを実行した。
EPIC-KITCHENは途中で停止してしまったが、UCF-101などの短い動画ではきちんと動作を確認できた。
要因として、MP4とavi 形式の違いも考えられる。
MP4の動画を再生すると次のようなエラーが出たのが未解決。
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f67a8144920] Timecode frame rate 59/1 not supported
ImageNetを読み込んでいるときに読み込み時間が長すぎて作業が進まないので高速化についてまとめる。研究では動画を扱う予定なので処理速度は重要になってくる。
参考
https://qiita.com/hara_pets/items/e42eb4c9f75e0ff5d6c2
accimageというpytorchが公開しているライブラリで高速化できる。torchvision datasetでも使用できる。
Repository
https://github.com/pytorch/accimage
事前にIPPのインストールが必要。
python setup.py install --user
cuda レベルでのGPUの切り替え
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0, 1'
torch.backends.cudnn.benchmark=True
とすると、cudnnがネットワークに対して自動的に最適なアルゴリズムを選択してくれるので早くなる。
しかし、iterateごとにネットワークの大きさが変化するものに対しては、全てに適用されてしまうので逆に遅くなることがある。
https://qiita.com/yubais/items/c95ba9ff1b23dd33fde2
pytorchのDCGANのtutorialで登場したanimation.ArtistAnimation().
これはjupyter上だけではなくて、gifとしても保存できるので便利。
使い方
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure()
ims = []
for i in range(10):
rand = np.random.randn(100) # 100個の乱数を生成
im = plt.plot(rand) # 乱数をグラフにする
ims.append(im) # グラフを配列 ims に追加
# 10枚のプロットを 100ms ごとに表示
ani = animation.ArtistAnimation(fig, ims, interval=100)
plt.show()
上記のようなコードを書くと、ランダム生成された10フレームのグラフがアニメーションとして表示される。
Attist.Animation(表示する場所, 表示するデータリスト, 切り替え速度[ms])
gifとして保存したい場合plt.show()を
ani.save("output.gif", writer="imagemagick")
とする。
予め用意されたデータではなくて関数を実行しながらアニメーション作成するときはFuncAnimationを使用。第二引数がdatalistでなく、実行関数になる。
unionについて
pythonのunionについてUnionとunionの2種類あるので整理
x: int
1つの変数に複数の型が入る可能性があるときはUnionを使用する。
from typing import Union
x: Union[int, None]
x = None
ただしjupyternotebook
Python 3.6.8 :: Anaconda custom (64-bit)
で試しに実行したが、指定した型以外の値を入れても特にエラーを吐かなかったのでなんの意味があるのかいまいちわからなかった。多分俺は使わない。(mypyで調べたときに違う型を代入するとエラーを吐くようになるらしい。しかし実行時にはスルーする)
2.union:
こっちの方がよく見かける。配列を結合させることができる。ただし和集合なので重複値は削除。
c = set()
a = ['aa','cc','ba2']
b = ['bb','bb2','cc']
c.union(a,b)
>>{'aa', 'ba2', 'bb', 'bb2', 'cc'}
ただし、辞書型なので結合後にもとの順番は保持されない。
ssh で見てるときにprintenvしたら表示多すぎて見えなかった。スクロールもできない。
解決策
printenv|cat|more
引数:epoch, data_loader, model, criterion, optimizer, opt,epoch_logger, batch_logger
batch_time, data_time, losses, accuracies がAverageMeterで定義されている。内容は以下の通り。
class AverageMeter(object):
"""Computes and stores the average and current value"""
def __init__(self):
self.reset()
def reset(self):
self.val = 0
self.avg = 0
self.sum = 0
self.count = 0
def update(self, val, n=1):
self.val = val
self.sum += val * n
self.count += n
self.avg = self.sum / self.count
宣言と同時にインスタンス変数が初期化される。
メソッドを呼び出すと呼び出すたびにvalがsumに追加されて平均が更新される。
https://www.st-hakky-blog.com/entry/2017/11/15/155523
(メソッドの話がちょっと気になったので上でクラスメソッドの解説を参照した)
A - 素数、コンテスト、素数
一応一番早いと言われている実装にした。
(今回は入力範囲がN>7だったので2<Nの処理を書いてない)
import numpy as np
def is_prime(N):
up = int(np.sqrt(N))
if not(N % 2): return 'NO'
for i in range(3, up + 1, 2):
if N % i:
continue
else:
return 'NO'
return 'YES'
N = int(input())
print(is_prime(N))
https://docs.python.org/ja/3/library/numbers.html
import numbers
import numpy as np
x = np.arange(10)
isinstance(x, numbers.Number)
>>False
isinstance(x[0], numbers.Number)
>>True
Numberによって種類は何であれ、数であるということだけチェックすることができる。
今日は幅優先探索を学習する。
C - 幅優先探索
かなり時間がかかった。原因は探索したかどうかを格納するstep変数を次のように初期化したことだった。
step = [[-1] * (C + 2)] * (R + 2)
これで探索のスタートを0にするため
step[sy][sx] = 0 #sy = sx = 2
とするとなんと次のように代入される。
[[-1, -1, 0, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, 0, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, 0, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, 0, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, 0, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, 0, -1, -1, -1, -1, -1, -1, -1],
[-1, -1, 0, -1, -1, -1, -1, -1, -1, -1]]
なんと!xy座標を指定したはずなのに縦にきれいに0が代入されている。
これに気づかなかったので何故か探索が途中で打ち切られていた。
どうやらこの配列の宣言方法では同じlistを複数コピーして二次元配列を作っているようで参照しているidが同じようだ。参照(https://qiita.com/masarin1126/items/e00407e7ba9f11fd185c)
リスト内包括表記で次のように宣言すると解決した。
step = [[-1 for _ in range(C+2)]for _ in range(R+2)]
今日は日本オラクルでの勉強会に参加した。
テーマ
RNNと自然言語処理の基礎から最新動向まで 本橋和貴(Skymind K.K.)
RL4JとAnyLogicを用いた実用シミュレーション環境における強化学習 Eduardo Gonzalez(Skymind K.K.)
参考サイト:https://qiita.com/knknkn1162/items/17f7f370a2cc27f812ee
実装
# iterableであるために
# __iter__(iteration/iterator protocol : 反復プロトコルというらしい)を実装する
class Foo():
def __init__(self):
self._L = [0,1,2]
def __iter__(self):
return FooIterator(self)
# iteratorであるために__iter__, __next__を実装する必要がある
class FooIterator():
def __init__(self, foo): # fooはiterableなオブジェクト
self._i = 0
self._foo = foo
def __iter__(self):
return self
def __next__(self):
try:
v = self._foo._L[self._i]
self._i += 1
return v
# StopIteration(RuntimeError)を送出するように実装
except IndexError:
raise StopIteration
直接操作するときはiter,next関数を使用
foo = Foo() #iterableなオブジェクトを生成
# iteratorを直接操作する
## iter関数は__iter__関数を呼び出し、イテレータを取得する。
iter_foo = iter(foo) # iterableオブジェクトを引数に
print(next(iter_foo)) # 0
print(next(iter_foo)) # 1
print(next(iter_foo)) # 2
print(next(iter_foo)) # StopIteration:が送出され、エラー
今日はpythonの入門書である"head first python"の第5章Webアプリケーションの構築に取り組んだ。
コードは以下
https://github.com/idekazuki/diary/tree/master/flask_test
基本的なFlaskの使用方法を学ぶことができた。
ファイル構造
/flask_test -_ _ vsearch.py
|_ /static -- hf.css
| _/template -- base.html--entry.thml--results.html
実行すると以下のようになる。
phrase の中にcharacter が含まれているかどうか確認するだけの関数である。
https://teratail.com/questions/41277
実践されている命名方法
_single_leading_underscore: “内部でだけ使う” ことを示します。たとえばfrom M import *は、アンダースコアで始まる名前のオブジェクトをインポートしません。
__double_leading_underscore: クラスの属性に名前を付けるときに、名前のマングリング機構を呼び出します (クラスFoobarの__booという名前は_FooBar__booになります。以下も参照してください)
メソッド名とインスタンス変数
公開されていないメソッドやインスタンス変数にだけ、アンダースコアを先頭に付けてください。
サブクラスと名前が衝突した場合は、Pythonのマングリング機構を呼び出すためにアンダースコアを先頭に二つ付けてください。
継承の設計
* 公開されている(public)属性の先頭にはアンダースコアを付けない
* もしあなたが公開している属性の名前が予約語と衝突する場合は、属性の名前の直後にアンダースコアを追加します。省略語を使ったり、スペルミスをするよりはマシです。
* サブクラス化して使うクラスがあるとします。サブクラスで使って欲しくない属性があった場合、その名前の最後ではなく、先頭にアンダースコアを二つ付けることを検討してみましょう。これによって Python のマングリングアルゴリズムが呼び出され、その属性にはクラス名が付加されます。これはサブクラスにうっかり同名の属性が入ってしまうことによる属性の衝突を避けるのに役立ちます。
~/.vimrc に次のような記述を追加した結果バックスペースで消せるようになった。
set backspace=indent,eol,start
noremap! ^H
noremap! ^D
OpenCVを使用してMP4の読み込みを行う。サンプルで使用するのは研究で使用するEPICKITCHNのデータセット。今日は短時間なら以下のコードで再生することができたが、途中で読み込みができなくなるか強制終了されてしまった。
#-*- coding:utf-8 -*-
import cv2
import numpy as np
def main():
# 動画の読み込み
cap = cv2.VideoCapture("../../EPIC-KITCHENS/videos/test/P01/P01_12.MP4")
# 動画終了まで繰り返し
while(cap.isOpened()):
# フレームを取得
ret, frame = cap.read()
# フレームを表示
cv2.imshow("Flame", frame)
# qキーが押されたら途中終了
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
SelebA dataset を使用してDCGANのtutorial programを回していたら、次のようなエラーが出た。
IOError: image file is truncated
これの解決策は、
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
を追加するだけで良い。
PILは画像データによっては処理落ちしそうになったら見過ごすという使用になっているらしい。上記のコードを打てば、デフォルトの設定を変更してきちんと読み込んでくれるようになる。
幅優先探索もだいぶ慣れてきた。
今回は探索したあとゴールまでにかかるステップ数を'.'の総数から引けば良い。
from collections import deque
H, W = map(int, input().split())
padding = ['#' for _ in range(W + 2)]
Map = tuple([padding])
Map += tuple(['#'] + list(input()) + ['#'] for _ in range(H))
Map += tuple([padding])
dxy = [(1, 0), (-1, 0), (0, 1), (0, -1)]
done = [[-1 for _ in range(W + 2)] for _ in range(H + 2)]
q = deque()
push, pop = q.append, q.popleft
push((1, 1))
done[1][1] = 0
while q:
y, x = pop()
for dy, dx in dxy:
if Map[y + dy][x + dx] == '.' and done[y + dy][x + dx] == -1:
push((y + dy, x + dx))
done[y + dy][x + dx] = done[y][x] + 1
if done[H][W] != -1:
break
cnt = 0
for i in range(1, H + 1):
for j in range(1, W + 1):
if Map[i][j] == '.':
cnt += 1
ans = cnt - done[H][W] -1
print(ans if done[H][W] != -1 else -1)
name = input()
ans = 'YES'
search = len(name) // 2
for i in range(search):
if name[i] == name[len(name) - 1 - i]:
ans = 'YES'
else:
ans = 'NO'
break
print(ans)
しかしこれだと計算時間も長いし、きれいじゃない。
文字列を単純に反転させたものを比較すれば良い。
name = input()
ans = 'YES' if name == name[::-1] else 'NO'
print(ans)
気づいたこと。
print('YES' if name == name[::-1] else 'NO')
よりも
ans = 'YES' if name == name[::-1] else 'NO'
print(ans)
のほうが1ms早い。
pytorchではlabelづけするときにint(32bit)ではなくてlong(64bit)を使用する。変換は
x.long()
で可能。
classify.py の中で宣言されているDataLoaderの引数としてvideopathがあるが、これをさかのぼってみるとmain.pyで呼び出すときに'tmp'としてよびだされていた。このtmpは動画を静止画として一時的に保存するために作成されるフォルダで実行後は削除される。
subprocess.call('mkdir tmp', shell=True)
subprocess.call('ffmpeg -i {} tmp/image_%05d.jpg'.format(video_path),
shell=True)
#なんか処理
result = classify_video('tmp', input_file, class_names, model, opt)
この時ファイル関係の処理はすべてsubprocessで行われていた。使い方は以下のサイトを参照した。
https://qiita.com/caprest/items/0245a16825789b0263ad
shell=Trueと設定すると標準のシェルでコマンドを実行するようになるらしい。
yield の使い方について確認した。
参考サイトはhttps://www.sejuku.net/blog/23716
yieldは関数を一時的に実行停止させることができる機能を持つ文で、大きな処理を行うときに返り値を小分けにすることができるので処理を高速化することができる。
ex
def myfunc1():
yield 10
yield 20
generator = myfunc1()
print(next(generator))
print(next(generator))
>>10
20
def myfunc2(x:int):
for i in range(x):
yield i*2
generator = myfunc2(3)
print(next(generator))
print(next(generator))
print(next(generator))
>>0
2
4
def myfunc(gen1, gen2):
yield from gen1
yield from gen2
generator = myfunc(gen1, gen2)
for i in range(5):
print(next(generator))
>>10
20
0
2
4
yield fromは結合する役割を持つ
def calculate_video_results(output_buffer, video_id, test_results, class_names):
video_outputs = torch.stack(output_buffer)
average_scores = torch.mean(video_outputs, dim=0)
sorted_scores, locs = torch.topk(average_scores, k=10)
video_results = []
for i in range(sorted_scores.size(0)):
video_results.append({'label': class_names[locs[i]], 'score': sorted_scores[i]})
test_results['results'][video_id] = video_results
torch.topk について
torch.topk(input, k, dim=None, largest=True, sorted=True, out=None) -> (Tensor, LongTensor)
Returns the k largest elements of the given input tensor along a given dimension.
If dim is not given, the last dimension of the input is chosen.
If largest is False then the k smallest elements are returned.
A namedtuple of (values, indices) is returned, where the indices are the indices of the elements in the original input tensor.
The boolean option sorted if True, will make sure that the returned k elements are themselves sorted
Parameters
input (Tensor) – the input tensor
k (int) – the k in “top-k”
dim (int, optional) – the dimension to sort along
largest (bool, optional) – controls whether to return largest or smallest elements
sorted (bool, optional) – controls whether to return the elements in sorted order
out (tuple, optional) – the output tuple of (Tensor, LongTensor) that can be optionally given to be used as output buffers
Example:
>>> x = torch.arange(1., 6.)
>>> x
tensor([ 1., 2., 3., 4., 5.])
>>> torch.topk(x, 3)
torch.return_types.topk(values=tensor([5., 4., 3.]), indices=tensor([4, 3, 2]))
例だと、第一引数のxに対して大きい順に第2引数で指定した3番目までを抽出している。
largest をFalseにすると小さい順に取り出してくれる。
sortedをFalseにすると結果ををソートせずに出力する。
yanailab windows how to use
rdesktop -g 1280x800 shogi
git 上のコードを実行することはできた #19 が、何が出力されているかあまりまだわからない。
今回はoutput.json file の中身を解析する。
入力として使用したのはUCF-101のArcheryの動画。
v_Archery_g01_c01.avi
という動画で、約5sの長さがある。
実行時のコマンドライン出力画面は次のようになった。
python3 main.py --input ./input --video_root ../../UCF-101/Archery/ --output ./output.json --model ./pretrain_data/resnet-18-kinetics.pth --mode score --model_depth 18
loading model ./pretrain_data/resnet-18-kinetics.pth
>>
loading model ./pretrain_data/resnet-18-kinetics.pth
resnet-18
../../UCF-101/Archery/v_Archery_g01_c01.avi
ffmpeg version 2.6.3 Copyright (c) 2000-2015 the FFmpeg developers
built with gcc 4.8 (Ubuntu 4.8.4-2ubuntu1~14.04)
configuration: --prefix=/usr/local --enable-shared --disable-static
libavutil 54. 20.100 / 54. 20.100
libavcodec 56. 26.100 / 56. 26.100
libavformat 56. 25.101 / 56. 25.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 11.102 / 5. 11.102
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 1.100 / 1. 1.100
Input #0, avi, from '../../UCF-101/Archery/v_Archery_g01_c01.avi':
Metadata:
encoder : MEncoder r34118-4.2.5
Duration: 00:00:05.24, start: 0.000000, bitrate: 781 kb/s
Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 669 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc
Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 99 kb/s
[swscaler @ 0xe3f200] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'tmp/image_%05d.jpg':
Metadata:
encoder : Lavf56.25.101
Stream #0:0: Video: mjpeg, yuvj420p(pc), 320x240 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc56.26.100 mjpeg
Stream mapping:
Stream #0:0 -> #0:0 (mpeg4 (native) -> mjpeg (native))
Press [q] to stop, [?] for help
frame= 131 fps= 32 q=24.8 Lsize=N/A time=00:00:05.24 bitrate=N/A
video:546kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
/host/space0/ide-k/out_git/video-classification-3d-cnn-pytorch/classify.py:25: UserWarning: volatile was removed and now has no effect. Use `with torch.no_grad():` instead.
inputs = Variable(inputs, volatile=True)
output.json を以下のようなコードで表示する。
#coding:utf-8
import json
def main():
with open('./output.json') as f:
jsn = json.load(f)
#読み込んだ形式を表示
print(type(jsn))
#整えた書式で全体を表示
print(json.dumps(jsn, sort_keys=True, indent=4))
#ラベルのみを抽出
for jsn_dic in jsn:
print(len(jsn_dic["clips"]))
for i in range(len(jsn_dic["clips"])):
print(jsn_dic["clips"][i]["label"])
if __name__ == "__main__":
main()
以下のような構造になっていることがわかった。
<class 'list'> │ 1 [{"video": "v_Archery_g01_c01.avi", "clips": [{"segment": [1, 16], "label": "archery", "scores": [1.7
[ │ 758756875991821, 2.1774258613586426, -0.3326228857040405, -0.29544246196746826, -2.281000852584839, 7
{ │ .768344402313232, 0.3198256194591522, -1.115415334701538, -2.7847046852111816, 0.28276023268699646, -
"clips": [ │ 3.1307008266448975, -1.4592198133468628, -0.11600761115550995, 0.8592607975006104, -0.768841564655304
{ │ , -0.8403390049934387, -0.1674695611000061, -0.3636217713356018, 0.06561709940433502, -2.458683490753
"label": "archery", │ 174, 1.1174076795578003, 1.9969531297683716, -3.195760488510132, -0.8408206105232239, 1.0247690677642
"scores": [ │ 822, -0.40334686636924744, -0.3428850769996643, -1.8218177556991577, -1.6184970140457153, 1.839611530
1.7758756875991821,
.
.
.
1.2808388471603394,
-1.083033561706543
],
"segment": [
113,
128
]
}
],
"video": "v_Archery_g01_c01.avi"
}
]
とりあえず"label"がアーチェリーになっていれば動作認識ができていることになる。
ざっと見"archery"と"playing tennis"の2つのクラスが出力されていることがわかった。
とりあえずpythonでlabelだけ抽出してみる。
archery
archery
archery
playing tennis
archery
playing tennis
archery
archery
このように8個のラベルが推測値として出力されていた。
正解していたのは8個中6個だったので、ここだけ見ると精度は0.7ちょい
frame= 131 fps= 32 q=24.8 Lsize=N/A time=00:00:05.24 bitrate=N/A
main.py を見るとopt.sample_duration = 16
となっているので131//16=8 frameとなって結果と一致していることがわかる。
A - 深さ優先探索
再帰的に処理を行う例を参考にした。
上下右左の順番で探索を行っている。
import sys
sys.setrecursionlimit(5000000)
h, w = map(int, input().split())
l = [list(input()) for _ in range(h)]
def dfs(r, c):
if not(0 <= c < w and 0 <= r < h) or l[r][c] == "#":
return
if l[r][c] == "g":
print("Yes")
exit()
l[r][c] = "#"
dfs(r+1, c)
dfs(r-1, c)
dfs(r, c+1)
dfs(r, c-1)
for i, val in enumerate(l):
if "s" in val:
dfs(i, val.index("s"))
break
print("No")
単純なtar だけの時は
tar tvf test.tar
で表示できるが、この時表示されすぎるので
tar tvf test.tar | head -50
or
tar tvf test.tar | more
で対応する。
全体の流れは以下のgit readmeに記述されている。
https://github.com/epic-kitchens/starter-kit-action-recognition
snakemakeの説明については以下リンク
https://github.com/joemphilips/Translate_Snakemake_Tutorial
本日はデータサイエンス協会企画委員会委員長株式会社ブレインバッドエバンジェリストの斎藤史郎さんの講演を受けた。
データサイエンスとは
データから役立つ情報を生み出すこと。
これからの社会
全ての企業でデータサイエンスを使うことになる。
感や度胸ではなくデータを基にした意思決定を行う必要があるから
データサイエンティストに必要なこと
ビジネス力
実装力
統計力
どれか一つだけでなく、2nd くらいは勉強しておきたい。
学部のうちは、アイデアソンではなく研究分野できちんと研究を行うことが重要
SQLが使えればどこでも生きていける。
https://note.nkmk.me/python-type-isinstance/
上記のサイトを参照
typeは引数の厳密なtype型を返してくれる。
isinstanceは第一引数のtype型と第二引数が一致していればTrueを返してくれる。
大きな違いとしては、instanceはあるサブクラスを第一引数にしたとき、そのサブクラスのスーパークラスのtype型も判定条件に含めるところ。
注意点:bool型はint型のサブクラスなので
isinstance(True, int)
>>True
isinstance(True, int)
>>True
となる
assert :条件式がTrue出ない時メッセージを返す
構文
assert 条件式, メッセージ
https://qiita.com/nannoki/items/15004992b6bb5637a9cd
script文実行時にコマンドラインオプション-Oをつけると__debug__がFalseになってassert文が無効になる。
python3 -O test.py
https://qiita.com/namakemono/items/c963e75e0af3f7eed732
ここに書かれているように共有のパスを手に入れたらダウンロードできた。
tensorboard をpytorchで動かすときはtensorboardXを使用する。まずはpip でインストールする。
この時研究室の環境上の問題で、pip install tensorboardx --user とする必要があった。
次のようなサンプルブログラムを実行したあとは
tensorboard --logdir="./runs" --host 130.153.192.xx
hostのところは自分でifconfig を実行してinet のアドレスを入れる。
また、リモートで使用するときは
ssh -L 8888:130.153.192.xx:6006 [email protected]
としてlocalhost:8888にバインドすることでtensorboard に接続。
http://localhost:8888 で実行できる。
ちなみにdefaultでは6006だが、--port 9999 とすることで任意のポートにつなげることができる。
研究室内でのproxy path 通し方
import os
os.environ["http_proxy"] = "http://proxy.〜〜〜.ac.jp:8080"
os.environ["https_proxy"] = "https://proxy.〜〜〜.ac.jp:8080"
len
シーケンスの長さをしる
contains
シーケンスが特定の値を含んでいるかどうかを知る
x[ : , None]は何を表してる?
一次元増やす役割。普通はnp.newaxisと名前つける。
https://teratail.com/questions/117881
bl2 = np.arange(N,dtype=np.int64)[:,None]
print(bl2)
bl3 = np.arange(N,dtype=np.int64)[None,:]
print(bl3)
print(bl2.shape)
print(bl3.shape)
print(bl2 < bl3)
>>[[0]
[1]
[2]
[3]]
[[0 1 2 3]]
(4, 1)
(1, 4)
[[False True True True]
[False False True True]
[False False False True]
[False False False False]]
先に最大値と最小値の差を計算して0ならこの時点で計算できない。Pについては、差があるならそれに何をかけたらBになるのかを求めれば良い。Aは平均なのでバイアスとしてどんなQを足したらAになるか求めれば良い。
N, A, B = list(map(int, input().split()))
S = [int(input()) for _ in range(N)]
sub = (max(S) - min(S))
if sub != 0:
P = B / sub
Q = A - P * sum(S) / N
print(P ,Q)
else:
print(-1)
データセット名(評価方法)
TIMIT(PER)
SwitchBoard Bank(WER)
Voice Search(SER)
PER(Phoneme Error Rate); 音素列で比較した時の正解率
WER(Word Error Rate); テキスト化した後の単語で比較した時の正解率
SER(Sentence Error Rate); テキスト化した後の文章単位で比較した時の正解率
ATIS(SLU)
SLU(Spoken Language understanding)
from collections import OrderedDict
についてhttps://note.nkmk.me/python-collections-ordereddict/
簡単に言うと順番を保持する辞書型。dictのサブクラス。
https://github.com/TwentyBN/GulpIO/blob/master/src/main/python/gulpio/fileio.py
starter kitの解析
xxx.gulp_dir.merged_meta_dict[id]で
[offset, padding, length]を返してくれる。offsetは先頭からのバイト数を表し、lengthはgulpチャンク内のjpegの長さを表す。paddingはよくわからんかった。
optical flowに関しては、u,vに分離して動画表示を行う関数が定義されていた。uは水平方向のoptical flowで、vは垂直方向のoptical flowを表している。
def grey_to_rgb(frames):
"""
Convert frame(s) from gray (2D array) to RGB (3D array)
"""
n_channels = 3
return np.repeat(np.array(frames)[..., np.newaxis], n_channels, axis=-1)
def stitch_flow_uv_frames(uv_frames, width_axis=2):
"""
Destack (u, v) frames and concatenate them side by side for display purposes
"""
u_frames = np.array(uv_frames[::2])
v_frames = np.array(uv_frames[1::2])
stacked_frames = np.concatenate((u_frames, v_frames), axis=width_axis)
return stacked_frames
def clipify_flow(frames, fps=30):
"""
Destack flow frames, join them side by side and then create an ImageSequenceClip
for display
"""
frames = grey_to_rgb(stitch_flow_uv_frames(list(map(np.array, frames))))
segment_clip = ImageSequenceClip(list(frames), fps=fps)
return segment_clip
example_segment = flow_train.video_segments[10]
# Note you can also pass an iterable of frame indices to extract, this is useful for
# methods like TSN which only need a few frames
example_flow_frames = flow_train.load_frames(example_segment, range(0, example_segment.num_frames))
clipify_flow(example_flow_frames).ipython_display()
ハイフンで区切られたタイトル名を分割して取得する時にfindを使用する
filename = 'aa_bb_cc'
print(filename[filename.find('_')+1:filename.find('_', 3)])
>>bbb
find('')によって最初に出てくるハイフンの位置を知ることができる。配列番号を取得したらその数字に1を足すことでハイフンの次に出てくる文字列の頭の配列番号を得ることができる。 filename[x:y]でxからyの文字列を取り出すことができる。find('', 3)のように代に引数を指定すると文字列検索の開始位置を指定することができる。今回はaa のように先頭の文字が2文字なので開始位置を3文字目以降にすることで2つ目のハイフンの位置を検索することができる。
つまり今回はfiledname[最初のハイフンの位置+1から2つ目のハイフンの位置] の文字列を検索することでbb を取得している。汎用的な処理にするならば、
print(filename[filename.find('_')+1: filename.find('_',filename.find('_')+1)])
のようにすれば良い?ただし可読性が低いのでなんとも言えない。
使用するとしたら決まった文字数のファイル名が多いと思うので最初から数字を指定してそのファイル群に絞ったコードにしたほうが良い気もする。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.