В последние годы в новостях было довольно много неясностей по двум, казалось бы, не связанным между собой темам: сокращению численности пчел и других опылителей и одновременному развитию искусственного интеллекта и науки о данных. Немного почитав опыление и то, как работают исследования опыления, я понял, что, хотя известно многое, есть, как и во всех науках, еще более неизведанные. Это вызвало у меня любопытство: нельзя ли использовать ИИ для изучения опылителей? В этом посте я объясню простой способ сделать это. Я написал код, который можно найти в моем гитхабе. (Https://github.com/jnnkl/bees_on_dahlia). Но в качестве тизера: я хотел подсчитать количество посещений цветов в этом фильме.

Получение данных
Первым делом нужно было собрать данные. Моей целью было сделать что-нибудь дешевое, поэтому я купил самую дешевую веб-камеру, которую смог найти в местном магазине электроники. В сентябре прошлого года я принес его в парк и собрал около 1,5 часов одну фотографию вторую покадровую серию букета цветов георгина. В результате был получен набор данных из 4500 изображений. Моей целью было использовать методы глубокого обучения, чтобы подсчитать количество опылителей, посещающих каждый цветок. Я решил пойти на обучение с учителем, потому что это самый простой способ. Для этого мне понадобился помеченный набор данных, и я использовал для этого первые 1500 изображений. То есть я действительно вырезал квадраты по середине основных цветов с посетителями и без насекомых. Я сделал квадраты разного размера и вырезал каждую пчелу по несколько раз. Таким образом я собрал 635 изображений цветка с пчелой, и, поскольку цветы чаще не посещают, чем посещают, было гораздо больше изображений без насекомых. Оказалось, что цветы чаще не посещают, чем посещают. Чтобы сделать набор данных сбалансированным, я использовал такое же количество изображений пустых цветов.

Построение сети
Я хотел построить классификатор, содержащий два класса: 1) насекомое присутствует и 2) насекомое отсутствует. Я использовал для этого сверточную нейронную сеть, потому что они очень полезны для распознавания изображений. Поскольку объем данных не был огромным, я пошел на трансферное обучение. Поскольку VGG16 была самой маленькой сетью, доступной в дистрибутиве keras, установленном на моем компьютере, я использовал ее. Я использовал методы, описанные в этом (https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html) блоге от keras. Это поверх сети VGG16. Я поместил небольшую сверточную нейронную сеть, обучил эту меньшую сеть и сохранил ее. Затем я взял всю сеть, сделал первые 15 слоев необучаемыми, а затем обучил остальные с очень небольшой скоростью обучения, чтобы предотвратить чрезмерную подгонку. Я быстро получил точность более 92%. Мне посчастливилось иметь доступ к кластеру GPU для обучения, иначе это заняло бы довольно много времени.

Создание фильма
Теперь, когда я смог классифицировать квадратные изображения с пчелой или без нее, пришло время использовать это, чтобы проверить количество насекомых-посетителей двух основных цветов в моем фильме. К счастью, я сделал свою таймлапс-запись в безветренный день, поэтому изображения были довольно стабильными. Поэтому я просто определил расположение двух цветов и взял эти части каждого изображения, пропустил их через нейронную сеть и получил таблицу с каждым изображением для обоих цветов, было ли там насекомое или нет. Поскольку точность была высокой, но не слишком высокой, я решил подсчитывать только те экземпляры насекомых, если есть по крайней мере два последующих экземпляра насекомых, и аналогично, если это было, оно исчезло на более короткий, чем одна секунда кадра, тогда я переклассифицировал его как с участием. Я рисовал коробки там, где я смотрел: красные, если насекомых не было, и зеленые, если насекомые были. Это привело к следующему фильму:

Количественная оценка результатов и некоторое обсуждение
Итак, теперь у меня есть хорошая визуализация, которая на самом деле не является количественной оценкой, давайте посмотрим на некоторые графики. На этих графиках цветок 1 - это цветок в левом верхнем углу, а цветок 2 - это большой цветок, который виден только наполовину.

Они показывают, что больший цветок посещают чаще, а интервалы между посещениями кажутся меньше. Конечно, это короткое измерение не подтверждает никаких серьезных заявлений о поведении опылителей, но я искал не это. Цель этого эксперимента заключалась в том, чтобы показать, что методы глубокого обучения могут помочь в изучении поведения опыления, в том числе и в количественном отношении. Конечно, это можно было сделать и классическим способом анализа изображений. Вероятно, можно было бы относительно легко придумать алгоритм, который бы автоматически распознавал посещение насекомыми этих цветов георгин. Однако они не распространяются на другие цветы. Я проверил, работает ли эта сеть и для других цветов. Мне бы повезло, если бы это было так, и я действительно должен был сделать вывод, что эта сеть работает только для этих цветов. Другие цветы часто более разнообразны по своей структуре, чем этот конкретный георгин, и создать сеть, обнаруживающую насекомых на всех типах цветов, на самом деле довольно сложно. Так что, как получить хорошую сеть обнаружения насекомых для других цветов и большего количества фонов, будет темой более поздней публикации.