Создание собственного приложения для обнаружения объектов в реальном времени: Roboflow (YOLOv8) и Streamlit

Введение

Активное обучение направлено на выбор наиболее информативных образцов из большого пула немаркированных данных, которые обычно помечает человек-аннотатор для повышения производительности модели.

В контексте Raspberry Pi активное обучение в этом проекте будет заключаться в сборе данных и загрузке этих новых данных в Roboflow для повышения производительности модели. Это может быть особенно полезно при работе с небольшими наборами данных, что характерно для встроенных систем, таких как Raspberry Pi, где ресурсы хранения и вычислительные ресурсы могут быть ограничены.

Для этого я буду использовать Roboflow API для загрузки изображений в наш существующий набор данных на платформе Roboflow. Вы можете загружать изображения в проекты Roboflow с помощью веб-интерфейса, Python SDK, REST API и CLI.

Сначала нам нужно настроить Raspberry Pi, посмотрите мой обучающий пост Как настроить Raspberry Pi. Для сбора данных я использую Buster версию ОС Raspberry Pi, затем нам нужно настроить камеру, если вы используете официальную камеру от Raspberry Pi, посмотрите мое руководство Как настроить камеру с версией ОС, о которой я упоминал.

Как только у нас все будет готово, первое, что нам нужно, это создать код Python для автоматизации, как мы делали это в Windows, как делать фотографии, код создаст папку с именем списка меток, который мы хотим, и для каждой папки будут захватывать изображения с камерой время, которое мы задали, и, как мы сделали в Windows, появятся окна, показывающие нам, что видит камера, давайте посмотрим код:

import time
import picamera
from PIL import Image
import os

def get_image_size(image_path):
    with Image.open(image_path) as img:
        return img.size

def take_pictures(label, num_pictures, interval_seconds, output_folder):
    folder_path = os.path.join(output_folder, label)
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)

    with picamera.PiCamera() as camera:
        # Start the preview
        camera.start_preview()

        for i in range(1, num_pictures + 1):
            # Generate the file name for the picture
            file_name = os.path.join(folder_path, f"{label}_picture{i}.jpg")

            # Capture the picture
            camera.capture(file_name)

            # Get the size of the captured image
            image_size = get_image_size(file_name)
            print(f"{label} - Picture {i}: Width={image_size[0]}, Height={image_size[1]}")

            # Wait for the specified interval before taking the next picture
            time.sleep(interval_seconds)

        # Stop the preview after capturing all pictures
        camera.stop_preview()

if __name__ == "__main__":
    labels = ["label1", "label2", "label3"]  # Add more labels if needed
    num_pictures_per_label = 20
    interval_seconds = 2
    label_delay_seconds = 10  # Delay between capturing pictures for each label
    output_folder = "my_pictures"  # Change this to the desired output folder name

    # Create the output folder if it doesn't exist
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for label in labels:
        print(f"Taking pictures for label: {label}")
        take_pictures(label, num_pictures_per_label, interval_seconds, output_folder)
        time.sleep(label_delay_seconds)

Вот как это будет выглядеть:

После этого у нас теперь есть новый набор данных, который теперь мы можем загрузить в Roboflow. Теперь расскажу о проблеме с ОС Raspberry Pi. Я пытался установить Roboflow в версии Buster, и это не сработало, похоже, нет совместимой версии. Из-за этого теперь нам нужно настроить Raspberry с последней версией ОС Raspberry Pi Bullseye, проблема с Bullseye заключается в том, что у него есть новая библиотека камер с именем picamera2, поэтому эта новая библиотека немного сложна, а ОС также не работает. Это позволяет вам легко получить доступ к камере, как в версии Buster, поэтому необходимо подойти к терминалу и активировать ее вручную. Чтобы получить доступ к этой конфигурации, нам нужно ввести sudo raspi-config. Предупреждаем, что это не работает с VNC, вам нужен монитор, подключенный к Pi.

Выберите опцию 3 Параметры интерфейса. И появится:

Затем выберите I1 Legaby Camera enable, а затем Enable, после чего вас спросят о перезагрузке, и для внесения изменений необходимо перезагрузить ее. Тогда возможен запуск кода, действительно похожего на тот, что в Buster.

import time
from picamera2 import Picamera2, Preview
from PIL import Image
import os

picam2 = Picamera2()

def take_pictures(label, num_pictures, interval_seconds, output_folder):
    folder_path = os.path.join(output_folder, label)
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)

    with picam2 as camera:
        # Start the preview
        camera.start(show_preview=True)

        for i in range(1, num_pictures + 1):
            # Generate the file name for the picture
            file_name = os.path.join(folder_path, f"{label}_picture{i}.jpg")

            # Capture the picture
            camera.capture_file(file_name)

            # Wait for the specified interval before taking the next picture
            time.sleep(interval_seconds)

        # Stop the preview after capturing all pictures
        camera.stop_preview()

if __name__ == "__main__":
    labels = ["label1", "label2", "label3"]  # Add more labels if needed
    num_pictures_per_label = 20
    interval_seconds = 2
    label_delay_seconds = 10  # Delay between capturing pictures for each label
    output_folder = "my_pictures"  # Change this to the desired output folder name

    # Create the output folder if it doesn't exist
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    for label in labels:
        print(f"Taking pictures for label: {label}")
        take_pictures(label, num_pictures_per_label, interval_seconds, output_folder)
        time.sleep(label_delay_seconds)

Теперь, после запуска любого из двух предыдущих кодов для сбора данных, давайте проверим, как загрузить эти данные из Raspberry Pi в Roboflow с помощью API.

Загружайте изображения в Roboflow с помощью API и Python.

Сначала нам нужно, чтобы наша Raspberry с версией Bullseye проверила мой учебник по настройке Raspberry. Затем нам нужно запустить в терминале

pip install roboflow

Если нам удалось установить библиотеку, откройте Thonny Python IDE из Raspberry и нажмите «Выполнить» со следующим кодом, чтобы загрузить изображения в папку, которую вы недавно создали (просто измените соответствующие значения вашего проекта).

import os
from roboflow import Roboflow

# Initialize the Roboflow object with your API key
rf = Roboflow(api_key="xxxxxxxxxxxxxxxxx")

# Retrieve your current workspace and project name
print(rf.workspace())

# Specify the project for upload
project = rf.workspace("xxxxxxxx").project("xxxxxxxxx")

# Folder path containing all the images
folder_path = "/content/images"  # Update this to your folder path

# Get a list of all image files in the folder
image_files = [os.path.join(folder_path, file) for file in os.listdir(folder_path) if file.lower().endswith(('.jpg', '.jpeg', '.png'))]

# Upload each image to your project
for image_file in image_files:
    project.upload(image_file)

В оболочке появится вся информация, и, если она запущена, добавьте печать, чтобы предупредить вас, когда она закончится. При запуске вы увидите, что это занимает некоторое время, но изображения будут загружены.

После его завершения вы можете подождать несколько минут, чтобы увидеть изображения в разделе назначения из вашего проекта Rboflow, как мы видим на изображении ниже.

Поздравляем, теперь у вас есть новый набор изображений для маркировки вручную, а затем переобучения модели! Используя потенциал активного обучения с Raspberry Pi и Roboflow API, вы создали оптимизированный процесс для захвата изображений и беспрепятственного использования их метки Roboflow. Итак, вперед, погрузитесь в процесс маркировки и позвольте возможностям активного обучения с Raspberry Pi и Roboflow API ускорить ваше путешествие по машинному обучению. Удачной маркировки и удачного кодирования!
Вы можете ознакомиться с частью 6: Как развернуть модель Roboflow (YOLOv8) на Raspberry Pi.