If I understand the issue correctly, you are seeing a good training and validation accuracy, but the test accuracy is a lot worse.
Could your training procedure have leaked the validation data somehow into the training, so that its accuracy might be biased?
Also, are you processing the training and validation data in a different way compared to the processing of the test set? Are all dataset splits generated randomly from the same data pool or were they sampled differently?