If you use a cascade classifier to detect the right eye, left eye and nose, calculate the centroid of each feature (feature x/2, feature y/2) this will give you three x-y points on your image.
You can detect roll by looking at the Y values of each eye, if one is higher than the other, it means the head is tilted in the direction of the lowest Y value (as one eye moves up the other moves down)
You can detect yaw by looking at the X value of the nose, if the user looks to their left, the X value of their nose will be closer to their left eye's X value, and same with looking to the right at the right eyes X value.
You can detect pitch by looking at the Y value of the nose, if the user is looking up, the Y value will be closer to both eyes Y values and if they look down, the Y value will be further away from the eye value.
Now this is of course not tremendously accurate and won't give you exact angles, however you can use this information to try and classify each value within certain groups i.e (looking forward, looking left, looking really left)
The only thing I can see effecting you calculating all three in one image might be if the roll is fairly drastic calculating the yaw might be troublesome as the X axis is no longer flat.
You can solve this by correcting the image through 2D rotation.
You will need to find how much the image needs to be rotated with
Value = (right eye Y / 2) - (left eye Y / 2)
With this information you can correct the image and continue with processing (to rotate the image look up creating a 2D rotation matrix and using warp affine)
Sorry if this is a bit of a necro but I found the above method to be pretty successful and I hope it help someone