Pollenating insect classification (209 classes)

Paris Saclay Center for Data Science

RAMP on Pollinating insect classification

Mehdi Cherti (CNRS), Romain Julliard (MNHN), Gregoire Lois (MNHN), Balázs Kégl (CNRS)


Pollinating insects play a fundamental role in the stability of ecosystems. An insect is said to be pollinator when it transports pollen from one flower to another, helping them to accomplish fertilization. The vast majority of plants pollinates using insects, and at the same time, these insects depend on plants for their survival. However, because of human intensified agrigulture, urbanisation and climate change, these species are threatened. 35% of human alimentation is based on plants pollinated by insects. Diversity of these insects is also important, the more diverse they are the best overall assistance is provided by these insects.

The SPIPOLL (Suivi Photographique des Insectes POLLinisateurs) project proposes to quantitatively study pollinating insects in France. For this, they created a crowdsourcing platform where anyone can upload pictures of insects and identify their species through a series of questions. These data are then used by specialists for further analyses.


In this RAMP, we propose a dataset of pictures of insects from different species gathered from the SPIPOLL project and labeled by specialists. The dataset contains a set of 68815 labeled pictures of insects coming from 209 different insect species. Each picture is a color image. The size of the images (number of pixels) vary.

The prediction task

The goal of this RAMP is to classify correctly the species of the insects. For each submission, you will have to provide an image preprocessor (to standardize, resize, crop, augment images) and batch classifier, which will fit a training set and predict the classes (species) on a test set. The images are big so loading them into the memory at once is impossible. The batch classifier therefore will access them through a generator which can be "asked for" a certain number of training and validation images at a time. You will typically run one minibatch of stochastique gradient descent on these images to train a deep convolutional neural networks which are the state of the art in image classification.


First of all, even though 69K images is relatively small compared to industrial level data sets, to achieve state-of-the-art performance, you will need big networks which will take ages (days) to train on a CPU. If you want to have a faster turnaround for tuning your net, you will need a GPU-equipped server of could instance. Setting up an AWS instance is easy, just follow this tutorial. If you want to have the starting kit preinstalled, use the community AMI "pollenating_insectsusers".

Your main bottleneck is memory. E.g., increasing the resolution to 128x128, you will need to decrease batch size. You should always run user_test_submission.py on the AWS node before submitting.

For learning the nuts and bolts of convolutional nets, we suggest that you follow Andrej Karpathy’s excellent course.

You have some trivial "classical" options to explore. You should set the epoch size to something more than three (in the starting kit). You should check when the validation error curve flattens because you will also be graded on training and test time. You can change the network architecture, apply different regularization techniques to control overfitting, optimization options to control underfitting.

You can use pretrained nets from here. There are a couple of examples in the starting kit. Your options are the following.

  • Retrain or not the weights. If you do not, you are using the pretrained net as fixed a feature extractor. You can add some layers on the top of the output of the pretrained net, and only train your layers. If you retrain all the layers, you use the pretrained net as an initialization. Again, your goal is not only to increase accuracy but also to be frugal. Retraining the full net is obviously more expensive.
  • You can "read out" the activations from any layer, you do not need to keep the full net, not even the full convolutional stack.
  • The starting kit contains examples with the VGG16 net, but feel free to use any of the other popular nets. Just note that there is no way to change the architecture of these nets. In particular, each net expects images of a given dimension so your image preprocessing needs to resize or crop the images to the right size.

You can also adjust the image preprocessing. Resizing to small (64x64 or even 32x32) will make the training faster so you can explore more hyperparameters, but the details will be lost so your final result will probably be suboptimal. Insects are mostly centered in the images but there are a lot of smaller insects which could be cropped for a better performance. You can also rotate the images or apply other data augmentation tricks (google "convolutional nets data augmentation"). You should also look at the actual images to get some inspiration to find meaningful preprocessing ideas.

In [1]:
import os
import numpy as np
import pandas as pd
from skimage.io import imread
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import AxesGrid
from matplotlib import cm

%matplotlib inline

pd.set_option('display.max_rows', 500)

The data

If the images are not yet in data/imgs, change the type of the net cell to "Code" and run it.

!python download_data.py
In [2]:
df = pd.read_csv('data/train.csv')
X_df = df['id']
y_df = df['class']
X = X_df.values
y = y_df.values

The class distribution is quite heavy tail: the largest class (ordinary bees) and the three largest classes contain 23% and 42% of the images, respectively.

In [3]:
labels_counts_df = df.groupby('class').count()
labels_counts_df = labels_counts_df.rename(columns={'id': 'count'})
class_codes_df =  pd.read_csv('data/class_codes.csv', index_col='class')
labels_counts_df = pd.merge(
    class_codes_df, labels_counts_df, left_index=True, right_index=True)
labels_counts_df = labels_counts_df.sort_values('count', ascending=False)
taxa_name count
202 L'Abeille mellifère <Apis mellifera> 4856
159 Les Eristales (autres) <Eristalis> 4049
57 Les Bourdons noirs à bande(s) jaune(s) et cul ... 2519
134 Les Bourdons à pilosité fauve à grise <Bombus> 1626
94 Le Syrphe ceinturé <Episyrphus balteatus> 1454
131 Les Mouches difficiles à déterminer 1320
27 Les Halictes (femelles) <Halictus, Lasioglossu... 1095
97 Les Oedemères verts <Oedemera> 934
170 Les Mouches aux reflets métalliques <Neomyia, ... 845
15 Les Guêpes Polistes <Polistes> 784
84 Les Coccinelles <Coccinellidae> 749
75 Les Bourdons noirs à cul rouge <Bombus> 728
121 La Coccinelle à 7 points <Coccinella septempun... 697
3 Les Sauterelles <Tettigonoidea> 648
175 Le Drap mortuaire <Oxythyrea funesta> 635
180 Les Bourdons noirs à bande(s) jaune(s) et cul ... 594
35 L'Araignée crabe Napoléon <Synema globosum> 593
148 Les Fourmis à pétiole simple <Formicinae> 592
200 Les Mouches pâles <Scathophaga et autres> 576
163 Les Syrittes <Syritta> 576
20 Les Bombyles <Bombylius, Systoechus> 560
179 Les Halictes (mâles) <Halictidae> 553
188 Les Moustiques, Tipules et autres Diptères Ném... 529
72 Les Ichneumons et autres <Ichneumonidae> 515
108 Les Mordelles <Mordellidae> 505
55 Les Fourmis difficiles à déterminer <Formicidae> 505
39 La Stomorhina <Stomorhina lunata> 497
112 Les Abeilles Hylaeus à taches blanches <Hylaeus> 465
7 L'Eristale des fleurs <Myathropa florea> 455
5 Les Hélophiles <Helophilus, Parhelophilus> 446
151 Les Cétoines métalliques à marques blanches <C... 398
150 Le Téléphore fauve et autres <Rhagonycha fulva... 395
160 Les Dermestes <Dermestidae> 391
66 Les Guêpes Crabronidae difficiles à déterminer... 389
167 Les Abeilles difficiles à déterminer <Apidae e... 387
140 Les Xylocopes <Xylocopa> 376
79 Taxon inconnu de la clé 374
98 Les Syrphes Sphaerophoria (femelle) <Sphaeroph... 358
124 Les Mouches à damier <Sarcophaga> 353
92 Les Andrènes rayées difficiles à déterminer <A... 345
25 Le Pentatome rayé <Graphosoma lineatum> 334
1 Les Guêpes Vespula <Vespula, Dolichovespula> 324
136 Les Guêpes maçonnes à abdomen court <Odynerus ... 320
77 Le Moro-sphinx <Macroglossum stellatarum> 316
168 Les Nitidulides <Nitidulidae> 314
33 Les Homoptères autres <Cicadelles, Cercopes et... 308
122 Les Piérides <Pieris> 300
54 Les Anthidies <Anthidium et autres> 294
0 Les Hespéries fauves <Ochlodes, Thymelicus> 291
197 Les Abeilles coucou noir, jaune et rouge <Noma... 280
102 Les Criquets <Acrididae> 279
14 Les Chenilles et fausses-Chenilles 270
8 Les Pucerons <Aphididae> 263
76 Les larves de Punaises <Heteroptera> 250
107 Les Bruches <Bruchus et autres> 250
185 Le Vulcain <Vanessa atalanta> 248
82 Les Conopides (autres) <Conopidae> 240
182 Le Syrphe porte-plume (mâle) <Sphaerophoria sc... 238
100 Les Bibions et autres <Bibio et autres> 237
206 Les Araignées (autres) 222
191 Le Gendarme <Pyrrhocoris apterus> 222
18 Les Eristales aux yeux ponctués <Eristalinus> 221
129 Le Paon du jour <Aglais io> 221
130 Le Xylocope violet (mâle) <Xylocopa violacea> 212
42 Les Azurés marrons à chevrons oranges <Polyomm... 211
120 Les Cétoines sombres soyeuses <Tropinota> 209
73 Les Araignées crabes sombres <Xysticus, Coriar... 207
50 Les Tenthrèdes noir et jaune <Tenthredo et aut... 199
172 Le Clairon des ruches <Trichodes alvearius> 195
103 Les Araignées sauteuses <Salticidae> 191
133 Les Rhingies <Rhingia> 188
52 Les Tachinaires fauves à abdomen aplati <Ectop... 183
193 Les Gastéruptions <Gasteruption> 171
162 La Lepture tachetée <Rutpela maculata> 171
74 L'Amaryllis <Pyronia tithonus> 166
99 Le Cuivré commun <Lycaena phlaeas> 160
157 Les Mégachiles <Megachile> 160
49 Les Coléoptères difficiles à déterminer 158
155 Les Tachinaires fauves à abdomen rond <Gymnosoma> 155
22 Les Mélitées et Damiers autres <Melitaea et au... 151
78 Les Syrphes à abdomen fin <Meliscaeva et autres> 150
58 Les Microlépidoptères difficiles à déterminer ... 148
38 Le Flambé <Iphiclides podalirius> 148
61 La Belle-Dame <Vanessa cardui> 148
41 Les Epeires et autres Araneidae 147
48 Les Taupins unis <Ampedus et autres> 147
90 Les Punaises difficiles à déterminer 147
198 Les Fadets sans bande blanche <Coenonympha> 146
69 Les Chrysides <Chrysididae> 146
62 Les Citrons <Gonepteryx> 145
51 Les Syrphes difficiles à déterminer 144
173 Les Nacrés et autres <Argynnis et autres> 142
119 Les Andrènes difficiles à déterminer <Andrenidae> 141
44 La Petite Tortue <Aglais urticae> 140
89 Le Frelon européen <Vespa crabro> 139
26 Le Souci et autres <Colias> 138
67 Les Sténoptères fauves <Stenopterus> 134
128 Les Syrphes à l'aspect de bourdon <Merodon et ... 134
70 Les Collètes (autres) <Colletidae> 131
34 Les Empidides <Empis et autres> 130
154 Les Tenthrèdes noir et fauve/orangé <Allantus,... 129
183 Les Malachides à points rouges <Malachius et a... 129
88 Les Chrysopes <Chrysopidae> 125
24 Le Robert-le-Diable <Polygonia> 124
165 Les Trichies <Trichius> 123
10 Les Terebrants Chalcidiens et autres 121
181 Les Mirides <Miridae> 119
139 Les Dasytides bleus et verts <plusieurs Dasyti... 117
9 Les Téphritides et autres <Tephritidae et autres> 116
19 Le Tircis <Pararge aegeria> 116
147 Les Opilions <Phalangiidae> 116
87 Les Pisaures <Dolomedes, Pisaura> 115
126 Le Frelon asiatique <Vespa velutina> 112
196 Le Demi-Deuil <Melanargia galathea> 112
207 Les Panorpes <Panorpidae> 112
186 La Volucelle zonée <Volucella zonaria> 111
11 Les Tachinaires fauves velues <Tachina et autres> 109
201 La Valgue hémiptère <Valgus hemipterus> 109
177 Les Syrphes Syrphus et autres <Syrphus, Dasysy... 108
171 Les Leptures fauves <Paracorymbia fulva et aut... 107
40 Les larves de Coccinelles <Coccinellidae> 107
64 Les Noctuelles <Noctuidae> 104
195 Les Scraptides <Scraptiidae> 101
152 Le Tabac d'Espagne <Argynnis paphia> 98
59 Les Anthracines Villa <Villa> 97
53 Les Abeilles à abdomen rouge <Sphecodes et aut... 95
65 Les Osmies noir et roux (femelles) <Osmia corn... 93
192 Les Andrènes à pilosité noir et blanc <Andrena> 92
166 Les Guêpes maçonnes à abdomen long <Delta, Dis... 92
106 Les Abeilles Ceratina bleutées <Ceratina> 92
149 Les Osmies noir et roux (mâles) <Osmia cornuta... 91
37 Les Araignées lynx <Oxyopes> 91
117 Les Pentatomes <Pentatomidae> 91
158 Les Longicornes entièrement noirs <Grammoptera... 89
71 Les Lygées rouges à points blancs <Lygaeus> 87
95 Les Zygènes à taches simples <Zygaena> 85
164 Les Araignées crabes Thomisus <Thomisus> 85
161 Le Clairon des abeilles <Trichodes apiarius> 84
144 Les Scolies à taches jaunes (autres) <Scolia e... 83
184 Les Clytes noir et jaune <Clytus et autres> 82
132 Le Sphégien noir à ailes fumées <Isodontia mex... 82
205 Les Abeilles à thorax roux <Andrena clarkella ... 80
63 La Collète du Lierre <Colletes hederae> 80
81 Les Mégachiles de petite taille <Stelis, Heria... 79
80 Les Adèles à motifs <plusieurs Adelidae> 78
146 Le Myrtil <Maniola jurtina> 78
56 Les Araignées crabes Misumena <Misumena> 77
68 Les Punaises Eurydema <Eurydema> 76
127 La Volucelle transparente <Volucella pellucens> 76
187 Les Anthophores autres et espèces proches <Ant... 76
16 Les Longicornes rouges au thorax noir <Acmaeop... 75
45 Les Coréides <Coreidae> 73
104 Les Anthophores rayés et espèces proches <Ameg... 71
208 Le Machaon <Papilio machaon> 71
142 Les Azurés bleus à chevrons oranges <Lysandra,... 71
114 Les Longicornes porte-coeur <Stictoleptura cor... 71
178 Les Epeires concombre <Araniella> 70
153 Les Pompiles <Pompilidae> 69
17 Les Syrphes Sphaerophoria (mâle) <Sphaerophoria> 67
123 Les Mylabres à bandes <Hycleus, Mylabris> 67
189 Le Satyre et autres <Lasiommata> 66
30 Les Araignées crabes Philodromus <Philodromus> 66
47 Les Chloromyies <Chloromyia> 65
125 Les Syrphes à taches en virgules <Eupeodes, Sc... 63
194 L'Athalie des roses <Athalia rosae> 63
4 Les Punaises prédatrices ternes 63
31 La Chrysomèle américaine <Chrysolina americana> 62
43 Les Perce-oreilles <Dermaptera> 62
12 L'Eristale taeniops <Eristalinus taeniops> 61
169 Les Sepsides <Sepsidae> 61
203 Les Guêpes fouisseuses <Bembix> 61
105 Les Ptérophores <Pterophoridae> 61
23 Les Pachytes <Pachyta et autres> 60
118 Photo insuffisante pour aller plus loin dans l... 59
116 La Tiphide aux pattes rouges <Tiphia femorata> 59
115 Les Fourmis à double pétiole <Myrmicinae> 58
91 Les Charançons (autres) <Larinus et autres> 58
141 Les Hannetons <Anisoplia, Phyllopertha> 57
83 Les Réduves <Rhynocoris> 56
86 La Tachinaire corpulente <Tachina grossa> 54
113 Les Sésies <Sesiidae> 54
174 Les Guêpes Cerceris <Cerceris> 53
138 L'Andrène fauve (femelle) <Andrena fulva> 53
46 Les Chrysanthies et autres <Chrysanthia, Ischn... 52
110 Les Bourdons (autres) <Bombus> 52
176 Les Asilides <Asilidae> 51
156 Les larves de Chrysopes <Chrysopidae> 51
111 La Punaise du Chou <Eurydema oleracea> 50
60 L'Abeille Ceratina noire <Ceratina cucurbitina> 49
32 Les Araignées Loup <Lycosidae> 48
143 L'Ecaille chinée <Euplagia quadripunctaria> 47
204 L'Azuré des Nerpruns (femelle) <Celastrina arg... 47
135 Les Chrysotoxes <Chrysotoxum> 47
93 Les Azurés migrateurs <Lampides, Leptotes> 47
28 La Silène <Brintesia circe> 46
36 Le Brun des Pélargoniums <Cacyreus marshalli> 46
137 Le Dinoptère <Dinoptera collaris> 46
96 Les Conopides jaune et noir <Conops et autres> 46
13 L'Araignée crabe Ebrechtella <Ebrechtella tric... 45
190 Le Criocère du Lis et autres <Exosoma, Lilioce... 45
109 Les Mouches Platystoma <Platystoma> 44
29 Les Eucères (mâles) <Eucera et autres> 44
199 Les Chloropides jaunes <Thaumatomyia> 43
2 La Mélitée orangée <Melitaea didyma> 42
6 La Carte géographique forme sombre <Araschnia ... 41
21 Les Bourdons à thorax fauve et à abdomen noir ... 40
145 Les Mouches tachetées <Anthomyia et autres> 38
85 Le Gazé <Aporia crataegi> 37
101 La Punaise de la Jusquiame <Corizus hyoscyami> 37
In [7]:
import sys  


plt.figure(figsize=(10, 5))

x = np.arange(len(labels_counts_df))
plt.bar(x, np.log10(labels_counts_df['count']))
plt.xticks(x + 0.5, labels_counts_df['taxa_name'], rotation=90, fontsize=1);

It is worthwhile to look at some image panels, grouped by label.

In [20]:
nb_rows = 4
nb_cols = 4
nb_elements = nb_rows * nb_cols
# change the label here to see other classes
label = 1


X_given_label = X[y==label]

subsample = np.random.choice(X_given_label, replace=False, size=nb_elements)

fig = plt.figure(figsize=(10, 10))
grid = AxesGrid(fig, 111, # similar to subplot(141)
                nrows_ncols = (nb_rows, nb_cols),
                axes_pad = 0.05,
                label_mode = "1",
for i, image_id in enumerate(subsample):
    filename = 'data/imgs/{}'.format(image_id)
    image = imread(filename)
    im = grid[i].imshow(image/255.)