Я немного умею складывать, но от вычитания у меня всегда кружится голова

Позднее Ctrl + ↑

Проверяем уникальность выборок в методе бустрепа при помощи хешей

Где-то в крымском лесу

Это продолжение серии заметок об анализе биологических данных.


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

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


Бутстреп

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

Немного о бустрепе.

Уникальные выборки

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

Хеш — это математическое преобразование, переводящее произвольный входной массив данных в строку фиксированной длины, состоящую из букв и цифр. Хеш считается хорошим, если он устойчив к колизиям — это когда невозможно получить из различных входных последовательностей одинаковые хеши.
Group-IB: Хеш четкий и хеш нечеткий.

Хеш

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

Вот как можно составить строку для хеширования из данных.

  • Если данные — это символы, например названия, тогда объединяем их в одну строку:
  • ’ellipse’ + ’convex’ + ’square’ + ’curve’ → ’ellipseconvessquarecurve’.
  • Если данные — это числа, то считаем их строками и тоже объединяем в одну строку:
  • 17.5 + 21.1 + 33.333 + 77.00098 + 1 + 0.008 → ’17.521.133.33377.0009810.008’

Алгоритмов хеширования много. Среди них наиболее распространены: MD5, SHA-1, SHA-2, SHA-256. Используйте любой.

Вот хеши SHA-256 двух вышенаписанных строк:

  • ellipseconvessquarecurve → 6d80b7d933b69b974189bd2a61b90a05f050c62afa055fb5a033f36114d360a2
  • 17.521.133.33377.0009810.008 → d1a728197a46f18060a0c2533938c881b0d48e8e65358f21f1d86dd0f5f1612b

Успехов в анализе данных.

Стандартизация числовых данных

Это продолжение серии заметок об анализе биологических данных. В прошлый раз мы разобрали понятие объекта и его признаков.


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


Допустим нам нужно статистически сравнить или сгруппировать несколько наблюдений по схожести признаков (например, выполнив кластерный анализ). Каждое наблюдение — это ряд числовых значений, к примеру, биомасс разных видов организмов. Ряды наблюдений упорядочены: первой всегда идет биомасса вида А, затем вида Б и так далее.

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

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

Такие наблюдения сравнивать некорректно. Виды, доминирующие по биомассе, будут сильнее всего влиять на результаты сравнения. Поэтому получится, что мы будем сравнивать не биомассы всех видов, а только нескольких доминирующих (в частном случае — одного).

Теперь выполним стандартизацию по видам (по столбцам).

Данные стандартизованные по признакам (столбцам)

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

Формула стандартизации

Для стандартизации ряда значений (строки или столбца) необходимо вычислить среднее \( \mu \) и стандартное отклонение \( \sigma \) значений ряда, затем отнять среднее от каждого элемента ряда и поделить разницу на стандартное отклонение:

\( y_i = (x_i — \mu) / \sigma \).

После таких манипуляций среднее ряда станет равным нулю, а стандартное отклонение — единице.

Полученные величины \( y_i \) будут выражать значения в пропорции к стандартному отклонению: то есть 1 будет означать одно стандартное отклонение, 2 — два и т. д.

Код на R

Если вы работаете в R, для стандартизации используйте функцию scale(). Она стандартизирует столбцы переданной матрицы.

standardized_columns <- scale(matrix)

Если необходимо стандартизировать строки, транспонируйте t матрицу, а затем транспонируйте результат.

standardized_rows <- t( scale( t(matrix) ) )

Когда применять стандартизацию

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

Объект и признаки объекта в биологической статистике

Базовые понятия необходимые для полноценного восприятия заметок об анализе биологических данных.


N. B. Нет такой дисциплины, как биологическая статистика. Статистика везде одинаковая, что в биологии, что в физике, что в лингвистике. А в заголовке она упомянута, чтобы подчеркнуть, что эта заметка, в первую очередь, предназначеная для биологов. Также поступают авторы соответствующих изданий: в названии они показывают, для какой аудитории предназначены их книги, и используют в тексте упрощения (минимум спец. символов и сложных формул в изданиях для биологов) или усложнения (доказательства теорем и выводы формул в изданиях для физиков).


Вид Южного берега Крыма

Основные понятия

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

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

Признаки объекта — это набор числовых значений, которые его описывают. Например:

  • объект численность видов сообщества в заданном районе описывается набором, состоящим из численности вида А, вида Б, вида В и т. д.
  • объект обилие вида в разных районах описывается набором, который содержит обилие вида в районе А, в районе Б, в районе В и т. д.
  • объект совокупность абиотических и биотических характеристик описывает значения этих характеристик в конкретной точке: значение характеристики А, характеристики Б, характеристики В и т. д.
  • объект признаки формы тела представителя вида описывает особенностями формы особи, выраженные какими-то числами, например — размерами: размер А, размер Б, размер В и т. д.
  • объект характеристики траектории движения микроорганизма описывает какие-то показатели траекторий, например: среднюю скорость, спрямленность, средний азимут движения и т. д.

С математической точки зрения признаки объекта — это вектор числовых или иных значений: текстовых, логических, прочих.

Позиция признаков
Позиция каждого признака в векторе строго фиксирована и ее нельзя изменить. Например, в признаках объектов сообщество X и сообщество Y на первом месте должна всегда стоять численность вида А, затем вида Б, потом В, — и их нельзя поменять местами. То же самое с объектами форма особи X, Y и Z: их вектора признаков должны на первом месте содержать размер А, потом Б, потом В и не иначе.



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

Обычно объекты — это строки, признаки — это столбцы матрицы данных.

Первая колонка матрицы данных часто содержит названия объектов, а первая строка — названия признаков.


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

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

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

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


Дополнительное чтение

Признаковое описание объекта на сайте machinelearning.ru.

«Матрица „объекты × признаки“ является стандартным и наиболее распространённым способом представления исходных данных в задачах классификации и регрессии. Подавляющее большинство методов обучения приспособлены к обработке именно таких данных. Однако на практике встречаются задачи, в которых данные устроены сложнее. [...] В таких случаях по имеющимся исходным данным вычисляются некоторые признаки, что позволяет привести данные к стандартному матричному виду. Этот прием называется извлечением признаков из данных (features extraction) или генерацией признаков (features generation).»

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



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

Написал скрипт для бинаризации видео движения микроорганизмов

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

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

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


Узнать больше и скачать скрипт.


Хорошие книги для изучающих R

Обновлено 24 ноя 2023.


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

Для доступа к некоторым книгам понадобится Ви-Пи-Эн.

Использование R

Advanced R. Второе издание.
The book is designed primarily for R users who want to improve their programming skills and understanding of the language. It should also be useful for programmers coming to R from other languages, as help you to understand why R works the way it does.

R for Data Science. Второе издание.
This book will teach you how to do data science with R: You’ll learn how to get your data into R, get it into the most useful structure, transform it and visualize.

Дендрограммы

Data Integration, Manipulation and Visualization of Phylogenetic Trees.
Рассказывает как строить дендрограммы и филогенетические деревья с помощью пакета ggtree. Есть глава, где говорится как прикрутить картинки к дендрограмме.

Статистическое моделирование

Tidy Modeling with R.
This book is a guide to using a collection of software in the R programming language for model building called tidymodels, and it has two main goals:

  • First and foremost, this book provides a practical introduction to how to use these specific R packages to create models. We focus on a dialect of R called the tidyverse that is designed with a consistent, human-centered philosophy, and demonstrate how the tidyverse and the tidymodels packages can be used to produce high quality statistical and machine learning models.
  • Second, this book will show you how to develop good methodology and statistical practices. Whenever possible, our software, documentation, and other materials attempt to prevent common pitfalls.

Визуализация

R Graphics Cookbook. Второе издание.
A practical guide that provides more than 150 recipes to help you generate high-quality graphs quickly, without having to comb through all the details of R’s graphing systems. Each recipe tackles a specific problem with a solution you can apply to your own project, and includes a discussion of how and why the recipe works.

ggplot2: Elegant Graphics for Data Analysis. Третье издание.
While this book gives some details on the basics of ggplot2, its primary focus is explaining the Grammar of Graphics that ggplot2 uses, and describing the full details. It is not a cookbook, and won’t necessarily help you create any specific graphic that you need. But it will help you understand the details of the underlying theory, giving you the power to tailor any plot specifically to your needs.

Статьи

«Кто за всех решил, что Python удобен для „гражданской“ аналитики?», — объясняет, почему R лучше Питона.

Провал первой попытки прослеживания путей перемещения протист

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


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

В первой заметке объяснил, как с помощью ffmpeg осветлить видео снятое на фотоаппарат, соединенный с микроскопом.

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

Напомню, что видео необходимо для построения траекторий движения микроорганизмов.




Для решения задачи использую Трекмейт (TrackMate).

Трекмейт — это плагин к Фи-джи (Fiji), который предназначен для прослеживания, визуализации, редактирования и анализа траекторий движения объектов, снятых на видео. Интерфейс Трекмейта состоит из последовательности диалоговых окон, в которых необходимо выбрать алгоритмы обработки видеоизображений и указать параметры этих алгоритмов.


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




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

Пробовал пороговую сегментацию (tresholding detector) и методы сегментации по инвариантным точкам (invariant feature detectors): LoG (Laplassian of Gaussian, Лапласиан Гаусиана :), DoG (differences of Gaussians, разница Гаусианов), Hessian (детектор Гессе).

Пороговая сегментация нашла всего один объект, а алгоритмы сегментации по инвариантным точкам приняли за объект каждое пятнышко.

Детектор Гессе приметил каждое пятнышко

Другие доступные методы сегментации не попробовал.




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

Однако их траектории проследить не удалось.

Трекинг построил слишком короткие пути и не все относятся к протистам.

Много коротких, частично некорректных треков — это провал




Cделал следующие выводы:

  1. Необходимо хотя бы в общих чертах понимать, как работают алгоритмы сегментации и трекинга, как на них влияют параметры и когда их стоит применять, а когда нет.
  2. Качество видеоизображений следует еще более улучшить: повысить контраст между подвижными организмами и статичным фоном, фон сгладить или вообще удалить.
  3. Желательно автоматически создать маску, на которой организмы будут отмечены цветом, а фон будет белым.
  4. Следует попробовать иные способы сегментации или другие программы выделения треков.

Об этом расскажу в другой раз.




Всем прочитавшим — Лаплассиана Гауссинана :)

Комбинируем кадры движения протист в многослойные тифы

В первой заметке рассказал, как улучшить качество видео и нарезать его на кадры.


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

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


В конце заметки приведена ссылка на скрипт, который преобразует mov в многослойные tif

Последовательность действий

Буду использовать ИмеджМаджик и батч-скрипт Виндоус. (Вместо последнего можно взять Поверскрипт, для Линукса — баш, но это вы уже сами :).

Скрипт разделяет тифы на группы: 1...100, 100...200, 200...300, ... и объединяет файлы из каждой группы в многослойный тиф.

Последний тиф группы совпадает с первым тифов седующей группы: 1...100≡100...200≡200... Так сделано для того, чтобы потом программа смогла правильно соединить кусочки траекторий, выделенные в группах, в целые траектории.

Инициализируем вспомогательные переменные

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

  • frame_0001.tif, frame_0002.tif, frame_0003.tiff, ...

Укажем в батч-скрипте название каталога, префикс тиф-файлов и префикс многослойных тифов.

rem Инициализируем вспомогательные переменные
:initialization
    set tif_file_prefix=frame_
    set group_file_prefix=merged_
    set tifs_dir=tifs

Посчитаем число тифов

Мы не знаем, сколько файлов у нас есть. Поэтому воспользуемся советом и напишем скрипт:

rem Считает число тифов в заданном каталоге
:calc-tifs-number
    cd %tifs_dir%
    dir *.tif /A:-D /B 2>nul | find /c /v "" > tmp
    set /p tifs_numb=<tmp
    set /a tifs_numb+=0
    del tmp
    cd ..

Скрипт переходит в каталог с тифами, записанном в переменной tifs_dir, считает число тифов и запоминает его в файле tmp, загружает значение из этого файла в переменную tifs_numb и удаляет tmp-файл.

Подсчет и сохранение числа в файл выполняет команда

dir *.tif /A:-D /B 2>nul | find /c /v "" > tmp

где опция

*.tif выбирает только тиф-файлы;
/A:-D убирает из подсчета каталоги и оставляет только файлы;
/B выводит только названия файлов;
2>nul не выводит строки с ошибками;
| передает полученный список файлов следующей команде;
find /c /v "" считает число строк в списке файлов;
> tmp запоминает полученное число в файл tmp.

Прочие команды скрипта очевидны.

Вычисляем количество групп файлов и число файлов в последней группе


set /a num_groups=1+(%tifs_numb%-1)/100
set /a numb_in_last_group=(%tifs_numb%)%%100

Объединяем тифы каждой группы в один многослойный тиф

В Имеджмаджик есть утилита convert, которая с ключом -adjoin объединяет тифы в один многослойный.

convert 0001.tif 0002.tif ... 100.tif -adjoin merged_1-100.tif
convert 0100.tif 0101.tif ... 200.tif -adjoin merged_100-200.tif
...

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

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

set /a file_index=0
set /a group_index=0

cd %tifs_dir%
    rem Пробегаем по каждой группе
    for /l %%G in (1,1,%num_groups%) do call :loop_groups %%G
cd ..

echo All tifs have been merged into multilayered tifs
pause

goto :eof

Цикл вызывает подпрограмму :loop_groups, где и происходит слияние. Подпрограмма принимает номер группы, вычисляет для нее номера первого и последнего файла, формирует список файлов с этими номерами и, в итоге, объединяет их в многослойный тиф.


:loop_groups

rem Определям начальный и конечный номер файла в группе
set /a start_index=group_index*100

if %1 EQU %num_groups% (
    rem Это последняя группа
    set /a finish_index=start_index+%numb_in_last_group%
) else (
    rem Это не последняя группа
    set /a finish_index=start_index+100
)

if %start_index% EQU 0 set /a start_index=1


rem Формируем список файлов.
rem Для этого перебираем номера файлов от start_index до finish_index
rem и конструируем название файла с каждым номером в пп loop_files
set file_list=
for /l %%H in (%start_index%,1,%finish_index%) do call :loop_files %%H


rem Задаем имя результирующего многослойного тифа
set merged_file=%group_file_prefix%_%start_index%-%finish_index%.tif


rem Конвертируем
convert %file_list% -adjoin %merged_file%


rem Переходим к следующей группе
set /a group_index=group_index+1

goto :eof

Сам список файлов поэлементно строится в подпрограмме :loop_files. Она принимает номер файла, дополняет его нулями, добавляет к нему префикс и помещает в конец списка (строки).

:loop_files
rem Добавляет ведущие нули к индексу файла
set "file_index=0000%1"
set "file_index=%file_index:~-4%"

rem Дополняет файл префиксом
set file_name=%tif_file_prefix%_%file_index%.tif

rem Добавляет название файла в конец списка
set "file_list=%file_list%%file_name% "
	
goto :eof

Итоговый скрипт

Готовый батч-скрипт пробразует mov в многослойные tiff.

Он использует код из двух заметок и:

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


Скачать скрипт mov-to-tifs

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


Для работы скрипта необходимо установить ImageMagick.


Вопросы, связанные с функционирование скрипта, задавайте в комментариях.

Улучшаем качество видео движения протист и нарезаем его на кадры

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



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

Темное низкоконтрастное видео

Поэтому интересующие нас простейшие незначительно отличаются от фона.

Кадр исходного видео

Если в графическом редакторе автоматически улучшить контраст, получится хорошо.

Автоматическое осветление

Если подправить гистограмму, тоже выйдет неплохо.

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

Очевидно, что использовать графический редактор для исправления всех кадров — нереально. Поэтому нагрузим работой компьютер: улучшим видео с помощью FFmpeg.

Улучшаем видео с помощью ffmpeg

Фотоаппарат записыват видео в формате mov (мув). FFmpeg осветлит его и покадрово сохранит в заданном каталоге.

Осветляем видео
Следующая команда читает исходный видеофайл input.mov и исправляет гистограмму каждого кадра так, чтобы черная точка сдвинулась до 64 (0,25~64/255), а белая — до 120 (0,47~120/255).

ffmpeg -i input.mov 
-vf "monochrome ,
     colorlevels=romin=0.25:rimax=0.47:gomin=0.25:gimax=0.47:bomin=0.25:bimax=0.47 ,
     smartblur=2.0:-0.7:-3.5:0.65:0.25:2.0"
output.avi

Опция -vf говорит, что мы применяем фильтры, влияющие на качество изображения.

  • Фильтр monochrome делает видео черно-белым.
  • Фильтр colorlevels выполняет коррекцию гистограммы. Его параметры:
    • r|g|b|omin задают уровень красной, зеленой и синей компоненты минимальной (черной) точки,
    • r|g|b|imax соответственно максимальной (белой);
    • значения компонент лежат в диапазоне [0; 1], что соответствует уровням [0; 255].
  • Фильтр smartblur немного шарпит границы — делает их более резкими.

Команда записывает результат в файл output.avi.

Чтобы фильтры обработали видео, выходной файл должен иметь иной формат, отличный от мув. В данном случае — это avi. Однако при конвертации в ави качество обработанного видео ухудшается. Поэтому поступим по иному.

Запишем каждый кадр обработанного видео в отдельный файл
Для этого заменим последнюю срочку команды на следующую:

-compression_algo lzw -pix_fmt rgb24 enhanced/frame_%04d.tif

Она сохранит каждый кадр обработанного видео в сжатом тиф-файле (-compression_algo lzw -pix_fmt rgb24) в каталоге enhanced. Тифы получат префикс frame_ и будут пронумерованы четырехзначным номером с ведущими нулями (%04d):

  • frame_0001.tif, frame_0002.tif, frame_0003.tif, ....

Вся команда выглядит так:

ffmpeg -i input.mov 
-vf "monochrome ,
     colorlevels=romin=0.25:rimax=0.47:gomin=0.25:gimax=0.47:bomin=0.25:bimax=0.47 ,
     smartblur=1.5:-0.35:-3.5:0.65:0.25:2.0"
-compression_algo lzw -pix_fmt rgb24 enhanced/frame_%04d.tif

Результат радует.

Осветленные кадры видео

Резюме

Чтобы осветлить видео и покадрово сохранить его в заданном каталоге, используйте приведенную команду ffmpeg.

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



На сегодня все.

Серия заметок об анализе траекторий движения протист


Последнее обновление 5 янв. 2024 года.

Планирую выпустить серию заметок про обработку видео с подвижными живыми микрообъектами. Мы хотим понять, как двигаются одноклеточные организмы (протисты) определенного вида при разных условиях, меняется ли что-то в их движении и что именно. Это наша задача.

Задача: определить, что меняется в движении протист при разных условиях

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


Оглавление серии

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


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


Немного о рутине

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


Необходимый софт

Для автоматизации рутины использую:

  • Пакетный файл Виндоус (батч-файл, bat-файл)
  • Баш (bash) Юникса для исполнения алгоритмов обработки видео и изображений;
  • FFmpeg для автоматической работы с видео;
  • ImageMagick для автоматической обработки изображений кадров;
  • Fiji для построения траекторий.
  • Эр для выделения объектов на кадрах и построения траекторий движения объектов.

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


Занесите заметку в закладки, чтобы не потерять.


Подписывайте масштабные отрезки

Держите строй. Правила поведения на ВДНХ. 2020 год

Изучим обозначения масштаба на рисунках и фотографиях микроводорослей, случайно выбранных из статей 1950-2020-х годов.

Увеличено в × раз

Когда автор четко понимал, какого размера будет иллюстрация после печати, под ней писали, во сколько раз увеличен тот или иной объект.

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

У каждого рисунка свое увеличение. Koppen, 1975

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

Сейчас подобный способ обозначения масштаба — моветон.

Масштаб 10 мкм

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

Длины отрезков подписаны рядом. Florin, 1957. ПДФ

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

Много масштабных отрезков, но все имеют одинаковую длину — 10 мкм. Sterrenburg, 1991

Удобство чтения рисунка от этого сильно пострадало.

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

У каждого рисунок свой отрезок и отдельная подпись в легенде. Benico et al., 2019

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

Легенда содержит шесть длин масштабных отрезков. Almeida et al., 2016
Здесь пять длин масштабов, но разобраться где-какая — очень сложно. Генкал и Ярушина, 2018

Не делайте так.

Пишите длину около масшабного отрезка

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

Поступайте также.

Выводы

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

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

Выровнять шеренги. Правила поведения на ВДНХ. 2020

Миникартинки Архипа

Архип — это билиотека опубликованных изображений диатомовых микроводорослей.


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

Сверху и снизу каждой миникартинки есть цветовые полосы и подписи.

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

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

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

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

Такие сомнительные определения найдены в статье Ryabushko et al. (2022) The epipsammon diatoms of Kruglaya Bay (the Black Sea). I. Centric, araphid and monoraphid.


3d-microalgae.org/arxip


Сделай сам

Повторное использование чужих приемов — это нормально

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

Когда у меня есть задача написать программу, я сажусь и пишу ее сам: продумываю алгоритм, интерфейс, пишу код, тестирую, правлю, опять тестирую и выпускаю релиз.

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

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

Депрессия. Из рецензии на книгу Домонкоса Сика «Социальные патологии современной цивилизации»

Рамон Касас. Юная декадентка. 1899.

Пишет Дмитрий Борисов.

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

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

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

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

Наконец, происходят телесные трансформации — превращение в «мертвое тело, существующее как объект». В этом случае человек теряет способность взаимообмена аффективными состояниями с другими. Речь об эмпатии, предполагающей эмоции, потенциально открытые для влияния со стороны других. [...] В депрессии же происходит принципиальное нарушение такой интертелесности, а именно — превращение живого тела, способного посредничать для себя и других, в мертвое, существующее как объект. Соответственно, и весь мир теряет свой «живой характер», становясь «мертвой материей».

Страдающий модерн. Дмитрий Борисов — о книге социолога Домонкоса Сика.

—-

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

Пародии на «Офелию» Джона Милле

Увидел где-то в коментах ВК, как один товарищ запостил фоточку с голыми девицами.

Фотограф Оксана Лещенко

Между прочим в 2020 году это фото стало победителем раздела «100 лучших фотографий обнаженных» фотопремии 35awards.

Но меня заинтересовало иное. Я понял, что где-то видел что-то похожее. Оказалось — это пародия на «Офелию» Джона Милле.

Джон Милле. «Офелия». 1851-1852.

И оказалось, что такие пародии делают часто и много.

Выдача Яндекса по фразе «утопленницы среди кувшинок».

Так что прав был Экклезиаст:

  • Что было, то и будет; и что делалось, то и будет делаться, и нет ничего нового под солнцем.

Главное: получается, что победительницей престижной премии стала фотография, изображающая утоплениц?!

Архип — библиотека опубликованных изображений диатомовых микроводорослей

Архип — это таксономическая информационная система, предназначенная для дистанционного взаимодействия с опубликованными изображениями диатомовых водорослей.

3d-microalgae.org/arxip

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

Работа с Архипом подразумевает просмотр и выбор фотографий, соответствующих заданному критерию. Это могут быть фотографии из выбранной статьи, или фотографии какого-то вида или представителей рода, или фотокопии таблиц с морфологическими признаками.

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

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

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

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

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

3d-microalgae.org/arxip

Архип рад всем таксономистам и систематикам, которые занимаются диатомовыми водорослями планктона и бентоса морей, рек, озер и океанов.

Система таксонов диатомовых микроводорослей в моих проектах

Панцирь диатомовой микроводоросли Pseudostaurosira cataractarum. Рис. 93, 94 из [Beauger et al., 2018]

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

На верхнем уровне находятся все диатомовые водоросли. Чтобы не путаться с высшими таксонами диатомовых, я считаю, что это просто отдельная безранговая группа микроорганизмов — Bacillariophyta.

На следующем уровне находятся два морфотаксона: центрические и пеннатные диатомовые: Centric и Pennate.

Они, в свою очередь, разделяются на морфотаксоны:

  • центрические однополюсные (Centic unipolar),
  • центрические двуполюсные (Centric bipolar),
  • пеннатные бесшовные (Pennate araphid),
  • пеннатные одношовные (Pennate monoraphid)
  • пеннатные двушовные (Pennate biraphid).

Роды диатомовых я отношу к одному из этих морфотаксонов. К родам отношу виды, вариететы и формы. Считаю, что вариететы и формы имеют ранг вида.

Получается следующая система:


  • Bacillariophyta
    • Centric
      • Centic unipolar
        • роды центрических однополюсных
      • Centric bipolar
        • роды центрических двуполюсных
  •  
    • Pennate
      • Pennate araphid
        • роды пеннатных бесшовных
      • Pennate monoraphid
        • роды пеннатных одношовных
      • Pennate biraphid
        • роды пеннатных двушовных

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

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

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

P. S. Впредь буду ссылаться на эту заметку в статьях, где потребуется объяснить используемую систему высших таксонов диатомовых микроводорослей.

РНФ высказал свою позицию относительно учета публикаций

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

Российский научный фонд в своей деятельности всегда оперировал публикациями в ведущих рецензируемых российских и зарубежных научных изданиях. Уровень издания определяется качеством рецензирования публикаций, которое должно признаваться научным сообществом. Руководствуясь государственными программными документами, РНФ использовал для оценки общепринятые индексы — базы данных „Сеть науки“ (Web of Science Core Collection) и „Скопус“ (Scopus), при этом учитывая не только количественные, но и качественные показатели. Такой подход в целом обеспечивал достаточно высокое качество конкурсного отбора заявок и экспертизы отчетов по проектам.

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

Экспертные советы РНФ придерживаются позиции, что накопленный опыт работы РНФ является хорошей основой для определения требований к периодическим научным изданиям, в которых должны быть размещены публикации. Даже сложившаяся ситуация, по мнению экспертных советов, не должна привести к снижению уровня представления результатов. Помимо общепринятых требований (периодичность, регулярность выпусков, наличие редколлегии, рецензирование материалов, содержание издания, следование стандартам оформления, индексация в одной или нескольких зарубежных библиографических базах и пр.) для соответствия требованиям РНФ научные издания, в которых представляются научные результаты, должны удовлетворять и следующему требованию — их уровень должен быть не ниже изданий, индексируемых в базах данных „Сеть науки“ (Web of Science Core Collection) и „Скопус“ (Scopus), а также Russian Science Citation Index (RSCI).

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

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

Оригинал на сайте РНФ

Ассоциативный массив в старых версиях Дельфи

В Королевстве Дельфи много лет назад Дмитрий Рябов предложил реализацию ассоциативных массивов.

«На практике часто возникает потребность сохранять и обрабатывать данные в массивах, осуществляя доступ к элементам не по индексу, а по ключу. Для этого используются ассоциативные массивы, которые есть, например, во многих скриптовых языках. В Delphi на уровне языка такая структура отсутствует. В качестве замены часто используются контейнерные классы TStringList, TParams и т. п., но они весьма неудобны в использовании и недостаточно функциональны. К тому же появляется необходимость заботиться об уничтожении экземпляра класса, что зачастую порождает лишние try..finally..end

В чем фишка реализации.

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

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


program Example;
{$APPTYPE CONSOLE}
uses
  Arrays;

procedure Main;
var
  I: IIntArray;
  S: IStrArray;
  V: IVarArray;
  M: IMltArray;

begin
  // создаём массив и получаем представление в целых числах
  I := CreateArray;

  // заполняем
  I['a'] := 5;
  I['b'] := 1;
  I['c'] := 4;
  I['d'] := 2;
  I['e'] := 3;

  // выводим
  WriteLn('Original array');
  I.First;
  while not I.Eof do
  begin
    WriteLn('[', I.CurrentKey, '] = ', I.CurrentValue);
    I.Next;
  end;

  // сортируем
  I.Sort;

  // наблюдаем результат
  WriteLn('Sorted array');
  I.First;
  while not I.Eof do
  begin
    WriteLn('[', I.CurrentKey, '] = ', I.CurrentValue);
    I.Next;
  end;

  // создаём строковое представление
  S := I.Instance;

  // наблюдаем результат
  WriteLn('Two views of one array');
  S.First;
  while not S.Eof do
  begin
    WriteLn('[', S.CurrentKey, '] + ''10'' = ', S.CurrentValue + '10');
    WriteLn('[', I.CurrentKey, '] + 10 = ', I.CurrentValue + 10);
    S.Next;
  end;

  // создаём вариантное представление
  V := S.Instance;
  V.Clear;
  V['integer'] := 10;
  V['string'] := '10';

  // наблюдаем результат
  WriteLn('Variant type conversion');
  V.First;
  while not V.Eof do
  begin
    WriteLn('[', V.CurrentKey, '] + 10 = ', V.CurrentValue + 10);
    WriteLn('[', V.CurrentKey, '] + ''10'' = ', V.CurrentValue + '10');
    V.Next;
  end;

  // используем ключи разных типов, но одного значения
  S.Clear;
  S[False] := 'boolean';
  S[0] := 'integer';
  S[0.0] := 'float';
  S['0'] := 'string';

  // наблюдаем результат
  WriteLn('Variant type keys ;)');
  S.First;
  while not S.Eof do
  begin
    WriteLn('[', S.CurrentKey, '] = ', S.CurrentValue);
    S.Next;
  end;

  // создаём ещё одно представление, на этот раз - многомерное
  M := V.Instance;
  M.Clear;

  // заполняем матрицу
  M['A']['a'].AsInteger := 1;
  M['A']['b'].AsInteger := 2;
  M['A']['c'].AsInteger := 3;
  M['B']['a'].AsInteger := 4;
  M['B']['b'].AsInteger := 5;
  M['B']['c'].AsInteger := 6;
  M['C']['a'].AsInteger := 7;
  M['C']['b'].AsInteger := 8;
  M['C']['c'].AsInteger := 9;

  // выводим матрицу
  WriteLn('Multidimensional array');
  M.First;
  while not M.Eof do
  begin
    M.CurrentValue.First;
    while not M.CurrentValue.Eof do
    begin
      WriteLn('[', M.CurrentKey, ',', M.CurrentValue.CurrentKey, '] = ',
        M.CurrentValue.CurrentValue.AsInteger);
      M.CurrentValue.Next;
    end;
    M.Next;
  end;

  // перед возвратом все созданные массивы автоматически удаляются
  WriteLn('Arrays is free');
end;

var
  L: Integer;
begin
  L := AllocMemSize;
  Main;
  // проверка утечки памяти
  WriteLn('Memory leak: ', AllocMemSize - L, ' bytes');
  ReadLn;
end.

Скачать исходники из Королевства

Посмотреть рекомендацию оссоциативного массива на Стакэксчендже .

Наблюдение 17. Корреляция, война и прививки

У меня создается впечатление, что есть хорошая положительная корреляция между людьми, которые (1) делают прививки, (2) призывают прекратить войну на Украине, (3) ругают Путина.

Примерно такая же, как между таксистами, которые жалуются на дорогой бензин и Путина, и не дают сдачу.

Есть повод задуматься.

Профиль в ВК

В ВК я публикую всяческие краткие заметки на разные темы или симпатичные кратинки, подсмотренные у прелестной Шакко.

Блогерши. На самом деле эта картина называется по другому, но я не помню как и, публикуя ее вот таким образом я нарушаю авторские права. А название «Блогерши» выбрано для иллюстрации этой заметки.

Если вы за мной регулярно скучаете, то вот

Мой профиль в ВК.

Давайте дружить.

Ранее Ctrl + ↓