Amplifying weak signal to 2000x

Hi, I try to build a high precision optical rotary encoder.

Im using 5 small smd LEDs

The 3 ones to detect strips like this:

Led1 led2 led3
^^^^ vvvv ^^^^

_____________............._____________............. = paper strips

Led2 = illuminates the paper
Led1 & led3 sense the white or black strips

The 2 other are similar to 3 ones but only one sender & one receiver to see offset zero position mask.

The receiver LEDs produces approx 2-5 mVolt when see white strip and less than 0,5 mVolt on black strip

I need to gain the signal about 2000x,
so 2-5mV x 2000 = 2-5 volt.
The nice range to be measured by Arduino analog pin.

I need 3 op-amp, so I choosed LM324
The feedback resistor of non inverting op-amp are 2M ohm & 1K ohm. So the gain is 2001x (or about 2000x).

But the output gain was not as expected, like crazy graph in Arduino IDE.

Anybody know the problem?
Do you have any solution?

I cannot use photodiode or phototransistor,
the dimension is too big and limit the resolution of the reading.
I use the 0603 smd LED, placed very close each other.
Good enough to see strips as small as 2-3 mm.

You will need a multi-stage amplifier, this is too much for a single stage. Three stages sound more sensible (20x, 10x, 10x).
But with such low voltages a specialised part such as the HX711 may be a better choice.

A single stage gain should not exceed about 100x, or it will tend to oscillate.

The LM324 is a very poor choice of op amp. Look for precision, low offset, low bias current op amps.

This is the problem of Lm324:

The input + and - emit voltage approx 11mV when checked using multimeter.
The 11 mv noise blinds the 2-5mv signal.

Even if I set the low gain of 10-100x , it likely not detecting the weak signal.

Do you have a suggestion of similar LM324 or another method?