Если вам понравилось данное видео, то будет очень приятно если вы поддержите меня, поставив звёздочку ⭐️ на данном репозитории github.com/Koldim2001/YOLO-Patch-Based-Inference Это мой довольно масштабный проект, позволяющий значительно улучшить качество детекциии и сегментации задачах компьютерного зрения Если вам интересно про него узнать, то вот ссылка на видео туториал - th-cam.com/video/ihch6pIZtQg/w-d-xo.htmlsi=usHHF2EIifm3CnN4
Обучающий датасет из 5-ти изображений это круто :) Я сначала удивился, но потом посмотрел дальше видео и понял что чуда не произошло . А почему решил так мало изображений использовать? Думаю за часик смог бы изображений 50 подготовить и разметить. Глядишь и красиво бы всё получилось.
Дмитрий, огромное спасибо за уроки! Отличное объяснение. Хотелось бы больше роликов, но, понимаю, у вас могут быть другие дела. Может быть вы подскажите других авторов, кого вы смотрите или можете посоветовать?
Дмитрий добрый день. Возникло вот такое замечание к исползуемой предобученной сети. 55:25 мин видео три больших самолета стоят одинаково (фюзеляжи параллельны) а сеть показала разные углы поворота. При чем разница значительная - почти в 15 градусов (38 и 24). Это недостаток обучения предобученной сети или причина в чем то другом? Есть необходимость применения как раз такой сетки где есть определенные требования к точности. Есть ли параметр наподобие confidence, но который показывает вероятность определения не объекта а уверенность в точности опредления угла?
Объект определяется сразу вместе с углом так что конфиденс там они сразу на всю детекцию конкретную. Сетку использую предобученную полагаю да в ней трабл можете сами обучить свою))
Приветствую! При обводке изображений мы можем использовать только прямоугольники? Или многоугольники, которые будут являтся прямоугольниками тоже можно использовать? Чтобы регулировать не только наклон вправо влево, но и вперёд-назад?
А можно реализовать обучение модели, так чтобы она разливала знаки по цветам, по типу есть белые знаки, а есть желтые и будет ли он различать? При этом они могут быть квадратными и прямоугольными?? Типо возможно сделать так чтобы было 4 фрейма: yellow_plate white_plate sqrt_yellow_plate sqrt_white_plate
@@niq1ta можете на n классов разметку сделать у yolo. Либо второй вариант находить что это plate (то есть у yolo это один общий класс) и далее гнать через отдельный классификатор который отдельно обучаете
Здравствуйте, подскажите пожалуйста, какие параметры у Вашего железа?? Я разметил датасет через CVAT, выбрал medium-модель и дальше два варианта: я получал либо сразу ошибку выделения памяти на CUDA, либо заполнение оперативы на 100% и карты на 50% с фризом и вылетом всех программ, которые есть, включая и сам VS Code + система начинала лагать, и помогает перезагрузка компьютера. Обучить получилось лишь один раз на nano-модели со значением imgsz чуть ли не в один пиксель. Мои параметры: RAM = 16GB CPU = i5 13500HX GPU = RTX4060 ОС = WIndows11
Скорее всего батч слишком большой. Попробуйте батч сайз снизить до 2 или 4. У меня i9 и 4090. Но ваших параметров должно с головой хватать для обучения. Так что поэксперимтируйте с батчами
@@Koldim2001 Спасибо за ответ! Я ещё раз попробовал заново пройти все шаги и оказалось, что я просто не знал как работает Jupyter Notebook, потому что в области машинного обучения я пока что полный beginner. Я не знал, что существует такое понятие как ядро/kernel, и что оно запускает сессию, отбирая при этом память RAM в полное владение. Поэтому когда я запускаю обучение в первый раз выделяется память, всё нормально, и если обучение прервать, то почему то память так и остаётся занятой, что мне не совсем понятно. И теперь, если запустить обучение во второй раз, то память ещё раз выделяется, при том что старый кусок так и остаётся, поэтому на новую места не хватает, и всё крашится, так как один кусок занимает всю оперативу + файл подкачки и в общей сложности где-то 18-20гб это всё занимает, а на диске C у меня свободно около 30гб. Чтобы освободить этот кусок мне нужно рестартнуть это ядро и запустить новую сессию, тогда обучение снова идёт нормально :) Ещё от Вас узнал, какая у batch корреляция с памятью уже видеокарты. При imgsz = 640 память карты загружается под завязку при batch = 18-20, поэтому наверное можно задать значение batch=16, но я пока что не особо знаю, какой должен быть у него оптимальный размер, и работает ли для него правило "чем больше, тем лучше".
Дмитрий, можете подсказать, не нашёл в ваших видео, есть ли нейронки для выделения кривой(ых) на изображении\видео ? например что бы найти границу между асфальтом и обочиной, границу воды и песка на пляже, или границу между растущим клевером и крапивой и тд, то есть границу между двумя отличающимися областями?
Звучит задача довольно интересно. Предполагаю, что можно решать через подход с семантической сегментацией (тут можно и нейронки применить) или классическими методами в cv2 без нейросетей как типаж edge detection с последующей фильтрацией (см пример тут pyimagesearch.com/2021/05/12/opencv-edge-detection-cv2-canny/ )
@@Koldim2001 да, про семантическую тоже думал, она наиболее близка к желаемому решению. И потому вопрос, в ваших некоторых видео при формировании обучающего набора вы пользуетесь инструментами по типу сивата, и там есть функция определения областей по точкам (кажется в прошлом видео вы так выделяли ложки...), а есть ли такие нейросети от ёло? не для конкретных областей(типа нахождения асфальта или песка), а для произвольных, которые укажет пользователь в процессе работы, как в том же сивате?
@@Deciptikonот yolo к сожалению нет. Там должно быть строгое число возможных классов. А вот нейросеть SAM как раз твой выбор. Она не имеет строгое число классов и сама находит контуры любых объектов если ей задать референсные точки или еще что-нибудь как референс. Как раз я SAM и использовал когда размечал быстро ложки и ножи в сивате. Можешь чекнуть есть в ютубе много туториалов как SAM в питоне использовать её и обучать не надо просто бери предобученную
Спасибо за информативный материал! Возник следующий вопрос: как правильно поступать при разметки, когда объекты перекрывают друг друга? Например резисторы лежат в куче и хочется определить какой из них лежит сверху. При таком раскладе лейбл верхнего резистора и тех, что лежат под ним должны быть разными? Каким образом обычно решается такая задача?
Для сети не имеет разницы кто выше кто ниже. Так что без дополнительной информации типа карты глубины понять кто где не выйдет. Сеть просто в идеале выдаст N объектов не более Можно далее зная боксы определить удаление до центров боксов с помощью лидара или стерео камеры и уже понять кто где. Но это уже не из коробки решение
Ааа ну тут мб стоит через сегментацию делать. То есть находишь маски объектов и оцениваешь по числу пикселей весь ли объект виден или часть (yolo-seg как вариант)
Огромное спасибо за видео! Натренил по Вашему видео модель на игральньіх костях (с 1..6 точками на гранях) для определения стороньі кубика, в результате саму грань детектит отлично, но угльі поворота всегда близки к 0 или 90 градусов, не зависимо от того как размещеньі на изображении... В чем может бьіть проблема?..
@@АлексВу Хмм возможно нужно больше данных при обучении. Он под капотом минимизирует сразу кучу лоссов. И распознавание, классификации так еще и поворот
что если повернутый bound box выходит за границу изображений, yolo это как то обрабатывается и как? используется такая разметка при тренировке или эта картинка с разметкой исключается из тренировки? Спасибо!
Вроде как помню, он не исключает её, то есть он под капотом хранит: центр бокса, его ширину, высоту и поворот. поэтому если центр находится не вне зоны изображения, то должен сработать. Надо потестировать на практике не часто с obb работаю
Огромное спасибо! Правильно ли я понял, что отличие от обычного обучения и obb в формате экспорта из CVAT(COCO) и тем, что в коде мы формат модели указываем -obb?) ну и соответственно, что мы еще и прямоугольники при разметки вертим) Еще у меня есть вопрос, а модели можно дообучать? к примеру, я уже обучил модель, но у меня появился еще один объект интереса который появляется в кадре.
По поводу первых вопросов: да все верно вы поняли По поводу дообучения: в данном случае надо просто отучить заново всю сеть но указав другое число классов. Так что надо переразметить фотки добавив везде тот новый класс и заново запустить процесс обучения прям как на видео
Приветствую, отличное видео! Не могли бы вы подсказать, у меня к примеру есть 1000 изображений с резисторами размеченных вручную, и есть еще 2000 неразмеченных изображений, можно ли как-то автоматизировать процесс?
Добрый день! Спасибо большое за видео и прочие материалы! Очень полезно и познавательно! Пытаюсь обучить аналогичную сеть, и обучение вроде проходит достаточно хорошо, но как только я пытаюсь что либо предсказать с помощью обученной сети, она выдает 0 предсказаний, причем даже если подать ей на предсказание, изображения из обучающего набора. При этом она еще и перестает предсказывать, то что до обучения предсказывала, машины, корабли и самолеты. Почему так происходит, не понимаю, бьюсь с этой проблемой уже два дня, раз 7 переобучал выбирая разные модели от n до L, менял размер изображений в датасете, ничего не помогает, после обучения сеть не находит вообще ничего.... Если будут предположения или советы, буду признателен, так как нахожусь в тупике ((( сразу отмечу, что общее количество размеченных изображений 1134, из низ 15% отведено на валидацию. На изображениях машины которые подъезжают, камера смотрит сверху и чуть сбоку, соответственно там еще и перспектива немного искажается. Задача состоит в том, чтобы выделить прямоугольник автомобильного номера.
То что сеть перестает распознавать классы что знала ранее это норма. Сеть учится на ваших примерах решать вашу задачу меняя веса под ваш уникальный кейс. Если хотите чтобы сеть помнила и старое, то надо скачать тот датасет на котором её исходно учили и уже к нему добавить свои примеры и классы. Но обычно так не делают и просто обучают сеть лишь на своих примерах + параллельно включают исходную предоюученную сеть. И вот теперь ваша сетка решает ваши кейсы и ваши классы + вторая сеть помнит то на чем её обучили по умолчанию
Попробуйте на инференсе сети поставить conf поменьше. Возможно объекты находятся но вы просто их высоким конфиденсом срезаете. И плюсом обучайте на большем размере батча. То есть минимум 16-32 ставьте батч
@@Koldim2001 Спасибо за совет, я уже conf поставил минимальный (results = model(img, conf=0.001)[0]) и все равно ничего не находит... увеличить батч попробую, но он жрет кучу видеопамяти ((( я обучаю его сейчас на 8, и он съедает 14gb видеопамяти
@@Koldim2001 Я уже думаю, может попробовать YOLOv8m-seg, может, я с разметкой начудил. Просто я Ваши ролики увидел, когда пытался проблему решить, а изначально разметку на 1000 объектов сделал в roboflow и уже грешу, что может там что-то не так ((
Если вам понравилось данное видео, то будет очень приятно если вы поддержите меня, поставив звёздочку ⭐️ на данном репозитории
github.com/Koldim2001/YOLO-Patch-Based-Inference
Это мой довольно масштабный проект, позволяющий значительно улучшить качество детекциии и сегментации задачах компьютерного зрения
Если вам интересно про него узнать, то вот ссылка на видео туториал - th-cam.com/video/ihch6pIZtQg/w-d-xo.htmlsi=usHHF2EIifm3CnN4
Радует, что разработчики yolo не стоят на месте. А вам спасибо за подробный разбор этого нововведения
Спасибо огромное за уроки!!!!!!!!! Материал 🔥
Спасибо, наглядно и полезно!
спасибо, очень помогли!
Обучающий датасет из 5-ти изображений это круто :) Я сначала удивился, но потом посмотрел дальше видео и понял что чуда не произошло . А почему решил так мало изображений использовать? Думаю за часик смог бы изображений 50 подготовить и разметить. Глядишь и красиво бы всё получилось.
Ахахаха да цель была показать как это делать а не реализовать полный процесс с хорошим итоговым качеством))
🔥
Дмитрий, огромное спасибо за уроки! Отличное объяснение. Хотелось бы больше роликов, но, понимаю, у вас могут быть другие дела. Может быть вы подскажите других авторов, кого вы смотрите или можете посоветовать?
Огромные спасибо) очень приятно ☺️
Из хороших computer vision спецов могу посоветовать глянуть эти каналы: roboflow, Nikolai Nielsen, Nicholas Renotte
Дмитрий добрый день. Возникло вот такое замечание к исползуемой предобученной сети. 55:25 мин видео три больших самолета стоят одинаково (фюзеляжи параллельны) а сеть показала разные углы поворота. При чем разница значительная - почти в 15 градусов (38 и 24). Это недостаток обучения предобученной сети или причина в чем то другом? Есть необходимость применения как раз такой сетки где есть определенные требования к точности. Есть ли параметр наподобие confidence, но который показывает вероятность определения не объекта а уверенность в точности опредления угла?
Объект определяется сразу вместе с углом так что конфиденс там они сразу на всю детекцию конкретную. Сетку использую предобученную полагаю да в ней трабл можете сами обучить свою))
Приветствую! При обводке изображений мы можем использовать только прямоугольники? Или многоугольники, которые будут являтся прямоугольниками тоже можно использовать? Чтобы регулировать не только наклон вправо влево, но и вперёд-назад?
К сожалению у данной модели нет. Так посмотри в сторону yolo-seg у меня на канале есть туториал
А можно реализовать обучение модели, так чтобы она разливала знаки по цветам, по типу есть белые знаки, а есть желтые и будет ли он различать? При этом они могут быть квадратными и прямоугольными?? Типо возможно сделать так чтобы было 4 фрейма:
yellow_plate
white_plate
sqrt_yellow_plate
sqrt_white_plate
@@niq1ta можете на n классов разметку сделать у yolo. Либо второй вариант находить что это plate (то есть у yolo это один общий класс) и далее гнать через отдельный классификатор который отдельно обучаете
Здравствуйте, подскажите пожалуйста, какие параметры у Вашего железа??
Я разметил датасет через CVAT, выбрал medium-модель и дальше два варианта: я получал либо сразу ошибку выделения памяти на CUDA, либо заполнение оперативы на 100% и карты на 50% с фризом и вылетом всех программ, которые есть, включая и сам VS Code + система начинала лагать, и помогает перезагрузка компьютера.
Обучить получилось лишь один раз на nano-модели со значением imgsz чуть ли не в один пиксель.
Мои параметры:
RAM = 16GB
CPU = i5 13500HX
GPU = RTX4060
ОС = WIndows11
Скорее всего батч слишком большой. Попробуйте батч сайз снизить до 2 или 4. У меня i9 и 4090. Но ваших параметров должно с головой хватать для обучения. Так что поэксперимтируйте с батчами
@@Koldim2001 Спасибо за ответ! Я ещё раз попробовал заново пройти все шаги и оказалось, что я просто не знал как работает Jupyter Notebook, потому что в области машинного обучения я пока что полный beginner.
Я не знал, что существует такое понятие как ядро/kernel, и что оно запускает сессию, отбирая при этом память RAM в полное владение. Поэтому когда я запускаю обучение в первый раз выделяется память, всё нормально, и если обучение прервать, то почему то память так и остаётся занятой, что мне не совсем понятно. И теперь, если запустить обучение во второй раз, то память ещё раз выделяется, при том что старый кусок так и остаётся, поэтому на новую места не хватает, и всё крашится, так как один кусок занимает всю оперативу + файл подкачки и в общей сложности где-то 18-20гб это всё занимает, а на диске C у меня свободно около 30гб.
Чтобы освободить этот кусок мне нужно рестартнуть это ядро и запустить новую сессию, тогда обучение снова идёт нормально :)
Ещё от Вас узнал, какая у batch корреляция с памятью уже видеокарты. При imgsz = 640 память карты загружается под завязку при batch = 18-20, поэтому наверное можно задать значение batch=16, но я пока что не особо знаю, какой должен быть у него оптимальный размер, и работает ли для него правило "чем больше, тем лучше".
@@АрсенийМедведев-и7о да все верно надо перезапускать кернел ноутбука. Все верно говорите)
Дмитрий, можете подсказать, не нашёл в ваших видео, есть ли нейронки для выделения кривой(ых) на изображении\видео ? например что бы найти границу между асфальтом и обочиной, границу воды и песка на пляже, или границу между растущим клевером и крапивой и тд, то есть границу между двумя отличающимися областями?
Звучит задача довольно интересно. Предполагаю, что можно решать через подход с семантической сегментацией (тут можно и нейронки применить) или классическими методами в cv2 без нейросетей как типаж edge detection с последующей фильтрацией (см пример тут pyimagesearch.com/2021/05/12/opencv-edge-detection-cv2-canny/ )
@@Koldim2001 да, про семантическую тоже думал, она наиболее близка к желаемому решению. И потому вопрос, в ваших некоторых видео при формировании обучающего набора вы пользуетесь инструментами по типу сивата, и там есть функция определения областей по точкам (кажется в прошлом видео вы так выделяли ложки...), а есть ли такие нейросети от ёло? не для конкретных областей(типа нахождения асфальта или песка), а для произвольных, которые укажет пользователь в процессе работы, как в том же сивате?
@@Deciptikonот yolo к сожалению нет. Там должно быть строгое число возможных классов. А вот нейросеть SAM как раз твой выбор. Она не имеет строгое число классов и сама находит контуры любых объектов если ей задать референсные точки или еще что-нибудь как референс. Как раз я SAM и использовал когда размечал быстро ложки и ножи в сивате. Можешь чекнуть есть в ютубе много туториалов как SAM в питоне использовать её и обучать не надо просто бери предобученную
@@Koldim2001 крайне благодарен)))))
Спасибо за информативный материал!
Возник следующий вопрос: как правильно поступать при разметки, когда объекты перекрывают друг друга? Например резисторы лежат в куче и хочется определить какой из них лежит сверху. При таком раскладе лейбл верхнего резистора и тех, что лежат под ним должны быть разными?
Каким образом обычно решается такая задача?
Для сети не имеет разницы кто выше кто ниже. Так что без дополнительной информации типа карты глубины понять кто где не выйдет. Сеть просто в идеале выдаст N объектов не более
Можно далее зная боксы определить удаление до центров боксов с помощью лидара или стерео камеры и уже понять кто где. Но это уже не из коробки решение
Речь скорее идёт не об определении дальности до объектов, а об разделении объектов на "полностью видимые", и "частично скрытые".
Ааа ну тут мб стоит через сегментацию делать. То есть находишь маски объектов и оцениваешь по числу пикселей весь ли объект виден или часть (yolo-seg как вариант)
Спасибо за ответ. Буду экспериментировать =)
Огромное спасибо за видео! Натренил по Вашему видео модель на игральньіх костях (с 1..6 точками на гранях) для определения стороньі кубика, в результате саму грань детектит отлично, но угльі поворота всегда близки к 0 или 90 градусов, не зависимо от того как размещеньі на изображении... В чем может бьіть проблема?..
@@АлексВу Хмм возможно нужно больше данных при обучении. Он под капотом минимизирует сразу кучу лоссов. И распознавание, классификации так еще и поворот
что если повернутый bound box выходит за границу изображений, yolo это как то обрабатывается и как? используется такая разметка при тренировке или эта картинка с разметкой исключается из тренировки? Спасибо!
Вроде как помню, он не исключает её, то есть он под капотом хранит: центр бокса, его ширину, высоту и поворот. поэтому если центр находится не вне зоны изображения, то должен сработать. Надо потестировать на практике не часто с obb работаю
Дмитрий, добрый день! Подскажите, как можно с Вами связаться для обсуждения предложения?
Через тг - kolesnikov_dima
Огромное спасибо!
Правильно ли я понял, что отличие от обычного обучения и obb в формате экспорта из CVAT(COCO) и тем, что в коде мы формат модели указываем -obb?)
ну и соответственно, что мы еще и прямоугольники при разметки вертим)
Еще у меня есть вопрос, а модели можно дообучать? к примеру, я уже обучил модель, но у меня появился еще один объект интереса который появляется в кадре.
По поводу первых вопросов: да все верно вы поняли
По поводу дообучения: в данном случае надо просто отучить заново всю сеть но указав другое число классов. Так что надо переразметить фотки добавив везде тот новый класс и заново запустить процесс обучения прям как на видео
@@Koldim2001 понял, спасибо!
Приветствую, отличное видео! Не могли бы вы подсказать, у меня к примеру есть 1000 изображений с резисторами размеченных вручную, и есть еще 2000 неразмеченных изображений, можно ли как-то автоматизировать процесс?
Если есть уже обученная сетка на 1000 фотках то можно написать код по авторазметке и интегрировать его с сиватом
Добрый день! Спасибо большое за видео и прочие материалы! Очень полезно и познавательно!
Пытаюсь обучить аналогичную сеть, и обучение вроде проходит достаточно хорошо, но как только я пытаюсь что либо предсказать с помощью обученной сети, она выдает 0 предсказаний, причем даже если подать ей на предсказание, изображения из обучающего набора. При этом она еще и перестает предсказывать, то что до обучения предсказывала, машины, корабли и самолеты. Почему так происходит, не понимаю, бьюсь с этой проблемой уже два дня, раз 7 переобучал выбирая разные модели от n до L, менял размер изображений в датасете, ничего не помогает, после обучения сеть не находит вообще ничего....
Если будут предположения или советы, буду признателен, так как нахожусь в тупике (((
сразу отмечу, что общее количество размеченных изображений 1134, из низ 15% отведено на валидацию. На изображениях машины которые подъезжают, камера смотрит сверху и чуть сбоку, соответственно там еще и перспектива немного искажается. Задача состоит в том, чтобы выделить прямоугольник автомобильного номера.
То что сеть перестает распознавать классы что знала ранее это норма. Сеть учится на ваших примерах решать вашу задачу меняя веса под ваш уникальный кейс. Если хотите чтобы сеть помнила и старое, то надо скачать тот датасет на котором её исходно учили и уже к нему добавить свои примеры и классы. Но обычно так не делают и просто обучают сеть лишь на своих примерах + параллельно включают исходную предоюученную сеть. И вот теперь ваша сетка решает ваши кейсы и ваши классы + вторая сеть помнит то на чем её обучили по умолчанию
Попробуйте на инференсе сети поставить conf поменьше. Возможно объекты находятся но вы просто их высоким конфиденсом срезаете. И плюсом обучайте на большем размере батча. То есть минимум 16-32 ставьте батч
@@Koldim2001 Спасибо за совет, я уже conf поставил минимальный (results = model(img, conf=0.001)[0]) и все равно ничего не находит...
увеличить батч попробую, но он жрет кучу видеопамяти ((( я обучаю его сейчас на 8, и он съедает 14gb видеопамяти
@@Koldim2001 Понял, хорошо, спасибо за пояснения. Я предполагал, что это нормально, но не был уверен, теперь знаю! Спасибо!
@@Koldim2001 Я уже думаю, может попробовать YOLOv8m-seg, может, я с разметкой начудил. Просто я Ваши ролики увидел, когда пытался проблему решить, а изначально разметку на 1000 объектов сделал в roboflow и уже грешу, что может там что-то не так ((
Всем привет! У кого-то отработала на своем датасете YOLO - obb?
Не совсем понял вопрос. Можете свой собрать датасет и протестировать процесс обучения