乙Py先生のプログラミング教室

乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

今回はPythonで様々なファイルを
取り扱う方法についてです


解説動画はこちら



今回はPython言語で色々なファイルを取り扱う方法のまとめ
様々な形式のファイルの確認、再生、編集方法について

今回取り扱うファイル形式は
以下の通りです

テキストファイル
 txt , json , csv

エクセルファイル
 xlsx

画像ファイル
 png , jpeg

動画ファイル
 mp4 , mov

音声ファイル
 mp3 , WAV , AIFF


全体的にファイル名やファイルパスなどは
書き換えて行って下さい


1.テキストファイル
拡張子:.txt
プレーンテキストのことで
文字コードによって表される
データだけが含まれるファイル形式です

with openの構文で
ファイルを開けます

一気にファイルを開く方法
# テキストファイルを開く
with open('file/sample_text.txt') as _f:
    text = _f.read()
    
print(text)

ただし、上記の方法だと
サイズの大きいファイルを開くと
固まってしまう可能性があります

そんな場合は1行づつ読み込みします


ファイルを1行づつ開く方法
# テキストファイルを開く
with open('file/sample_text.txt') as _f:
    for i,row in enumerate(_f):
        # 特定行数でブレイクする
        if i>0:
            break
        print(row)

この場合は任意の行数でプレビューする事で
大きなサイズのファイルも開けます


テキストファイルの書き込み

with open構文に引数 w を追加すれば
書き込みを行えます

# テキストファイルを書き込みする
with open('file/out.txt','w') as _w:
    _w.write('さんぷる\n')
    _w.write('テキスト')
    _w.write('書いてみよう\n')



2.Json形式
拡張子 : .json
辞書形式のテキストファイルで
文字列のキーと値のペアをコロンで対
コンマ区切り、全体を波カッコ { } で括る
ファイル形式です


Jsonファイルを開く方法

jsonライブラリで
json.loadを使います
import json

with open('file/sample_json.json') as _f:
    json_data = json.load(_f)

print(json_data)
print(type(json_data))
print(len(json_data))

読み込み後のデータは
辞書型になっています


Jsonファイルをの書き込み

辞書型のデータを
json.dumpでjsonファイルに書き込みできます
sample_dict = {"A":1,"B":2,"C":{"D":444,"E":666}}

with open('file/out.json' , 'w') as _w:
    json.dump(sample_dict , _w , ensure_ascii=False)



3.CSVファイル
拡張子 : .csv
「 , 」カンマ区切りのテキストファイル

テキストファイル同様
with構文で読み書きが行えます

読み込んだあとに
カンマで区切ればデータ化できます
# CSVファイルを開く
with open('file/sample_csv.csv') as _f:
    for i,row in enumerate(_f):
        rows = row.replace('\n','').split(',')
        print(rows)


CSVライブラリを用いると いい感じでカンマ区切りを行ってくれます
# CSVライブラリを使用する場合
import csv

with open('file/sample_csv.csv') as _f:
    reader = csv.reader(_f)
    for row in reader:
        print(row)

CSVファイルの書き込みは
テキストファイル同様にし
拡張子を「.csv」にして
カンマ区切りのテキストにすれば
良いです



Pandasライブラリで開く場合

開いた場合のデータ形式は
「データフレーム」となります
import pandas as pd

df = pd.read_csv('file/sample_csv.csv')

df


PandasライブラリでCSVファイルの書き込み
df.to_csv('file/out.csv' , index=False)



4.エクセルファイル

拡張子 : .xlsx
MicrosoftのExcel形式


Pandasライブラリで開く場合

開いた場合のデータ形式は「データフレーム」となります
綺麗な表形式になっていないとうまく開けないので
注意が必要です


import pandas as pd

df = pd.read_excel('file/pop_area_2009.xlsx')

df


openpyxl を用いる方法

エクセル操作用のライブラリで
閲覧・編集・保存など様々な操作を行えます
要インストール(openpyxl)


openpyxlでエクセルファイルの読み込み
import openpyxl

wb = openpyxl.load_workbook('file/pop_area_2009.xlsx')

# ワークブック内のアクティブなシートを取得
ws = wb.active

# セルA1を表示
print(ws["A1"].value) 

openpyxlで行列を指定して閲覧
for r in range(1,5):
    for c in range(1,5):
        val = ws.cell(row=r, column=c).value
        print(val , end='\t')
    print()




5.画像ファイル
拡張子 : .png .jpegなど
静止画などの画像形式

PILでイメージの読み込み
Matplotlibで表示

import matplotlib.pyplot as plt
from PIL import Image
%matplotlib inline

# 画像の読み込み
im = Image.open("file/kosakana.png")

# 表示サイズの指定
plt.figure(figsize=(10, 12))
# 画像の表示
plt.imshow(im)
# 軸の表示の削除
plt.axis('off')
plt.show()



opencvで画像の読み込み

要インストール(opencv)
そのまま読み込みすると
色の順番がBGR(青、緑、赤)になってしまうので
RGBに変換が必要です
import matplotlib.pyplot as plt
import cv2
%matplotlib inline

# 画像の読み込み
im_cv = cv2.imread("file/kosakana.png")

# 画像のBGRをRGBに変換する
im_rgb = cv2.cvtColor(im_cv, cv2.COLOR_BGR2RGB)

# 表示サイズの指定
plt.figure(figsize=(10, 12))
# 画像の表示
plt.imshow(im_rgb)
# 軸の表示の削除
plt.axis('off')
plt.show()


モザイク処理なんかも
行う事ができます
# 画像の読み込み
im_cv = cv2.imread("file/kosakana.png")
# 画像のBGRをRGBに変換する
im_rgb = cv2.cvtColor(im_cv, cv2.COLOR_BGR2RGB)

# モザイク処理を行う
ratio = 0.06
tmp_img = cv2.resize(im_rgb, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
dst = cv2.resize(tmp_img, im_rgb.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)

# 表示サイズの指定
plt.figure(figsize=(10, 12))
# 画像の表示
plt.imshow(dst)
# 軸の表示の削除
plt.axis('off')
plt.show()



6.動画ファイル
拡張子 : .mp4 .mov
静止画の集まり + 音声になっているので
opencvで開けます


opencvでのファイルの読み込み

import cv2

cap = cv2.VideoCapture('file/kosakana.mp4')

# データ型
print(type(cap))

# 動画のサイズ
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# フレームレート
print(cap.get(cv2.CAP_PROP_FPS))

# フレーム数
print(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# 秒数
print(cap.get(cv2.CAP_PROP_FRAME_COUNT) / cap.get(cv2.CAP_PROP_FPS))


Jupyter Notebookで動画ファイルの再生

単純なプレビューなら
Jupyter Notebookで行う事ができます
from IPython.display import Video

Video('file/result_voice.mp4',width=600)




7.音声ファイル

拡張子 : .mp3 .wav .aiff

Jupyter Notebookで音声ファイルの再生
from IPython.display import Audio

Audio('file/kosakana.wav')



Librosaライブラリを用いる方法

Pythonの音声解析用のライブラリで
様々な解析を行う事ができます
要インストール(librosa)

下記はバージョン0.9.2のコードです
バージョンによりメソッドが
かなり異なるので注意が必要です

Librosaで音声ファイルの読み込み

import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter('ignore')
%matplotlib inline

print(librosa.__version__)

file_path = 'file/kosakana.wav'

# 音声をnumpyのndarrayに読み込みする
y, sr = librosa.load(file_path , sr=None, mono=False)


print(y.shape)
print(type(y))

# サンプリング周波数
print(sr)


Librosaで音声波形の表示
plt.figure(figsize=(12,6))
librosa.display.waveshow(y, sr)
plt.show()


Librosaでスペクトログラムの表示

音声を周波数分析して色による強さ
周波数、時間の3次元表示
y, sr = librosa.load(librosa.ex('choice'), duration=15)
fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True ,figsize=(12, 10))
D = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max)
img = librosa.display.specshow(D, y_axis='linear', x_axis='time',sr=sr, ax=ax[0])



こんな感じで、Python言語では
様々な形式のファイルを扱う事ができます

上記で世の中にある
ほとんどのファイル操作が行えると思いますので
ファイルを取り扱って自動化したい場合は
参考にしてみて下さい

それでは







 

今回は音声に合わせて
リップシンク動画を作成できる
「Wav2Lip」でリップシンク動画を
作ってみました


解説動画はこちら



はじめに:

Wav2Lip: Accurately Lip-syncing Videos In The Wild

このWav2Lipというライブラリは
動画内の人物の口の形を
音声にあわせて変える事ができます

これを使えば簡単に
リップシンク動画を作る事ができます

音声に合わせて、動画の方を変えられるので
言ってない事を言ってる様に
見せる事ができます


インストール方法

Google Colabでの利用方法です

1.ランタイムのタイプを変更から「GPU」に変更する

CPUでは利用できないようなので
ランタイムの変更から「GPU」
に切り替えておきましょう

2.ライブラリのインストール
結構たくさんあるんですが
次のコードでライブラリ群のインストールが出来ます

Google Drive を利用するので
空き容量は確認しておきましょう
# MiniCondaのインストール
%%bash
MINICONDA_INSTALLER=Miniconda3-py37_4.8.2-Linux-x86_64.sh
MINICONDA_DOWNLOAD_HP=https://repo.anaconda.com/miniconda
MINICONDA_PREFIX=/usr/local
wget $MINICONDA_DOWNLOAD_HP/$MINICONDA_INSTALLER
chmod +x $MINICONDA_INSTALLER
./$MINICONDA_INSTALLER -b -f -p $MINICONDA_PREFIX
# Googleドライブのマウントと作業フォルダへの移動
from google.colab import drive
drive.mount('/content/drive')
%cd '/content/drive/My Drive/'
!mkdir W2L
%cd 'W2L'
# パッケージのインストール
!git clone https://github.com/Rudrabha/Wav2Lip.git
%cd Wav2Lip
!pip install -r requirements.txt
!pip install resampy==0.3.1
3.モデル(wav2lip.pth)を「Wav2Lip/checkpoints」に配置

以下のURLよりモデルをダウンロードして
checkpointsフォルダにアップロードする
モデルのダウンロード先

リンクは「Model」の「Wav2Lip」の「Link」です
ダウンロードやアップロードに時間がかかるので
Google DriveのUIで操作する方が早いかもしれません


4.音声と動画を「Wav2Lip」フォルダの直下に配置

音声(WAV形式) : ファイル名.wav
動画(MP4形式) : ファイル名.mp4
という名称でファイルを置いておきましょう

配置したファイルの確認は
次のコードで行えます

# 音声ファイルの確認
from IPython.display import Audio

audio_file_path = "kosakana.wav"
Audio(audio_file_path)

5.推論を実行

resultsフォルダ内に結果出力されます

!python inference.py \
    --checkpoint_path checkpoints/wav2lip.pth \
    --face 動画ファイル名.mp4 \
    --audio 音声ファイル名.wav

あとは出来上がりを確認してみましょう
どんなリップシンク動画になったのかは
動画をご覧ください

それでは

今回は物体検知のライブラリである
YOLOを使って色々な画像の物体を検知してみました

解説動画はこちら



YOLOとは

YOLOは
リアルタイムオブジェクト検出アルゴリズム
のことで、You Look Only Onseの略
だそうです

オブジェクトの検出と
クラス分類を同時に行う事ができ
画像をグリッドセルとして扱って
オブジェクトに当てはめ

オブジェクトが存在する場合
どのクラスに属するかを確率で示してくれる
というものです

早速物体検知をやってみましょう

Google Colabで使う事ができる
コードサンプルです

Google Colabへのインストール方法


一番最初はGoogle Driveのマウントです
# Google ドライブをマウントする
from google.colab import drive
drive.mount('/content/drive')

コードを実行すると
ドライブのマウントに関する
アカウントの許可が求められるので
自分のアカウントを指定します

次にコード類のインストールです
# マウント場所に移動
%cd  /content/drive/MyDrive/

# YOLO V5をGithubより入手
!git clone https://github.com/ultralytics/yolov5.git

# YOLOに必要なモジュールをインストール
%pip install -qr yolov5/requirements.txt

# インストール場所に移動
%cd  /content/drive/MyDrive/yolov5

これを実行すると
ドライブ内にインストールされる形になります


サンプル画像を見てみる

物体検知を行う画像は
data/images/ 配下に
置くようになっているようです

ここに画像を置いておきましょう

サンプル画像を確認するコードはこれです
# サンプル画像の表示
from IPython.display import Image, display
display(Image('画像パスを指定',width=400))

画像の物体検知を行うには
次のコードで行います
# 画像内の物体検知を行う
!python detect.py --source data/images/画像ファイル名

結果は
runs/detect/フォルダ名
配下の同名のファイルになります

サンプル画像で行うと
こんな結果になります

download

オブジェクトが存在する領域を
バウンディングボックスで
ボックス内のクラス分類を行って
その確率を0-1の間で返してくれます


動画では
色々なサンプル画像で検出を行っているので
そちらも参考にしてみて下さい

今回はここまでです
それでは


このページのトップヘ