Форум программистов, компьютерный форум, киберфорум
C++: ИИ, нейросети, ML, агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
5 / 5 / 0
Регистрация: 01.03.2022
Сообщений: 145

Чем лучше сделать рисовалку для тренировки нейронки?

31.12.2022, 16:33. Показов 8163. Ответов 12
Метки c++, qt (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, решил в коем-то веке окунуться в нейронки. Начать решил с известной, думаю, многим нейронки, определяющей цифру, нарисованную на экране. А так, как я, в целом, полюбил Qt, я решил сделать рисовалку именно на нём, но что-то встал в ступор.

В целом, само "поле" для рисования должно быть 24х24 ( это распространенный пример), хотя это не столь важно, в любом случае - оно должно быть маленьким. Так вот, я на просторах интернета нашел код, на котором я "примерно" начал вникать в тему QPixmap, вот сам код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class Pa : public QWidget
{
public:
    Pa()
    {
        pixmap_ = QPixmap( 100, 100); //изменить размер самого поля
        pixmap_.fill( 0xffffffff ); //цвет бекграунда
        pen_ = QPen( QBrush( Qt::black ), 3.0f ); //кисть (цвет, размер)
    }
 
protected:
    void mousePressEvent( QMouseEvent * e )
    {
        if ( e->button() == Qt::LeftButton )
        {
            QPainter p( &pixmap_ );
            p.setPen( pen_ );
            p.drawPoint( e->pos() );
            p.end();
 
            lastPoint_ = e->pos();
 
            update();
        }
    }
 
    void mouseMoveEvent( QMouseEvent * e )
    {
        if ( e->buttons() & Qt::LeftButton )
        {
            QPainter p( &pixmap_ );
            p.setPen( pen_ );
            p.drawLine( lastPoint_, e->pos() );
            p.end();
 
            lastPoint_ = e->pos();
 
            update();
        }
    }
 
    void paintEvent( QPaintEvent * )
    {
        QPainter p( this );
        p.setCompositionMode( QPainter::CompositionMode_Source );
        p.drawPixmap( QPoint(), pixmap_ );
    }
 
private:
    QPen pen_;
    QPixmap pixmap_;
    QPoint lastPoint_;
};
 
int main( int argc, char ** argv )
{
    QApplication app( argc, argv );
 
    Pa pa;
    pa.show();
 
    return app.exec();
}
Работать-то оно работает, но проблема в том, что размер этого поля настолько маленький, что рисовать на нём неудобно. Нельзя же просто взять и увеличить размер поля - тогда и кол-во пикселей изменится. Необходимо именно поле приблизительно 24 на 24, но адекватного размера. Что для этого можно использовать, что почитать?
Ps, выглядит сейчас это так:


И да, всех с наступающим(у некоторых уже наступившим) Новым годом
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.12.2022, 16:33
Ответы с готовыми решениями:

Можно ли на C++ сделать рисовалку для саржи?
Нужно крч создать программку для рисования переплетений саржи. Саржа это типа плетение/узор для ткани.. Во вложении добавил что нужно...

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

На чем лучше написать лучше сайт для футбольного клуба?
На чем лучше написать лучше сайт для футбольного клуба? Просто написал примитивный вот http://fcslonim.hol.es Хотелось более...

12
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.12.2022, 20:57
Почему нельзя увеличить-то?
0
5 / 5 / 0
Регистрация: 01.03.2022
Сообщений: 145
31.12.2022, 20:58  [ТС]
nmcf, а каким образом? Может, я что-то не дочитал?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.12.2022, 21:18
Pixmap этот сделай больше. Потом уменьшишь до 24, когда нарисуешь. Или в чём проблема-то?
0
5 / 5 / 0
Регистрация: 01.03.2022
Сообщений: 145
31.12.2022, 21:20  [ТС]
Задача в том, чтобы нарисовать на поле 24 на 24 цифру. И чтобы размер поля, на котором я рисую был адекватного размера, то есть чтобы рисовать было удобно. Я так понял, Ваша мысль в том, чтобы нарисовать на полноценном размере, а после переформатировать в 24 на 24, верно?
0
524 / 512 / 129
Регистрация: 31.10.2016
Сообщений: 4,156
31.12.2022, 21:32
PrOsTo_NiK_, в выборках исходные цифры не имели разрешение 24х24, оно было большим, но потом - уменьшено. Для этого проще всего использовать dwt, можете так сделать и Вы. Рисуйте цифры любого размера и толщины, как Вам удобно, а потом уменьшайте разрешение до 24х24.

Добавлено через 2 минуты
Вы же понимаете, что всё равно нужен алгоритм, приводящий любую цифру к этой матрице. Иначе нейросеть не будет иметь никакой практической ценности.
1
5 / 5 / 0
Регистрация: 01.03.2022
Сообщений: 145
31.12.2022, 21:33  [ТС]
Alexis333, спасибо за ответ. В целом, да, я думал об этом, немного не сообразил. Менять размер QPixMap c помощью функции scaled? И читал где-то, что для считывания каждого пикселя надо преобразовать pixmap в Image, а потом уже идти по пикселям, или как лучше это реализовать
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.12.2022, 21:35
PrOsTo_NiK_, поле делаешь кратным 24 - например, 240; и линию аналогично, а перед обработкой Pixmap уменьшишь.
0
524 / 512 / 129
Регистрация: 31.10.2016
Сообщений: 4,156
31.12.2022, 21:40
Цитата Сообщение от PrOsTo_NiK_ Посмотреть сообщение
читал где-то, что для считывания каждого пикселя надо преобразовать pixmap в Image, а потом уже идти по пикселям, или как лучше это реализовать
Я же Вам написал, используйте dwt. Если на "пальцах" и не вдаваясь в нюансы метода, то всё, что нужно сделать - это вычислить средние значения 4-х соседних пикселей. Это будут значения пикселей изображения с в 2 раза меньшим разрешением. Если мало - повторяете, и т.п., до тех пор пока не будет 24х24. Качество картинки страдать сильно не будет. Метод общеизвестный и проверенный.
0
Покинул чат.
1132 / 727 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
31.12.2022, 22:28
Как вариант:
На таблице 24х24 ховер над ячейками отслеживать и рисовать точки на пиксмапе?
У меня вот такая штука получилась (слева маленький пиксмап с результатом)


Если таблица не гуд, то разрисовать сетку на виджете и отслеживать клики в ячейках, но это морока...
1
524 / 512 / 129
Регистрация: 31.10.2016
Сообщений: 4,156
31.12.2022, 22:43
PrOsTo_NiK_, вообще, я бы на Вашем месте использовал готовую выборку MNIST. Она общедоступна и содержит десятки тысяч примеров. Ничего нового Вы всё равно не нарисуете, там есть всевозможные цифры, искаженные как только можно и нельзя. Если задача обучение сети, то нет никакого смысла создавать свою выборку. Всё равно, ничего похожего, за обозримое время создать не сможете. Просто напрасный труд.
0
5 / 5 / 0
Регистрация: 01.03.2022
Сообщений: 145
31.12.2022, 22:46  [ТС]
Alexis333, Я и не хочу делать новую выборку, просто на чём-то же мне нужно тестировать её работу, поле для рисования, чтобы как-то визуально увидеть её результат А то, что она будет работать с этой выборкой, я, в целом, и не сомневался. Просто хочется помимо нейронок еще какое-то визуально приятное приложение сделать, где можно наглядно продемонстрировать возможности этой неронки.
0
524 / 512 / 129
Регистрация: 31.10.2016
Сообщений: 4,156
31.12.2022, 22:58
PrOsTo_NiK_, иногда мы тонем в приготовлениях, так и не приступив к основной задаче ...
Я бы на Вашем месте добился более приемлемого качества распознавания, а потом уже занимался интерфейсом. У них на сайте есть рейтинг с лучшими достигнутыми результатами. Лично у меня не получилось дойти до 1 места. Но это так, рассуждения вслух. У Вас конечно же свои цели и свои приоритеты.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2022, 22:58
Помогаю со студенческими работами здесь

На чем лучше сделать?
Незнаю на чем сделать некую бд недвижимости. В общем надо сделать сайт: Список недвижимости (так же всякие фильтры и вывод на карте по...

Чем Python лучше для кроссплатформенности чем C++?
Чем Python лучше для кроссплатформенности чем C++?

Выбор ноутбука для нейронки и дип обучения
Здравствуйте. Помогите выбрать ноутбук для нейронки и дип обучения, ну короче для DS. Acer Nitro 5 GTX1050Ti (i5 8300H 2.30, Turbo...

В чём лучше сделать большую картинку?
У меня используется картинка (типа карта) на весь экран смартфона, после того как было нажатие на какой-то участок эта область...

На чем лучше сделать специфичный сайт?
В общем, стоит задача сделать что-то вроде онлайн-конструктора, где в реальном времени будет формироваться макет (на основании выбора...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru