How can I animate a 2D face rig on any 3D object?
First a simple solution with the UV Warp modifier. Then an alternative with Image Sequence as explained here by SouthernShotty.

UV Warp solution:


Create a PNG, with transparent background, of your facial expressions:





Give your object a material. Assign another material to the face area: Unwrap this part, add a UV Map node with the new UV map loaded, plug it into an Image Texture node, open the PNG, plug the Image Texture into a Mix Shader, plug the Image Texture Alpha output into the Factor of the Mix Shader, plug the skin material into the other input of the Mix Shader.





Create an empty at the same position as the head. Give the head a UV Warp modifier. Choose X and Z as UV Axis, From > Choose the head object, To > Choose the empty.





Create a bone at the exact same position as the empty. Parent the empty to this bone (the bone will probably be part of a whole armature):





Now the bone controls the empty and the empty controls the position of the PNG. To save all the different expressions, you can use the Pose Library in the Properties panel > Object Data. Move the bone in Pose mode and press the "+" button to save the pose. Continue until you've saved all the poses. "+" button is also used to replace an existing pose. Use the Apply button to call a pose. Give each pose an appropriate name (Smile, Sad, etc...).




Image Sequence solution:


Create your facial expressions on transparent (alpha) backgrounds, name your images 0.png, 1.png, 2.png, etc:





Select the part of your mesh where the expressions are supposed to happen, unwrap and give it its own material. Create an Image Texture node, click on its Open Image button, select and load all the PNGs, plug the node's color output into a Mix Shader, use the other Mix Shader' socket for the skin color you've used for the rest of the head, plug the Image Texture's alpha output into the mix factor socket so that you can see the expressions over the skin:





When you've imported your PNG, the Image Texture node has automatically switched to its Image Sequence mode. Set the Frames value to 1. Now you just need to create some keyframes on the Offset value to switch between the different images along the timeline. The Offset begins at 0, so Offset > 0 will be image 0, Offset > 1 will be image 1, etc. In the Dopesheet, once some keyframes created, press T and choose Constant Interpolation so that each keyframe switches directly to the image you want.


  


It should work: