Как использовать AI для подсчета коров на поле
Практическое руководство по использованию компьютерного зрения и YOLOv8 для подсчета объектов на изображениях
У вас есть ферма, и вам нужно посчитать количество коров на поле, чтобы убедиться, что ни одна не пропала. Машина может сделать это за вас:

Программа нашла 77 коров за одну секунду.
**Примеры из реальной жизни:** подсчитать клиентов, которые зашли в магазин сегодня, отсортировать фрукты или посчитать автомобили на парковке.
**Мы создадим простой анализатор изображений**, чтобы посчитать количество коров на поле и автоматически выделить их на фото. Опыт программирования не требуется. Если что-то непонятно, просто спросите ChatGPT.
Код универсален, поэтому вы можете обнаруживать людей или другие объекты, просто отредактировав одну строку кода. Мы будем использовать YOLOv8, передовую и высокоточную библиотеку распознавания изображений, которой можно пользоваться бесплатно.
**Требования:**
- Компьютер (Mac или Windows или Linux)
- Интернет
- Python (мы его установим)
- AI-модель YOLOv8 (мы ее скачаем)
- Изображение коров (мы его скачаем)
# Настройка рабочего пространства
Процесс программирования состоит из двух частей: написания кода и его выполнения. Обычно код пишут в текстовом редакторе, а выполняют с помощью инструмента типа "Терминал" на Mac. Однако существуют приложения, специально созданные для программирования, например, Visual Studio Code, которые позволяют писать и выполнять код на одной странице.
Visual Studio также поможет вам установить Python. Вы также можете установить расширения, которые ускоряют написание кода (например, автозаполнение Python и Copilot) или расширение, которое хранит ваш код в интернете (например, репозиторий Git).
# Установка Python
Мы будем использовать Python для написания кода и установки AI-моделей. Чтобы запустить код на Python, мы будем использовать Visual Studio Code. Чтобы установить Python, просто откройте "Расширения" на левой панели, введите "Python" в поле поиска и установите расширение Python.

## Установка Python на Mac
Во время установки могут возникнуть ошибки. Обратитесь к ChatGPT за помощью в их решении (например, скопируйте и вставьте текст ошибки).
Для установки Python на Mac вам потребуется скачать Homebrew - это своего рода магазин приложений для программистов. Откройте приложение "Терминал" (нажмите Command+Space и введите "Терминал"), затем скопируйте и вставьте код ниже в "Терминал":
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
Нажмите Enter и следуйте инструкциям программы.
После установки Brew рекомендуется выполнить
```bash
brew update
```
Это гарантирует, что у вас будет последняя версия Homebrew, и вы скачаете самую свежую версию Python.


Загрузите Python, введя
```bash
brew install python
```
Следуйте инструкциям и обратитесь к ChatGPT, если возникнут ошибки.
## Установка на Windows
Перейдите на [официальную страницу установки Python](https://www.python.org/downloads/windows/) и выберите последний установщик Python для Windows.
Установка проста, но могут возникнуть некоторые проблемы. Если это случится, опишите ошибки для ChatGPT (например, скопируйте и вставьте текст ошибки).
# Написание кода
Создайте новый документ, нажав Command+N. Затем сохраните файл с помощью Command+S под именем "analyze_image.py", где "analyze_image" - имя, а ".py" указывает на файл Python.
Теперь напишите простой код, который выводит "Привет!":
```python
print("Привет!")
```
Сохраните код, нажав комбинацию клавиш Command+S
# Запуск кода
Чтобы запустить код, нажмите кнопку воспроизведения. Вы увидите результат в окне "Терминал" внизу.
(Примечание: ваш терминал может выглядеть иначе, чем мой, но это не имеет значения)
Вы получите ответ здесь

Вы также можете нажать кнопку F5. В первый раз вам будет предложено выбрать отладчик (то же, что и запуск кода). Выберите первый.
Кроме того, вы можете запустить программу с использованием терминала в Visual Studio Code или "Терминал" на Mac. Это немного сложнее. Сначала откройте папку, в которой находится файл Python. Она отображается сверху в Visual Studio Code.
Чтобы открыть его, введите путь и функцию "cd" (change directory) в командную строку. Не указывайте имя файла; остановитесь на последней папке.
```bash
cd /Users/daniil_kovekh/Desktop/bot/Image/find_cow
```
Теперь вы можете перечислить все файлы в папке.
```bash
ls
```
Чтобы запустить код Python, введите "python" и имя файла с ".py" на конце.
```bash
python analyse_image.py
```
Вот и все. Если возникнет ошибка, попросите помощи у ChatGPT. Возможно, в коде есть ошибка.
# Загрузка библиотек
## Основы
Библиотека - это код, написанный другими разработчиками. Вот как его использовать:
Например, если вы хотите создать график с количеством клиентов, посетивших ваш магазин на прошлой неделе, вы можете использовать существующую функцию построения графиков, такую как "Matplotlib". Эта библиотека может нарисовать любой график, который вам нужен.
Сначала загрузите библиотеку из интернета. Используйте командную строку в Visual Studio Code для этого (вы также можете использовать приложение "Терминал" на Mac). Мы будем использовать установщик Python, называемый "pip".
```bash
pip install matplotlib
```
Нажмите "Enter" на клавиатуре.
После загрузки просто напишите этот код.
Символ "#" используется для комментариев. Текст после него в строке будет виден вам, но не машине.
```python
# Импортируем библиотеку и модуль pyplot. Модуль содержит функции.
import matplotlib.pyplot
# Определяем данные. Мы храним данные в виде списков - элементов одного формата.
# days - список, содержащий текст - это формат "строки"
days = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]
# customers - список, содержащий числа - формат "целых чисел"
customers = [120, 140, 110, 100, 170, 200, 210]
# Добавляем данные на график (X, Y).
# Мы используем столбчатую диаграмму - функция также называется "bar".
matplotlib.pyplot.bar(days, customers)
# Рисуем и отображаем график.
matplotlib.pyplot.show()
```
Сохраните код с помощью кнопки Command+S и нажмите кнопку воспроизведения для запуска кода (или используйте другие методы, которые мы изучили ранее). График появится в другом окне или, возможно, на другом рабочем столе.

## Бесплатные или платные
Большинство библиотек бесплатны, но некоторые требуют оплаты. Например, Yahoo Finance предоставляет бесплатный доступ к данным о ценах на акции. Однако OpenAI, поставщик ChatGPT, взимает $0.06 за каждые 1000 слов, напечатанных с использованием ChatGPT-4.
YOLOv8 - анализатор изображений можно использовать бесплатно.
## Доступ в Интернет
Некоторые библиотеки требуют доступа в интернет. Yahoo Finance и OpenAI оба работают с интернетом. Yahoo Finance использует интернет для доступа к своей базе данных с ценами на акции. OpenAI использует интернет по другой причине: оно получает текст, который вы написали, запускает программу AI на своем сервере и отправляет вам ответ.
YOLOv8 работает как онлайн, так и офлайн. YOLOv8 требует доступа в интернет для доступа к базе данных с обученными моделями, которые определяют, что изображено на картинке. Если вы обучите модель самостоятельно, загрузив сотни фотографий и указав, что на них изображено, то она будет работать офлайн.
# Импорт библиотеки YOLOv8
Библиотека YOLO разработана Ultralytics. Чтобы установить ее, просто выполните следующую команду:
```bash
pip install ultralytics
```
Вы можете столкнуться с ошибками, связанными с необходимостью загрузки других библиотек или устаревших пакетов. Просто скопируйте и вставьте эти сообщения об ошибках сюда, в ChatGPT.
# Получение изображений коров
Мы найдем коров на лугах, используя эти изображения:
https://koveh.ru/img/cows.jpg
https://koveh.ru/img/cows2.jpg
https://koveh.ru/img/cows3.jpg
Загрузите эти изображения и разместите их в папке с скриптом "analyse_image.py".
# Написание кода для обнаружения коров.
Давайте напишем основной код для обнаружения коров на изображениях. Сначала задайте путь к исходному изображению. Затем определите модель - мы будем использовать простую универсальную предварительно обученную модель под названием "yolov8n.pt". Затем определите, следует ли сохранить новое изображение с выделенными коровами. Также установите порог уверенности для компьютера, чтобы определить корову (от 0 до 1). Чем ниже уровень уверенности, тем больше шансов, что корова будет найдена, но риск того, что другой объект будет выбран в качестве коровы, также будет выше (например, автомобиль может стать коровой). Установите порог уверенности на 0.4.
Дополнительные настройки можно найти на [официальной веб-странице](https://docs.ultralytics.com/modes/predict/)
Обратите внимание: мы не определяем специально, что ищем коров; код просто определяет наиболее очевидные объекты на картинке. Мы уточним это позже.
```python
from ultralytics import YOLO
source = "/Users/daniil_kovekh/Desktop/bot/Image/find_cow/cows.jpg"
# Загрузка модели YOLOv8 из предварительно обученного файла весов
model = YOLO("yolov8n.pt")
# Найти корову с уверенностью 0.4 и сохранить изображение
model.predict(source, save=True, conf=0.4)
```


Результаты сохраняются в папке runs/detect/predict. Если папка "predict" уже существует, она будет названа "predict1" и т.д.
Вот результаты изображения с 2 коровами на нем:

Результаты с большим количеством коров:

Как видим, когда коровы меньше и перекрывают друг друга, код допускает ошибки из-за неуверенности.
# Улучшение результатов - уменьшение уверенности.
Чтобы улучшить результаты, мы можем настроить порог уверенности и Intersection Over Union (IOU) - который учитывает перекрывающихся коров, например, когда корова прячется за деревом. Измените эти настройки в диапазоне от 0 до 1.
```python
from ultralytics import YOLO
source = "/Users/daniil_kovekh/Desktop/bot/Image/find_cow/cows.jpg"
# Загрузка модели YOLOv8 из предварительно обученного файла весов
model = YOLO("yolov8n.pt")
# Найти корову с уверенностью 0.4 и сохранить изображение
model.predict(source, save=True, conf=0.4, iou= 0.4)
```
Результаты все еще могут быть неидеальными, потому что при низком пороге уверенности AI может ошибочно определить другие объекты, такие как автомобили, в качестве коров.
# Улучшение результатов – увеличение размера изображения
По умолчанию ширина изображения составляет 640 пикселей. Размер изображения cows3.jpg составляет примерно 5000x3000 пикселей, в то время как размер изображения cows.jpg отличается. Определите подходящий размер изображения для каждой картинки с использованием Python Imaging Library (PIL).
Установите PIL с помощью команды терминала и pip:
```bash
pip install Pillow
```
Теперь напишите код на Python в Visual Studio:
```python
from PIL import Image
source = "/Users/daniil_kovekh/Desktop/bot/Image/find_cow/cows3.jpg"
# Загрузите изображение и получите его ширину
image = Image.open(source)
width, _ = image.size # _ означает высоту, которая нам не нужна.
# Загрузка модели YOLOv8 из предварительно обученного файла весов
model = YOLO("yolov8n.pt")
# использовать imgsz равное ширине
model.predict(source, imgsz=width, save=True, conf=0.4, iou= 0.4)
```
Этот подход дает лучшие результаты, но не стесняйтесь экспериментировать с настройками для их дальнейшего улучшения.
# Подсчет коров
Чтобы посчитать коров, мы будем подсчитывать количество индексов "коровы". Индексы коров хранятся в словаре, аналогичном приведенному ниже примеру:
```python
животные = {"корова": 0.8, "корова":0.5, "собака":0.4, "корова":0.66, "утка":0.4}
```
В этом словаре записывается каждый обнаруженный объект на изображении и его уверенность как указанное животное. Мы будем считать все коровы, присутствующие в словаре. В приведенном выше примере насчитывается три коровы.
```python
from ultralytics import YOLO
from PIL import Image
source = "/Users/daniil_kovekh/Desktop/bot/Image/find_cow/cows3.jpg"
# Загрузите изображение и получите его ширину
image = Image.open(source)
width, _ = image.size
# Загрузка модели YOLOv8 из предварительно обученного файла весов
model = YOLO("yolov8n.pt")
# Определите индекс класса коровы
cow_class_index = None # по умолчанию, если на картинке нет коров
for key, value in model.names.items():
if value == "cow":
cow_class_index = key # ключ - это первый элемент в словаре Python
break
# Запустите прогнозирование на первом изображении
results = model.predict(source, save=True, imgsz=width, conf=0.3, iou = 0.5)
boxes = results[0].boxes
cow_detections = [box for box in boxes if int(box.cls) == cow_class_index]
print(f"Количество коров на {source}: {len(cow_detections)}")
```


Компьютер подсчитывает 77 коров (из 78).
# Анализируйте что угодно
Теперь вы готовы писать код для обнаружения объектов различных видов. Если вы хотите обнаруживать людей, просто измените значение с "корова" на "человек" или "чашка".

4 человека

18 человек

3 чашки кофе
Исследуйте [документацию](https://docs.ultralytics.com/modes/predict/#arguments) и анализируйте что угодно – вы можете анализировать видео или прямые трансляции, обнаруживать движения человека или даже рисовать скелет индивида для оценки движений спортсменов.
Если вам нужно приложение на базе ИИ, сайт, бот для Telegram, расширение для Google, инструмент автоматизации или веб-скрепер, не стесняйтесь связаться со мной по адресу daniil@koveh.com. Моя команда и я рады помочь вам.