wzf19947 commited on
Commit
9d449ad
·
1 Parent(s): 2325de2
README.md CHANGED
@@ -103,6 +103,6 @@ axmodel input: 640x480
103
 
104
  ```
105
 
106
- 视频降噪样例(点击播放):
107
 
108
- [![Video Denoising Demo](fastDVDnet/res/people-sunset_axmodel_side_by_side.mp4)](fastDVDnet/res/people-sunset_axmodel_side_by_side.mp4)
 
103
 
104
  ```
105
 
106
+ 视频降噪样例:
107
 
108
+ ![Video Denoising Demo](fastDVDnet/res/people-sunset_axmodel_side_by_side.gif)
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
- fourcc = cv2.VideoWriter_fourcc(*"mp4v")
 
 
 
 
 
 
 
 
 
 
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.mp4")
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