tmp

# 必要なモジュールをインポート
import cv2
import numpy as np

# 画像Aと画像Bのファイルパスを指定
img_a_path = "img_a.jpg"
img_b_path = "img_b.jpg"

# 画像Aと画像Bを読み込む
img_a = cv2.imread(img_a_path)
img_b = cv2.imread(img_b_path)

# 画像Aと画像Bのサイズを取得
h_a, w_a, _ = img_a.shape
h_b, w_b, _ = img_b.shape

# 画像Bを画像Aの中央に貼り付けるための座標を計算
x = (w_a - w_b) // 2
y = (h_a - h_b) // 2

# 画像Bの縁にぼかしを入れるためのマスクを作成
# マスクは画像Bと同じサイズで、中央は白く、縁は黒くなるようにする
mask = np.zeros((h_b, w_b), dtype=np.uint8)
mask = cv2.rectangle(mask, (0, 0), (w_b, h_b), 255, -1) # 全体を白く塗る
mask = cv2.rectangle(mask, (10, 10), (w_b - 10, h_b - 10), 0, -1) # 中央を黒く塗る
mask = cv2.GaussianBlur(mask, (21, 21), 0) # ガウシアンフィルタでぼかす

# 画像Bにマスクを適用して、縁にぼかしを入れる
img_b_blur = cv2.bitwise_and(img_b, img_b, mask=mask)

# 画像Aに画像Bを貼り付ける
img_a[y:y+h_b, x:x+w_b] = img_b_blur

# 結果を表示
cv2.imshow("Result", img_a)
cv2.waitKey(0)
cv2.destroyAllWindows()

python cv2.findContours sample

import numpy as numpy
import cv2

def make_list(filepath: str):
    # read
    img = cv2.imread('tmp.bmp', 0)

    # find_contours
    contours, hierarchy = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

    # make list
    listx =
    listy =
    for tmp in contours[0]:
        x, y = tmp[0]
        listx.append(x)
        listy.append(y)

    # return
    return listx, listy

if __name__ == '__main__':
    listx, listy = make_list('tmp.bmp')

AmongUs 役職追加MOD「The Other Roles」導入方法

f:id:rew05:20210817162721p:plain AmongUsのMODで、最近流行の「The Other Roles」についてメモ

注意

  • 非公式MODです。インストールは自己責任で。
  • MOD製作者ではありません。本記事も身内用のメモです。質問などは受け付けておりません。
  • 2021/08/17時点での手順です。アップデートなどで手順の変更が発生する可能性があります。
  • 気が向いたら更新します。

導入手順

  1. 下記ページにアクセスする。 https://github.com/Eisbison/TheOtherRoles/releases/latest
  2. 「TheOtherRoles.zip」と書かれたリンクからzipファイルをダウンロードする。
  3. 「amongus.exe」があるフォルダを開く。
    Steamのライブラリを開き、Among Usを右クリック→[管理]→[ローカルファイルを閲覧]→フォルダが開く。
    以下、参考画像
    f:id:rew05:20210817161055p:plain
    Steamスクリーンショット
  4. 1でダウンロードしたzipファイルを解凍する。
  5. 解凍すると中に3つのフォルダと3つのファイルがあるので、それらを手順3で開いたフォルダにコピペする。
  6. 通常通りAmong Usを起動する。初回起動時は少し時間がかかる。
  7. 起動後のトップ画面が変わっていればインストール成功。
    f:id:rew05:20210817161258p:plain
    インストール成功後のAmongUsトップ画面

できること

基本的にGithubに詳しい説明が書いてあるので、読める人はそっちを読んでください。

ゲーム設定

  • ロビーの歯車マークから設定できる項目が増える。
    • StreamerMode:Onにすると部屋コードがThe Other Rolesのロゴで隠れる。
    • Ghosts Can See Roles、Ghosts Can See Votes:死んだプレイヤーが視認できる情報の設定。
  • ロビーのPCから部屋主が変更可能な項目が増える。
    • Map:プレイするマップを変更できる。Dleksも選択できる。
    • 各役職名:役職の出現率を設定できる。10%単位で設定可能。10%以上に設定すると、クールダウンなど各役職の詳細な設定ができる。
    • Number Of Meetings:1試合全体で押せる緊急ボタンの数を制限できる。例えば8で設定した場合、その試合で他プレイヤーが8回ボタンを押していると自分が緊急ボタンを使っていない場合でも緊急ボタンを押すことが出来ない。Mayerは
    • Block Skipping Emergency Meetings:Onにすると会議時にSkipボタンが使用できなくなる。時間までに投票しないと自投票になる。
    • Hide Player Names:Onにするとプレイヤー名が非表示になる。Lovers、Imposter、Jackal陣営の場合、チームメイトの名前は表示される。

【とりあえず動かすChainer】pix2pix

f:id:rew05:20171003232931p:plain

今更だけど、chainerでpix2pixを動かすやつ。

 

以下のソースコードをお借りしました。

github.com

 

pix2pixとは

簡単に言うと画像変換ネットワーク。

2つの画像A,Bをペアで学習させることで、画像A’を入力すると画像B'を出力するモデルになる。

https://arxiv.org/pdf/1611.07004v1.pdf

具体例は上記論文の画像を見てもらうとして、有名どころとしては

  • 線画→実写真
  • モノクロ→着色

などだろうか。

 

今回はお借りしたソースコードを動かして、学習が進むにつれて生成画像がそれっぽくなる様子を紹介する。

 

使用する環境は以下、マシンスペックはこちら→PC買いました。 - 深層ロック

Python3.5(Anaconda4.4.0)

Chainer == 2.0.0

cupy == 1.0.3

tqdm == 4.14.0

 

準備

githubからソースをダウンロードし、任意のフォルダに展開。今回はC:\python\pix2pixに展開する。

f:id:rew05:20171003221249j:plain

 

次にREADME.mdに記載されているhttp://cmp.felk.cvut.cz/~tylecr1/facade/からデータセットをダウンロードし「C:\python\pix2pix\facade」に配置。(extendedは要らないかも)

f:id:rew05:20171003221557j:plain

 

データセットについて

データセット

の同名異拡張子の3ファイルで1組になっている。jpgは実際の建物の写真、pngはjpgのラベリング画像。(xmlpng作成時に使用?生成?たぶん使わない。)

ここで言うラベリングとは、画像に写る各部位を色で表現する方法で、例えば今回の場合、濃い青は外壁、黄色は窓のシャッター(?)、赤は柱を表す色になっている。実際の写真とラベリングされた画像をペアで覚えさせることで、ラベリング画像を入力したときに「ここは赤色だから柱」「濃い青だから壁」と認識して建物っぽい画像を生成して出力する。

f:id:rew05:20171004232555p:plain

学習

コマンドプロンプトを開き、下記コマンドを実行。

python train_facade.py

 GPUを使用する場合は後ろに「-g 0」を引数で追加。

f:id:rew05:20171003222131j:plain

(データセットをダウンロードし忘れると上部のエラーが出る。わ、わざとだし・・・)

 

学習の際に建物の画像はランダムな位置から256*256pixelで切り抜かれ使用される。学習途中で行うテストには上記切り抜き画像を使用し、5*5=25枚並べた状態で出力される。

 

前述したスペックで学習終了まで約6時間半。朝起きたら終わってた。

学習の途中経過は「C:\python\pix2pix\result」に、学習途中で生成した画像は「C:\python\pix2pix\result\preview」に出力される。image_gen_***.pngが生成画像、image_gt_***.pngが正解画像、image_in_***.pngがラベル画像。

 

以下に出力された画像を結合した画像を配置した。左から生成画像、正解画像、ラベル画像。

f:id:rew05:20171004001758p:plain

学習1000回

f:id:rew05:20171004214034p:plain

学習30000回

f:id:rew05:20171004213627p:plain

学習59000回


学習回数が増えるにつれて、ぼんやりしていた部分がはっきりしてきたり、壁やパーツのバリエーションが増えていることがわかる。

 

おわり

 このようにpix2pixを使うと12色の画像から本物の建物っぽい画像が生成できる。今回のラベリング画像は識別しやすいように色を分けているが、コンピュータ的には値が1でも違えば識別できるので、実際は0000~1111までの4bitあれば今回の学習を再現することができる。しゅごい。

 

次は違うデータセットでやってみたい。ラベリングがめんどい。

 

 

 

 

 

ワイヤレスイヤホン買いました。

 

ワイヤレスイヤホン買いました。

 音質的なことはわからないので使用感について書きました。参考までに。

 

使用状況

基本は通勤時に音楽を聴くために使用。常用の携帯とは別に持ち歩いているiPod touchから再生。ほかの接続先は常用の携帯(Xperia)とデスクトップPC(Bluetooth非対応)。

 

メリット

①体の前にイヤホンがぷらぷらしない。

すごい快適。体感して初めて分かったけど、コードってだいぶストレスあったんだなーと思った。コード自体もだけれど、コードの接続先を線でつなげる範囲に置かなくてもいいのって楽。鞄の中に入れておけばいいのが楽すぎて、これだけで有線には戻れない。


②コードが絡まらない。

イヤホン部がマグネットになっている、コードが短い&きし麺なので、基本的に絡まらない。絡まれない。なので絡まり対策(コードをまとめる、プレイヤーに巻き付けるなど)を施す必要がない。デジタルとアナログの差はあるけれど断線の心配がないから、自分の使い方的に耐久性は上がる気がする。

 

デメリット

①充電管理

充電めんどい。いくら少し充電すればすぐ使えるとは言えどめんどい。フル充電で6時間(体感5時間くらい)使えるけど、片道1.5時間の通勤だと毎日充電しないといけない。そして携帯と違って充電しながら使えるわけでもないのがネック。充電量はiOS端末なら見れるけれど、自分の場合鞄の中だから見ない。


②ペアリング周り

普段はiPod touchを使って音楽を聴いているけれど、TwitterのGIF動画をみるときはXperia、そしてデスクトップPC。ペアリング登録は2台まで。有線の場合は差し替えればいいけど無線の場合はペアリングし直しが必要。なので結局有線イヤホンはPC前で待機。

 

まとめ

  • 短距離移動/2端末以内の場合は手間削減。
  • 日常的に長距離移動/3端末以上の場合は手間微増。

3000円でこのメリットなら十分元は取れたという印象。値段あげて再生時間長いのを選ぶのもありかも。

 

 

リッチなプログレスバー、tqdm

機械学習をしていると進捗状況をみつつ作業することが多い(らしい)。

確かに仕事で機械学習を行う際に、終了時間の検討がつかないことには次の作業に移りづらい。上司に報告しづらい。メンタル的につらい。仕事辞めたい。

 

そんなあなたにtqdm

 

for文にかませるだけで、進捗パーセンテージ、経過時間、終了までの残り時間を表示してくれる。

以下、使用例。まずは普通のfor文

import time
for i in range(100)
sleep(0.1)

 

このfor文に、以下のようにtqdmをかませる。

from tqdm import tqdm
import time
for i in tqdm(range(100))
time.sleep(0.1)

そうすると

26%|███████████▏ | 26/100 [00:02<00:07, 9.36it/s]

なんかこんな感じの進捗バーが出る。おしゃみが高い。

 以下は上記例と同義。tqdm(range(xxx)) = trange(xxx)

from tqdm import trange
import time
for i in trange(100)
time.sleep(0.1)

 

なおimport時に import tqdmだけだと以下のエラーが出る。たまにミスるからメモ。

TypeError: 'module' object is not callable

 

2017/09/25 追記: 

そのままでも十分使えるけど、以下の引数を追加してより良いプログレスバーに。

 

desc='xxx':プログレスバーの名前を指定可能。

 leave=True or False:Falseを指定することで、プログレスバーが100%に達したときにバーの表示が削除される。

 勉強次第追加します。。。

Anacondaを使用したPython仮想環境の構築

1台のPCにPythonの環境を複数作成する方法はいくつかあるが、
Windowsはほぼ1択っぽいのでメモ。

 

環境

Windows10 x64 Home

Python 3.6.1 (Anaconda3 4.4.0 64-bit)

 

下記コマンドをコマンドプロンプトで入力することで、

簡単に仮想環境を作成できる。

conda create -n [仮想環境名] python=[Pythonバージョン番号] anaconda

例えば

conda create -n py27 python=2.7 anaconda

と入力して実行すると、Python2.7の環境が仮想環境として作成される。

 

作成後は

conda info -e

と入力することで、作成済みのバージョンを確認可能。

 

仮想環境の使用および構築の続きは、下記コマンドで仮想環境をアクティベート後に行う。

activate [仮想環境名]

activateに成功すると、コマンドの行頭に仮想環境名が追加される。この状態で導入したパッケージや設定は、activateしている環境でのみ適用される。

root環境に戻る場合は下記コマンドでdeactivateする。

deactivate

 

 作成した仮想環境を削除する場合は以下。

conda remove -n [仮想環境名] --all