Гайд - Создаём свой ИИ на Python! | End Way - форум программирования и сливов различных скриптов
  • Присоединяйтесь к нам в телеграм канал! EndWay канал | EndSoft канал | EWStudio канал
  • Хочешь поставить скрипт, но не умеешь?
    А может ты хочешь свой уникальный скрипт?

    Тогда добро пожаловать в нашу студию разработки!

    Телеграм бот: EWStudioBot
    Телеграм канал: EWStudio

Гайд Создаём свой ИИ на Python!

Lanutrix

Бот
Автор темы
9 Фев 2023
44
131
0
Всем доброго времени суток. И снова пост про python. И снова гайд. В этот раз я расскажу, как создать свою нейросеть для распознавания объектов на фотографиях.

Небольшая предыстория. Мне поступил заказ на разработку бота для онлайн-игры. У игры есть античит, да и считывать оперативную память я не умею. Единственным решением, которое пришло мне в голову, было создание ИИ для распознавания нужных объектов.

Ну что же, приступим. Руки так и чешутся!
:foxДля тех, кто ещё не зарегистрировался:fox
[REACTS=1]
Итак, задача поставлена. Как её решить? По сравнению с прошлой моей статьёй всë несколько сложнее, так что будь готов потратить далеко не один час своего времени на практическую реализацию.

Приступим! Для начала расскажу немного теории. Использовать мы будем YOLOv8, в частности библиотеку ultralistics. Что же это такое? Если не вдаваться в подробности, то это мега крутая штука и для еë использования вам не нужны глубокие познания в математике. Она работает быстро, а насколько чëтко, зависит от того как ты еë обучишь. У самой YOLOv8 есть несколько вариаций модели, они отличаются по весу, скорости и точности распознавания. Эти модели являются обученными и распознают довольно много объектов, начиная от людей заканчивая мебелью.

— Люди, машины, стулья - это всё конечно классно, но я хочу, чтобы оно распознавало мобов в игре. Такого точно в стандартной модели нет!
— Нет, конечно, но ты можешь обучить еë этому.
— А как?

А вот так. Для начала тебе нужен будет датасет (фотографии, на которых отмечены нужные объекты). Для того, чтобы сделать свой датасет тебе понадобится собрать много фото нужных тебе объектов в разных положениях и под разными ракурсами, а также соблюсти ряд условий (без них точность будет ужасной):
  1. Количество разных классов (распознаваемых объектов) должно быть одинаковым или примерно равным.
  2. Не должно быть повторяющихся фото
  3. Не должно быть фото без нужных объектов.
  4. Общее количество фото в датасет от 100 на каждый объект.
  5. Количество классов объектов не должно быть слишком большим.

— Ну собрал я фотографии, пол дня мучался! Теперь можно обучать?
— Нет, теперь можно размечать.
— Да бл... агославит тебя господь, сука!
— Не ной, ты сам захотел сделать свою нейросеть!

Так все-таки, как разместить датасет? Для этого есть много решений, как бесплатных, так и условно-бесплатных. Я предлагаю второй вариант, так как ограничение в 2000 картинок ты вряд ли перепрыгнешь, а сервис реально хороший, roboflow называется. Безусловно, есть и программы, которые будут работать локально, но во-первый, облачное хранение - это всегда удобно, а во-вторых от дизайна у тебя НЕ БУДУТ ВЫТЕКАТЬ ГЛАЗА.

Для начала зарегистрируйтесь и создайте новый проект, это будет выглядеть так:

Create project

Далее нужно загрузить фото (можно и видео, будут вырезаться кадры, с амплитудой, которую ты задашь). Можно загружать как отдельную картинку, так и целую папку с ними.

Upload img

После чего нужно разметить загруженные фото.

— Я всё разметил. Что дальше?
— Давай проверим..... Ууу ну ты чего, нужно прям по пиксельно выделять.

Слева неправильный вариант, а справа исправленный.

NenadoORnado

— Я исправил криво размечанные фотки.
— Импортируй датасет.

Импорт происходит следующим образом:
  1. В размеченных фото нажмите "Add image to Dataset".
  2. В методе выберете РАЗБИТЬ НА Train/Valid/Test, а проценты разделения поставь 70/20/10.
ImageToDataset

3. Нажми на пункт "Generate".

4. Далее "Generate New Version".
YoloDatasetVersion

5. Пункт 1 и 2 пропускаем (continue)

6. В пункте 3 в параметре resize указываешь нужное тебе разрешение, но советую ставить 640x480.
DATASETpynkt3

7. Пункт 4. Нажимаешь "Add Augmentation Step" и выбираешь один или несколько уровней. Их список приведён ниже:
Pasted image 20230605120826

8. На пункте 5 должно быть, что-то подобное, просто нажми "Generate" немного подожди.
Pasted image 20230605121116

9. Нажми "Export Dataset".
ExportDataSet

10. В выпадающем меню выбрать YOLOv8 и ниже поставить галочку на "download zip to computer".
DownLoadDateSetRoboflow

Ура, получилось, теперь у нас есть то, что называется датасетом.

— Ну давай умник, какая следующая запара меня ждёт?
— Нууу теперь её нужно обучить.

Открыл ты значит редактор кода и весь такой радостный, в предвкушении Machine Learning. Охлади свои потные ручки, давай проверим оборудование (для работы нейронки хватит и бюджетного процессора, но для её обучения нужна видюха и как можно мощнее). Скажу сразу, если у тебя видеокарта не от Nvidia, серии GTX или RTX, то сильно не огорчайся, расскажу как обучить нейронку хоть на телефоне. И так, если ты обладатель зелёной видеокарты, вот тебе инструкция:

1. Качаешь cuda toolkit(net) и в нём устанавливаем все, что предлагается (Лучше качать свежую версию).
2. Скачиваешь cudnn 11.x и по документации все это дело извлекаем в определенные папки, где после установки находится cuda вашей версии.
3. После всего этого скачиваешь pytorch под свою версию cuda (то что ты скачивал в пункте 1).
4. Скачиваешь библиотеку ultralistics. (pip install ultralistics)

Если же у тебя нет продукции от дядюшки Хуанга, то тебе поможет Google с их сервисом Colaboratory. Для использования понадобится только google аккаунт. Да и этот сервис условно бесплатный, ну а что ты хотел, все хотят кушать.

Создаёшь значит ты новый блокнот кнопкой "Создать блокнот". Сделал, молодец! Теперь нужно подрубить внутреннего еврея на максимум ну и за одно бесплатную gpu от google (на 16 гб видеопамяти). Просто делай так, как показано на скриншотах.

VidCardOtGoogle
GpuGoogleFree

— Да сколько можно! КОГДА МЫ БУДЕМ УЖЕ ОБУЧАТЬ НЕЙРОСЕТЬ?
— Что ты такой не терпеливый, я и так стараюсь быстро и кратко рассказывать.

Последние приготовления и написание скрипта для обучения.
Во-первых, нужно распаковать датасет. Как это сделать локально думаю все знают, а что на счёт Colaboratory. Там всё чутка сложнее, но для максимальной простаты́:

1. Загрузи датасет на свой Google Диск.
2. И пропиши в скрипте: !unzip /content/drive/MyDrive/PATH_TO_DATASET.zip

Дальше различий нет!

А теперь долгожданное обучение нейронной сети, то ради чего ты проделал весь этот огромный путь, приложив тонну усилий:

yolo task=detect mode=train model=yolov8s.pt imgsz=640 dаta=dаtа.yaml epochs=100 batch=64 name=lanutrix project=endway


— Эй-эй-эй, это что за хрень! Говорил нейронку обучим, а сам кинул одну непонятную команду и всё...

Давай разбираться, чё за команда и какие параметры принимает.

Итак, этой командой мы запускаем yolo (cli), для обнаружения объектов (task=detect) и хотим, чтобы она обучалась этому (mode=train), далее мы указываем модель, которая будет обучаться на нашем датасете. Вот собственно табличка, какие есть модели, с их характеристиками:

Pasted image 20230529211234

Самый главный как по мне параметр, по мимо точности, это скорость работы на CPU и GPU. Если ты можешь запустить нейронку на видеокарте, то бери модель L или X, но если ты не владеешь картой от Nvidia, то к сожалению на процессоре это работает не очень.

Опять же я пишу статью для всех, так что даже на видеоядре ты сможешь прикоснуться к нейросетям. Не буду долго тянуть, бери модель S, она гораздо лучше N, а кушает ресурсов почти так же.

О чём я рассказывал... Ах, да, параметры для обучения, следующий на очереди imgsz, он отвечает за размер фоток для обучения (в пикселях).

Следующий параметр dаta - это путь к файлу YAML dataset, в котором прописана вся информация о том как обработать датасет.

После идёт параметр epochs - он задаёт количество раз, которая неёронка пройдёт датасет для обучения (и нет, не всегда больше - значит лучше, короче не стоит для 500 фоток ставить значение больше 1k)

В конце записи, но не по значению стоит параметр batch, он отвечает за количество потоков, в которое будет обучаться нейронка. Чем больше будет значение, тем процесс пойдёт быстрее, но и нагрузка возрастёт. Кстати о ней, если этот параметр будет слишком большим для вашего железа, то при обучении вылезет ошибка, о нехватке ресурсов.

— Я всё сделал!!!
— Красавчик, теперь проверим насколько хорошо ты это сделал.
— И как мы это сделаем?

Как-же понять насколько всë плохо? Для начала запусти обучения и дай пройти хотя-бы одной эпохе. Теперь открой {project}/{name}/labels.jpg. Ну и сопоставь с картинкой ниже:
Labels in dataset


Если твой labels.jpg, как на третей картинке, то можешь ставить обучение и дожидаться результата. А если нет, то обратно иди на roboflow и дополняй свой датасет, после чего заново импортируй его.

Итогом всех твоих мучений будет файл {project}/{name}/weights.best.pt, который является твоей обученной нейронкой.

— Дааа! Я мега хорош! но как её использовать в моём python коде?
— Бро, говно вопрос, щас расскажу.

Python:
import ultralytics

model = ultralytics.YOLO('best.pt')

results = model.predict(path_to_img, show = False, save=False, imgsz=(1280, 736), conf=0.7, line_width = 1)

for r in results:
    for c in r.boxes:
        print(c.xyxy[0])
    for c in r.boxes.cls:
        print(model.names[int(c)])

Сначала задаём путь до нашей модели. После в model.predict есть несколько параметров, сейчас их разберём:
  • path_to_img - путь до фото, на котором нужно, что-то распознать.
  • show - при значение True будет выводить обработанное фото с обведёнными объектами.
  • save - при значение True будет сохранять обработанное фото.
  • imgsz - размер фото, для обработки. Стоит пояснить, что он может не совпадать с реальным размером фото, а будет преобразовывать его до указанного размера. На выходе будет изображение исходного размера.
  • conf - порог достоверности объекта для обнаружени.
  • line_width - толщина линии ограничивающих рамок. Если нет, масштабируется до размера изображения.

А на выходе должно быть, что-то подобное:
Bash:
image 1/1 D:\farm_skin\atack.png: 416x736 1 deer, 463.1ms
Speed: 2.0ms preprocess, 463.1ms inference, 1.0ms postprocess per image at shape (1, 3, 1280, 736)
tensor([308.9633, 164.6175, 617.5374, 397.9679])
deer
[/REACTS]

Фух, это всё! Статья получилась огромной и всеобъемлющей. На её написание ушло несколько дней, так что подписка будет отличной благодарностью. Искренне верю, что кому-нибудь помогут мои материалы и он сэкономит своё время на поиске информации. Спасибо, что дочитал, с тобой были Lanutrix.

:smilecatДо новых встреч на endway.su:smilecat
 
Последнее редактирование:
Like
  • 22
Реакции: 21 users
Активность:
Пока что здесь никого нет