As per your requirements, I would suggest that you start with any [simple CNN](https://www.tensorflow.org/tutorials/images/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 image 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](https://www.tensorflow.org/api_docs/python/tf/keras/layers/MaxPool2D) and [BatchNormalization](https://www.tensorflow.org/api_docs/python/tf/keras/layers/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](https://www.tensorflow.org/api_docs/python/tf/keras/losses/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)) 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](https://cs231n.github.io/understanding-cnn/) your model to better understand what it has learned. Here is an [example](https://arxiv.org/pdf/1902.10178.pdf) of such a problem we faced at our university. There are also more advanced CNN architectures such as [ResNet](https://en.wikipedia.org/wiki/Residual_neural_network), [VGG](https://arxiv.org/abs/1409.1556) or [YOLO](https://arxiv.org/abs/1506.02640). You can also extend your model with time series (i.e. video) using [LSTM](https://en.wikipedia.org/wiki/Long_short-term_memory) or [GRU](https://en.wikipedia.org/wiki/Gated_recurrent_unit) architecture.