cv2(openCV)で動画の途中から再生する方法

概要

openCVで動画の任意の地点から再生を開始する方法をまとめる。
これまではwhileループで1フレームずつ取得し読み飛ばしていた。しかし、この方法はあまりにも無駄が多い・・・時間もかかるし、HDDにも悪影響が出そう。
ということで、もう少し効率の良い方法を調べてみた。

従来方法

飛ばしたい時間分フレームを読みこませるだけ、簡単だけど、100秒のスキップに10秒ほど時間がかかる。
流石にこれじゃねぇ・・・。ということで、次の手法。

movie = cv2.VideoCapture(input_filename)
if movie.isOpened() == True:
    ret,frame = movie.read()
else:
    ret = False


# フレームを連続で読み込ませる
for i in range(framerate*shift_time):
    ret,frame = movie.read()

高速手法

開始のゼロ点をms単位でセットしてあげるだけ。スキップはほぼ一瞬。
HDDへのアクセスも少なく、パソコンに優しい!

movie = cv2.VideoCapture(input_filename)
if movie.isOpened() == True:
    ret,frame = movie.read()
else:
    ret = False

#スタート地点をsetする
movie.set(0,shift_time*1000)
ret,frame = movie.read()

疑問点

h264動画を取得すると、以下のエラーが出る。
キーフレームが見つからないってことなんだろうけど・・・・。
このエラーが出てもとりあえず読み込めてるから、とりあえず用は足りる。
(キーフレームが出るまで再読込してるのかな??本当はopenCVのソース読んで確認すべき。)

[h264 @ 0x2f1fac0] Missing reference picture, default is 0
[h264 @ 0x2f1fac0] decode_slice_header error

pythonでgooglemap情報を扱う方法まとめ

概要

googlemapデータを機械学習の元ネタにするために、データの取り扱い方を調べたのでまとめておく。

地名から座標(緯度経度)、詳細住所を取得する

pipでインストール

pip install pygeocoder


あとはpythonで書くだけ。

from pygeocoder import Geocoder
address = '国会議事堂'
results = Geocoder.geocode(address)
print(results[0].coordinates)
# => (35.675888, 139.744858)

result = Geocoder.reverse_geocode(*results.coordinates, language="ja")
print result
# => 日本, 〒100-0014 東京都千代田区永田町1丁目7−1 国会議事堂

ふむ、簡単にかける割にはすごい。

特定の座標周辺の地図を画像として保存

次は、上記で得た座標を元に周辺の地図画像をダウンロードしてみる。
基本的には以下URLを参考にした。

Google Static Maps API入門
Google Mapの地図の画像を取得するには – 山本隆の開発日誌

pipでライブラリをインストール

sudo pip install urllib

以下のように、地図画像を取得して保存させる。
自分で書いておいてなんだけど、いまいち美しくない…。

from pygeocoder import Geocoder
import urllib

def download_pic(url,filename):
	img = urllib.urlopen(url)
	localfile = open( "./" + str(filename) + ".png" , 'wb')
	localfile.write(img.read())
	img.close()
	localfile.close()

address = 'ホワイトハウス'
results = Geocoder.geocode(address)
print(results[0].coordinates)

result = Geocoder.reverse_geocode(*results.coordinates, language="ja")
print result

html1 = "https://maps.googleapis.com/maps/api/staticmap?center="
html2 = "&maptype=hybrid&size=640x480&sensor=false&zoom=18&markers="
html3 = "&key=googleから取得したキーコードを入力"

axis = str((results[0].coordinates)[0]) + "," + str((results[0].coordinates)[1])

html = html1 + axis + html2 + axis + html3

print html

download_pic(html,address)

f:id:t_nkb:20161221131234p:plain

ちゃんとホワイトハウス周辺の地図が保存できた。さすがグーグル、使いやすくできてる。
細かなパラメータについては上記リンクを参照。

フォルダ内の全画像ファイルに対して一括処理を行う(python)

機械学習を行う際、webでスクレイピングした大量の画像ファイル等を一括で操作したくなることが多い。
その場合ファイル名も拡張子もバラバラで保存されるため、処理する際にいつも悩む。
毎回調べるのもバカらしいので、サンプルとしてまとめておく。
pythonだとこういう処理が書きやすくて便利。

# -*- coding: utf-8 -*-
import os
import cv2

def main():
    data_dir_path = u"./画像ディレクトリ名/"
    file_list = os.listdir(r'./画像ディレクトリ名/')

    for file_name in file_list:
        root, ext = os.path.splitext(file_name)
        if ext == u'.png' or u'.jpeg' or u'.jpg':
            abs_name = data_dir_path + '/' + file_name
            image = cv.imread(abs_name)
            #以下各画像に対する処理を記載する

if __name__ == '__main__':
    main()

ubuntuからgoogle remote desktopを削除する方法(deja-dup-moniter暴走時の対処法)

deja-dup-moniterが起動直後にPCのメモリを全部使用し始めて、パソコンが全く動かなくなったので調査。
メモリ24GBもあるのに全部使いやがるとは・・・。

調べると、ubuntu16.04とgoogle remote desktopの相性が悪いらしく、deja-dup-moniterと合わさると悪さを始める模様。

google remote desktopめ、ubuntu16ではインストールしてもまともに使えないばかりか、他に影響を与えるとは、もう許せん。
ということで、google remote desktopを削除することに。
そういえば、apt-getで入れたアプリケーションを検索して消したことなかったので、やり方も合わせてメモ

#まずはおおよそ当たりをつけたアプリ名で検索
$ dpkg -l | grep chrome

ii  chrome-remote-desktop                        55.0.2883.50                                          amd64        Chrome Remote Desktop Beta


#パッケージ名を把握したら、--purgeオプションをつけて完全に削除
$ sudo apt-get --purge remove chrome-remote-desktop 

再起動したらいつもどおりのメモリ消費量になっていて一安心。

pix2pix(GAN)を使ってモノクロのおそ松くんをカラー画像にしてみた

前半に着色結果
後半にpix2pixの導入方法、学習方法
という構成になっている。手っ取り早く導入したいならば、「作業内容」からみるのがオススメ。

概要

清水さんのブログにてpix2pixが紹介されていて面白そうだったので試してみた。
GANのパラメータを自動で修正させることで、汎用的に画像→画像変換ができるようになったものらしい。(まだ論文読んでないから正しくないかも・・・・)
shi3zの長文日記

githubに公開されているpix2pixを使えば、簡単に自分のデータセットを学習させられそうだったので、今回は、おそ松さん(2015年放送)のカラー画像を学習して、おそ松くん(1965年放送)の白黒画像を着色してみる。
もう時代遅れ(?)なのかもしれないけれど。同じような絵柄でカラー、白黒が存在するから、学習しやすそうかなぁと。

結果

まず最初に結果から。
完璧というわけではないけれど、結構自然に着色できた。

とりあえず、平均的なものを評価してみる。

人はある程度自然に着色されている。
着色度合いがなんとなく古臭い。何故w
よく見ると木目が緑だったり、腕に緑が入っていたりして、破綻している部分も。
f:id:t_nkb:20161126113044p:plainf:id:t_nkb:20161126112731p:plain
f:id:t_nkb:20161126113253p:plainf:id:t_nkb:20161126112636p:plain
f:id:t_nkb:20161126113240p:plainf:id:t_nkb:20161126112839p:plain
f:id:t_nkb:20161126114011p:plainf:id:t_nkb:20161126113931p:plain

人工物

建物や室内もそれっぽい。
まぁ何色塗ってもそれっぽくなる気もするが・・・。
f:id:t_nkb:20161126113057p:plainf:id:t_nkb:20161126112803p:plain
f:id:t_nkb:20161126113051p:plainf:id:t_nkb:20161126112749p:plain

その他

この着色とか、おそ松くんっぽいビビットな色合いが出てる。
本当は全体にわたってこんな色合いになって欲しかった・・・。
f:id:t_nkb:20161126113108p:plainf:id:t_nkb:20161126112853p:plain

(追記)漫画のカラー化もしてみた

これなら漫画の着色もできるのでは?ということで、ソーマの白黒ーカラー画像でも同様に学習させてみた。
150枚の白黒ーカラー画像を学習させて、別のソーマ画像に着色。ちょっとパラメータいじって、学習の解像度は2倍にしてある。
かなり自然な色付けに見える・・・。
f:id:t_nkb:20161203165222j:plainf:id:t_nkb:20161203165230j:plain

作業内容

ということで、この結果に至るまでの作業内容を記載する。
作業環境は、GTX1070,ubuntu16.04となる。

torchのインストール

基本以下に書いてるとおりに実行するだけ
Torch | Getting started with Torch

gitから取ってきて
$ git clone https://github.com/torch/distro.git ~/torch --recursive

インストール(結構時間がかかる)
$ cd ~/torch; bash install-deps;
$ ./install.sh

最後にパスを追加するか?と聞かれるので、yesと入力

$ source ~/.bashrc

thコマンドを打っていかが表示されるようならインストール成功。

$ th

______             __   |  Torch7 
/_  __/__  ________/ /   |  Scientific computing for Lua. 
/ / / _ \/ __/ __/ _ \  |  Type ? for help 
/_/  \___/_/  \__/_//_/  |  https://github.com/torch 
                        |  http://torch.ch 

pix2pixを導入

基本は以下参照
GitHub - phillipi/pix2pix: Image-to-image translation using conditional adversarial nets


言われるがままに、nngraphとdisplayを入れる

$ luarocks install nngraph
$ luarocks install https://raw.githubusercontent.com/szym/display/master/display-scm-0.rockspec

pix2pixをclone

$ git clone https://github.com/phillipi/pix2pix.git
#公式では以下だけど、このままではエラーになる。
#git clone git@github.com:phillipi/pix2pix.git

$cd pix2pix

まずはサンプルのデータセットをダウンロードして実行してみる。

$ bash ./datasets/download_dataset.sh facades
$ DATA_ROOT=./datasets/facades name=facades_generation which_direction=BtoA th train.lua

学習が進んでいるところがターミナルで見えたら、ctrl+cでストップしてOK。

オリジナルデータセットを学習させる

ダウンロードしてきた、サンプルのデータセットを見るとこんな感じ。
なるほど。256*256の画像をbefore,afterで並べりゃいいのね、お手軽。
f:id:t_nkb:20161126114750j:plain

ということで、
1.ネットからおそ松さん画像200枚を集めてきて
2.256*256にリサイズして
3.グレースケール化して
4.2つの画像を並べてひとつの画像にする
としたものがこれ。

f:id:t_nkb:20161126115028p:plain
f:id:t_nkb:20161126115053p:plain
f:id:t_nkb:20161126115127p:plain

この画像を、先ほどの./datasets/facades/trainの中身と入れ替えて(入れ替えなくても以下引数を変えればいいんだけど・・・。)学習させる。

(追記)
論文読むと、バッチサイズを増やせるなら増やしてもいい模様。
train.luaのbatchSize行を増やすとより早く計算が進む。
今回は論文の推奨通り、4に増やしてみた。これでエラーが出て学習が進まないようなら、1に戻すこと。

batchSize = 1,
↓ こう変更
batchSize = 4,

DATA_ROOT=./datasets/facades name=facades_generation which_direction=AtoB th train.lua

GTX1070で2時間程度まつと学習が完了する。

(追記)
学習中、別ウィンドウで以下を起動し、ブラウザから以下URLにアクセスすることで、実行過程を見ることができる。

th -ldisplay.start 8000 0.0.0.0

http://0.0.0.0:8000



テストデータを作って結果を見る

その間にテストデータを作る。
今回は結果を見たいだけなので、ソースコードはいじらない方針。
1.ネットからおそ松くん画像(白黒)を集めてきて
2.256*256にリサイズして
4.同じ画像を2つよこに並べる

出来たものはこんな感じ。
f:id:t_nkb:20161126115725p:plain
f:id:t_nkb:20161126115709p:plain

これを./datasets/facades/varの中身と入れ替えて、以下のコマンドを打つと、./resultsフォルダに結果が格納される。

$ DATA_ROOT=/path/to/data/ name=expt_name which_direction=AtoB phase=val th test.lua

感想

結果は上記の通り。
学習時間除けば、実作業1〜2時間でここまで出来てしまう。
いやぁ、時代の進歩って怖い・・・。
取り残されないように、ソースコードと論文でも読みますか。。。。

英語論文の文末を整形し、スムーズにGoogleに翻訳させる(javascript版)

概要

Google翻訳の精度は大幅に向上したが、論文をコピペして翻訳しようとすると文末、行末の"-"や改行のせいで、まともに翻訳できない

Google翻訳が理解できるよう、翻訳前に成形するスクリプト書いた!便利!

javascript
pythonだと、いちいちファイル開かなければいけないため面倒なので、せめてブラウザ上で完結させてみた。
初めてjavascript使ったけど、携帯からポチポチ打って試したら出来てしまった。簡単だし、結構便利かも。

以下の整形前英文入力欄に英文を入力すると、下に整形後の英文が出力される。
ここで出力された英文をGoogle翻訳に突っ込めば、まともな翻訳文をgetできる。

Google 翻訳

2017/09/10
翻訳がおかしな単語を最初に置換できるようにしてみた。


文末整形スクリプト

整形前英文入力

オリジナル置換語句(before)←→(after) (before)←→(after)




整形後文章




実装内容

実装内容は以下リンク(python版)と同様
改行記号を消して、"-"を見つけて文頭と繋げているだけ。
officeのマクロでもできるけど、いちいちoffice使わなくても良い点がメリット。
英語論文の文末を整形し、スムーズにGoogleに翻訳させる(python版) - 技術メモ集




英語論文の文末を整形し、スムーズにGoogleに翻訳させる(python版)

概要

以下リンクの通り、Google翻訳の精度は大幅に向上したが、論文をコピペして翻訳しようとすると "-" や改行のせいで、まともに翻訳できない

Google翻訳が理解できるよう、翻訳前に成形するスクリプト書いた!便利!

やったことはしょぼしょぼだけど、翻訳がかなり使いやすくなる。

Google翻訳APIは有料なので、自分でコピペして翻訳させるしかない。
#本当はクリップボードの文章そのまま整形したいけど、マルチプラットフォーム対応が面倒・・・・。

t-nkb.hatenablog.com


(2016/11/22)
javascript版も作った。
こっちだとブラウザ内で完結するので、使うならばこちらがおすすめ。
t-nkb.hatenablog.com


うまく翻訳できない例

例えば、以下の論文を例にあげて、翻訳を確認してみる。
https://arxiv.org/pdf/1312.5602.pdf

上記のアブストをそのままコピペしてみると以下のような形になる。

【コピペ英文】
We present the first deep learning model to successfully learn control policies di-
rectly from high-dimensional sensory input using reinforcement learning. The
model is a convolutional neural network, trained with a variant of Q-learning,
whose input is raw pixels and whose output is a value function estimating future
rewards. We apply our method to seven Atari 2600 games from the Arcade Learn-
ing Environment, with no adjustment of the architecture or learning algorithm. We
find that it outperforms all previous approaches on six of the games and surpasses
a human expert on three of them.


これをそのまま翻訳させると・・・・


【コピペ翻訳文】
我々は、制御ポリシーを正しく学習するための最初の深い学習モデルを提示する。
強化学習を用いて高次元の感覚入力から直腸にザ
モデルは畳み込みニューラルネットワークであり、Q-learningの変種で訓練され、
その入力は生のピクセルであり、その出力は将来を予測する価値関数である
報酬。アーケード学習の7つのAtari 2600ゲームに本手法を適用し、
アーキテクチャーや学習アルゴリズムを調整する必要はありません。我々
6つのゲームとそれを上回るすべての先のアプローチよりも優れていることがわかります
そのうちの3人の人間の専門家。


うん、いまいち。「感覚入力から直腸にザ」ってなんだ。
ここでの問題点は2点。Google翻訳は、
・改行=文の区切りと判断する
・-で前後の行にわかれた単語を解釈しない
という仕様になっているため、改行周りでバグっていることが原因。
数行なら手でつなげればいいけど、長文になるとやってられん。

改善

ということで、ハイフンと改行を見つけて文章をつなげてみた。
以下スクリプトをtrans.py等として保存し、同じ場所に"before"というファイルを作り、その中に論文の内容をコピペ→スクリプトを起動することで、afterに整形された文章が出てくる。

#! /usr/bin/python
# -*- coding:utf-8 -*-

if __name__ == '__main__':
    f = open('before', 'r')
    fw = open('after', 'w')
    for row in f:
        row = row.replace('-\n','')
        row = row.replace('\n',' ')
        fw.write(row)
    f.close()
    fw.close()

整形された文章がこちら。
わかりやすいように自動改行させない形で表示してみた。
これを見るとちゃんと一文として繋がっていることがわかる。

【整形後英文】
We present the first deep learning model to successfully learn control policies directly  from  high-dimensional  sensory  input  using  reinforcement  learning.   The model  is  a  convolutional  neural  network,  trained  with  a  variant  of  Q-learning, whose input is raw pixels and whose output is a value function estimating future rewards. We apply our method to seven Atari 2600 games from the Arcade Learning Environment, with no adjustment of the architecture or learning algorithm. We find that it outperforms all previous approaches on six of the games and surpasses a human expert on three of them .

これを翻訳させてみると・・・。

【整形後翻訳文】
我々は、強化学習を用いて高次元の感覚入力から制御ポリシーを直接学習するための最初の深い学習モデルを提示する。モデルは畳み込みニューラルネットワークであり、その入力は生のピクセルであり、その出力は将来の報酬を推定する価値関数である、Q学習の変形で訓練されている。アーケード学習環境の7つのAtari 2600ゲームにこの方法を適用し、アーキテクチャや学習アルゴリズムは調整しません。 6つのゲームでこれまでのすべてのアプローチよりも優れていることがわかり、3つのゲームでは人間の熟練者を上回ります。


わかる、わかるぞっ!!
ということで、便利になりましたよと。