update
Browse files
README.md
CHANGED
|
@@ -103,6 +103,6 @@ axmodel input: 640x480
|
|
| 103 |
|
| 104 |
```
|
| 105 |
|
| 106 |
-
视频降噪样例
|
| 107 |
|
| 108 |
-
|
|
|
|
| 103 |
|
| 104 |
```
|
| 105 |
|
| 106 |
+
视频降噪样例:
|
| 107 |
|
| 108 |
+

|
fastDVDnet/python/axmodel_video_infer.py
CHANGED
|
@@ -103,8 +103,22 @@ def denoise_axmodel(frames_bgr, noise_sigma_01, sess, ax_h, ax_w,
|
|
| 103 |
def write_side_by_side(frames_orig, frames_den, out_path, fps, label=True):
|
| 104 |
h, w = frames_orig[0].shape[:2]
|
| 105 |
os.makedirs(os.path.dirname(os.path.abspath(out_path)), exist_ok=True)
|
| 106 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
writer = cv2.VideoWriter(out_path, fourcc, fps, (w * 2, h))
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
if not writer.isOpened():
|
| 109 |
raise RuntimeError("video writer fail: {}".format(out_path))
|
| 110 |
for orig, den in zip(frames_orig, frames_den):
|
|
@@ -118,6 +132,30 @@ def write_side_by_side(frames_orig, frames_den, out_path, fps, label=True):
|
|
| 118 |
writer.release()
|
| 119 |
|
| 120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
def main():
|
| 122 |
parser = argparse.ArgumentParser(description="FastDVDnet axmodel video inference")
|
| 123 |
parser.add_argument("--axmodel", type=str, default="./fastdvdnet_640x480.axmodel")
|
|
@@ -126,6 +164,8 @@ def main():
|
|
| 126 |
parser.add_argument("--out_dir", type=str, default="./")
|
| 127 |
parser.add_argument("--max_frames", type=int, default=0, help="0=all")
|
| 128 |
parser.add_argument("--no_label", action="store_true")
|
|
|
|
|
|
|
| 129 |
args = parser.parse_args()
|
| 130 |
|
| 131 |
sess = axe.InferenceSession(args.axmodel, providers=["AxEngineExecutionProvider"])
|
|
@@ -142,7 +182,7 @@ def main():
|
|
| 142 |
print("outputs:", [(n, list(o.shape)) for n, o in zip(output_names, sess.get_outputs())])
|
| 143 |
|
| 144 |
base = os.path.splitext(os.path.basename(args.video))[0]
|
| 145 |
-
out_path = os.path.join(args.out_dir, base + "_axmodel_side_by_side.
|
| 146 |
|
| 147 |
t0 = time.time()
|
| 148 |
frames_bgr, fps, orig_w, orig_h = read_video(args.video, args.max_frames)
|
|
|
|
| 103 |
def write_side_by_side(frames_orig, frames_den, out_path, fps, label=True):
|
| 104 |
h, w = frames_orig[0].shape[:2]
|
| 105 |
os.makedirs(os.path.dirname(os.path.abspath(out_path)), exist_ok=True)
|
| 106 |
+
|
| 107 |
+
ext = os.path.splitext(out_path)[1].lower()
|
| 108 |
+
|
| 109 |
+
if ext == '.gif':
|
| 110 |
+
_write_gif(frames_orig, frames_den, out_path, fps, w, h, label)
|
| 111 |
+
else:
|
| 112 |
+
_write_mp4(frames_orig, frames_den, out_path, fps, w, h, label)
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
def _write_mp4(frames_orig, frames_den, out_path, fps, w, h, label):
|
| 116 |
+
fourcc = cv2.VideoWriter_fourcc(*"avc1")
|
| 117 |
writer = cv2.VideoWriter(out_path, fourcc, fps, (w * 2, h))
|
| 118 |
+
if not writer.isOpened():
|
| 119 |
+
# fallback to mp4v if avc1 not available
|
| 120 |
+
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
|
| 121 |
+
writer = cv2.VideoWriter(out_path, fourcc, fps, (w * 2, h))
|
| 122 |
if not writer.isOpened():
|
| 123 |
raise RuntimeError("video writer fail: {}".format(out_path))
|
| 124 |
for orig, den in zip(frames_orig, frames_den):
|
|
|
|
| 132 |
writer.release()
|
| 133 |
|
| 134 |
|
| 135 |
+
def _write_gif(frames_orig, frames_den, out_path, fps, w, h, label):
|
| 136 |
+
try:
|
| 137 |
+
from PIL import Image
|
| 138 |
+
except ImportError:
|
| 139 |
+
raise RuntimeError("GIF output requires Pillow: pip install Pillow")
|
| 140 |
+
|
| 141 |
+
gif_frames = []
|
| 142 |
+
for orig, den in zip(frames_orig, frames_den):
|
| 143 |
+
canvas = np.concatenate([orig, den], axis=1)
|
| 144 |
+
if label:
|
| 145 |
+
cv2.putText(canvas, "Original", (16, 34), cv2.FONT_HERSHEY_SIMPLEX,
|
| 146 |
+
1.0, (0, 255, 255), 2, cv2.LINE_AA)
|
| 147 |
+
cv2.putText(canvas, "AXModel Denoised", (w + 16, 34), cv2.FONT_HERSHEY_SIMPLEX,
|
| 148 |
+
1.0, (0, 255, 255), 2, cv2.LINE_AA)
|
| 149 |
+
canvas_rgb = cv2.cvtColor(canvas, cv2.COLOR_BGR2RGB)
|
| 150 |
+
gif_frames.append(Image.fromarray(canvas_rgb))
|
| 151 |
+
|
| 152 |
+
duration = int(1000.0 / fps)
|
| 153 |
+
gif_frames[0].save(
|
| 154 |
+
out_path, save_all=True, append_images=gif_frames[1:],
|
| 155 |
+
duration=duration, loop=0, optimize=True,
|
| 156 |
+
)
|
| 157 |
+
|
| 158 |
+
|
| 159 |
def main():
|
| 160 |
parser = argparse.ArgumentParser(description="FastDVDnet axmodel video inference")
|
| 161 |
parser.add_argument("--axmodel", type=str, default="./fastdvdnet_640x480.axmodel")
|
|
|
|
| 164 |
parser.add_argument("--out_dir", type=str, default="./")
|
| 165 |
parser.add_argument("--max_frames", type=int, default=0, help="0=all")
|
| 166 |
parser.add_argument("--no_label", action="store_true")
|
| 167 |
+
parser.add_argument("--format", type=str, default="gif", choices=["mp4", "gif"],
|
| 168 |
+
help="output format")
|
| 169 |
args = parser.parse_args()
|
| 170 |
|
| 171 |
sess = axe.InferenceSession(args.axmodel, providers=["AxEngineExecutionProvider"])
|
|
|
|
| 182 |
print("outputs:", [(n, list(o.shape)) for n, o in zip(output_names, sess.get_outputs())])
|
| 183 |
|
| 184 |
base = os.path.splitext(os.path.basename(args.video))[0]
|
| 185 |
+
out_path = os.path.join(args.out_dir, base + "_axmodel_side_by_side." + args.format)
|
| 186 |
|
| 187 |
t0 = time.time()
|
| 188 |
frames_bgr, fps, orig_w, orig_h = read_video(args.video, args.max_frames)
|
fastDVDnet/res/{people-sunset_axmodel_side_by_side.mp4 → people-sunset_axmodel_side_by_side.gif}
RENAMED
|
File without changes
|