Sean Carnahan commited on
Commit
56926a1
·
1 Parent(s): e7825c1

Force MoveNet to run on CPU to avoid GPU JIT errors on HF Spaces

Browse files
Files changed (1) hide show
  1. app.py +23 -27
app.py CHANGED
@@ -156,7 +156,7 @@ def predict_pose_cnn(img_path):
156
  finally:
157
  cleanup_memory()
158
 
159
- @app.route('/static/uploads/<path:filename>')
160
  def serve_video(filename):
161
  response = send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=False)
162
  # Ensure correct content type, especially for Safari/iOS if issues arise
@@ -185,18 +185,11 @@ def process_video_movenet(video_path):
185
  total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
186
  print(f"[DEBUG] Video properties - FPS: {fps}, Width: {width}, Height: {height}, Total Frames: {total_frames}")
187
 
188
- # Initialize MoveNet model on GPU if available
189
- print("[DEBUG] Initializing MoveNet model")
190
- if gpus:
191
- print("[DEBUG] Using GPU for MoveNet")
192
- with tf.device('/GPU:0'):
193
- movenet_model = hub.load("https://tfhub.dev/google/movenet/singlepose/lightning/4")
194
- movenet = movenet_model.signatures['serving_default']
195
- else:
196
- print("[DEBUG] No GPU found, using CPU for MoveNet")
197
- with tf.device('/CPU:0'):
198
- movenet_model = hub.load("https://tfhub.dev/google/movenet/singlepose/lightning/4")
199
- movenet = movenet_model.signatures['serving_default']
200
 
201
  # Create output video writer
202
  output_filename = f'output_movenet_lightning.mp4'
@@ -210,14 +203,18 @@ def process_video_movenet(video_path):
210
 
211
  frame_count = 0
212
  processed_frames = 0
 
213
 
214
  while cap.isOpened():
215
  ret, frame = cap.read()
216
- if not ret:
 
 
217
  break
 
 
 
218
  frame_count += 1
219
- if frame_count % 10 != 0: # Process every 10th frame
220
- continue
221
  try:
222
  # Ensure frame size matches VideoWriter
223
  if frame.shape[1] != width or frame.shape[0] != height:
@@ -227,15 +224,10 @@ def process_video_movenet(video_path):
227
  img = frame.copy()
228
  img = tf.image.resize_with_pad(tf.expand_dims(img, axis=0), 192, 192)
229
  img = tf.cast(img, dtype=tf.int32)
230
- # Run inference on GPU if available
231
- if gpus:
232
- with tf.device('/GPU:0'):
233
- results = movenet(img)
234
- keypoints = results['output_0'].numpy()
235
- else:
236
- with tf.device('/CPU:0'):
237
- results = movenet(img)
238
- keypoints = results['output_0'].numpy()
239
  # Process keypoints and draw on frame
240
  y, x, c = frame.shape
241
  shaped = np.squeeze(keypoints)
@@ -260,7 +252,9 @@ def process_video_movenet(video_path):
260
  print(f"[DEBUG] Output video file size: {file_size} bytes")
261
  if processed_frames == 0 or file_size < 1000:
262
  raise ValueError(f"Output video file is empty or too small: {output_path}")
263
- return url_for('serve_video', filename=output_filename, _external=False)
 
 
264
  except Exception as e:
265
  print(f"[ERROR] Error in process_video_movenet: {str(e)}")
266
  traceback.print_exc()
@@ -400,7 +394,9 @@ def process_video_mediapipe(video_path):
400
  if frame_count == 0:
401
  raise ValueError("No frames were processed from the video by MediaPipe")
402
  logger.info(f"MediaPipe video processing completed. Processed {frame_count} frames. Output: {output_path}")
403
- return url_for('serve_video', filename=output_filename, _external=False)
 
 
404
  except Exception as e:
405
  logger.error(f'Error in process_video_mediapipe: {e}')
406
  traceback.print_exc()
 
156
  finally:
157
  cleanup_memory()
158
 
159
+ @app.route('/static/uploads/<path:filename>', endpoint='serve_video')
160
  def serve_video(filename):
161
  response = send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=False)
162
  # Ensure correct content type, especially for Safari/iOS if issues arise
 
185
  total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
186
  print(f"[DEBUG] Video properties - FPS: {fps}, Width: {width}, Height: {height}, Total Frames: {total_frames}")
187
 
188
+ # Force MoveNet to CPU to avoid GPU JIT error
189
+ print("[DEBUG] Forcing CPU for MoveNet (due to GPU JIT error)")
190
+ with tf.device('/CPU:0'):
191
+ movenet_model = hub.load("https://tfhub.dev/google/movenet/singlepose/lightning/4")
192
+ movenet = movenet_model.signatures['serving_default']
 
 
 
 
 
 
 
193
 
194
  # Create output video writer
195
  output_filename = f'output_movenet_lightning.mp4'
 
203
 
204
  frame_count = 0
205
  processed_frames = 0
206
+ first_frame_shape = None
207
 
208
  while cap.isOpened():
209
  ret, frame = cap.read()
210
+ print(f"[DEBUG] Frame {frame_count+1}: ret={ret}, frame is None: {frame is None}")
211
+ if not ret or frame is None:
212
+ print(f"[DEBUG] Stopping at frame {frame_count+1}: ret={ret}, frame is None: {frame is None}")
213
  break
214
+ if first_frame_shape is None:
215
+ first_frame_shape = frame.shape
216
+ print(f"[DEBUG] First frame shape: {first_frame_shape}")
217
  frame_count += 1
 
 
218
  try:
219
  # Ensure frame size matches VideoWriter
220
  if frame.shape[1] != width or frame.shape[0] != height:
 
224
  img = frame.copy()
225
  img = tf.image.resize_with_pad(tf.expand_dims(img, axis=0), 192, 192)
226
  img = tf.cast(img, dtype=tf.int32)
227
+ # Always run inference on CPU
228
+ with tf.device('/CPU:0'):
229
+ results = movenet(img)
230
+ keypoints = results['output_0'].numpy()
 
 
 
 
 
231
  # Process keypoints and draw on frame
232
  y, x, c = frame.shape
233
  shaped = np.squeeze(keypoints)
 
252
  print(f"[DEBUG] Output video file size: {file_size} bytes")
253
  if processed_frames == 0 or file_size < 1000:
254
  raise ValueError(f"Output video file is empty or too small: {output_path}")
255
+ video_url = url_for('serve_video', filename=output_filename, _external=False)
256
+ print(f"[DEBUG] Returning video URL: {video_url}")
257
+ return video_url
258
  except Exception as e:
259
  print(f"[ERROR] Error in process_video_movenet: {str(e)}")
260
  traceback.print_exc()
 
394
  if frame_count == 0:
395
  raise ValueError("No frames were processed from the video by MediaPipe")
396
  logger.info(f"MediaPipe video processing completed. Processed {frame_count} frames. Output: {output_path}")
397
+ video_url = url_for('serve_video', filename=output_filename, _external=False)
398
+ print(f"[DEBUG] Returning video URL: {video_url}")
399
+ return video_url
400
  except Exception as e:
401
  logger.error(f'Error in process_video_mediapipe: {e}')
402
  traceback.print_exc()