Spaces:
Sleeping
Sleeping
File size: 6,293 Bytes
327b68f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
#coding=utf-8
import os
import cv2 # OpenCV λΌμ΄λΈλ¬λ¦¬
import numpy as np
from PIL import Image
# -- IO utils
# ν
μ€νΈ λΌμΈ λΆλ¬μ€κΈ°
def read_txt_lines(filepath):
# νμΌμ΄ μλμ§ νμΈ, μμΌλ©΄ AssertionError λ©μμ§λ₯Ό λμ
assert os.path.isfile( filepath ), "Error when trying to read txt file, path does not exist: {}".format(filepath) # μνλ 쑰건μ λ³μκ°μ 보μ¦νκΈ° μν΄ μ¬μ©
# νμΌ λΆλ¬μ€κΈ°
with open( filepath ) as myfile:
content = myfile.read().splitlines() # λ¬Έμμ΄μ '\n' κΈ°μ€μΌλ‘ μͺΌκ° ν list μμ±
return content
# npz μ μ₯
def save2npz(filename, data=None):
# λ°μ΄ν°κ° λΉμ΄μλμ§ νμΈ, μμΌλ©΄ AssertionError λ©μμ§λ₯Ό λμ
assert data is not None, "data is {}".format(data)
# νμΌ μμ κ²½μ°
if not os.path.exists(os.path.dirname(filename)):
os.makedirs(os.path.dirname(filename)) # λλ ν 리 μμ±
np.savez_compressed(filename, data=data) # μμΆλμ§ μμ .npz νμΌ νμ μΌλ‘ μ¬λ¬ λ°°μ΄ μ μ₯
def save2npz(filename, data=None):
"""save2npz.
:param filename: str, the fileanme where the data will be saved.
:param data: ndarray, arrays to save to the file.
"""
assert data is not None, "data is {}".format(data)
if not os.path.exists(os.path.dirname(filename)):
os.makedirs(os.path.dirname(filename))
np.savez_compressed(filename, data=data)
# λΉλμ€ λΆλ¬μ€κΈ°
def read_video(filename):
cap = cv2.VideoCapture(filename) # μμ κ°μ²΄(νμΌ) κ°μ Έμ€κΈ°
while(cap.isOpened()): # μμ νμΌ(μΉ΄λ©λΌ)μ΄ μ μμ μΌλ‘ μ΄λ Έλμ§(μ΄κΈ°νλμλμ§) μ¬λΆ
# ret: μ μμ μΌλ‘ μ½μ΄μλκ°?
# frame: ν μ₯μ μ΄λ―Έμ§(frame) κ°μ Έμ€κΈ°
ret, frame = cap.read() # BGR
if ret: # νλ μ μ 보λ₯Ό μ μμ μΌλ‘ μ½μ§ λͺ»νλ©΄
yield frame # νλ μμ ν¨μ λ°κΉ₯μΌλ‘ μ λ¬νλ©΄μ μ½λ μ€νμ ν¨μ λ°κΉ₯μ μ보
else: # νλ μ μ 보λ₯Ό μ μμ μΌλ‘ μ½μ§ λͺ»νλ©΄
break # while λΉ μ Έλκ°κΈ°
cap.release() # μμ νμΌ(μΉ΄λ©λΌ) μ¬μ© μ’
λ£
# Video μ 보 κ°μ Έμ€κΈ°
def get_video_info(infilename, is_print=False):
cap = cv2.VideoCapture(infilename)
if not cap.isOpened():
print("could not open : ", infilename)
cap.release()
exit(0)
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
cap.release()
if is_print:
print('length : ', length)
print('width : ', width)
print('height : ', height)
print('fps : ', fps)
video_info = {
'length': length,
'width': width,
'height': height,
'fps': fps,
}
return video_info
# Video -> Numpy
# μ°Έκ³ κΉνλΈ μ½λ: https://github.com/khazit/Lip2Word/blob/master/lipReader.py#L22
def videoToArray(video_pathname, is_gray=True) :
cap = cv2.VideoCapture(video_pathname) # μμ κ°μ²΄(νμΌ) κ°μ Έμ€κΈ°
# μμ νμΌ(μΉ΄λ©λΌ)μ΄ μ μμ μΌλ‘ μ΄λ¦¬μ§ μμ κ²½μ°
if not cap.isOpened():
print("could not open : ", video_pathname)
cap.release() # μμ νμΌ(μΉ΄λ©λΌ) μ¬μ© μ’
λ£
exit(0) # λΉ μ Έλκ°κΈ°
n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # μμ νλ μ κ°μ
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # μμ λλΉ
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # μμ λμ΄
fps = cap.get(cv2.CAP_PROP_FPS) # μμ FPS(Frames Per Second)
if is_gray:
video = np.zeros((n_frames, height, width)) # gray
else:
n_channels=3
video = np.zeros((n_frames, height, width, n_channels)) # color
video = video.astype(np.uint8)
i = 0
while True :
success, frame = cap.read()
if not success :
break
else :
# gray scale μ μ©
if is_gray:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
video[i] = frame
i += 1
cap.release() # μμ νμΌ(μΉ΄λ©λΌ) μ¬μ© μ’
λ£
return video # μμ μ 보 μμ μμ νλ μ κ°μλ₯Ό μΆκ°ν numpy λ°ν
# Frame Sampling (νλ μ κ°μ λ§μΆκΈ°)
# μ°Έκ³ κΉνλΈ μ½λ: https://github.com/khazit/Lip2Word/blob/master/lipReader.py#L62
def frameAdjust(video, target_frames=29):
n_frames = video.shape[0] # μμ νλ μ κ°μ
if target_frames == n_frames :
return video # μμ κ·Έλλ‘ λ°ν
else :
# μμ νλ μ κ°μ > μνλ νλ μ κ°μ
if n_frames > target_frames :
idx = np.linspace(0, n_frames-1, target_frames) # μ«μ μνμ€ μμ± # κ΅¬κ° μμμ , κ΅¬κ° λμ , κ΅¬κ° λ΄ μ«μ κ°μ
idx = np.around(idx, 0).astype(np.int32) # λ°μ¬λ¦Όνκ³ dtype μ μ μλ‘ λ³κ²½
return video[idx] # μνλ νλ μ κ°μλ‘ sampling ν μμ
# μμ νλ μ κ°μ < μνλ νλ μ κ°μ
else :
output_video = np.zeros((target_frames, *video.shape[1:])).astype(np.uint8) # μνλ νλ μ κ°μμ λ§μΆ°μ 0μΌλ‘ μ΄κΈ°νν numpy μμ±
output_video[:n_frames] = video # μμ νλ μ κ°μκΉμ§ κ·Έλλ‘ μμ μ 보 μ μ₯
# μνλ νλ μ κ°μλ§νΌ λ§μ§λ§ νλ μ 볡μ
for i in range(target_frames-n_frames+1) :
output_video[i+n_frames-1] = output_video[n_frames-1]
return output_video # μνλ νλ μ κ°μλ‘ sampling ν μμ
|