Сообщество - Программирование на python

Программирование на python

929 постов 11 940 подписчиков

Популярные теги в сообществе:

10

Алготрейдинг на коленке: как сделать свой TradingView на Python

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

Сегодня у нас есть Python и такие мощные библиотеки, как Backtrader. Однако голый фреймворк — это лишь половина дела. Чтобы он стал по‑настоящему народным инструментом, ему нужна удобная обвязка: готовая структура проекта, автоматический импорт стратегий, наглядные отчёты, тепловые карты для оптимизации и бесшовное подключение к API брокеров — не только российских, но надо начать с Мосбиржи.

Мы стремимся сделать инструмент таким же удобным, как TradingView. Простота в использовании и доступность всех функций для пользователей без глубокой технической экспертизы — мне кажется вот идеал. Чтобы каждый, кто заинтересован в алгоритмической торговле, мог без усилий внедрить свою стратегию, протестировать её и получить результаты, не проводя часы и дни за настройкой системы.

Эта статья — не просто описание проекта, а призыв к действию. Я предлагаю объединить усилия и создать открытый стандарт для алготрейдинга на базе open source Backtrader, заточенный под реалии российского рынка.

<a href="https://pikabu.ru/story/algotreyding_na_kolenke_kak_sdelat_svoy_tradingview_na_python_13115941?u=https%3A%2F%2Fgithub.com%2Fempenoso%2Fbacktrader-quickstart-template&t=https%3A%2F%2Fgithub.com%2Fempenoso%2Fbacktrader-quickstart-template&h=c5548e75e7e51d61842be085fc0c023bdc1710d6" title="https://github.com/empenoso/backtrader-quickstart-template" target="_blank" rel="nofollow noopener">https://github.com/empenoso/backtrader-quickstart-template</a>

https://github.com/empenoso/backtrader-quickstart-template

Главная задача — построить открытый шаблон, который позволит частному инвестору, даже с небольшими навыками в программировании, сосредоточиться на главном — на разработке и тестировании стратегий, а не на борьбе с инфраструктурой. Мы создаём систему для марафона, а не для спринта: для классических стратегий с горизонтом в часы и дни, которая будет работать автономно и не требовать ежедневного внимания.

Почему Backtrader, а не другая библиотека?

Выбор в пользу Backtrader был сделан не случайно. Прежде чем остановиться на этой библиотеке изучил несколько популярных open‑source решений, каждое из которых имеет свои сильные стороны, но не соответствовало главной цели — создать простой и гибкий инструмент, который будет удобен для частных инвесторов на Московской бирже.

С одной стороны, существуют комплексные платформы, такие как OsEngine. Это мощное решение на C#, предлагающее готовый функционал «из коробки»: от графического интерфейса до подключения к различным брокерам. OsEngine представляет собой готовую экосистему, в которую интегрируются торговые роботы. Для тех, кто ищет законченный продукт и готов работать в его рамках, это отличный выбор. Однако для нашей цели — создания гибкого и легко кастомизируемого шаблона на Python — его архитектура оказалась менее подходящей, так как мы стремимся к максимальной простоте и модульности, свойственной конструкторам.

На другом полюсе — узкоспециализированные инструменты. Freqtrade — необычайно популярен в мире криптотрейдинга. Он обладает огромным сообществом и богатым функционалом, но весь этот функционал «заточен» под цифровые активы. Для фондового рынка и тем более для Московской биржи потребуются серьёзные доработки.

Есть и проекты, выросшие из легендарного Zipline от Quantopian, например, Ziplime. Сам движок Zipline по‑прежнему силён в бэктестинге, но после закрытия Quantopian все стало сложно.

Отдельно стоит упомянуть Nautilus Trader — это современный высокопроизводительный фреймворк, который часто называют «тяжёлой артиллерией» для HFT. Он невероятно быстр, поддерживает асинхронную архитектуру и ориентирован на работу с миллионами тиков в секунду. Но для большинства частных инвесторов такой уровень скорее избыточен. Для долгосрочных стратегий с горизонтом в часы и дни он выглядит как перегруженный инструмент.

На фоне этих решений Backtrader выделяется своей философией. Это не готовая платформа с жёсткими рамками, а библиотека‑конструктор. Она даёт базовые «кубики», из которых можно собрать именно ту систему, которая нужна.

У неё есть три решающих преимущества: большое сообщество, качественная документация (и даже на русском, неофициальная, сделанная одним из пользователей) и проверенные интеграции с API российских брокеров.

Именно поэтому Backtrader кажется идеальной основой для «народного» шаблона: лёгкого, гибкого и понятного даже тем, кто делает первые шаги в алгоритмической торговле.

Open source

Все компоненты нашего фреймворка — библиотека Backtrader и предлагаемый шаблон — распространяются под лицензией Open Source. Это означает не просто бесплатный доступ к коду, но и возможность совместно развивать и улучшать проект.

В мире open source качественные инструменты создаются коллективными усилиями и становятся доступны каждому, устраняя барьеры проприетарных решений. Наш «народный шаблон Backtrader» — часть движения, которое делает мощные инструменты алгоритмической торговли доступными без значительных финансовых затрат.

Архитектура нашего шаблона: что «под капотом»?

В основе шаблона лежат три принципа: модульность, наглядность результатов и готовность к реальной торговле. Давайте заглянем «под капот» и посмотрим, как это устроено.

1. Максимальная модульность: одна стратегия — один файл.
Избавляемся от сложной структуры и запутанных зависимостей. Каждая ваша торговая идея — это отдельный Python‑файл в папке strategies. Внутри этого файла вы описываете всё, что касается именно этой стратегии: логику входа и выхода, список тикеров для теста, размер комиссии брокера, начальный капитал и, что самое важное, параметры для будущей оптимизации. Больше не нужно искать настройки по всему проекту. Система автоматически подхватывает все стратегии из этой папки, а в главном файле вы просто указываете, какую из них хотите запустить сегодня.

2. Два режима работы: «тест» и «оптимизация».
В основном файле проекта заложен простой переключатель. Хотите быстро проверить гипотезу на исторических данных? Включаете режим тестирования. Нужно подобрать лучшие параметры для вашей стратегии? Переключаетесь в режим оптимизации. Это позволяет сосредоточиться на задаче, не меняя код самой стратегии. Данные для тестов хранятся в отдельной папке data, а в настройках запуска вы лишь указываете нужный временной интервал, например, с 01.01.2022 по 31.12.2024.

3. Информативные отчёты и визуализация.
Поэтому по итогам каждого бэктеста фреймворк генерирует подробный текстовый отчёт в папку reports. В нём собраны ключевые метрики: чистая прибыль, годовая доходность в сравнении с «купил и держи», максимальная просадка, профит-фактор и коэффициент Сортино.

--- ОТЧЕТ ПО БЭКТЕСТУ СТРАТЕГИИ: SmaCrossStrategy ---
Бумаги в тесте: ['SBER', 'VTBR', 'GAZP', 'LKOH', 'NVTK', 'YDEX', 'T']
Параметры: {'fast_ma': 20, 'slow_ma': 50, 'alloc_percent_per_ticker': 0.9, 'min_size': 1, 'rebal_weekday': None, 'log_on_connect': True}
Период тестирования: с 01.01.2018 по 12.08.2025
--- РЕЗУЛЬТАТЫ ---
Итоговая прибыль/убыток: 252 713.12 [50.54%]
Доходность (годовых): 5.44%
Результат 'Купил и держал': 205 648.56 [41.13%]
Максимальная просадка: 67 124.98 [13.42%]
Всего сделок: 128
Процент прибыльных сделок: 41.41% (53 из 128)
Фактор прибыли: 2.13
Коэффициент Сортино: 1.08
--------------------------------------------------

Для режима оптимизации сознательно ограничились двумя параметрами. Почему? Это позволяет визуализировать результаты в виде тепловой карты. Глядя на неё, вы сразу видите, какие комбинации параметров дают наибольший профит‑фактор, и можете выявить зоны переоптимизации, где стратегия становится неустойчивой.

4. Бесшовный переход к автоторговле.
Тестирование — это лишь первый шаг. Шаблон изначально спроектирован с возможностью лёгкого подключения к реальному рынку. В него заложена основа для интеграции с API.

В России есть несколько брокеров с открытыми API:

Брокер / Документация

Тинькофф (T-Invest) / https://developer.tbank.ru/invest/intro/intro

Алор / https://alor.dev/docs/

Финам / https://tradeapi.finam.ru/

Для Backtrader есть интеграции с API российских брокеров.

Когда ваша стратегия покажет стабильные результаты на истории, вы сможете активировать режим реальной торговли, просто изменив одну настройку. Это превращает наш шаблон из простой «песочницы» в полноценный боевой инструмент.

Как вы можете помочь?

Я сделал первую рабочую версию шаблона, которую можно найти на GitHub. Это основа, скелет будущего шаблона, но чтобы он оброс «мясом» и стал по‑настоящему удобным и «народным», ему нужна помощь сообщества. И здесь я обращаюсь к вам.

Одна из первых трудностей, с которой я столкнулся, — это визуализация результатов. Стандартная функция cerebro.plot() отлично справляется с одной ценной бумагой, но при тестировании портфеля из десятка акций график превращается в нечитаемую кашу, где сигналы и сделки сливаются в сплошную линию. Приблизить и рассмотреть детали невозможно. В идеале, нужно научить систему сохранять графики для каждого тикера в отдельный файл с высоким разрешением, чтобы можно было спокойно и детально изучать каждую сделку.

Мне удалось сохранить график в таком читаемом виде только за счёт махинаций с поворотом экрана на 90° через программу управления монитором.

Сделки только на первом графике показаны

Сделки только на первом графике показаны

Но технические задачи — это лишь часть дела. Я буду невероятно благодарен за любую конструктивную критику. Возможно, вы видите архитектуру иначе? Знаете, как сделать отчёты ещё информативнее или добавить новые метрики? Можете предложить более изящный способ управления стратегиями? Любые идеи приветствуются.

Да, я знаю о существовании такого популярного комплекса, как QUIK. Я уважаю его возможности, но сознательно выбрал путь Python. Гибкость, открытость и возможность запустить торгового робота даже на крошечном Raspberry Pi, который будет автономно работать месяцами — вот те преимущества, которые, на мой взгляд, перевешивают.

Если вы разделяете идею создания «народного Backtrader» — подключайтесь. Даже небольшие улучшения или просто замечания помогут довести этот проект до уровня, когда частные инвесторы смогут использовать его так же легко, как крупные игроки используют свои проприетарные системы.

Заключение

Главная цель этого проекта — создать не просто очередную библиотеку или набор скриптов, а универсальный инструмент для алгоритмической торговли, который будет доступен каждому. Мы строим открытый шаблон на Python, чтобы частные инвесторы могли сосредоточиться на разработке стратегий и анализе идей, а не на бесконечной настройке инфраструктуры. Народный Backtrader — это шаг к формированию сообщества, где знания и опыт становятся общим ресурсом. Вместе мы можем превратить этот проект в удобный, гибкий и по‑настоящему народный стандарт для алгоритмической торговли на Московской бирже.

Автор: Михаил Шардин
🔗 Моя онлайн-визитка
📢 Telegram «Умный Дом Инвестора»

26 августа 2025

Показать полностью 5
7

Легко читайте PDF в Python: Извлечение текста, изображений, таблиц и метаданных

PDF-файлы широко используются для хранения структурированных документов, но программное извлечение их содержимого может быть сложной задачей. К счастью, библиотеки Python для работы с PDF, такие как PyPDF2, pdfplumber и Spire.PDF, предоставляют мощные решения для чтения PDF, позволяя разработчикам легко извлекать текст, изображения, таблицы и метаданные.

В этом блоге мы рассмотрим, как извлекать различные типы содержимого из PDF с помощью библиотеки Spire.PDF.

  • Библиотека Python для чтения PDF-файлов

  • Извлечение текста из поисковых PDF

  • Извлечение изображений, внедренных в PDF-файлы

  • Сбор табличных данных из PDF-документов

  • Доступ к метаданным в PDF-файлах

  • Заключение

Библиотека Python для чтения PDF-файлов

Spire.PDF для Python — это всесторонняя библиотека, которая позволяет разработчикам программно манипулировать PDF-файлами. Она поддерживает:

  • Генерацию PDF с нуля

  • Редактирование существующих документов

  • Объединение или разделение PDF-документов

  • Конвертацию PDF в другие форматы файлов

  • Чтение содержимого PDF-документов

Чтобы установить библиотеку, выполните команду:

pip install spire.pdf

Примечание: Spire.PDF для Python — это коммерческая библиотека, которая добавляет сообщения об оценке в сгенерированные документы. Доступна бесплатная версия, но она ограничивает загрузку PDF до 10 страниц на документ.

Вы также можете установить бесплатную версию через pip:

pip install freespire.pdf

Теперь давайте погрузимся в различные техники извлечения.

Извлечение текста из поисковых PDF

Поисковые PDF содержат выделяемый текст, что делает извлечение простым. Класс PdfTextExtractor в Spire.PDF предоставляет методы для извлечения текста со специфических страниц, в то время как класс PdfTextExtractOptions позволяет настраивать процесс извлечения, например, задавать прямоугольную область для извлечения.

Следующий пример демонстрирует, как извлечь текст со всех страниц PDF и сохранить его в отдельные .txt файлы. Метод ExtractText() извлекает содержимое, сохраняя структуру документа, что обеспечивает сохранение оригинального макета извлеченного текста.

from spire.pdf.common import *

from spire.pdf import *

# Создаем объект PdfDocument

doc = PdfDocument()

# Загружаем PDF-документ

doc.LoadFromFile("C:/Users/Administrator/Desktop/Input.pdf")

# Перебираем страницы документа

for i in range(doc.Pages.Count):

# Получаем конкретную страницу

page = doc.Pages[i]

# Создаем объект PdfTextExtractor

textExtractor = PdfTextExtractor(page)

# Создаем объект PdfTextExtractOptions

extractOptions = PdfTextExtractOptions()

# Устанавливаем IsExtractAllText в True

extractOptions.IsExtractAllText = True

# Извлекаем текст со страницы

text = textExtractor.ExtractText(extractOptions)

# Записываем текст в файл txt

with open('output/TextOfPage-{}.txt'.format(i + 1), 'w', encoding='utf-8') as file:

lines = text.split("\n")

for line in lines:

if line != '':

file.write(line)

doc.Close()

Извлечение изображений, внедренных в PDF-файлы

PDF-файлы часто содержат встроенные изображения, которые можно извлекать программно с помощью класса PdfImageHelper. Этот утилитный класс предоставляет метод GetImagesInfo(), который извлекает все данные изображений с заданной страницы, включая размеры и информацию о пикселях.

Извлеченные изображения можно сохранить в различных форматах, таких как PNG или JPEG. Следующий пример демонстрирует, как просканировать каждую страницу PDF, идентифицировать встроенные изображения и сохранить их как отдельные файлы.

from spire.pdf.common import *

from spire.pdf import *

# Создаем объект PdfDocument

doc = PdfDocument()

# Загружаем PDF-документ

doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\input.pdf")

# Создаем объект PdfImageHelper

imageHelper = PdfImageHelper()

# Объявляем переменную int

index = 0

# Перебираем страницы

for i in range(0, doc.Pages.Count):

# Получаем конкретную страницу

page = doc.Pages.get_Item(i)

# Получаем всю информацию об изображениях с конкретной страницы

imageInfos = imageHelper.GetImagesInfo(page)

# Перебираем информацию об изображениях

for imageInfo in imageInfos:

# Задаем имя выходного файла изображения

imageFileName = "C:\\Users\\Administrator\\Desktop\\Extracted\\Image-{0:d}.png".format(index)

# Получаем конкретное изображение

image = imageInfo.Image

# Сохраняем изображение в файл png

image.Save(imageFileName)

index += 1

# Освобождаем ресурсы

doc.Dispose()

Сбор табличных данных из PDF-документов

Извлечение структурированных табличных данных из PDF является распространенной задачей для анализа данных. Spire.PDF предоставляет класс PdfTableExtractor, который идентифицирует таблицы в PDF и позволяет извлекать данные на уровне ячеек.

Метод ExtractTable() возвращает список таблиц, каждая из которых может быть обработана построчно. Следующий пример демонстрирует, как извлечь таблицы из PDF и сохранить их в структурированном текстовом формате.

from spire.pdf.common import *

from spire.pdf import *

# Создаем объект PdfDocument

doc = PdfDocument()

# Загружаем PDF-файл

doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf")

# Создаем список для хранения извлеченных данных

builder = []

# Создаем объект PdfTableExtractor

extractor = PdfTableExtractor(doc)

# Извлекаем таблицы с конкретной страницы (индекс страницы начинается с 0)

tableList = extractor.ExtractTable(0)

# Проверяем, что список таблиц не пуст

if tableList is not None:

# Перебираем таблицы в списке

for i in range(len(tableList)):

# Получаем конкретную таблицу

table = tableList[i]

# Получаем количество строк и столбцов

row = table.GetRowCount()

column = table.GetColumnCount()

# Перебираем строки и столбцы

for m in range(row):

for n in range(column):

# Получаем текст из конкретной ячейки

text = table.GetText(m, n)

# Добавляем текст в список

builder.append(text + " ")

builder.append("\n")

builder.append("\n")

# Записываем содержимое списка в текстовый файл

with open("output/Table-{}.txt".format(i + 1), "w", encoding="utf-8") as file:

file.write("".join(builder))

Доступ к метаданным в PDF-файлах

Метаданные PDF включают свойства документа, такие как заголовок, автор, тема и ключевые слова. Свойство DocumentInformation класса PdfDocument предоставляет доступ к этим деталям.

Следующий пример демонстрирует, как извлечь и отобразить метаданные PDF.

from spire.pdf import *

from spire.pdf.common import *

# Создаем объект PdfDocument

doc = PdfDocument()

# Загружаем PDF-файл

doc.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf")

# Получаем информацию о документе

properties = doc.DocumentInformation

# Инициализируем строку для хранения информации о документе

information = ""

# Извлекаем стандартные свойства документа

information += "\nTitle: " + properties.Title

information += "\nAuthor: " + properties.Author

information += "\nSubject: " + properties.Subject

information += "\nKeywords: " + properties.Keywords

# Печатаем свойства документа

print(information)

# Освобождаем ресурсы

doc.Dispose()

Заключение

Статья демонстрирует, как извлекать текст, изображения, таблицы и метаданные из PDF-документа с помощью Python. Следуя примерам в этом руководстве, вы можете эффективно обрабатывать PDF для анализа данных, управления документами и автоматизации.

Показать полностью
13

Claude Code

В Claude Code добавили 2 режима обучения кодингу.

Теперь ИИ-агент может научить вас писать код:

- Режим Learning mode: ИИ решает задачу частично и оставляет метки, а вам нужно дописать проект самостоятельно.

- Режим Explanatory: Claude пишет код полностью и параллельно объясняет каждый шаг — что делает, зачем и какие есть альтернативы.

Ссылка

Источник

Показать полностью
380

Эксперимент с компьютерным зрением: кого видит камера у подъезда

Каждый день мимо двери моего подъезда проходят десятки людей. Иногда это знакомые соседи, но чаще - курьеры или случайные гости.

Домофонная камера всё записывает, но вручную пересматривать часы видео бессмысленно. Мне стало интересно: можно ли разово прогнать архив записей через алгоритмы компьютерного зрения и посмотреть, как быстро GPU справится с такой задачей.

Это был чисто экспериментальный проект: не «система слежки», а тест производительности и возможностей CUDA в связке с dlib и face_recognition.

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

Проект выложен на GitHub.

Часть 1: Битва за dlib с CUDA-ускорением на Ubuntu

dlib - это популярная библиотека на Python для компьютерного зрения и машинного обучения, особенно известная своим модулем распознавания лиц. Она умеет искать и сравнивать лица. Однако «из коробки» через pip она работает только на CPU, что для задач с большим объёмом данных ужасно медленно.

У меня видеокарта NVIDIA GeForce RTX 5060 Ti 16 ГБ и здесь на помощь приходит CUDA-ускорение - технология NVIDIA, позволяющая выполнять вычисления на графическом процессоре видеокарты. Для распознавания лиц это критично: обработка видео с несколькими тысячами кадров на CPU может занять часы, тогда как с GPU - минуты. CUDA задействует сотни параллельных потоков, что особенно эффективно для матричных операций и свёрточных сетей, лежащих в основе face_recognition.

Именно поэтому моя цель была не просто «запустить dlib», а сделать это с полной поддержкой GPU.

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

Неподходящая Ubuntu 25.04, моя <a href="https://pikabu.ru/story/yeksperiment_s_kompyuternyim_zreniem_kogo_vidit_kamera_u_podezda_13091125?u=https%3A%2F%2Fpikabu.ru%2Fstory%2F_12932017&t=%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E%20%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B0%20%D0%B7%D0%B4%D0%B5%D1%81%D1%8C&h=bae4ad01c19333ac2eb186ade38ed29e21aab210" title="https://pikabu.ru/story/_12932017" target="_blank" >конфигурация полностью описана здесь</a>

Неподходящая Ubuntu 25.04, моя конфигурация полностью описана здесь

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

1. Исходная точка и первая проблема: неподходящая версия Python

  • Задача: установить face_recognition и его зависимость dlib на свежую Ubuntu 25.04.

  • Предпринятый шаг: попытка установки в системный Python 3.13.

  • Результат: ошибка импорта face_recognition_models. Стало ясно, что самые свежие версии Python часто несовместимы с библиотеками для Data Science, которые обновляются медленнее.

  • Решение: переход на pyenv для установки более стабильной и проверенной версии Python 3.11.9. Это был первый правильный шаг, решивший проблему с совместимостью на уровне Python.

2. Вторая проблема: dlib работает, но только на CPU

  • Предпринятый шаг: после настройки pyenv и установки зависимостей (numpy, opencv-python и т.д.), dlib и face_recognition успешно установились через pip.

  • Результат: скрипт анализа видео работал ужасно медленно (несколько минут на одно видео). Мониторинг через nvidia-smi показал 0% загрузки GPU.

  • Диагноз: стандартная установка dlib через pip скачивает готовый бинарный пакет ("wheel"), который собран без поддержки CUDA для максимальной совместимости. Чтобы задействовать GPU, dlib нужно компилировать из исходного кода прямо на моей машине.

3. Третья, главная проблема: конфликт компиляторов CUDA и GCC

  • Предпринятый шаг: попытка скомпилировать dlib из исходников с флагом -DDLIB_USE_CUDA=1.

  • Результат: сборка провалилась с ошибкой. Анализ логов показал, что cmake находит CUDA Toolkit 12.6, но не может скомпилировать тестовый CUDA-проект. Ключевая ошибка: error: exception specification is incompatible with that of previous function "cospi"

  • Диагноз: мой системный компилятор GCC 13.3.0 (стандартный для Ubuntu 25.04) был несовместим с CUDA Toolkit 12.6. Новые версии GCC вносят изменения, которые ломают сборку с более старыми версиями CUDA.

4. Попытки решения конфликта компиляторов

  • Шаг №1: установка совместимого компилятора. Я установил gcc-12 и g++-12, которые гарантированно работают с CUDA 12.x.

  • Шаг №2: ручная сборка с указанием компилятора. Я пытался собрать dlib вручную, явно указав cmake использовать gcc-12:

    cmake .. -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 ...

    Результат: та же ошибка компиляции. cmake, несмотря на флаги, по какой-то причине продолжал использовать системные заголовочные файлы, конфликтующие с CUDA.

  • Шаг №3: продвинутый обходной маневр (wrapper). Я создал специальный скрипт-обертку nvcc_wrapper.sh, который должен был принудительно "подсовывать" nvcc (компилятору NVIDIA) нужные флаги и использовать gcc-12.
    Результат: снова неудача. Ошибка 4 errors detected in the compilation... осталась, что указывало на фундаментальную несовместимость окружения.

Капитуляция перед реальностью
Несмотря на все предпринятые шаги - использование pyenv, установку совместимого компилятора GCC-12 и даже создание wrapper-скриптов - dlib так и не удалось скомпилировать с поддержкой CUDA на Ubuntu 25.04.

Похоже проблема была не в моих действиях, а в самой операционной системе. Использование не-LTS релиза Ubuntu для серьезной разработки с проприетарными драйверами и библиотеками (как CUDA) - это путь, полный боли и страданий.

Принял решение установить Ubuntu 24.04 LTS, для которой NVIDIA предоставляет официальную поддержку CUDA Toolkit 12.9 Update 1.

Часть 2: чистый лист и работающий рецепт

Установил Ubuntu 24.04 LTS - систему с долгосрочной поддержкой, для которой NVIDIA предоставляет официальный CUDA Toolkit и драйверы. Это был шаг назад, чтобы сделать два вперёд.

Но даже на чистой системе путь не был устлан розами. Первые попытки установки нужной версии Python через apt провалились (в репозиториях Noble Numbat её просто не оказалось), что вернуло меня к использованию pyenv. После нескольких итераций, проб и ошибок, включая установку CUDA Toolkit и отдельно cuDNN (библиотеки для нейросетей, без которой dlib не видит CUDA), родился финальный, работающий рецепт.

Ubuntu 24.04.2 LTS

Ubuntu 24.04.2 LTS

"Золотой" скрипт установки

Вместо того чтобы описывать десятки команд, которые я вводил вручную - собрал все шаги в единый установочный скрипт setup_env.sh. Что он делает:

  1. Проверка pyenv. Скрипт начинается с проверки наличия pyenv. Это позволяет использовать нужную версию Python (3.11.9), а не системную, избегая конфликтов.

  2. Установка системных библиотек. Для компиляции dlib из исходного кода необходимы инструменты сборки (build-essential, cmake) и библиотеки для работы с математикой и изображениями (libopenblas-dev, libjpeg-dev). Скрипт автоматически их устанавливает.

    Важно: скрипт предполагает, что CUDA Toolkit и отдельно cuDNN уже установлены по официальным инструкциям NVIDIA для вашей системы - они по ссылкам.

  3. Создание чистого venv. Создаем изолированное виртуальное окружение, чтобы зависимости нашего проекта не конфликтовали с системными. Скрипт удаляет старое окружение, если оно существует, для гарантированно чистой установки.

  4. Ключевой момент: установка dlib. Это сердце всего процесса. Команда pip install dlib с особыми флагами:

    • --no-binary :all: — этот флаг принудительно запрещает pip скачивать готовый, заранее скомпилированный пакет (wheel). Он заставляет pip скачать исходный код dlib и начать компиляцию прямо на вашей машине.

    • --config-settings="cmake.args=-DDLIB_USE_CUDA=1" — а это инструкция для компилятора cmake. Мы передаем ему флаг, который говорит: «При сборке, пожалуйста, включи поддержку CUDA».

Именно эта комбинация заставляет dlib собраться с поддержкой GPU на Ubuntu 24.04 LTS чтобы использовать видеокарту, а не в стандартном CPU-only варианте.

Вот сам скрипт setup_env.sh:

#!/bin/bash
set -e

VENV_DIR=".venv"
PYTHON_VERSION_TARGET="3.11.9"

echo "=== Установка окружения и зависимостей ==="

# --- Проверка наличия pyenv ---
if ! command -v pyenv &> /dev/null; then
echo -e "\n\033[1;31m[ERROR] pyenv не найден. Установи pyenv перед запуском.\033[0m"
exit 1
fi

echo -e "\n[INFO] Выбор версии Python $PYTHON_VERSION_TARGET через pyenv..."
pyenv local $PYTHON_VERSION_TARGET
echo "[INFO] Текущая версия Python: $(python --version)"

# --- Проверка системных библиотек ---
echo -e "\n[INFO] Проверка и установка системных библиотек для dlib..."
sudo apt update
sudo apt install -y build-essential cmake libopenblas-dev liblapack-dev libjpeg-dev git

# --- Очистка и создание виртуального окружения ---
if [ -d "$VENV_DIR" ]; then
echo "[INFO] Удаление старого виртуального окружения '$VENV_DIR'..."
rm -rf "$VENV_DIR"
fi

echo "[INFO] Создание виртуального окружения '$VENV_DIR'..."
python -m venv "$VENV_DIR"

echo "[INFO] Активация окружения..."
source "$VENV_DIR/bin/activate"

echo "[INFO] Установка Python-зависимостей..."
pip install --upgrade pip
pip install -r requirements.txt

echo "[INFO] Установка dlib с поддержкой CUDA..."
pip install dlib \
--no-binary :all: \
--verbose \
--config-settings="cmake.args=-DDLIB_USE_CUDA=1"

echo "[INFO] Установка face_recognition..."
pip install face_recognition

echo -e "\n\033[1;32m[OK] Окружение и зависимости успешно установлены.\033[0m"

requirements.txt:

numpy opencv-python git+https://github.com/ageitgey/face_recognition_models tqdm

Часть 3: собираем все вместе

Камера, смотрящая на лифтовой холл. Фото из интернета

Камера, смотрящая на лифтовой холл. Фото из интернета

После победы над зависимостями у меня есть полностью рабочее окружение с CUDA-ускорением. Настало время применить его к реальным данным. Мои исходные данные - это архив видеозаписей с двух IP-камер, которые пишут видео на сетевой накопитель Synology Surveillance Station (есть аналоги). Для приватности я заменю реальные имена камер на условные:

  • podiezd_obshiy\ - камера, смотрящая на лифтовой холл.

  • dver_v_podiezd\ - камера из домофона, направленная на улицу.

Внутри каждой папки видео отсортированы по каталогам с датами в формате ГГГГММДД с суффиксом AM или PM. Сами файлы имеют информативные имена, из которых легко извлечь дату и время записи: podiezd_obshiy-20250817-160150-....mp4.

Камера из домофона, направленная на улицу. Здесь качество гораздо лучше потому что камера цифровая, а не аналоговая как у меня из квартирного домофона. Это фото из интернета

Камера из домофона, направленная на улицу. Здесь качество гораздо лучше потому что камера цифровая, а не аналоговая как у меня из квартирного домофона. Это фото из интернета

С данными разобрались, теперь перейдем к инструменту - Python-скрипту face_report.py. Скрипт служит разовым инструментом анализа архива видео, чтобы протестировать работу CUDA.

За работой

За работой

Общая архитектура скрипта

Я использовал стандартную библиотеку argparse. Она позволяет задавать ключевые параметры прямо из командной строки:

  • --model: выбор детектора лиц (hog или cnn).

  • --scale: коэффициент масштабирования кадра. Уменьшение кадра (например, до 0.5) ускоряет обработку, но может пропустить мелкие лица.

  • --skip-frames: количество пропускаемых кадров. Анализировать каждый кадр избыточно и медленно; достаточно проверять каждый 15-й или 25-й.

Скрипт находит все .mp4 файлы в указанной директории и запускает основной цикл, обрабатывая каждый видеофайл.

1. Детекция лиц: HOG против CNN

face_recognition предлагает два алгоритма детекции: HOG (Histogram of Oriented Gradients) и CNN (Convolutional Neural Network). HOG - классический и очень быстрый метод, отлично работающий на CPU. CNN - это современная нейросетевая модель, гораздо более точная (особенно для лиц в профиль или под углом), но крайне требовательная к ресурсам.

Раз я так боролся за CUDA, выбор очевиден - будем использовать cnn. Это позволит находить лица максимально качественно, не жертвуя скоростью.

2. Уникализация личностей

Как скрипт понимает, что лицо на двух разных видео принадлежит одному и тому же человеку? Он преобразует каждое найденное лицо в face_encoding - вектор из 128 чисел, своего рода уникальный «цифровой отпечаток».

Когда появляется новое лицо, его «отпечаток» сравнивается со всеми ранее сохраненными. Сравнение происходит с определенным допуском (tolerance). Установил его равным 0.6 - это золотая середина, которая позволяет не путать разных людей, но и узнавать одного и того же человека при разном освещении или угле съемки.

3. Умный подсчет: один файл - один голос

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

4. Создание красивых иконок

Чтобы в кадр попадала вся голова с прической и частью шеи, я добавил в функцию create_thumbnail логику с отступами. Она берет размер найденного лица и увеличивает область кадрирования на 50% по вертикали и горизонтали. Так превью в отчете выглядят гораздо лучше и живее.

5. Генерация наглядного HTML-отчета

Финальный штрих - вся собранная информация (иконки, количество появлений) упаковывается в красивый и понятный HTML-отчет. Никаких сложных фреймворков: с помощью f-string и небольшого блока CSS генерируется страница, на которой все уникальные личности в этом эксперименте отсортированы по частоте появлений.

Часть 4: результаты и выводы

Для эксперимента я посчитал уникальных людей в выборке. Скрипт я запускал разово, отдельно для каждой камеры - это не постоянно работающий сервис, а скорее любопытная исследовательская игрушка.

Результаты оказались наглядными, но и показали пределы технологии. Качество распознавания напрямую зависит от исходного видео: камера домофона с узким углом и посредственным сенсором даёт мыльную картинку, на которой детали лица часто теряются. Для сравнения, камера 2,8 мм 4 Мп в лифтовом холле (широкоугольный объектив и матрица с разрешением 2560×1440) выдаёт значительно более чёткие кадры - глаза, контуры лица и текстура кожи читаются лучше, а значит, алгоритм реже ошибается.

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

Заключение

От простой идеи - «разово прогнать архив записей через алгоритмы компьютерного зрения и посмотреть, как быстро GPU справится с такой задачей» - я прошёл путь через череду технических ловушек: несовместимые версии Python, упёртый dlib, капризы CUDA и GCC.

К тому же это не сервис, а исследовательская проверка возможностей GPU.

Автор: Михаил Шардин
🔗 Моя онлайн-визитка
📢 Telegram «Умный Дом Инвестора»

19 августа 2025

Показать полностью 7
1

GenEraser Bot. Добавление оплаты на примере ЮКасса

Доброго времени суток! Сегодня расскажу о боте, который создавал больше для себя, а также для тестирования оплаты в телеграм. GenEraser Bot - бот, который имеет две функции:

1. Удалять фон с изображений.

2. Генерировать изображение (на основе модели Kandinsky 3.0)

На коде бота останавливаться особо не будем, кому интересно, можете посмотреть по ссылке ниже. Сегодня же нас интересует другой момент, а именно момент оплаты.

Начинаем с того, что выбираем платежную систему, через которую будем производить платежи и регистрируемся там. Я выбрал ЮКасса. Осуществляем обработку платежей в коде.

Бота пишу с использованием библиотеки pyTelegramBotAPI, для начала нам нужно создать счет на оплату, для этого я создал отдельную функцию send_invoice, в котором создается счёт.

main.py

функция send_invoice()

функция send_invoice()

в ней мы уже вызываем метод bot.send_invoice, который имеет такие параметры:

chat.id - id чата с текущим пользователем

title - название платежа

description - описание платежа

invoice_payload - payload платежа

provider_token -токен платёжной системы, покажу позже, как мы его получим

currency - валюта

prices - цена, где label - название, amount - цена, в самой маленькой единице валюты, например, у меня в копейках, так как валюта рубль

start_parameter - параметры платежа (произвольная строка)

Итак, когда пользователь подтвердит платёж, Telegram пришлёт вам webhook с Update, который содержит объект PreCheckoutQuery. На этот запрос нужно ответить в течение 10 секунд, вызвав метод answerPreCheckoutQuery. (Из документации ЮКасса).

main.py

обработка запроса

обработка запроса

Можно также в этой функции реализовать проверку заказа, но у меня просто ответ. После успешного платежа, бот пришлет следующий вебхук SuccessfulPayment. Мы теперь можем отследить это событие и сделать нужные действия. У меня, к примеру, это начисление монеток.

main.py

обработка успешного платежа

обработка успешного платежа

На этом моменте с кодом мы разобрались, теперь покажу, как получить токен для платежной системы.

Переходим в телеграм в @botfather. Там выбираем своего бота, кнопка "Payments":

Нажимаем на кнопку

Нажимаем на кнопку

Выбираем нужную систему для оплаты, у меня это ЮКасса:

ЮКасса

ЮКасса

Коннектимся, если нужно протестировать систему, выбираем ТЕСТ, если уже есть готовый магазин на сервисе ЮКасса, то выбираем LIVE. Магазин должен работать по API в документации от ЮКасса это подробно описано.

Дальше, вас перебросит в бота от ЮКассы, где вы должны дать доступ к своим данным. Даём доступ и возвращаемся в @BotFather, имеем тот самый платёжный токен.

Токен

Токен

Как раз его нужно скопировать и вставить в наш код. На этом всё, всем хорошего кодинга, а я буду браться за свой новый пет-проект.

Следите за новостями, подписывайтесь на мой телеграм-канал. Заходите на мой сайт, там много интересного.

P.S. Кому интересно, бота можно глянуть по ссылке.

Код на GitFlic

Показать полностью 7
3

Inform Bot Обновление

Приветствую в своём блоге, сегодня я расскажу вам о своём небольшом проекте. Недавно я уже писал, про этого бота, это был первый проект такого плана. До этого я никогда раньше не писал ботов, поэтому этот проект, так называемая, "проба пера") В этом обновлении я добавил базу данных к боту, вместо файла json. Сейчас мы попробуем разобрать весь код подробнее.

Структура проекта:

-data/

- - - - -db.db

-.env

-bot.py

-btns.py

-db_tool.py

-parse_func.py

-requirements.txt

Немного расскажу о структуре проекта, имеем папку data/ в ней лежит файл базы данных db.db, БД использовал SQLite, она отлично подошла для такого небольшого проекта.

Файл .env содержит переменные окружения, там у нас записан токен бота, токен Open Weather Map и директория, из которой подтягивается БД.

Файл bot.py содержит основной код программы, btns.py - кнопки для бота решил поместить в отдельный файл, чтобы разгрузить основной.

Файл db_tool.py содержит функции для работы с базой данных, parse_func.py - функции парсинга данных.

Файл requirements.txt - зависимости.

Код

Теперь покажу немного кода. Весь код будет доступен по ссылке, здесь покажу только основные моменты.

bot.py

Функция для проверки событий в другом потоке

Функция для проверки событий в другом потоке

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

В коде есть замечание, я получаю текущее время и прибавляю к нему timedelta, это из-за часовых поясов, у меня на сервере -3 от Москвы.

В коде есть замечание, я получаю текущее время и прибавляю к нему timedelta, это из-за часовых поясов, у меня на сервере -3 от Москвы.

Функция для получения значений, записанных в БД и отправка пользователю

Функция для получения значений, записанных в БД и отправка пользователю

Запускаем бота и поток с проверкой времени

Запускаем бота и поток с проверкой времени

Обрабатываем команду /start

Обрабатываем команду /start

Дальше идёт обработка текстовых сообщений пользователя, а именно какие кнопки были нажаты

для примера кнопка настроек

для примера кнопка настроек

Запускаем бесконечную прослушку бота

Запускаем бесконечную прослушку бота

С основными моментами в файле bot.py, вроде всё.

btns.py

Кнопки в отдельном файле

Кнопки в отдельном файле

Больше всего было интересно работать с БД, написал функции для работы с ней.

db_tool.py

Вот пример функции для получения значений по chat_id пользователя

Вот пример функции для получения значений по chat_id пользователя

В результате получаем словарь со всеми нужными значениями.

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

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

P.S. Вы знали, что у нас есть российский аналог GitHub? Я не знал, а теперь знаю, так что проекты буду там свои выкладывать отныне. Поддержим российского производителя))

P.P.S. Подписывайтесь на мой телеграм канал. Попробовать бота: @pytginform_bot.

Показать полностью 10
8

Codex от Google

Убийца Codex от Google вышел из беты — мощный ИИ-агент для кодеров Jules спустя два месяца тестов стал доступен для ВСЕХ!

Нейронка кодит целые приложения на ФОНЕ, пока вы отдыхаете:

🔅 Подключается в один клик к репозиторию GitHub.

🔅 Работает в защищенной виртуальной машине Google Cloud.

🔅 Выполняет до 3 задач одновременно.

🔅 Создаёт пул-реквесты, фиксит баги, тестит код и добавляет новые фичи.

🔅 После выполненной работы выдаёт готовый отчёт.

15 задач в день: Бесплатно

Ссылка

Источник

Показать полностью

Создать бот по распознаванию лица по фото

Нужна помощь в создании бота в Telegram распознавания лица по ранее загруженному фото.
Для чего это всё!? Являюсь сотрудником полиции, очень часто ищем людей совершивших кражу из магазина, велосипеда из подъезда или карманников в общественном транспорте по видео изображению лица по камерам. И не всегда удаётся распознать ранее известного лица(качество может быть плохое и многое другое).
Пример: делаем фото человека в полный рост, профиль, анфас, 3/4. Пишем данные человека Фио и дату рождения. Все данные человека загружены. Потом когда появляется фото жулика с камер загружаем его и если он ранее загружен в бот, то бот быстро выдаёт его данные. Бот должен быть закрытым, не для общего пользования.

Отличная работа, все прочитано!