Neural frame generation for the PS5, in 432,308 parameters. Two colour frames in, the picture between them out. Compute shaders on the PS5's own GPU, no engine data, no motion vectors, no async compute.
MihawkGen turns a 30 or 60 fps picture into 120 fps on a base PS5: one generated picture between two real frames at 60 fps, three at 30 fps. It works on the pictures a title shows, so it needs nothing from the title: no engine data, no motion vectors. When a title does hand over depth and motion vectors, a second method (mvsplat) uses them.
| Model | Parameters | Compute for one 288×512 pair | Runs on a PS5? |
|---|---|---|---|
| MihawkGen network | 0.43 M | 4.4 GFLOPs | yes: about 2.2 ms at 3840×2160 |
| AMT-S | 3.0 M | 32 GFLOPs | not tested |
| IFRNet | 5.0 M | 57 GFLOPs | not tested |
| IFRNet-L | 19.7 M | 226 GFLOPs | no (about 50× the compute) |
| GIMM-VFI-R | 19.8 M | RAFT, 20 iterations | no |
The network estimates a flow and a mask at four scales, warps both real frames with it, and mixes them. It cannot paint a pixel that is not in one of the two frames; a last shader pass keeps still regions exact.
The honest kind: the same triplets (frame, the real picture between, next frame) for every method, never-trained clips only, a hash audit of the benchmark against the training clips, and one scorer for all. PSNR in dB (higher is better), SSIM, LPIPS (lower is better); the average over clip sets.
33 never-trained 2D clip sets, the picture at t = ½:
| Method | PSNR | SSIM | LPIPS |
|---|---|---|---|
| GIMM-VFI-R (20 M, research) | 30.44 | 0.9418 | 0.0420 |
| SGM-VFI (21 M, research) | 30.20 | 0.9372 | 0.0454 |
| MihawkGen (0.43 M) | 30.08 | 0.9391 | 0.0428 |
| BiM-VFI (6.9 M, research) | 30.08 | 0.9410 | 0.0426 |
| plain average of the two frames | 29.29 | 0.9223 | 0.0481 |
| FSR 3.1 frame interpolation (no engine data) | 28.82 | 0.9206 | 0.0506 |
8 never-trained 3D clip sets:
| Method | PSNR | SSIM | LPIPS |
|---|---|---|---|
| GIMM-VFI-R | 37.00 | 0.9328 | 0.0675 |
| SGM-VFI | 36.38 | 0.9257 | 0.0621 |
| MihawkGen | 35.84 | 0.9178 | 0.0578 |
| BiM-VFI | 35.64 | 0.9295 | 0.0551 |
| plain average | 33.66 | 0.8857 | 0.0716 |
| FSR 3.1 | 31.53 | 0.8840 | 0.0742 |
Three generated pictures between two real ones (t = ¼, ½, ¾) keep the same order: on the 3D set MihawkGen leads the plain average by 1 to 1.6 dB at every instant.
Reading the tables. MihawkGen beats FSR 3.1 and the plain average on every metric on both sets, and is within 0.4 dB of a 20-million-parameter research model on 2D clips. The research models are far ahead on 3D (up to 1.2 dB) and cost 7× to 50× the compute. They are measured, not shipped.
train/situations.py renders 70 controlled scenes with an exact truth (scrolls, pans, zoom, rotation, parallax, sprites, explosions, particles, fades, HUD over motion, tickers). The pictures are real frames of clips never trained on, moved by code. PSNR in dB:
| Situation | MihawkGen | plain average | FSR 3.1 | IFRNet-L |
|---|---|---|---|---|
| camera pan | 30.0 | 25.1 | 24.6 | 37.6 |
| zoom | 35.6 | 25.8 | 25.3 | 41.3 |
| rotation | 32.5 | 25.9 | 25.7 | 36.3 |
| layered scenes (parallax) | 34.8 | 26.6 | 26.6 | 46.1 |
| sprites | 36.5 | 29.3 | 29.3 | 38.7 |
| explosions | 36.3 | 35.4 | 34.3 | 36.2 |
| HUD over motion | 33.3 | 25.0 | 24.9 | 37.1 |
| fast text tickers | 24.9 | 18.0 | 18.0 | 34.0 |
| side-scrolling | 32.0 | 20.4 | 20.3 | 46.0 |
| fades (small step per frame) | 50.6 | 55.5 | 36.6 | 53.4 |
It is far above the plain average and FSR on motion. The big public model is ahead on large rigid motion, and a fade is better left as the plain blend (the network is 5 dB under it, at 50 dB). A variant with a different last pass closes half of the scroll gap in these scenes and loses on real recordings, so it is not shipped.
FrameGen Lab renders a scene at 120 Hz with the exact answer and times every method at 3840×2160:
| Method | PSNR | GPU time |
|---|---|---|
| repeat | 27.5 dB | 0.13 ms |
| blend | 32.8 dB | 0.14 ms |
| mvwarp (motion vectors) | 46.1 dB | 0.44 ms |
| neural (two frames only) | 46.7 dB | 2.2 ms |
| mvsplat (depth and motion vectors) | 50.7 dB | 4.7 ms |
framegen/ the generator: interface, methods, compute shaders (compiled in), host tests
models/network.fgw the trained network (1.7 MB, loaded from a memory blob)
examples/framegenlab/ FrameGen Lab: the scene, the ground truth, the measures
train/ the network: model, trainer, situations suite, benchmark and the public models' adapters
tools/ the loop, the verdicts, stream analysis
base/ external/ ps5/ the PS5 Vulkan Template foundation (MIT)
framegen/tests/run.sh # seconds: the device-free tests and the SPIR-V
tools/lab.sh pixels # the pixel-art motion pass
tools/lab.sh host # a minute: FrameGen Lab on this PC's Vulkan driverJudge quality on the PC and the PS5; judge speed only on the PS5.
The network is weights only (432,308 parameters, 1.7 MB): no image or clip is in this repository or in the weights, and the network cannot paint a picture that is not in its input. The trainer in train/ takes any folder of clips, so you can retrain on material of your own choosing. The network was trained on private clips that are not redistributed, with some of its targets distilled from public interpolation models under permissive licences (RIFE, IFRNet, EMA-VFI, FILM, VFIMamba; credited in THIRD_PARTY_NOTICES.txt). The research models used for comparison (GIMM-VFI, BiM-VFI, AMT) are for non-commercial measurement only, are not trained on and are not part of the weights. FSR 3.1 is run as a black box from AMD's FidelityFX SDK, which is not shipped; its licence terms apply to anyone repeating that comparison.
framegen/, examples/, train/: GPL-3.0-or-later. tools/, base/, ps5/: MIT. Third-party libraries under external/ keep their own licences. See LICENSE.md and THIRD_PARTY_NOTICES.txt.