As per your requirements, I would suggest that you start with any simple CNN network.
CNNs take advantage of the hierarchical pattern in data and assemble more complex patterns using smaller and simpler patterns. Therefore, on the scale of connectedness and complexity, CNNs are on the lower extreme.
Here is a Keras example:
model = models.Sequential()
model.add(layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=image_shape))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
# output layer
model.add(layers.Dense(1))
where image_shape
is the resolution and number of channels of images (e.g. 128x128x3 for RGB images). I also suggest you downscaling the imageimages to a lower resolution. You will also have to crop the images as they must all be the same image_shape
.
Also take a look at the MaxPooling2D and BatchNormalization layers.
Since you only have real and CGI images, this becomes a binary classification problem. Therefore you can have a single output (0 - CGI, 1 - real). Such problems can be solved with BinaryCrossentropy loss.
model.compile(loss=losses.BinaryCrossentropy(from_loits=True), optimizer='adam')
Finally, you can fit your model
history = model.fit(train_images, train_labels, epochs=1000, validation_data=(test_images, test_labels))
You can find a complete example here.
Please note that depending on your data, the model can become biased if your dataset is unbalanced. That is, if all of your CGI images have text, and only a small fraction of the real images also have text, they might be misclassified. Therefore, I recommend that you visualize your model to better understand what it has learned. Here is an example of such a problem we faced at our university.
There are also more advanced CNN architectures such as ResNet, VGG or YOLO. You can also extend your model with time series (i.e. video) using LSTM or GRU architecture.