AfterEffectsへIllustratorデータをシェイプレイヤーに変換する方法

本日は、Illustratorで作成した、aiデータをAfterEffectsでシェイプレイヤーとして活用する方法です。

After Effectsのプロジェクトから、
読み込み > ファイル > aiデータを選択
 ※読み込みの種類 = コンポジションレイヤーサイズ維持 を選択

これで、aiデータを、After Effects内へ取り込むことが出来ました。

次に、このaiデータをシェイプレイヤーに変換します。

コンポジション内のaiレイヤーを選択した状態で
右クリック > 作成 > ベクトルレイヤーからシェイプを作成

これで、レイヤー内の1個1個の要素がシェイプとして分割されて作成されます。

After Effectsを使って、コンポジションのカタチを自在に変形する方法

本日は、下記動画の7秒ころから
新しいコンポジションのカタチが横に広がっていく方法を紹介します。

シェイプレイヤーと、トラックマットを活用して作成していきます。
トラックマットについては、以前記事にも書きました。

主に、下記の3層になって作ります。
A:シェイプレイヤー → シェイプレイヤー1
B:画面に広がっていく動画 → main01_01
C:背景となる動画 → main01_02

ポイントとして、忘れてはいけないのが
main01_01 のトラックマットを、アルファマットシェイプレイヤー1 を選択することです。

これを設定することで、main01_01の動画が、シェイプレイヤーの大きさに切り取られたカタチになります。
この設定の状態で、シェイプレイヤー1のサイズを時間経過に合わせて、変化させてあげることで、動画がWideになっていく映像表現をすることが出来ます。

[:x] Ndarrayや配列における、thresholdの考え方。

今回は、thresholdの操作を紹介します。
(正式な呼称なのか知らない…)

使用目的は、データの分割や、データの一部を抽出するときのために使います。
実際の式変形を見てみましょう。

a = np.arange(24)

a = np.arange(24)
print(a)

threshold = 10

b = a[:threshold]
print(b)
c = a[threshold:]
print(c)

#a
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
#b
[0 1 2 3 4 5 6 7 8 9]
#c
[10 11 12 13 14 15 16 17 18 19 20 21 22 23]

numpyで0~23の数字が格納されたndarray型のデータを作成しました。
b, c, では、コロンがついている場所が違います。

b –> [:threshold] #thresholdよりも左側のデータ
[0 1 2 3 4 5 6 7 8 9]

c –> [threshold:] #thresholdよりも右側のデータ
[10 11 12 13 14 15 16 17 18 19 20 21 22 23]

続いて、画像データで見てみましょう。
画像が3枚、480×640のサイズ、3チャンネル(RGB)の画像が格納されたsumImageデータがあるとします。

sumImage.shape
#(3, 480, 640, 3)

それでは、sumImageデータを基にしてthresholdでのデータ分割、抽出の方法を見ていきましょう。

sumImage.shape[:1]
#(3)

(3, 480, 640, 3)の中で、1つ目のデータのみをデータ抽出しています。
※画像データが移行された訳ではない。shapeの情報を参照しているのみ。

cc = sumImage.shape[:3]
#(3, 480, 640)

同じく、3つ目よりも前の情報を取得しています。

bb = sumImage.shape[-3:]
#(480, 640, 3)

マイナスを使うことが出います。
マイナスは後ろから、という指定です。

では、shapeの情報だけではなく、画像データも分割、抽出することが出来るのでしょうか。

ff = sumImage[1:]
gg = ff.shape
#(2, 480, 640, 3)

1つ目以降の画像データ、2つ目と3つ目の画像データを含む(2, 480, 640, 3)が抽出されました。

After effectsのトラックマットの使い方

トラックマットとは何か

厳密な定義はあると思いますが
簡単にいうと、上のレイヤー(or コンポジション)に対して、合成の影響を与える設定です。

シェイプレイヤーと組み合わせて使うことによって、強力なツールとなります。

トラックマットには4種類の設定があります。
・アルファマット × (通常)
・アルファマット × 反転
・ルミナンスマット × (通常)
・ルミナンスマット × 反転

アルファマットは通常の合成です。
例えば、
星型のシェイプレイヤーの下に動画を設置、アルファマットをOnにすると、星型の動画にくり抜かれます。
これを、アルファマット × 反転をOnにすると、星型以外の部分が残った動画になります。

ルミナンスマットは輝度に対しての合成です。
輝度の高低でいうところの、白、黒のレイヤーの場合には、
白:合成される
黒:合成されない
(中間の輝度であれば、中間度合いで合成される)

Anacondaの中のライブラリバージョンを変更する方法

Anacondaの中にインストールしているライブラリのバージョンを変更する方法を紹介します。
とても簡単です。

Anaconda-Navigatorを開いてください。
HomeのAppications onで操作したい仮想環境を選択して下さい。
Environmentを見ると、インストール済みのライブラリを一覧を見ることが出来ます。

ライブラリの、左側にあるチェックボタンをクリック

「Mark for specific version installation」でインストールしたい、バージョンを選択します。

以上です。
とても簡単です。

After Effectsで、簡単にモーショングラフィックに挑戦

After Effectsの醍醐味と言えば、モーショングラフィックですね。
今回は、簡単にモーショングラフィックに挑戦する方法を紹介します。

基礎の基礎で、円系にぐるっと回るモーショングラフィックを作ります。
手順は下記です。

・シェイプレイヤーを作成
・シェイプレイヤーを選択した状態で、楕円形ツールで円を描く
・シェイプレイヤーの追加 > パスのトリミングを追加
・パスのトリミングで、「開始点」「終了点」を設定

シェイプレイヤーを作成

コンポジションの中で、
右クリック > 新規 > シェイプレイヤー

これで、シェイプレイヤーを作成できます。

■シェイプレイヤーを選択した状態で、楕円形ツールで円を描く

選択が、シェイプレイヤーになっている状態で。
画面上部の、「アンカーポイント」と「ペンツール」に挟まれた図形ツールで、楕円形ツールを選択します。

こちらの楕円形ツールで、
Shiftを押した状態で、マウスを動かすと、円形を描くことができます。

■シェイプレイヤーの追加 > パスのトリミングを追加

シェイプレイヤーにパスのトリミングを追加します。
シェイプレイヤーのコンテンツ右部に存在する
追加 > パスのトリミング
を選択します。

パスのトリミングで、「開始点」「終了点」を設定

最後に、パスのトリミングを設定します。
図形がパスとして認識されます。パスですので、「始点」「終点」が存在します。

これが、開始点・終了点のparameterで調整することができます。

試しに、終了点だけ調整してみましょう。
終了点 :0秒のところに、キーフレーム. 0%
終了点 :1秒のところに、キーフレーム. 100%

この設定は、円形が1秒間で、ぐるっと表示されるモーショングラフィックになります。
これに開始点も調整していきましょう。

開始点 :1 / 4秒のところに、キーフレーム. 0%
開始点 :1秒のところに、キーフレーム. 100%

こうすると、終了点を追っかけるかたちで、始点が遷移していき、
円の軌跡を描きながら、消えていく、モーショングラフィックになります。

以上となります。
まだまだ奥が深い、After Effectsですが、本日はこの辺で。

Tensorflow2.xで、1.xのバージョンを使う方法

以前、Tensorflow1.xについての記事を書きました。

Tensorflow1.xを用いる方法は幾つかありますが、
今回は Tensorflow2.x importした後に、部分的に1.xの関数などを利用したい場合です。

結論からいうと、
tf.compat.v1
を付けることです。

https://www.tensorflow.org/api_docs/python/tf/compat/v1

■例

tf.compat.v1.get_default_graph()

https://www.tensorflow.org/api_docs/python/tf/compat/v1/get_default_graph

2.xに随時移行していきましょう。

Youtube動画編集でテロップいれる際のコツ

Youtuberが爆増していますね。
Youtubeの動画編集であるあるなのは、「トーク内容のテロップ」入れだと思います。

実際にやったことがある人だと、分かると思うんですけども
地味だけども、めちゃくちゃ大変です。

今回は、Adobe Premiere Proを使って、
「トーク内容のテロップ」を入れる際には、

エッセンシャルグラフィックス

1択だと思っています。
エッセンシャルグラフィックスの使い方については、下記をご覧いただけたらと思います。

今回は、このエッセンシャルグラフィックスを使って、
如何に効率的に「トーク内容テロップ」を入れていけるのかという点について話していきます。

仕事の効率化ハウツーみたいになってしまいますが
ポイントは同じ作業を詰め込むです。

▼作業内容
( 1 ):人数分 (色分けすべき分)のエッセンシャルグラフィックスのレイヤーを用意
( 2 ):エッセンシャルグラフィックスのレイヤー部分を最初から最後まで伸ばす
( 3 ):レイヤーを切り刻む作業に集中する
( 4 ):特定の人の「トーク内容テロップ」を入力している際は、他の人のレイヤーは非表示

( 1 ):人数分 (色分けすべき分)のエッセンシャルグラフィックスのレイヤーを用意
( 2 ):エッセンシャルグラフィックスのレイヤー部分を最初から最後まで伸ばす

下記のように、
Aさん、Bさんが登場する動画がだとすると、
全編分、Aさん、Bさんのレイヤーを作成し、伸ばしてしまいます。

( 3 ):レイヤーを切り刻む作業に集中する

そして、まずは、セリフを打ち込む作業はぐっと、こらえて。
動画を再生させながら、とにかく、このレイヤーを切り刻むことに集中しましょう。
動画のセリフを聞きながら、いいタイミングでレイヤーを刻んでいくのです。
・画角に収まる文章量の範囲
・ツッコミや、ボケなどがいい感じで入るタイミング
を意識しながら、まずはレイヤーを切り刻んでいきます。

( 4 ):特定の人の「トーク内容テロップ」を入力している際は、他の人のレイヤーは非表示

最後に、テロップ文章を入力していきます。
ここで注意すべきことは、なるべく、1人づつ入力していくといいと思います(ケースバイケースなときも)
その際には、入力しない人のレイヤーを非表示にしましょう。
複数のレイヤーが画面上に存在すると、入力したい側のレイヤーが押しづらいので、非表示を有効的に使っていきましょう。

テロップ入力は非常に面倒な作業です。
極限まで、効率化して、作業時間を短くしていきたいものです。

Kerasで複数のmodelを結合する方法

転移学習をしようとした際に、modelを結合するという、概念を知りました。
簡単ではありますが、modelを結合する方法について書いていきます。

Kerasでのmodel結合を考える際には、
functional APIの考えが参考になりました。

■functional APIでKerasを始めてみよう
https://keras.io/ja/getting-started/functional-api-guide/

functional APIでmodelを作成する手順は
・Inputを定義
・layerの記載
・Modelを定義

■functional APIでModelを作成

実際に記載してみましょう。
modelは、ただDenseを結合していくだけです。

#ライブラリをimport
from tensorflow import keras
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Dropout, Flatten, Input

#inputの定義
inputs = Input(shape=model.output_shape[1:])

#layerの記載
X = Dense(100, activation='relu')(inputs)
X = Dense(100, activation='relu')(X)
prediction = Dense(2,activation='softmax')(X)

#Modelの定義
modelvol2 = Model(inputs=inputs , outputs=prediction)

#Modelの確認
modelvol2.summary()

_________________________________________________________________
Layer (type) Output Shape Param # =================================================================
input_5 (InputLayer) [(None, 34, 34, 64)] 0 _________________________________________________________________ dense_11 (Dense) (None, 34, 34, 100) 6500 _________________________________________________________________ dense_12 (Dense) (None, 34, 34, 100) 10100 _________________________________________________________________ dense_13 (Dense) (None, 34, 34, 2) 202 =================================================================

■layerの記載に説明します。
layerインスタンス = layer内容( 結合するlayer )
という表記で作成していきます。

Sequential型であれば、
layer.add()で記載していく部分です。

■Modelの定義について説明します。
Model(inputs= XXX, outputs=YYY)で定義できます。
XXX・YYYにはlayerインスタンスを格納していきます。

predictionは最後の層です。が、
それまで継承してきた、Xも引き継いでいます。

・Layerの継承方法
・Modelの定義方法
が、modelを結合していく為に必要な考え方です。

modelを結合するために、もう一つmodelを作成します。

■Keras SequentialでModelを作成

modelvol1を作ります。
CNN型のmodel layerを並べました。

image_size = 150
modelvol1 = Sequential()
modelvol1.add(Conv2D(32,(3,3), activation='relu',input_shape=(image_size,image_size,3)))
modelvol1.add(MaxPooling2D(pool_size=(2,2)))
modelvol1.add(Conv2D(64,(3,3), activation='relu'))
modelvol1.add(MaxPooling2D(pool_size=(2,2)))
modelvol1.add(Dropout(0.25))

それでは、この2つのmodel を結合していきます。
結合していくときには、
・Layerの継承方法
・Modelの定義方法
を活用していきます。

新しく生成するmodelをmodelYとして作成していきます。

modelvol1 → modelvol2 の流れになるように結合していきます。

modelY = 
 Model(inputs=modelvol1.input , outputs=modelvol2(model.output))
modelY.summary()

_________________________________________________________________
Layer (type) Output Shape Param # =================================================================
conv2d_12_input (InputLayer) [(None, 150, 150, 3)] 0 _________________________________________________________________ conv2d_12 (Conv2D) (None, 148, 148, 32) 896 _________________________________________________________________ max_pooling2d_8 (MaxPooling2 (None, 74, 74, 32) 0 _________________________________________________________________ conv2d_13 (Conv2D) (None, 72, 72, 64) 18496 _________________________________________________________________ max_pooling2d_9 (MaxPooling2 (None, 36, 36, 64) 0 _________________________________________________________________ dropout_6 (Dropout) (None, 36, 36, 64) 0 _________________________________________________________________ model_10 (Model) (None, 36, 36, 2) 16802 =================================================================

これで、modelの結合は完了です。
>> model_10 (Model) (None, 36, 36, 2) 16802
の部分が、modelvol2で作成した部分です。

Model(inputs=modelvol1.input , outputs=modelvol2(model.output))

について少し解説します。
と、言っても、functional API部分の繰り返しになってしまいますが。

Modelの定義をしています。
( model結合と言っても、要は2つのmodelから、1つのmodelを生成している )

▼inputs
inputsは、modelvol1.inputの入力部分を

▼outputs
outputsは、modelのlayer部分を記載します。
実際に記載した内容は
modelvol2(model.output)です。
functional API部分でも記載した通り

layerインスタンス = layer内容( 結合するlayer )

というカタチで、継承していきます。
modelvol2(model.output)

これは、modelの最後部分に対して、modelvol2が継承するカタチになっています。
それがoutputsに入力されているのです。

これで、modelvol1 → modelvol2 の結合が完成しました。

functional APIでのmodelの作り方は、初めは避けていたのですが
転移学習を学んだり、modelについての理解を深めるためには、非常に重要な考え方でした。

Colaboratoryで、機械学習済みのModelを使い予測値を算出する。

機械学習をやり初めのときに疑問だったことは、
Colaboratoryなり、Anacondaなり使って、モデルを作ることが出来るんだけども、
どうやって、アプリケーションするのか?ということでした。

結論から言ってしまうと、modelデータを保存→ダウンロードして、他のアプリケーションに組み込むです。modelはmodelの形式や、重み・バイアスが、バイナリーデータとして格納されています。
他のアプリケーションで利用する際には、学習時に成形した入力形式が定まっているので、入力する際には注意が必要かと思います。

■Colaboratoryで、機械学習済みのModelを使う

それでは、簡単ではありますが、実際に使ってみます。
色々とやり方はあるかと思いますが、
今回は機械学習済みModelの、重み・バイアスを抽出して、予測値を算出していきます。

大まかな流れとしては、
・学習済みModelをUpload(ディレクトリへ格納)
・モデルの定義
・重み、バイアスのロード
・予測を実行

まずは、学習したModelをUploadします。

/content/model_data/ ディレクトリ配下に
modelDone.hdf5 というファイル名にてUploadする。

Modelを定義します。
これは、機械学習をした際と同じModelを定義します。
Kerasを活用するとします。(Libraryはimport済み)

#modelの定義
model = tf.keras.models.Sequential()
model.add(Flatten(input_shape=(28, 28)))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))

Modelに対して、重み・バイアスを読み込ませます。

model.load_weights('/content/model_data/modelDone.hdf5')

これで、学習した状態と同じ状態になります。

予測値を算出するには、学習したときと同じ入力形式で、データを入力し、予測を実行させて上げればよいのです。

predicted = model.predict(入力データ)
#変数 predicted に予測値が出力される。