def test_framereader(self): with tempfile.NamedTemporaryFile(suffix=".hevc") as fp: r = requests.get( "https://github.com/commaai/comma2k19/blob/master/Example_1/b0c9d2329ad1606b%7C2018-08-02--08-34-47/40/video.hevc?raw=true" ) fp.write(r.content) fp.flush() f = FrameReader(fp.name) self.assertEqual(f.frame_count, 1200) self.assertEqual(f.w, 1164) self.assertEqual(f.h, 874) frame_first_30 = f.get(0, 30) self.assertEqual(len(frame_first_30), 30) print(frame_first_30[15]) print("frame_0") frame_0 = f.get(0, 1) frame_15 = f.get(15, 1) print(frame_15[0]) assert np.all(frame_first_30[0] == frame_0[0]) assert np.all(frame_first_30[15] == frame_15[0])
class CommaDataset(Dataset): def __init__(self, main_dir, transform=None): self.main_dir = main_dir self.frame_reader = FrameReader(main_dir + 'video.hevc') self.gps_times = np.load(main_dir + 'global_pose/frame_gps_times') self.orientations = np.load(main_dir + 'global_pose/frame_orientations') self.positions = np.load(main_dir + 'global_pose/frame_positions') self.times = np.load(main_dir + 'global_pose/frame_times') self.velocities = np.load(main_dir + 'global_pose/frame_velocities') self.transform = transform def __len__(self): return len(self.velocities) def __getitem__(self, idx): image = np.array(self.frame_reader.get(idx, pix_fmt='rgb24')[0], dtype=np.float64) sample = { 'image': image, 'gps_times': self.gps_times, 'orientations': self.orientations, 'positions': self.positions, 'times': self.times, 'velocities': self.velocities[idx] } if self.transform: sample = self.transform(sample) return sample
from common.transformations.camera import transform_img, eon_intrinsics from common.transformations.model import medmodel_intrinsics import numpy as np from tqdm import tqdm from tools.lib.framereader import FrameReader import matplotlib import matplotlib.pyplot as plt # imgs just a list of images as in YUV format fr = FrameReader("leon.hevc") imgs = [] for i in tqdm(range(100)): imgs.append(fr.get(i, pix_fmt='yuv420p')[0].reshape((874 * 3 // 2, 1164))) def frames_to_tensor(frames): H = (frames.shape[1] * 2) // 3 W = frames.shape[2] in_img1 = np.zeros((frames.shape[0], 6, H // 2, W // 2), dtype=np.uint8) in_img1[:, 0] = frames[:, 0:H:2, 0::2] in_img1[:, 1] = frames[:, 1:H:2, 0::2] in_img1[:, 2] = frames[:, 0:H:2, 1::2] in_img1[:, 3] = frames[:, 1:H:2, 1::2] in_img1[:, 4] = frames[:, H:H + H // 4].reshape((-1, H // 2, W // 2)) in_img1[:, 5] = frames[:, H + H // 4:H + H // 2].reshape( (-1, H // 2, W // 2)) return in_img1 imgs_med_model = np.zeros((len(imgs), 384, 512), dtype=np.uint8)
def replay(route, loop): route = route.replace('|', '/') lr = LogReader(f"cd:/{route}/rlog.bz2") fr = FrameReader(f"cd:/{route}/fcamera.hevc", readahead=True) # Build mapping from frameId to segmentId from roadEncodeIdx, type == fullHEVC msgs = [m for m in lr if m.which() not in IGNORE] msgs = sorted(msgs, key=lambda m: m.logMonoTime) times = [m.logMonoTime for m in msgs] frame_idx = {m.roadEncodeIdx.frameId: m.roadEncodeIdx.segmentId for m in msgs if m.which() == 'roadEncodeIdx' and m.roadEncodeIdx.type == 'fullHEVC'} socks = {} lag = 0 i = 0 max_i = len(msgs) - 2 while True: msg = msgs[i].as_builder() next_msg = msgs[i + 1] start_time = time.time() w = msg.which() if w == 'roadCameraState': try: img = fr.get(frame_idx[msg.roadCameraState.frameId], pix_fmt="rgb24") img = img[0][:, :, ::-1] # Convert RGB to BGR, which is what the camera outputs msg.roadCameraState.image = img.flatten().tobytes() except (KeyError, ValueError): pass if w not in socks: socks[w] = messaging.pub_sock(w) try: if socks[w]: socks[w].send(msg.to_bytes()) except messaging.messaging_pyx.MultiplePublishersError: socks[w] = None lag += (next_msg.logMonoTime - msg.logMonoTime) / 1e9 lag -= time.time() - start_time dt = max(lag, 0) lag -= dt time.sleep(dt) if lag < -1.0 and i % 1000 == 0: print(f"{-lag:.2f} s behind") if input_ready(): key = sys.stdin.read(1) # Handle pause if key == " ": while True: if input_ready() and sys.stdin.read(1) == " ": break time.sleep(0.01) # Handle seek dt = defaultdict(int, s=10, S=-10)[key] new_time = msgs[i].logMonoTime + dt * 1e9 i = bisect.bisect_left(times, new_time) i = (i + 1) % max_i if loop else min(i + 1, max_i)
import requests from PIL import Image from tools.lib.auth_config import get_token from tools.lib.framereader import FrameReader jwt = get_token() route = sys.argv[1] segment = int(sys.argv[2]) frame = int(sys.argv[3]) url = 'https://api.commadotai.com/v1/route/'+sys.argv[1]+"/files" r = requests.get(url, headers={"Authorization": "JWT "+jwt}) assert r.status_code == 200 print("got api response") cameras = r.json()['cameras'] if segment >= len(cameras): raise Exception("segment %d not found, got %d segments" % (segment, len(cameras))) fr = FrameReader(cameras[segment]) if frame >= fr.frame_count: raise Exception("frame %d not found, got %d frames" % (frame, fr.frame_count)) im = Image.fromarray(fr.get(frame, count=1, pix_fmt="rgb24")[0]) fn = "uxxx_"+route.replace("|", "_")+"_%d_%d.png" % (segment, frame) im.save(fn) print(f"saved {fn}")