Всем доброго времени суток. И снова пост про python. И снова гайд. В этот раз я расскажу, как создать свою нейросеть для распознавания объектов на фотографиях.
Небольшая предыстория. Мне поступил заказ на разработку бота для онлайн-игры. У игры есть античит, да и считывать оперативную память я не умею. Единственным решением, которое пришло мне в голову, было создание ИИ для распознавания нужных объектов.
[REACTS=1]
Итак, задача поставлена. Как её решить? По сравнению с прошлой моей статьёй всë несколько сложнее, так что будь готов потратить далеко не один час своего времени на практическую реализацию.
Приступим! Для начала расскажу немного теории. Использовать мы будем YOLOv8, в частности библиотеку ultralistics. Что же это такое? Если не вдаваться в подробности, то это мега крутая штука и для еë использования вам не нужны глубокие познания в математике. Она работает быстро, а насколько чëтко, зависит от того как ты еë обучишь. У самой YOLOv8 есть несколько вариаций модели, они отличаются по весу, скорости и точности распознавания. Эти модели являются обученными и распознают довольно много объектов, начиная от людей заканчивая мебелью.
А вот так. Для начала тебе нужен будет датасет (фотографии, на которых отмечены нужные объекты). Для того, чтобы сделать свой датасет тебе понадобится собрать много фото нужных тебе объектов в разных положениях и под разными ракурсами, а также соблюсти ряд условий (без них точность будет ужасной):
Так все-таки, как разместить датасет? Для этого есть много решений, как бесплатных, так и условно-бесплатных. Я предлагаю второй вариант, так как ограничение в 2000 картинок ты вряд ли перепрыгнешь, а сервис реально хороший, roboflow называется. Безусловно, есть и программы, которые будут работать локально, но во-первый, облачное хранение - это всегда удобно, а во-вторых от дизайна у тебя НЕ БУДУТ ВЫТЕКАТЬ ГЛАЗА.
Для начала зарегистрируйтесь и создайте новый проект, это будет выглядеть так:
Далее нужно загрузить фото (можно и видео, будут вырезаться кадры, с амплитудой, которую ты задашь). Можно загружать как отдельную картинку, так и целую папку с ними.
После чего нужно разметить загруженные фото.
Слева неправильный вариант, а справа исправленный.
Импорт происходит следующим образом:
3. Нажми на пункт "Generate".
4. Далее "Generate New Version".
5. Пункт 1 и 2 пропускаем (continue)
6. В пункте 3 в параметре resize указываешь нужное тебе разрешение, но советую ставить 640x480.
7. Пункт 4. Нажимаешь "Add Augmentation Step" и выбираешь один или несколько уровней. Их список приведён ниже:
8. На пункте 5 должно быть, что-то подобное, просто нажми "Generate" немного подожди.
9. Нажми "Export Dataset".
10. В выпадающем меню выбрать YOLOv8 и ниже поставить галочку на "download zip to computer".
Ура, получилось, теперь у нас есть то, что называется датасетом.
Открыл ты значит редактор кода и весь такой радостный, в предвкушении Machine Learning. Охлади свои потные ручки, давай проверим оборудование (для работы нейронки хватит и бюджетного процессора, но для её обучения нужна видюха и как можно мощнее). Скажу сразу, если у тебя видеокарта не от Nvidia, серии GTX или RTX, то сильно не огорчайся, расскажу как обучить нейронку хоть на телефоне. И так, если ты обладатель зелёной видеокарты, вот тебе инструкция:
1. Качаешь cuda toolkit(net) и в нём устанавливаем все, что предлагается (Лучше качать свежую версию).
2. Скачиваешь cudnn 11.x и по документации все это дело извлекаем в определенные папки, где после установки находится cuda вашей версии.
3. После всего этого скачиваешь pytorch под свою версию cuda (то что ты скачивал в пункте 1).
4. Скачиваешь библиотеку ultralistics. (
Если же у тебя нет продукции от дядюшки Хуанга, то тебе поможет Google с их сервисом Colaboratory. Для использования понадобится только google аккаунт. Да и этот сервис условно бесплатный, ну а что ты хотел, все хотят кушать.
Создаёшь значит ты новый блокнот кнопкой "Создать блокнот". Сделал, молодец! Теперь нужно подрубить внутреннего еврея на максимум ну и за одно бесплатную gpu от google (на 16 гб видеопамяти). Просто делай так, как показано на скриншотах.
Последние приготовления и написание скрипта для обучения.
Во-первых, нужно распаковать датасет. Как это сделать локально думаю все знают, а что на счёт Colaboratory. Там всё чутка сложнее, но для максимальной простаты́:
1. Загрузи датасет на свой Google Диск.
2. И пропиши в скрипте:
Дальше различий нет!
А теперь долгожданное обучение нейронной сети, то ради чего ты проделал весь этот огромный путь, приложив тонну усилий:
Давай разбираться, чё за команда и какие параметры принимает.
Итак, этой командой мы запускаем yolo (cli), для обнаружения объектов (task=detect) и хотим, чтобы она обучалась этому (mode=train), далее мы указываем модель, которая будет обучаться на нашем датасете. Вот собственно табличка, какие есть модели, с их характеристиками:
Самый главный как по мне параметр, по мимо точности, это скорость работы на CPU и GPU. Если ты можешь запустить нейронку на видеокарте, то бери модель L или X, но если ты не владеешь картой от Nvidia, то к сожалению на процессоре это работает не очень.
Опять же я пишу статью для всех, так что даже на видеоядре ты сможешь прикоснуться к нейросетям. Не буду долго тянуть, бери модель S, она гораздо лучше N, а кушает ресурсов почти так же.
О чём я рассказывал... Ах, да, параметры для обучения, следующий на очереди imgsz, он отвечает за размер фоток для обучения (в пикселях).
Следующий параметр dаta - это путь к файлу YAML dataset, в котором прописана вся информация о том как обработать датасет.
После идёт параметр epochs - он задаёт количество раз, которая неёронка пройдёт датасет для обучения (и нет, не всегда больше - значит лучше, короче не стоит для 500 фоток ставить значение больше 1k)
В конце записи, но не по значению стоит параметр batch, он отвечает за количество потоков, в которое будет обучаться нейронка. Чем больше будет значение, тем процесс пойдёт быстрее, но и нагрузка возрастёт. Кстати о ней, если этот параметр будет слишком большим для вашего железа, то при обучении вылезет ошибка, о нехватке ресурсов.
Как-же понять насколько всë плохо? Для начала запусти обучения и дай пройти хотя-бы одной эпохе. Теперь открой {project}/{name}/labels.jpg. Ну и сопоставь с картинкой ниже:
Если твой labels.jpg, как на третей картинке, то можешь ставить обучение и дожидаться результата. А если нет, то обратно иди на roboflow и дополняй свой датасет, после чего заново импортируй его.
Итогом всех твоих мучений будет файл {project}/{name}/weights.best.pt, который является твоей обученной нейронкой.
Сначала задаём путь до нашей модели. После в model.predict есть несколько параметров, сейчас их разберём:
А на выходе должно быть, что-то подобное:
[/REACTS]
Фух, это всё! Статья получилась огромной и всеобъемлющей. На её написание ушло несколько дней, так что подписка будет отличной благодарностью. Искренне верю, что кому-нибудь помогут мои материалы и он сэкономит своё время на поиске информации. Спасибо, что дочитал, с тобой были Lanutrix.
До новых встреч на endway.su
Небольшая предыстория. Мне поступил заказ на разработку бота для онлайн-игры. У игры есть античит, да и считывать оперативную память я не умею. Единственным решением, которое пришло мне в голову, было создание ИИ для распознавания нужных объектов.
Для тех, кто ещё не зарегистрировалсяНу что же, приступим. Руки так и чешутся!
[REACTS=1]
Итак, задача поставлена. Как её решить? По сравнению с прошлой моей статьёй всë несколько сложнее, так что будь готов потратить далеко не один час своего времени на практическую реализацию.
Приступим! Для начала расскажу немного теории. Использовать мы будем YOLOv8, в частности библиотеку ultralistics. Что же это такое? Если не вдаваться в подробности, то это мега крутая штука и для еë использования вам не нужны глубокие познания в математике. Она работает быстро, а насколько чëтко, зависит от того как ты еë обучишь. У самой YOLOv8 есть несколько вариаций модели, они отличаются по весу, скорости и точности распознавания. Эти модели являются обученными и распознают довольно много объектов, начиная от людей заканчивая мебелью.
— Люди, машины, стулья - это всё конечно классно, но я хочу, чтобы оно распознавало мобов в игре. Такого точно в стандартной модели нет!
— Нет, конечно, но ты можешь обучить еë этому.
— А как?
А вот так. Для начала тебе нужен будет датасет (фотографии, на которых отмечены нужные объекты). Для того, чтобы сделать свой датасет тебе понадобится собрать много фото нужных тебе объектов в разных положениях и под разными ракурсами, а также соблюсти ряд условий (без них точность будет ужасной):
- Количество разных классов (распознаваемых объектов) должно быть одинаковым или примерно равным.
- Не должно быть повторяющихся фото
- Не должно быть фото без нужных объектов.
- Общее количество фото в датасет от 100 на каждый объект.
- Количество классов объектов не должно быть слишком большим.
— Ну собрал я фотографии, пол дня мучался! Теперь можно обучать?
— Нет, теперь можно размечать.
— Да бл... агославит тебя господь, сука!
— Не ной, ты сам захотел сделать свою нейросеть!
Так все-таки, как разместить датасет? Для этого есть много решений, как бесплатных, так и условно-бесплатных. Я предлагаю второй вариант, так как ограничение в 2000 картинок ты вряд ли перепрыгнешь, а сервис реально хороший, roboflow называется. Безусловно, есть и программы, которые будут работать локально, но во-первый, облачное хранение - это всегда удобно, а во-вторых от дизайна у тебя НЕ БУДУТ ВЫТЕКАТЬ ГЛАЗА.
Для начала зарегистрируйтесь и создайте новый проект, это будет выглядеть так:
Далее нужно загрузить фото (можно и видео, будут вырезаться кадры, с амплитудой, которую ты задашь). Можно загружать как отдельную картинку, так и целую папку с ними.
После чего нужно разметить загруженные фото.
— Я всё разметил. Что дальше?
— Давай проверим..... Ууу ну ты чего, нужно прям по пиксельно выделять.
Слева неправильный вариант, а справа исправленный.
— Я исправил криво размечанные фотки.
— Импортируй датасет.
Импорт происходит следующим образом:
- В размеченных фото нажмите "Add image to Dataset".
- В методе выберете РАЗБИТЬ НА Train/Valid/Test, а проценты разделения поставь 70/20/10.
3. Нажми на пункт "Generate".
4. Далее "Generate New Version".
5. Пункт 1 и 2 пропускаем (continue)
6. В пункте 3 в параметре resize указываешь нужное тебе разрешение, но советую ставить 640x480.
7. Пункт 4. Нажимаешь "Add Augmentation Step" и выбираешь один или несколько уровней. Их список приведён ниже:
8. На пункте 5 должно быть, что-то подобное, просто нажми "Generate" немного подожди.
9. Нажми "Export Dataset".
10. В выпадающем меню выбрать YOLOv8 и ниже поставить галочку на "download zip to computer".
Ура, получилось, теперь у нас есть то, что называется датасетом.
— Ну давай умник, какая следующая запара меня ждёт?
— Нууу теперь её нужно обучить.
Открыл ты значит редактор кода и весь такой радостный, в предвкушении 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 гб видеопамяти). Просто делай так, как показано на скриншотах.
— Да сколько можно! КОГДА МЫ БУДЕМ УЖЕ ОБУЧАТЬ НЕЙРОСЕТЬ?
— Что ты такой не терпеливый, я и так стараюсь быстро и кратко рассказывать.
Последние приготовления и написание скрипта для обучения.
Во-первых, нужно распаковать датасет. Как это сделать локально думаю все знают, а что на счёт 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), далее мы указываем модель, которая будет обучаться на нашем датасете. Вот собственно табличка, какие есть модели, с их характеристиками:
Самый главный как по мне параметр, по мимо точности, это скорость работы на CPU и GPU. Если ты можешь запустить нейронку на видеокарте, то бери модель L или X, но если ты не владеешь картой от Nvidia, то к сожалению на процессоре это работает не очень.
Опять же я пишу статью для всех, так что даже на видеоядре ты сможешь прикоснуться к нейросетям. Не буду долго тянуть, бери модель S, она гораздо лучше N, а кушает ресурсов почти так же.
О чём я рассказывал... Ах, да, параметры для обучения, следующий на очереди imgsz, он отвечает за размер фоток для обучения (в пикселях).
Следующий параметр dаta - это путь к файлу YAML dataset, в котором прописана вся информация о том как обработать датасет.
После идёт параметр epochs - он задаёт количество раз, которая неёронка пройдёт датасет для обучения (и нет, не всегда больше - значит лучше, короче не стоит для 500 фоток ставить значение больше 1k)
В конце записи, но не по значению стоит параметр batch, он отвечает за количество потоков, в которое будет обучаться нейронка. Чем больше будет значение, тем процесс пойдёт быстрее, но и нагрузка возрастёт. Кстати о ней, если этот параметр будет слишком большим для вашего железа, то при обучении вылезет ошибка, о нехватке ресурсов.
— Я всё сделал!!!
— Красавчик, теперь проверим насколько хорошо ты это сделал.
— И как мы это сделаем?
Как-же понять насколько всë плохо? Для начала запусти обучения и дай пройти хотя-бы одной эпохе. Теперь открой {project}/{name}/labels.jpg. Ну и сопоставь с картинкой ниже:
Если твой 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
Фух, это всё! Статья получилась огромной и всеобъемлющей. На её написание ушло несколько дней, так что подписка будет отличной благодарностью. Искренне верю, что кому-нибудь помогут мои материалы и он сэкономит своё время на поиске информации. Спасибо, что дочитал, с тобой были Lanutrix.
До новых встреч на endway.su
Последнее редактирование: