GithubHelp home page GithubHelp logo

diary's People

Contributors

idekazuki avatar

Watchers

 avatar  avatar

Forkers

idekworks

diary's Issues

8/12 夏休み基礎力強化プロジェクト5日目

本日から闇雲に問題を解いていくのではなく、既存サイトをもとにカテゴリ分けされた問題を解いていく。
最初は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が指定可能。デフォルトでは入力リスト全体となる。

8/21夏休み基礎力強化プロジェクト10日目

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)

7/4 epic-kitchens starter-kit-action-recognition01 pathlib

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) テキスト表示

8/27夏休み基礎力強化プロジェクト15日目

ナップザック問題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

6/28 自然言語処理の インテントとスロットについて

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}中です

6/22 video-classification-3d-cnn-pytorchを動かすまで

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}

これで実行したところきちんと動作を確認できた。

5/27 torch memory over

with torch.no_grad():

メモリが溢れてしまっていたので解決さくとして計算高速化のための勾配保持をやめるための関数

6/5 OpticalFlow

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_video/py_lucas_kanade/py_lucas_kanade.html#lucas-kanade

上記のサイトのコードを実行した。
EPIC-KITCHENは途中で停止してしまったが、UCF-101などの短い動画ではきちんと動作を確認できた。
要因として、MP4とavi 形式の違いも考えられる。

MP4の動画を再生すると次のようなエラーが出たのが未解決。

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f67a8144920] Timecode frame rate 59/1 not supported

5/22 pytorch 画像読み込み高速化

ImageNetを読み込んでいるときに読み込み時間が長すぎて作業が進まないので高速化についてまとめる。研究では動画を扱う予定なので処理速度は重要になってくる。
参考
https://qiita.com/hara_pets/items/e42eb4c9f75e0ff5d6c2

accimageというpytorchが公開しているライブラリで高速化できる。torchvision datasetでも使用できる。
Repository
https://github.com/pytorch/accimage

事前にIPPのインストールが必要。
python setup.py install --user

5/14 switch gpu pytorch

cuda レベルでのGPUの切り替え

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0, 1'

torch.backends.cudnn.benchmark=True
とすると、cudnnがネットワークに対して自動的に最適なアルゴリズムを選択してくれるので早くなる。
しかし、iterateごとにネットワークの大きさが変化するものに対しては、全てに適用されてしまうので逆に遅くなることがある。

5/22 matpltでanimation/

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でなく、実行関数になる。

8/23夏休み基礎力強化プロジェクト12日目

unionについて
pythonのunionについてUnionとunionの2種類あるので整理

  1. Union:
    型の明示に使用。
    pythonで型を指定する時は普通以下のようにする。
    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'}

ただし、辞書型なので結合後にもとの順番は保持されない。

6/3 more command

ssh で見てるときにprintenvしたら表示多すぎて見えなかった。スクロールもできない。
解決策
printenv|cat|more

6/26 train.pyの解析 video-classification git

引数: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
(メソッドの話がちょっと気になったので上でクラスメソッドの解説を参照した)

8/3 夏休み基礎力強化プロジェクト2日目

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))

8/15夏休み基礎力強化プロジェクト8日目

今日は幅優先探索を学習する。

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)]

5/15 実践者向けディープラーニング勉強会 第三回

今日は日本オラクルでの勉強会に参加した。
テーマ
RNNと自然言語処理の基礎から最新動向まで 本橋和貴(Skymind K.K.)
RL4JとAnyLogicを用いた実用シミュレーション環境における強化学習 Eduardo Gonzalez(Skymind K.K.)

6/27 iterable iterator について

参考サイト:https://qiita.com/knknkn1162/items/17f7f370a2cc27f812ee

  • iterable なオブジェクト:__iter__特殊メソッドが定義されている
  • iterator : __iter__と __next__が定義されているオブジェクトのこと。
    __iter__はiteratorを返すメソッド、__next__は要素を反復して取り出すことのできる特殊メソッド

実装

# 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:が送出され、エラー

8/13 夏休み基礎力強化プロジェクト6日目

今日は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 が含まれているかどうか確認するだけの関数である。

image
image

6/28 python _ アンダースコアの意味

https://teratail.com/questions/41277
実践されている命名方法

_single_leading_underscore: “内部でだけ使う” ことを示します。たとえばfrom M import *は、アンダースコアで始まる名前のオブジェクトをインポートしません。
__double_leading_underscore: クラスの属性に名前を付けるときに、名前のマングリング機構を呼び出します (クラスFoobarの__booという名前は_FooBar__booになります。以下も参照してください)

メソッド名とインスタンス変数

公開されていないメソッドやインスタンス変数にだけ、アンダースコアを先頭に付けてください。
サブクラスと名前が衝突した場合は、Pythonのマングリング機構を呼び出すためにアンダースコアを先頭に二つ付けてください。

継承の設計

* 公開されている(public)属性の先頭にはアンダースコアを付けない
* もしあなたが公開している属性の名前が予約語と衝突する場合は、属性の名前の直後にアンダースコアを追加します。省略語を使ったり、スペルミスをするよりはマシです。
* サブクラス化して使うクラスがあるとします。サブクラスで使って欲しくない属性があった場合、その名前の最後ではなく、先頭にアンダースコアを二つ付けることを検討してみましょう。これによって Python のマングリングアルゴリズムが呼び出され、その属性にはクラス名が付加されます。これはサブクラスにうっかり同名の属性が入ってしまうことによる属性の衝突を避けるのに役立ちます。

6/4 opencv mp4 読み込み 再生

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()

5/31 PIL error

SelebA dataset を使用してDCGANのtutorial programを回していたら、次のようなエラーが出た。

IOError: image file is truncated

これの解決策は、

from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

を追加するだけで良い。
PILは画像データによっては処理落ちしそうになったら見過ごすという使用になっているらしい。上記のコードを打てば、デフォルトの設定を変更してきちんと読み込んでくれるようになる。

http://snowman-88888.hatenablog.com/entry/2016/03/08/115918

8/22夏休み基礎力強化プロジェクト11日目

D - Grid Repainting

幅優先探索もだいぶ慣れてきた。
今回は探索したあとゴールまでにかかるステップ数を'.'の総数から引けば良い。

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)

8/6 夏休み基礎力強化プロジェクト3日目

A - 名前

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早い。

5/24 型、配列

pytorchではlabelづけするときにint(32bit)ではなくてlong(64bit)を使用する。変換は
x.long()
で可能。

6/27 main.py データの読み込み部分の解読 subprocess DataLoader ffmpeg

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と設定すると標準のシェルでコマンドを実行するようになるらしい。

6/27 yield generator iterator

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は結合する役割を持つ

6/27 test.pyについてvideo-classification-3d-cnn-pytorch torch.topk torch.stack

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にすると結果ををソートせずに出力する。

6/22 UCF101 実行時のoutput.jsonの中身

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となって結果と一致していることがわかる。

8/14夏休み基礎力強化プロジェクト7日目

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")

6/1 データサイエンスの現在と未来

本日はデータサイエンス協会企画委員会委員長株式会社ブレインバッドエバンジェリストの斎藤史郎さんの講演を受けた。

  • データサイエンスとは
    データから役立つ情報を生み出すこと。

  • これからの社会
    全ての企業でデータサイエンスを使うことになる。
    感や度胸ではなくデータを基にした意思決定を行う必要があるから

  • データサイエンティストに必要なこと
    ビジネス力
    実装力
    統計力

どれか一つだけでなく、2nd くらいは勉強しておきたい。

学部のうちは、アイデアソンではなく研究分野できちんと研究を行うことが重要
SQLが使えればどこでも生きていける。

  • 5年後の世界
    データサイエンスは貴重な技術ではなくなる。web黎明期のHP作れる人の貴重さのように
    常に勉強することが大切。自分で学会に論文出せるくらい。Drだとなお良い。

6/27 type isinstance の違い

https://note.nkmk.me/python-type-isinstance/
上記のサイトを参照

typeは引数の厳密なtype型を返してくれる。
isinstanceは第一引数のtype型と第二引数が一致していればTrueを返してくれる。
大きな違いとしては、instanceはあるサブクラスを第一引数にしたとき、そのサブクラスのスーパークラスのtype型も判定条件に含めるところ。

注意点:bool型はint型のサブクラスなので

isinstance(True, int)
>>True
isinstance(True, int)
>>True

となる

5/30 tensorboard on pytorch

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 とすることで任意のポートにつなげることができる。

8/24夏休み基礎力強化プロジェクト13日目

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]]

8/8日夏休み基礎力強化プロジェクト4日目

A. 点数変換

先に最大値と最小値の差を計算して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)

6/28 音声認識の評価指標について

データセット名(評価方法)
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)

8/26夏休み基礎力強化プロジェクト14日目

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()

6/8 file.find('_') ファイル名抽出

ハイフンで区切られたタイトル名を分割して取得する時に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)])

のようにすれば良い?ただし可読性が低いのでなんとも言えない。
使用するとしたら決まった文字数のファイル名が多いと思うので最初から数字を指定してそのファイル群に絞ったコードにしたほうが良い気もする。

8/19夏休み基礎力強化プロジェクト9日目

前回作ったページのログが取れるようになった。
image

flaskの request, escapeを活用した。
request.form, remote_addr, user_agent, が取れるようになっている。ただし読み込むときにescapeで囲まないと特殊文字が含まれており、表示されないので注意。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.