All streams
Search
Write a publication
Pull to refresh
6
0.3
Send message
Вообще-то, в математике принято соглашение об арифметическом значении квадратного корня. Т.е., по определению, квадратный корень всегда положителен. Но если, допустим, нужно решить квадратное уравнение x^2 = 1, то корнем будут два значения: +sqrt(1) = 1 и –sqrt(1) = –1. Так что, в математике, функция y = sqrt(x) – функция однозначная.

А вот функция y = x^x для иррациональных отрицательных чисел просто неопределенна, другими словами, многозначна. Это означает, что существуют разные подпоследовательности, сходящиеся к аргументу, но имеющие различные значения. Равно, как это обстоит с sin(x) на бесконечности. Только sin(x) многозначна в «точках» плюс / минус бесконечность, а x^x многозначная для всех иррациональных отрицательных чисел.
Ценю ваш профессиональный ответ. Мне, откровенно говоря, лень разбираться с отображением формул. Но, думаю, можно обойтись без них.

Я согласен, что «композиция аналитических функций» функция аналитическая, но вы сами пишете, что есть «основная ветвь логарифма», а «остальные отличаются на 2pi». Другими словами, логарифм для отрицательных аргументов – функция многозначная. Как тот же sin(x) на бесконечности. Из этого следует, что значение отрицательного иррационального числа в точно такой же степени величина многозначная, даже если можно говорить о «главном» значении.

Что отличает однозначное значение от многозначного? Вы, как профессионал в математике, должны знать, что если непрерывная функция в некоторой точке однозначна, то любая подпоследовательность сходится к этому значению. А если многозначна, то разные подпоследовательности, сходящиеся к искомому аргументу, могут давать разные значения, как вышеупомянутый sin(x) на бесконечности.

И это достаточно очевидно. Возьмем тот же пример www.wolframalpha.com/input/?i=x%5Ex+where+x%3D-pi, указанный samrrr чуть выше. Речь идет о минус пи в степени минус пи. Представим минус пи в виде двух подпоследовательностей рациональных чисел, сходящихся к этому аргументу. В первой последовательности все числители будут четными, а во второй нечетными при нечетном знаменателе. Таким образом, мы получим два разных предельных значения, первое будет положительным числом, а второе отрицательным. Можно также подобрать подпоследовательность, дающую комплексный предел.

Так что, не все так однозначно :).
Не устроит, ибо я не вижу на графике разрывов.
А то, что в левой части графика изображена комплексная функция, вы видите? На рисунке представлены действительная (real) и мнимая (imaginary) части комплексного значения. Действительного предела (по непрерывности) слева для этой функции нет. Есть только предел слева для real-части комплексного значения. А это, как бы, не одно и то же.

Тоже самое для минус пи в степени минус пи. Это выражение многозначно, как, скажем sin(x) на бесконечности. Вы можете выбрать любое значении от –1 до +1 и указать некоторую подпоследовательность, сходящееся к этому значению, что, однако, не сделает это выражение определенным, только с точностью до некоторой подпоследовательности.

Вы можете сказать, что приведенное значение «главное». Тогда я скажу, что «главное» значение sin(x) на бесконечности равно нулю, что проблемы, понятно, не закроет.
Не соглашусь. Я давно заметил, что из крутых математиков редко получаются хорошие программисты. Понимание навороченных математических абстракций слабо связано с пониманием абстракций программистских.

Согласен в то части, то 100%-ные математики не готовят себя к программированию, поэтому они его просто не знают. Но среди крутых программистов трудно найти человека, который совершенно не знает математику. Возьмите трехтомник Кнута, «Искусство программирования». Сможете ли вы утверждать, что он не знает математику? Да он ее знает покруче некоторых дипломированных математиков.

Хорошо назовите пример крутого программиста, в части нетривиального программирования, который в математике ноль, как, скажем, Александр Сергеевич Пушкин.

Так современное программиование — это не придумывание новых алгоритмов, а переиспользование уже существующих.

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

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

Речь идет не столько о самостоятельной реализации алгоритмов OpenCV, сколько о понимании их работы. А как вы их поймете, если не знаете математики? А непонимание чревато. Убедился на себе. Я вот сейчас пишу обучающую программу по распознаванию встроенных субтитров видео роликов и перевода их на русский язык. В том числе использую OpenCV (наряду с SDL и FFmpeg / FFplay). Так вот использование алгоритмов OpenCV вслепую, по аналогии с опубликованными примерами, приводит, в конечном счете, к плачевным результатам (для более-менее серьезных проектов). И только когда я начал вникать в алгоритмы и пользоваться их собственными аналогами, дела пошли лучше. И даже код получался проще и понятнее. Надеюсь, я еще опубликую здесь свою статью об этом.

Велосипеды обычно не нужны, потребность в новых реализациях и новых алгоритмах не насколько велика.

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

Если вы наслышаны про 1С, то можете знать о мегатоннах холивара и сра*а на эту тему. А все почему? Потому, что программировали его люди, плохо знающие математику, соответственно, со слабым абстрактным мышлением. В итоге, «ежики плакали, кололись, но ели кактус». А куда деваться бедным пользователям?

Возьмем простейшую ситуацию. Допустим, вы специалист по интерфейсу программ. Вам поставили задачу использовать MDI-интерфейс, но чтобы в дочерних окнах были локальные меню. Не будем спорить, зачем? Приказы начальства не обсуждают. Вы думаете: «а, щас, задача – два пальца об асфальт». Делаете, но болт! Не получается. Начинаете копать глубоко и выясняете, что локальные меню запрещает парадигма MDI на уровне системных dll. Вот те на! И действительно, никто не использует локальное меню. Вместо этого применяется контекстное меню, панель инструментов, командную панель, кнопочное меню, различного рода панели управления, но полноценного локального меню в дочерних окнах нет (возьмите для примера интерфейс 1С любой версии).

И что делать? Изобретать собственный вариант псевдо MDI? Или эмулировать собственное меню? Это можно, но очень долго. Также непросто обстоят дела с закладками окон, можно использовать тяжелые внешние библиотеки, но нужно ли?

Хорошо, вас переключили на SDI-интерфейс. Говорят, сделай нам мультипоточный интерфейс с перегружаемыми либо неявным образом переключаемыми клиентским окнами. Есть хороший прототип для работы? «Брезенту ненту!», как говорил старый Райкин.

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

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

Поэтому, думать, творить и изобретать что-то свое очень полезно, если не хотите быть последним человеком в своей специальности. Однако это совсем не отменяет изучение чужого опыта, скорее наоборот. Как говорил Ньютон: «Если я и увидел дальше, то только потому, что стоял на плечах гигантов!».
На вашем рисунке нет никакой функции в отрицательной полуплоскости аргумента. Об этом и шла речь, что функция y = x^x не определена для x < 0. Именно как функция, точнее, как непрерывная функция и уж тем более, как гладкая функция. Но как разрывная функция она определена, согласен. При целых четных отрицательных значениях функция будет положительна, а при целых нечетных отрицательных значениях функция будет отрицательна. Сложнее вопрос обстоит с рациональными аргументами, здесь помимо действительных, могут быть комплексные значения, а для отрицательных иррациональных чисел функция не определенна даже в комплексной плоскости и вообще для любых числовых множеств.

Поэтому непрерывности, при x < 0, у этой функции нет, а гладкости тем более. А поскольку речь шла, о предельном значении по непрерывности справа, то я и утверждал, что данная функция не определенна по непрерывности слева. Хотя, строго говоря, функция определенна, как уже говорилось, как разрывная функция и то за исключением иррациональных аргументов. Причем, мера рациональных чисел на любом отрезке равна нулю. Это дает нам право говорить, что строго математически, данная функция не определенна, при x < 0, почти всюду.

Вас такой ответ устроит :)?
Я долго вникал почему 0 в степени 0 равен 1, и у меня ощущение что я до конца так и не понял всей сути.

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

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

Например, в функции y = x^x, при положительных значениях х, все определенно и понятно (постройте этот график и убедитесь сами, можно попутно найти минимум этой функции). Так вот, при x, стремящемся к нулю справа (при x, меньших нуля, эта функция неопределенна), легко видеть, что значение функции стремиться к единице. Его еще называют значением по непрерывности. Поэтому, ничего нам не мешает доопределить эту функцию в нуле, так чтобы для всех неотрицательных значениях x, функция сохраняла непрерывность (и даже дифференцируемость).

На мой вопрос: «как решаются такие уравнения?», ответ был очень прост: «учи исследование функции, начало анализа и задачи на оптимизацию. Алгебра 10-11 класс».

Мы квадратные уравнения изучали в пятом-шестом классе. А тригонометрию вам в школе преподавали? А стереометрию? Классов у нас было десять, анализа, исследования функции и оптимизации не было, но я лично в десятом классе все это легко выучил самостоятельно (по учебнику для первого курса ВТУЗов).

Начинаю осознавать, что для полной картины понимания Computer Science, мне необходимо будет заново учить алгебру, а затем и ВысшМат.

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

Пример, возьмите опенсорсную библиотеку компьютерного зрения OpenCV. Ее использование – современный тренд в распознавании чего-либо с помощью элементов искусственного интеллекта. Так там большинство алгоритмов используют не просто высшую математику, а математику из арсенала мехмата МГУ, т.е., нечто запредельного уровня сложности.

А вот сама прикладная математика в обычной жизни редко применяется. Мне даже школьная тригонометрия практически ни разу не пригодилась. Но для разработки игр эта вещь очень полезная.

Могу открыть маленький секрет, достаточно знать не объемный курс высшей математики, а просто быть способным легко усваивать нужную тему. А по сложным алгоритмам можно попросить помощи на форуме математиков. Я вот недавно задал там вопрос: «Как группировать бинарные матрицы по степени их похожести?» ( dxdy.ru/topic142232.html ) и нашел ответ с общей помощью, что позволяет мне программировать дальше.
Думаю, нет главного принципа: «Выбор правильной стратегии».

Что предлагает автор? Допустим, к 35 годам или больше вам захотелось более престижной и «умной» работы. Вы там слегка поднатаскали себя в какой-нибудь модной теме и пошли на собеседование. Не мытьем, так катаньем находите какую-то работу и делаете, что скажут. Не понравилось, ищете что-нибудь другое, попутно матерясь на объявления, типа: «Требуется программист 1С (или в другой области), не старше 30 лет».

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

Я не знаю, что сейчас наиболее актуально, но вижу много проблем в сфере компьютерного учета на предприятиях (базы данных). Актуальны, по-моему, также компьютерное зрение (опенсорсная библиотека OpenCV), искусственный интеллект (это бесконечная тема), 3d-моделирование и т.д. и т.п.

По учету, лидирует ПО от 1С, но там столько проблем, что разгребать авгиевы конюшни можно еще очень долго. Пример собственной ниши в этой области – «Магазька», это простая любительская программа на 1С82 по розничному учету (в основном, для индивидуальных предпринимателей). Автор этой программы уже более десяти лет кормиться за счет нее и кормиться неплохо. Он продает ее через Интернет по разумным ценам. И как он пишет у себя на сайте, заработал на своем детище себе квартиру в Москве и крутую иномарку. Причем эта программа актуальна до сих пор.

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

Хорошо, допустим, вам не нравится компьютерная бухгалтерия, тогда ищете свою нишу в другой области. На вскидку, можно предложить обучающие программы, скажем иностранному языку. Таких программ много, но хороших я лично не знаю. Это вполне по силам одному человеку. Если взлетит, можно недорого продавать безо всякого работодателя или работовзятеля.

Короче, вариантов много. Нужно просто активно думать в этом направлении. При желании, идеи можно обсуждать в Интернете, в т.ч., здесь, на Хабре.
> Если интересно, могу рассказать детали.

Думаю, вы проделали очень интересную работу, но, к сожалению, перечисленные инструменты (C#, WinForms, Delphi) вне области моих интересов, хотя на уровне общей концепции было интересно послушать.

> А про WTL, к своему собственному удивлению, даже не слышал.

Я тоже про нее узнал недавно, года полтора, хотя ему уже порядка 20 лет. Интересная штука для создания легких приложений. Это Майкрософтовский опенсорс, поэтому для кроссплатформенности годится мало, но последнее в моем случае не актуально.

А так, я тоже собираюсь опубликовать здесь статью по своей текущей программе, когда она будет готова. Она будет работать как собственный видеоплейер по адаптации обучающих видеороликов, например, переделка французско-английских встроенных субтитров (см. замечательные ролики «Easy French» на Ютубе) на французско-русские (с возможностью распознавания текста). Почему именно французский язык? Благодаря ZAZ. Некоторые детали были озвучены при обсуждении алгоритма группировки на форуме математиков dxdy.ru/topic142232.html. Остальные подробности, надеюсь, будут в статье.
П — Так WinAPI это старье беспросветное, на нем уже никто не пишет
С — Да? А на чем пишут сейчас?
П — Ну на Jave и на Qt

Пробовал я писать и на WinAPI, и на wxWidgets, и на Qt, и на Java. В итоге Джаву однозначно побоку, а вот С++ самое оно. Да, долго, да, сложно, да и много еще чего, но интересно и абсолютно никаких ограничений.

C++ / Qt очень мощная вещь, но иногда нужно чего-нибудь попроще. Следующая, по простоте, конструкция это C++ / wxWidgets. Замечательно, но если желать чего еще проще, то приходим к C++ / WTL (может быть в связке с ATL).

C++ / WTL это, практически, уровень C++ / WinAPI, только более комфортный для использования. Чем больше я занимаюсь WTL, тем больше он мне нравится. WTL это сверхлегкая библиотека пользовательского интерфейса, все остальное можно получить из опенсорса, например, компьютерное зрение – OpenCV, работа с мультимедиа – SDL / FFmpeg / FFplay, работа с внедряемыми базами данных – SQLite и т.д. и т.п. Так что пока нет даже особой потребности возвращаться к wxWidgets или Qt.

Лично моя область интересов, как программиста – любителя, это обучающие программы, работающие с мультимедиа и легкие учетные системы, типа современного эквивалента платформы 1С77. Пока все в стадии разработки, но, к счастью, в шею никто не гонит, так что можно получать удовольствие от самого процесса программирования :).
Ценю ваши подробные замечания!

В принципе, вы говорите все правильно, но как-то в общем. А я, в данный момент, пишу конкретную программу и алгоритм мне нужен конкретный.

В практическом плане задача решалась следующая. В типовом ролике «Easy French» порядка 6 тысяч кадров, на каждом из них несколько десятков символов, причем в первых строках французский текст, а во вторых – английский. Всего набегало порядка полмиллиона символов на одно видео. Символы разделялись (в т.ч., с помощью криволинейного контура), абсолютно точные дубликаты удалялись, в итоге их оставалось около 30 тысяч. Но в любом латинско подобном алфавите всего несколько десятков символов, со всякими там спецсимволами. Таким образом, на каждый уникальный символ приходится примерно несколько сотен бинарных матриц, разной размерности, их изображающих. Естественно, требуется сократить общее количество уникальных матриц символов до приемлемого количества, которое уже можно будет распознавать вручную.

Различные эксперименты понижали множество уникальных матриц разной размерности до нескольких тысяч. Наиболее подходящими были параметры относительной ширины символа и относительных отступов символов сверху и снизу в паре с абсолютной высотой матрицы в пикселях и т.п. вариации. Плюс хеширование матриц символов.

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

Однако буквально сегодня пришли другие мысли, связанные с оптимизацией процесса. А именно:

1. Зачем обрабатывать все кадры с одинаковым текстом, если можно обработать только один кадр?

2. Зачем делать посимвольное распознавание, если можно делать распознавание вручную всего ключевого кадра сразу? Для одного ролика «Easy French» таких кадров порядка сотни, состоящих из двух строк текста.

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

4. Различать бинаризированные текстовые области кадров видео можно по некоторому хэш-коду.

Этот подход сильно упрощает процесс программирования. Сегодня я уже успел попробовать пункт 4 для хэша размерности 8*16, он дает коэффициент дублирования меньше двух. Конкретно, вместо примерно ста ключевых кадров (из 6 тысяч) выдает 185, что приемлемо.

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

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

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

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

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

Вы правильно заметили, что здесь можно использовать «алгоритм кластеризации (или классификации)», но почему он не может быть основан на «выборе признаков»? Думаю, вполне может. Такими признаками могут быть:

– Отступ символа сверху (три значения: малый, средний и большой, для больших символов, малых и верхних и нижних спецсимволов);
– Процент ширины символа от его высоты (можно с точностью до нескольких процентов).

Можно придумать и другие признаки, но пока достаточно. Это дает нам естественную кластеризацию или группировку символов по данным параметрам.

Далее, можно использовать искусственные признаки. Лучшим кандидатом на это является хэш-код, получаемый путем сжатия исходной матрицы до размера, скажем, 8*8 и преобразованный в 64-битное значение любым единообразным способом, что создаст группу матриц с искусственным признаком (конкретным хэш-кодом) в рамках естественного кластера признаков.

Таким образом, расстояние Хэмминга мы уже не используем, точнее, используем только нулевое расстояние. Да, это дает нам избыточное количество групп похожих матриц, но мы можем снизить его до приемлемого уровня за счет: а) снижения размерности сжатых матриц (7*7, 6*6, 5*5 или даже 4*4 – выбираем экспериментально) и б) увеличением количества признаков естественной, не пересекающейся кластеризации.

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

Да, можно сжать матрицы до одной размерности и сравнивать их хэш-коды, но это годится для поиска, а для группировки нужно, чтобы расстояние Хэмминга для хэщ-кодов, размерности, например, 8*8, не превышало, скажем, трех. А этот критерий невозможно применить, в силу отсутствия у расстояния Хэмминга отношения эквивалентности. Таким образом, мы имеем хороший критерий, но он не позволяет разделить искомое множество бинарных матриц (заполненные только нулями и единицами) на непересекающиеся классы эквивалентности.
Задача практически решена на форуме математиков: dxdy.ru/topic142232.html. Я там под ником Scholium.
Это все конечно здорово, но похоже на классическое: «Отстаньте, жалкие! Я не тактик, я стратег!». Вот, я сам себе и заказчик, и исполнитель задачи по распознаванию встроенных субтитров обучающих видео, с целью их перевода.

Все чудесно программируется, даже разделение сцепленных символов реализовал (которые можно разъединить только криволинейным контуром). Однако появилась задача группировки бинарных матриц символов, разной размерности, по степени их похожести. Да, можно сжать матрицы до одной размерности и сравнивать их хэш-коды, но это годится для поиска, а мне нужна именно группировка.

Есть ли у вас какие-либо идеи на эту тему? Вы все-таки профессионал, а я любитель. Но, если это не ваша область интересов, то я снимаю свой вопрос.
Очень круто! И примерно то, чем я тоже занимаюсь.

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

Меня, в данном случае, интересует французский язык, который я хочу понимать на слух. Говорить правильно по-французски очень сложно, звуки от русских отличаются почти полностью. Поэтому смотреть фильмы с двойными субтитрами практически не выход. Лучше осваивать специализированные обучающие ролики на Ютубе, типа «(Super) Easy French» (пример: www.youtube.com/watch?v=bb4zvZdrMz4 ). Правда, там идут встроенные субтитры, а язык перевода – английский. Зато ролики (а их сотни) сделаны идеально. Разве что напрягают звуковые заставки, при многократном просмотре они сильно раздражают.

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

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

Такая программа, в существенной своей части уже сделана. Взят опенсорсный видеоплейер FFplay.c из библиотеки FFmpeg + SDL. Удалось скомпилировать его и внедрить в интерфейс программы, написанной на C++ / WTL. Само видео воспроизводится в клиентской области окна приложения. Оно может быть распахнуто / «спахнуто» (в т.ч., по двойному щелку мыши) на весь экран и обратно, в дочернее окно. Все клавиатурные команды и команды мыши FFplay.c работают без изменений, разве, что добавлена обработка новых. Сами ролики могут аккуратно перегружаться и много чего еще можно сделать в собственной программе. В общем, получается чудесная вещь.

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

Кроме этого, можно использовать видео, где представлен только встроенный текст на одном языке. Как вариант, можно изучать ролики французского TV, вроде: «7 jours sur la planète» ( www.youtube.com/watch?v=32PAh5gNYqE ). Здесь идут чистые (встроенные) титры на французском, осталось только добавить русский перевод. Причем, смотреть на красавицу Marianne Beseme ну очень приятно, и говорит она просто идеально, не знаю даже как выразить свой восторг :).

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

Если (когда) программа будет закончена, то я опубликую соответствующую статью, здесь, на Хабре.
Интересно, конечно, для ввода в тему, но плохо то, что статья не ориентирована на реальный выхлоп. Да, «делать второй FineReader» не нужно, но FineReader рассчитан на профессиональную работу с документами, а, скажем, для распознавания встроенных титров в видео, например, обучающих, типа «Easy French» ( www.youtube.com/watch?v=bb4zvZdrMz4 ), он не годится.

А так, идея обучающих видео очень классная. Если допустим в указанном ролике затереть английский перевод и добавить русский (хоть встроенными субтитрами, хоть обычными), то было бы просто супер. Конечно, можно непосредственно подключить переводные субтитры на русском языке, но получается не слишком изящно. Распознавание голоса, даже на Ютубе, пока еще не идеально. В любом случае, распознавание встроенных оригинальных субтитров в видео, думаю, вполне востребовано. Бывают обучающие ролики с очень мелкими встроенными субтитрами, а автоматические текстовые субтитры, как правило, оставляют желать лучшего. Там было бы удобно распознать оригинальный встроенный текст, затереть его и вывести (внутренним либо внешним образом) в виде более крупного шрифта и даже другим цветом. Иногда и ошибки можно исправить.

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

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

Интересно, но сцепленные символы, сдвоенные и даже строенные (допускаю и большее количество) тоже легко настраивать на распознавание. Например, строенными тут идут символы «st-» (между ними нельзя провести прямые разделительные линии, хотя бы из-за дефектов изображений). А сдвоенных пар гораздо больше: «nj», «ra», «ve», «et», «to», и множество других, даже «r.» сцеплены.

Детали алгоритма будут в статье. Да, алгоритм привязывается к типоразмеру шрифта, но легко настраивается вручную. Для корректировки обучающих видео этого вполне достаточно.
Оказывается, про загрузку dll самой себя, с целью блокировки выгрузки нестандартной ВК из 1С было упомянуто еще в 2016 году. Вот ссылка на 21-ое сообщение Serginio1:
На самом деле можно запретить выгрузку DLL (через LoadLibrary самой себя) и использовать статические переменные. Я например в своей ВК так и поступаю. У меня проблемы с повторной инициализацией .Net

> сделано было на АЛьФовском формексе, и 12 лет назад (в 2007), и работало без проблем и напрягов лет 9.

Я, по-моему, уже несколько раз объяснял, почему меня не устраивает «АЛьФовский формекс». Я рад за вас, но мне это ничего не дает.

> в восьмерках тоже можно сделать без проблем,

Ключевое слово – можно! Да, можно, и я это продемонстрировал в статье.

> только уже не нужно — есть другие инструменты.

Кому не нужно? Вам? Так и не делайте, кто вас заставляет. Мне? Так надо было раньше говорить, а то я этого не знал, а теперь уже поздно, все сделано :).
Ну, я лично не собираюсь подменять профсоюзы и бухгалтерию (они дают деньги на юбилей), отдел кадров (они предоставляют оплачиваемый выходной на день рождения) и девочек, которые на цветном принтере печатают поздравления для всех счастливцев. Коллективно или индивидуально, поздравляют всех, кто как хочет.

В донном случае, речь идет о тех, с кем приходится плотно работать, особенно женщинах. Они уже как бы ожидают к себе подобного отношения тоже. Так что придется им «рисовать» видео также. Просто хороших прототипов на Ютубе очень мало. Главное это видео, ссылки на которое можно сбросить смс-кой на смартфон имениннице. Так как с 1С не все из них работают.

Следовательно, дело отнюдь не в картинках, нашел красивую в Интернете, сделал стандартную надпись (а там много не напишешь) и выложил вместо фона для 1С, для тех кто в нем работает.

Поэтому программу из статьи нужно воспринимать несколько шире, чем она представлена. Поздравления только повод, причина это нестандартная работа с 1С (поскольку стандартная имеет ограничения). Возможно, в следующей статье я приведу более практичный пример.
У нас никто не обиделся, все остались довольны. Причем это уже второй подобный случай. Даже более, ожидают видео для других персон. А я ведь не мультимедийщик. Как выкручиваться? Даже не знаю. Может, подскажите, только не слишком банально, типа позвонить по телефону, подарить букет цветов лично.

Information

Rating
2,409-th
Registered
Activity