Winter 2026

In this assignment, you’ll implement a (slightly simplified) version of the technique described in the influential 2020 paper NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis by Mildenhall et al. Given a collection of images taken from multiple perspectives, along with pose information for those cameras, NeRF is an elegant technique that encodes a 3D volumetric representation of the scene in a neural network.
Assigned: Monday, January 26th, 2026
Code Due: Thursday, January 29th, 2026 at 10:00pm (via Github)
This project gives you practice applying both 3D geometry concepts (in determining the color of a ray through the volume) as well as machine learning concepts, helping you to demonstrate aspects of the following course outcomes:
Accept the Project 4 assignment on Github Classroom and clone your repository. This repository contains the assignment’s single Jupyter notebook, which includes detailed instructions as well as skeleton code and TODOs for you to complete.
This project requires the use of a GPU to train NeRF models using the PyTorch framework. The recommended approach for this is to use Google Colab, which provides a Jupyter-like environment for working with notebooks, and allows you to use a GPU-equipped runtime for free.
Free Colab usage has dynamic limits based on availability, and students have had issues with the service timing out or restricting GPU usage after a while. As of early December 2025, Google offered their Colab Pro subscription for free for a year to students and educators; as of December 30th 2025, I don’t see this option, but it might come back. Check the subscription page and see if there’s a “Free for students and educators” button or link. The Colab Pro subscription gives you higher limits, access to faster GPUs, and so on; you should be fine without it, but it may be nicer to have it.
Head over to https://colab.research.google.com/ and upload the
Project4.ipynb notebook found in your Github repo. From
there, using Colab is very similar to using Jupyter Lab. To make sure
you are using a runtime with a GPU, go to Runtime > Change runtime
type and ensure that you have some kind of GPU selected under Hardware
Accelerator (e.g., T4 GPU).
If you have a computer with a cuda-enabled GPU and wish to run the
notebook locally, you can do this using Jupyter Lab. The skeleton code
inclues the Python dependencies needed, so you should be able to
uv run jupyter lab from the repo’s root directory and work
with the notebook as usual. Make sure that when the first cell is
executed, the value of device when printed is
cuda. If it’s cpu, you can still work on many
parts of the notebook, but the actual training and inference may be
debilitatingly slow.
If you’re on a mac, you may be able to use Apple GPU acceleration
using device = torch.device("mps") instead of
"cuda".
The input and test data for this project will be downloaded (and cached) by the notebook as needed. Do not commit the data files to your Github repository.
There are several pieces we ask you to implement in this assignment:
The instructions about individual TODOs are present in detail in the notebook.
To help you verify the correctness of your solutions, we provide tests at the end of each TODO block, as well as qualitative and quantitative evaluation at the end of the notebook.
With no positional encoding:

With 3 frequencies:

With 6 frequencies:

The optimization for this scene takes around 1000 to 3000 iterations to converge on a single GPU (in 10 to 30 minutes). We use peak signal-to-noise ratio (PSNR) to measure structual similarity between the prediction and target image, and we expect a converged model to reach a PSNR score higher than 20, and produce a reasonable depth map. Here’s an output after 1000 iterations of training with default settings:

Here’s the resulting 360 video:
Notebook Execute your completed notebook in Jupyter and commit the resulting version of your .ipynb file to your github repository; make sure the cell outputs are contained in the notebook.
Sample Output Also commit the 360 video output
(lego_spiral_001000_rgb.mp4) to your repository.
Hours On the first line of
hours.txt, include a single integer estimate of the number
of hours you spent working on this assignment. Below that, you may
optionally include a reflection on how it went, anything you found
particularly confusing or helpful, and/or suggestions for improving the
assignment.
Points are awarded for correctness and efficiency, and deducted for issues with clarity or submission mechanics:
Clarity Deductions for poor coding style may be made. Please see the syllabus for general coding guidelines. Points may be deducted for any of the following:
This assignment is based on an assignment from Noah Snavely; thanks to Noah and numerous underappreciated TAs.