Why are there non-visible objects in my final render?
If you look at the outliner, some eye-icons are faded out to indicate that certain objects are hidden.

But there's hidden and there's hidden: hidden in the viewport (eye-icon), and hidden for rendering (camera-icon).

You may paste the following code line to the Python Console (at the bottom of the Scripting view) and hit return, to make the render visibility match the viewport visibility automatically:

for ob in bpy.context.scene.objects: ob.hide_render = ob.hide