Caffe can create, read and write images from an LMDB database. This is much faster than using the files from filesystem during training. However, I noticed that by default Caffe would not set write permissions for my group for the lmdb directory.
A quick investigation into src/caffe/util/db_lmdb.cpp
showed that this was because new lmdb directory was being created with
0744 permissions. I changed this to 0774 in
the code and recompiled Caffe.
Now comes the mystery: Caffe still created lmdb directories where my group did not have write permission!
Further investigation showed that the default umask in Linux is
0022. This umask does not allow the group write permissions
to be set.
Ok, so then I set the umask at the shell to 0002 and
tried to create the lmdb again. Found that lmdb directories still did
not have group write permissions!
I was creating the lmdb databases from a script that ran the
convert_imageset binary. Now the binary was run by using
the exec command of the Bash shell. This replaces the
currently running process with the convert_imageset binary.
However, unlike a fork, the new process is not passed the umask of the
parent process by the OS! This was the reason for the problem.
Once I knew this, the solution was easy. I modified the
tools/convert_imageset.cpp code and added this code:
#include <sys/types.h>
#include <sys/stat.h>
// In the main function ...
umask(0002);
// ....
This solved the problem perfectly! :)