How to show entries related to main category

There are a couple of problems with that code

Selecting the wrong terms

First of all, you are storing tags instead of categories in the $terms variable. The taxonomy name for categories is category. That line should look like this.

$categories = get_the_terms( get_the_ID(), 'category');

For sake of expresivity, I changed the $terms variable to $categories.

Wrong query parameter for categories

You are using category__not_in, telling the query NOT to search for posts with those caregories. It is not only returning posts from crops, it returning every post that doesn’t has the current category.

In order to tell the query that you want posts from a category or group of categories, you should use category__in

You can see more about accepted args for the WP_Query here

Wrong value for category__in

The category__in parameter for the query takes as value either a string or an array of categories ids (strings). The items stored in the $categories array are instances of WP_Term.

In order to pass the right value, you should create an array of ids from the array of WP_Term. We can get a WP_Term id by accesing the term_id property.

'category__in'           => array_map(function($cat){ return $cat->term_id; }, $categories)

array_map returns every item from the array after aplying a callback function to each of them. In this case, we are making an array of terms_ids from the $categories array.

Final Result

This is how your query should look like

$categories = get_the_terms( get_the_ID(), 'category');

$args = array (
    'category__in'                  => array_map(function($cat){ return $cat->term_id; }, $categories),
    'post__not_in'                  => array(get_the_ID()),
    'posts_per_page'                => '10',
    'ignore_sticky_posts'           => 1,
    'meta_key'                      => '_thumbnail_id',
);

$query = new WP_Query($args);