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! :)