Just to inform you, the UpdatePhoto API method is behaving a bit strange and it took me some time to find out what is going wrong.
In the PhotoUpdater documentation there are some fields where it is clearly stated what happens if the "value is not provided". You should clarify what "not provided" really means in terms of JSON data. If not provided means to 'omit' the field, then it is ok. I interpreted it as writing a 'null' value which works in most cases but not one: Categories can be omitted but you get an error if you set it to 'null' whereas Keywords can be set to 'null' and it works perfectly.
So how do you people see "value is not provided"? Is it 'null' or is it omitting the value? If it is 'null', then you should fix the behavior of PhotoUpdater::Categories