Scene Change Detection (code, datasets, papers)
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +21 -0
- code/ChangeDet/ChangeDet.rar +3 -0
- code/ChangeDet/Описание.txt +1 -0
- code/ChangeNet/ChangeNet (arishin), enhanced fork.rar +3 -0
- code/ChangeNet/ChangeNet. Архитектура глубокого обучения для визуального обнаружения изменений.pdf +3 -0
- code/ChangeNet/ChangeNet.rar +3 -0
- code/ChangeNet/Описание.txt +1 -0
- code/ChangeSim/ChangeSim. К комплексному онлайн-обнаружению изменений сцены в промышленных помещениях.pdf +3 -0
- code/ChangeSim/Видео.txt +2 -0
- code/ChangeSim/Описание.txt +1 -0
- code/ChangeSim/Официальный сайт.txt +1 -0
- code/ChangeSim/Репозиторий.txt +1 -0
- code/DR-TANet/DR-TANet. Динамическая восприимчивая сеть временного внимания для обнаружения изменений уличной сцены.pdf +3 -0
- code/DR-TANet/DR-TANet.rar +3 -0
- code/DR-TANet/Описание.txt +1 -0
- code/DR-TANet/Форк с демо.txt +1 -0
- code/DSP (NeurAI Lab)/(на русском) Differencing based self-supervised pretraining for Scene Change Detection.mp4 +3 -0
- code/DSP (NeurAI Lab)/DSP.rar +3 -0
- code/DSP (NeurAI Lab)/Видео.txt +2 -0
- code/DSP (NeurAI Lab)/Датасеты.txt +4 -0
- code/DSP (NeurAI Lab)/Описание.txt +10 -0
- code/DSP (NeurAI Lab)/Самоконтролируемая предварительная подготовка на основе дифференциации для обнаружения изменений сцены.pdf +3 -0
- code/DSP (NeurAI Lab)/Схема.png +3 -0
- code/DetectSceneChange (Rust)/detect-scene-change.rar +3 -0
- code/DetectSceneChange (Rust)/Описание.txt +23 -0
- code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/ffmpeg-scripts.rar +3 -0
- code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/scene-cut.sh +117 -0
- code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/scene-detect.sh +171 -0
- code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/scene-images.sh +95 -0
- code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/scene-time.sh +125 -0
- code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/Руководство по детекту сцен.txt +8 -0
- code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/Руководство по установке ffmpeg скриптов.txt +1 -0
- code/PySceneDetect v0.6.2/Fast cut-scene detection and split video into parts.mp4 +3 -0
- code/PySceneDetect v0.6.2/PySceneDetect.rar +3 -0
- code/PySceneDetect v0.6.2/[GUI] SceneChangeDetector/SceneChangeDetector [ChuaN15].rar +3 -0
- code/PySceneDetect v0.6.2/[GUI] SceneChangeDetector/Описание.txt +3 -0
- code/PySceneDetect v0.6.2/Материалы.txt +2 -0
- code/PySceneDetect v0.6.2/Обнаружение и классификация видеосцен. PySceneDetect, Places365 и Mozilla DeepSpeech Engine.docx +3 -0
- code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/desktop.ini +2 -0
- code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/python-scene-detection-tutorial.rar +3 -0
- code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/Описание.txt +10 -0
- code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/Часть 1. Обнаружение порога_перехода в чёрный цвет.docx +3 -0
- code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/Часть 2. Адаптивное пороговое обнаружение.docx +3 -0
- code/PySceneDetect v0.6.2/Описание.txt +11 -0
- code/PySceneDetect v0.6.2/Повышение эффективности.docx +3 -0
- code/SSCDNet/sscdnet.rar +3 -0
- code/SSCDNet/Описание.txt +3 -0
- code/SSCDNet/Слабо контролируемое обнаружение семантических изменений сцены на основе силуэтов.pdf +3 -0
- code/SSCDNet/Схема.png +3 -0
- code/SceneChangeDet/SceneChangeDet.rar +3 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,24 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
code/ChangeNet/ChangeNet.[[:space:]]Архитектура[[:space:]]глубокого[[:space:]]обучения[[:space:]]для[[:space:]]визуального[[:space:]]обнаружения[[:space:]]изменений.pdf filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
code/ChangeSim/ChangeSim.[[:space:]]К[[:space:]]комплексному[[:space:]]онлайн-обнаружению[[:space:]]изменений[[:space:]]сцены[[:space:]]в[[:space:]]промышленных[[:space:]]помещениях.pdf filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
code/DR-TANet/DR-TANet.[[:space:]]Динамическая[[:space:]]восприимчивая[[:space:]]сеть[[:space:]]временного[[:space:]]внимания[[:space:]]для[[:space:]]обнаружения[[:space:]]изменений[[:space:]]уличной[[:space:]]сцены.pdf filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
code/DSP[[:space:]](NeurAI[[:space:]]Lab)/(на[[:space:]]русском)[[:space:]]Differencing[[:space:]]based[[:space:]]self-supervised[[:space:]]pretraining[[:space:]]for[[:space:]]Scene[[:space:]]Change[[:space:]]Detection.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
code/DSP[[:space:]](NeurAI[[:space:]]Lab)/Самоконтролируемая[[:space:]]предварительная[[:space:]]подготовка[[:space:]]на[[:space:]]основе[[:space:]]дифференциации[[:space:]]для[[:space:]]обнаружения[[:space:]]изменений[[:space:]]сцены.pdf filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
code/DSP[[:space:]](NeurAI[[:space:]]Lab)/Схема.png filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
code/PySceneDetect[[:space:]]v0.6.2/Обнаружение[[:space:]]и[[:space:]]классификация[[:space:]]видеосцен.[[:space:]]PySceneDetect,[[:space:]]Places365[[:space:]]и[[:space:]]Mozilla[[:space:]]DeepSpeech[[:space:]]Engine.docx filter=lfs diff=lfs merge=lfs -text
|
| 43 |
+
code/PySceneDetect[[:space:]]v0.6.2/Обнаружение[[:space:]]смены[[:space:]]сцен[[:space:]]на[[:space:]]Python[[:space:]]и[[:space:]]OpenCV/Часть[[:space:]]1.[[:space:]]Обнаружение[[:space:]]порога_перехода[[:space:]]в[[:space:]]чёрный[[:space:]]цвет.docx filter=lfs diff=lfs merge=lfs -text
|
| 44 |
+
code/PySceneDetect[[:space:]]v0.6.2/Обнаружение[[:space:]]смены[[:space:]]сцен[[:space:]]на[[:space:]]Python[[:space:]]и[[:space:]]OpenCV/Часть[[:space:]]2.[[:space:]]Адаптивное[[:space:]]пороговое[[:space:]]обнаружение.docx filter=lfs diff=lfs merge=lfs -text
|
| 45 |
+
code/PySceneDetect[[:space:]]v0.6.2/Повышение[[:space:]]эффективности.docx filter=lfs diff=lfs merge=lfs -text
|
| 46 |
+
code/PySceneDetect[[:space:]]v0.6.2/Fast[[:space:]]cut-scene[[:space:]]detection[[:space:]]and[[:space:]]split[[:space:]]video[[:space:]]into[[:space:]]parts.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 47 |
+
code/SceneChangeDet/Учимся[[:space:]]измерять[[:space:]]изменения.[[:space:]]Полностью[[:space:]]свёрточные[[:space:]]сиамские[[:space:]]метрические[[:space:]]сети[[:space:]]для[[:space:]]обнаружения[[:space:]]изменений[[:space:]]сцены.pdf filter=lfs diff=lfs merge=lfs -text
|
| 48 |
+
code/SceneChangeDetection[[:space:]]\[neelarya19\]/Отчёт[[:space:]]по[[:space:]]инновационному[[:space:]]проекту.[[:space:]]EC412[[:space:]]Машинное[[:space:]]обучение.[[:space:]]Scene[[:space:]]change[[:space:]]detection.pdf filter=lfs diff=lfs merge=lfs -text
|
| 49 |
+
code/SSCDNet/Слабо[[:space:]]контролируемое[[:space:]]обнаружение[[:space:]]семантических[[:space:]]изменений[[:space:]]сцены[[:space:]]на[[:space:]]основе[[:space:]]силуэтов.pdf filter=lfs diff=lfs merge=lfs -text
|
| 50 |
+
code/SSCDNet/Схема.png filter=lfs diff=lfs merge=lfs -text
|
| 51 |
+
code/VideoSceneInventory/(на[[:space:]]русском)[[:space:]]демо[[:space:]]видео.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 52 |
+
datasets/Пример[[:space:]]SCD[[:space:]]из[[:space:]]набора[[:space:]]данных[[:space:]]ChangeSim.gif filter=lfs diff=lfs merge=lfs -text
|
| 53 |
+
papers/Быстрое[[:space:]]обнаружение[[:space:]]изменения[[:space:]]сцены[[:space:]]для[[:space:]]персонального[[:space:]]видеорегистратора.pdf filter=lfs diff=lfs merge=lfs -text
|
| 54 |
+
papers/Обнаружение[[:space:]]изменений[[:space:]]сцены[[:space:]]в[[:space:]]аудиовизуальном[[:space:]]контенте.docx filter=lfs diff=lfs merge=lfs -text
|
| 55 |
+
papers/Эффективные[[:space:]]подходы[[:space:]]к[[:space:]]обнаружению[[:space:]]смены[[:space:]]сцен[[:space:]]на[[:space:]]видео.pdf filter=lfs diff=lfs merge=lfs -text
|
| 56 |
+
papers/Эффективный[[:space:]]и[[:space:]]быстрый[[:space:]]алгоритм[[:space:]]обнаружения[[:space:]]изменения[[:space:]]сцены[[:space:]]для[[:space:]]видео,[[:space:]]сжатых[[:space:]]в[[:space:]]формате[[:space:]]MPEG.pdf filter=lfs diff=lfs merge=lfs -text
|
code/ChangeDet/ChangeDet.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b3a0ba317c99d04f4df941ebac7d1ea2381836c808310c09b8f09f0c37089ef5
|
| 3 |
+
size 117143
|
code/ChangeDet/Описание.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Обнаружение изменения сцены (SCD) в масштабе города с использованием облаков точек [point clouds].
|
code/ChangeNet/ChangeNet (arishin), enhanced fork.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:bdd6a9fa3eec93959c46b67ac847d5c7457722aa6dd34e3e221bb62b1076a7ea
|
| 3 |
+
size 10332520
|
code/ChangeNet/ChangeNet. Архитектура глубокого обучения для визуального обнаружения изменений.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0f8e298c273aefdc545bf37a6d6f2d17193db44783e9d3a6559464ef7d443873
|
| 3 |
+
size 3030983
|
code/ChangeNet/ChangeNet.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:349f2ed6d576a8ad4a99ea5b53027f7c4f151fde79e409c0b0bc0cc0d5064d8b
|
| 3 |
+
size 10312208
|
code/ChangeNet/Описание.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Код для научной статьи о ChangeNet (https://openaccess.thecvf.com/content_ECCVW_2018/papers/11130/Varghese_ChangeNet_A_Deep_Learning_Architecture_for_Visual_Change_Detection_ECCVW_2018_paper.pdf).
|
code/ChangeSim/ChangeSim. К комплексному онлайн-обнаружению изменений сцены в промышленных помещениях.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:eff32ca7fda6d1924228300668301ee7ff8862ccc0c1dcf8ba55693f297312aa
|
| 3 |
+
size 17338755
|
code/ChangeSim/Видео.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
ChangeSim: к комплексному онлайн-обнаружению изменений сцены в промышленных помещениях
|
| 2 |
+
https://www.youtube.com/watch?v=3zMMWg40WZY
|
code/ChangeSim/Описание.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Мультимодальный фотореалистичный набор данных для сквозного онлайн-обнаружения изменений и многого другого (принято в IROS2021).
|
code/ChangeSim/Официальный сайт.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
https://sammica.github.io/ChangeSim
|
code/ChangeSim/Репозиторий.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
https://github.com/SAMMiCA/ChangeSim
|
code/DR-TANet/DR-TANet. Динамическая восприимчивая сеть временного внимания для обнаружения изменений уличной сцены.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9afff51aa9b2f40d209eebd23dc728498f800c6b0a502cb2cd490004a656d87e
|
| 3 |
+
size 3938101
|
code/DR-TANet/DR-TANet.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:609cf6f5b573c01b7939c01d8860f34f1bd00aa0d099e789f2298ae6bd20604c
|
| 3 |
+
size 329257
|
code/DR-TANet/Описание.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Это официальная реализация TANet и DR-TANet в «DR-TANet: динамическая восприимчивая сеть временного внимания для обнаружения изменений уличной сцены» (IEEE IV 2021).
|
code/DR-TANet/Форк с демо.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
https://github.com/YvonneChika/DR-TANet
|
code/DSP (NeurAI Lab)/(на русском) Differencing based self-supervised pretraining for Scene Change Detection.mp4
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:962f3840d057c58f4aac1476e23fb9ca2f8c3c236e27e036476c770ac60db26f
|
| 3 |
+
size 14648291
|
code/DSP (NeurAI Lab)/DSP.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:11126d5f14cea385703631a824705764856e6321a0b04d9b4d9dc7d753b03c0d
|
| 3 |
+
size 1273642
|
code/DSP (NeurAI Lab)/Видео.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Differencing based Self-supervised pretraining for Scene Change Detection-CoLLAs 2022
|
| 2 |
+
https://youtube.com/watch?v=53YVk9Lsa5A
|
code/DSP (NeurAI Lab)/Датасеты.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Наша сеть тестируется на двух наборах данных для обнаружения изменения сцены при просмотре улиц:
|
| 2 |
+
> Набор данных PCD из обнаружения изменений на основе пары изображений улиц с использованием функций CNN и сегментации суперпикселей (http://www.vision.is.tohoku.ac.jp/files/9814/3947/4830/71-Sakurada-BMVC15.pdf).
|
| 3 |
+
Информацию о том, как получить «TSUNAMI», «GSV» и предварительно обработанные наборы данных для обучения и тестирования, вы можете найти здесь: https://kensakurada.github.io/pcd_dataset.html
|
| 4 |
+
> Набор данных VL-CMU-CD из функции обнаружения изменений Street-View с помощью деконволюционных сетей (http://www.robesafe.com/personal/roberto.arroyo/docs/Alcantarilla16rss.pdf)
|
code/DSP (NeurAI Lab)/Описание.txt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Предварительное обучение с самоконтролем на основе дифференциации для обнаружения изменения сцены (DSP)
|
| 2 |
+
|
| 3 |
+
Это официальный код статьи COLLA 2022 «Самоконтролируемое предварительное обучение на основе дифференциации для обнаружения изменения сцены» (V.R.T.Ramkumar, E.Arani, B.Zonooz), в которой мы предлагаем новую архитектуру предварительной подготовки с самоконтролем, основанную на различении, называемую DSP для обнаружение изменения сцены.
|
| 4 |
+
|
| 5 |
+
* * *
|
| 6 |
+
|
| 7 |
+
Обнаружение изменения сцены (SCD), важнейшая задача восприятия, определяет изменения путем сравнения сцен, снятых в разное время. SCD представляет собой сложную задачу из-за шумных изменений освещенности, сезонных колебаний и различий в перспективе на разных ракурсах. Решения на основе глубоких нейронных сетей требуют большого количества аннотированных данных, получение которых утомительно и дорого. С другой стороны, перенос обучения на основе больших наборов данных вызывает сдвиг предметной области. Чтобы решить эти проблемы, мы предлагаем новый метод предварительного обучения с самоконтролем (DSP), который использует дифференцирование признаков для изучения дискриминационных представлений, соответствующих измененным областям, одновременно устраняя шумные изменения, обеспечивая временную инвариантность между представлениями. Наши экспериментальные результаты на наборах данных SCD демонстрируют эффективность нашего метода, особенно в отношении различий в точках обзора камеры и условиях освещения. По сравнению с самоконтролируемыми близнецами Барлоу и стандартным предварительным обучением ImageNet, которое использует более миллиона дополнительных помеченных изображений, DSP может превзойти его без использования каких-либо дополнительных данных. Наши результаты также демонстрируют устойчивость DSP к естественным искажениям, смещению распределения и обучению в условиях ограниченных размеченных данных.
|
| 8 |
+
|
| 9 |
+
----------------------------------------------------------
|
| 10 |
+
https://proceedings.mlr.press/v199/ramkumar22a.html
|
code/DSP (NeurAI Lab)/Самоконтролируемая предварительная подготовка на основе дифференциации для обнаружения изменений сцены.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:77515306a8d86d1c6ab7f58f1168ff50fa0849eeba3179534d4d9b049626009f
|
| 3 |
+
size 5937112
|
code/DSP (NeurAI Lab)/Схема.png
ADDED
|
Git LFS Details
|
code/DetectSceneChange (Rust)/detect-scene-change.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:679dadc4d138a4361cae3e23c5985d57ba4b8c4f835af4640c3d616e036ae0e7
|
| 3 |
+
size 24266
|
code/DetectSceneChange (Rust)/Описание.txt
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Обнаружение таймстемпов всех изменений сцены в видео.
|
| 2 |
+
|
| 3 |
+
Как использовать:
|
| 4 |
+
cargo run <video> <threshold [0-1]>
|
| 5 |
+
|
| 6 |
+
Пример:
|
| 7 |
+
$ cargo run foo.mp4 0.03
|
| 8 |
+
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
|
| 9 |
+
Running `target/debug/detect_scene_change foo.mp4 0.03`
|
| 10 |
+
diff time frame
|
| 11 |
+
---- 0.00 1/719
|
| 12 |
+
0.063 3.03 73/719
|
| 13 |
+
0.038 5.55 133/719
|
| 14 |
+
0.079 9.37 224/719
|
| 15 |
+
0.372 15.38 367/719
|
| 16 |
+
0.120 15.80 377/719
|
| 17 |
+
0.256 16.22 387/719
|
| 18 |
+
0.041 20.29 484/719
|
| 19 |
+
0.198 23.44 559/719
|
| 20 |
+
0.072 25.21 601/719
|
| 21 |
+
0.188 28.23 673/719
|
| 22 |
+
---- 30.17 719/719
|
| 23 |
+
$
|
code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/ffmpeg-scripts.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:21a4a030380bb476d43767586ab96747a9cd6bd97725a756177225a8ca1fada1
|
| 3 |
+
size 352817
|
code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/scene-cut.sh
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
|
| 3 |
+
#===============================================================================
|
| 4 |
+
# scene-cut
|
| 5 |
+
# ffmpeg scene cut
|
| 6 |
+
#===============================================================================
|
| 7 |
+
|
| 8 |
+
# dependencies:
|
| 9 |
+
# ffmpeg
|
| 10 |
+
|
| 11 |
+
#===============================================================================
|
| 12 |
+
# script usage
|
| 13 |
+
#===============================================================================
|
| 14 |
+
|
| 15 |
+
usage () {
|
| 16 |
+
# if argument passed to function echo it
|
| 17 |
+
[ -z "${1}" ] || echo "! ${1}"
|
| 18 |
+
# display help
|
| 19 |
+
echo "\
|
| 20 |
+
$(basename "$0") -i input -c cutfile
|
| 21 |
+
|
| 22 |
+
-i input.(mp4|mov|mkv|m4v)
|
| 23 |
+
-c cutfile"
|
| 24 |
+
exit 2
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
#===============================================================================
|
| 29 |
+
# error messages
|
| 30 |
+
#===============================================================================
|
| 31 |
+
|
| 32 |
+
INVALID_OPT_ERR='Invalid option:'
|
| 33 |
+
REQ_ARG_ERR='requires an argument'
|
| 34 |
+
WRONG_ARGS_ERR='wrong number of arguments passed to script'
|
| 35 |
+
|
| 36 |
+
#===============================================================================
|
| 37 |
+
# check the number of arguments passed to the script
|
| 38 |
+
#===============================================================================
|
| 39 |
+
|
| 40 |
+
[ $# -gt 0 ] || usage "${WRONG_ARGS_ERR}"
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
#===============================================================================
|
| 44 |
+
# getopts check the options passed to the script
|
| 45 |
+
#===============================================================================
|
| 46 |
+
|
| 47 |
+
while getopts ':i:c:h' opt
|
| 48 |
+
do
|
| 49 |
+
case ${opt} in
|
| 50 |
+
i) input="${OPTARG}";;
|
| 51 |
+
c) cutfile="${OPTARG}";;
|
| 52 |
+
h) usage;;
|
| 53 |
+
\?) usage "${INVALID_OPT_ERR} ${OPTARG}" 1>&2;;
|
| 54 |
+
:) usage "${INVALID_OPT_ERR} ${OPTARG} ${REQ_ARG_ERR}" 1>&2;;
|
| 55 |
+
esac
|
| 56 |
+
done
|
| 57 |
+
shift $((OPTIND-1))
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
#===============================================================================
|
| 61 |
+
# variables
|
| 62 |
+
#===============================================================================
|
| 63 |
+
|
| 64 |
+
# get the input file name
|
| 65 |
+
input_nopath="${input##*/}"
|
| 66 |
+
input_name="${input_nopath%.*}"
|
| 67 |
+
|
| 68 |
+
#===============================================================================
|
| 69 |
+
# ffmpeg create clips - nostdin needed to avoid clash with read command
|
| 70 |
+
#===============================================================================
|
| 71 |
+
|
| 72 |
+
trim_video () {
|
| 73 |
+
# awk convert start and end time from sexagesimal time to seconds
|
| 74 |
+
# add the start and end time to get the endpoint and convert from seconds back to sexagesimal time
|
| 75 |
+
endtime=$(printf "%s %s\n" "${start}" "${duration}" \
|
| 76 |
+
| awk '
|
| 77 |
+
{
|
| 78 |
+
start = $1
|
| 79 |
+
end = $2
|
| 80 |
+
if (start ~ /:/) {
|
| 81 |
+
split(start, t, ":")
|
| 82 |
+
sseconds = (t[1] * 3600) + (t[2] * 60) + t[3]
|
| 83 |
+
}
|
| 84 |
+
if (end ~ /:/) {
|
| 85 |
+
split(end, t, ":")
|
| 86 |
+
eseconds = (t[1] * 3600) + (t[2] * 60) + t[3]
|
| 87 |
+
}
|
| 88 |
+
duration = eseconds + sseconds
|
| 89 |
+
printf("%s\n"), duration
|
| 90 |
+
}' \
|
| 91 |
+
| awk -F. 'NF==1 { printf("%02d:%02d:%02d\n"), ($1 / 3600), ($1 % 3600 / 60), ($1 % 60) }\
|
| 92 |
+
NF==2 { printf("%02d:%02d:%02d.%s\n"), ($1 / 3600), ($1 % 3600 / 60), ($1 % 60), ($2) }'
|
| 93 |
+
)
|
| 94 |
+
output="${input_name}-[${start}-${endtime}].mp4"
|
| 95 |
+
ffmpeg \
|
| 96 |
+
-nostdin \
|
| 97 |
+
-hide_banner \
|
| 98 |
+
-stats -v panic \
|
| 99 |
+
-ss "${start}" \
|
| 100 |
+
-i "${input}" \
|
| 101 |
+
-t "${duration}" \
|
| 102 |
+
-c:a aac \
|
| 103 |
+
-c:v libx264 -profile:v high \
|
| 104 |
+
-pix_fmt yuv420p -movflags +faststart \
|
| 105 |
+
-f mp4 \
|
| 106 |
+
"${output}"
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
#===============================================================================
|
| 111 |
+
# read file and set IFS=, read = input before , duration = input after ,
|
| 112 |
+
#===============================================================================
|
| 113 |
+
|
| 114 |
+
count=1
|
| 115 |
+
while IFS=, read -r start duration; do
|
| 116 |
+
trim_video
|
| 117 |
+
done < "${cutfile}"
|
code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/scene-detect.sh
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
|
| 3 |
+
#===============================================================================
|
| 4 |
+
# scene-detect
|
| 5 |
+
# ffmpeg scene detection
|
| 6 |
+
#===============================================================================
|
| 7 |
+
|
| 8 |
+
# dependencies:
|
| 9 |
+
# ffmpeg ffprobe awk
|
| 10 |
+
|
| 11 |
+
#===============================================================================
|
| 12 |
+
# script usage
|
| 13 |
+
#===============================================================================
|
| 14 |
+
|
| 15 |
+
usage () {
|
| 16 |
+
# if argument passed to function echo it
|
| 17 |
+
[ -z "${1}" ] || echo "! ${1}"
|
| 18 |
+
# display help
|
| 19 |
+
echo "\
|
| 20 |
+
$(basename "$0") -s 00:00:00 -i input -e 00:00:00 -t (0.1 - 0.9) -f sec -o output
|
| 21 |
+
|
| 22 |
+
-s 00:00:00 : start time
|
| 23 |
+
-i input.(mp4|mov|mkv|m4v)
|
| 24 |
+
-e 00:00:00 : end time
|
| 25 |
+
-t (0.1 - 0.9) # threshold
|
| 26 |
+
-f sec # output in seconds
|
| 27 |
+
-o output.txt"
|
| 28 |
+
exit 2
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
#===============================================================================
|
| 33 |
+
# error messages
|
| 34 |
+
#===============================================================================
|
| 35 |
+
|
| 36 |
+
INVALID_OPT_ERR='Invalid option:'
|
| 37 |
+
REQ_ARG_ERR='requires an argument'
|
| 38 |
+
WRONG_ARGS_ERR='wrong number of arguments passed to script'
|
| 39 |
+
NOT_MEDIA_FILE_ERR='is not a media file'
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
#===============================================================================
|
| 43 |
+
# check the number of arguments passed to the script
|
| 44 |
+
#===============================================================================
|
| 45 |
+
|
| 46 |
+
[ $# -gt 0 ] || usage "${WRONG_ARGS_ERR}"
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
#===============================================================================
|
| 50 |
+
# getopts check the options passed to the script
|
| 51 |
+
#===============================================================================
|
| 52 |
+
|
| 53 |
+
while getopts ':s:i:e:t:o:f:h' opt
|
| 54 |
+
do
|
| 55 |
+
case ${opt} in
|
| 56 |
+
s) start="${OPTARG}";;
|
| 57 |
+
i) input="${OPTARG}";;
|
| 58 |
+
e) end="${OPTARG}";;
|
| 59 |
+
t) threshold="${OPTARG}";;
|
| 60 |
+
o) output="${OPTARG}";;
|
| 61 |
+
f) format="${OPTARG}";;
|
| 62 |
+
h) usage;;
|
| 63 |
+
\?) usage "${INVALID_OPT_ERR} ${OPTARG}" 1>&2;;
|
| 64 |
+
:) usage "${INVALID_OPT_ERR} ${OPTARG} ${REQ_ARG_ERR}" 1>&2;;
|
| 65 |
+
esac
|
| 66 |
+
done
|
| 67 |
+
shift $((OPTIND-1))
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
#===============================================================================
|
| 71 |
+
# variables
|
| 72 |
+
#===============================================================================
|
| 73 |
+
|
| 74 |
+
# get the input file name
|
| 75 |
+
input_nopath="${input##*/}"
|
| 76 |
+
input_name="${input_nopath%.*}"
|
| 77 |
+
|
| 78 |
+
# output file name
|
| 79 |
+
output_default="${input_name}-detection-$(date +"%Y-%m-%d-%H-%M-%S").txt"
|
| 80 |
+
|
| 81 |
+
# threshold default
|
| 82 |
+
threshold_default='0.3'
|
| 83 |
+
|
| 84 |
+
# start default
|
| 85 |
+
start_default='0.0'
|
| 86 |
+
|
| 87 |
+
|
| 88 |
+
#===============================================================================
|
| 89 |
+
# ffprobe video duration
|
| 90 |
+
#===============================================================================
|
| 91 |
+
|
| 92 |
+
ffduration () {
|
| 93 |
+
# video duration to append to cutfile
|
| 94 |
+
duration_default=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "${input}")
|
| 95 |
+
|
| 96 |
+
# if video duration is empty exit
|
| 97 |
+
[ -n "${duration_default}" ] || usage "${input} ${NOT_MEDIA_FILE_ERR}"
|
| 98 |
+
}
|
| 99 |
+
|
| 100 |
+
|
| 101 |
+
#===============================================================================
|
| 102 |
+
# convert time input to seconds
|
| 103 |
+
#===============================================================================
|
| 104 |
+
|
| 105 |
+
checktime () {
|
| 106 |
+
start=$(echo "${start}" | awk -F: 'NF==3 { print ($1 * 3600) + ($2 * 60) + $3 } NF==2 { print ($1 * 60) + $2 } NF==1 { print 0 + $1 }')
|
| 107 |
+
end=$(echo "${end}" | awk -F: 'NF==3 { print ($1 * 3600) + ($2 * 60) + $3 } NF==2 { print ($1 * 60) + $2 } NF==1 { print 0 + $1 }')
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
#===============================================================================
|
| 112 |
+
# ffmpeg scene detection
|
| 113 |
+
#===============================================================================
|
| 114 |
+
|
| 115 |
+
# scene detection
|
| 116 |
+
ffdetection () {
|
| 117 |
+
detection="$(ffmpeg -hide_banner -i "${input}" -filter_complex "select='gt(scene,"${threshold:=${threshold_default}}")',metadata=print:file=-" -f null -)"
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
# scene detection range
|
| 121 |
+
ffdetection_range () {
|
| 122 |
+
detection="$(ffmpeg -hide_banner -i "${input}" \
|
| 123 |
+
-filter_complex "[0:0]select='between(t\,"${start}"\,"${end}")'[time];\
|
| 124 |
+
[time]select='gt(scene,"${threshold:=${threshold_default}}")',metadata=print:file=-[out]" -map "[out]" -f null -)"
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
#===============================================================================
|
| 129 |
+
# create cutfile - prepend start and append end or duration
|
| 130 |
+
#===============================================================================
|
| 131 |
+
|
| 132 |
+
cutfile_seconds () {
|
| 133 |
+
echo "${detection}" \
|
| 134 |
+
| awk -F':' 'BEGIN { printf("%s\n", '"${start:=${start_default}}"') }/pts_time/ { printf("%s\n", $4) } END { printf("%s\n", '"${end:=${duration_default}}"') }' > "${output:=${output_default}}"
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
cutfile_minutes () {
|
| 138 |
+
echo "${detection}" \
|
| 139 |
+
| awk -F':' 'BEGIN { printf("%s\n", '"${start:=${start_default}}"') }/pts_time/ { printf("%s\n", $4) } END { printf("%s\n", '"${end:=${duration_default}}"') }' | awk -F. 'NF==1 { printf("%02d:%02d:%02d\n"), ($1 / 3600), ($1 % 3600 / 60), ($1 % 60) }\
|
| 140 |
+
NF==2 { printf("%02d:%02d:%02d.%s\n"), ($1 / 3600), ($1 % 3600 / 60), ($1 % 60), ($2) }' \
|
| 141 |
+
> "${output:=${output_default}}"
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
|
| 145 |
+
#===============================================================================
|
| 146 |
+
# run function
|
| 147 |
+
#===============================================================================
|
| 148 |
+
|
| 149 |
+
if [ -n "${start}" ] && [ -n "${end}" ]; then
|
| 150 |
+
# scene detect range in video
|
| 151 |
+
checktime
|
| 152 |
+
ffdetection_range
|
| 153 |
+
if [ -n "${format}" ]; then
|
| 154 |
+
cutfile_seconds
|
| 155 |
+
else
|
| 156 |
+
cutfile_minutes
|
| 157 |
+
fi
|
| 158 |
+
elif [ -n "${start}" ]; then
|
| 159 |
+
usage "${start} ${WRONG_ARGS_ERR}"
|
| 160 |
+
elif [ -n "${end}" ]; then
|
| 161 |
+
usage "${end} ${WRONG_ARGS_ERR}"
|
| 162 |
+
else
|
| 163 |
+
# scene detect entire video
|
| 164 |
+
ffduration
|
| 165 |
+
ffdetection
|
| 166 |
+
if [ -n "${format}" ]; then
|
| 167 |
+
cutfile_seconds
|
| 168 |
+
else
|
| 169 |
+
cutfile_minutes
|
| 170 |
+
fi
|
| 171 |
+
fi
|
code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/scene-images.sh
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
|
| 3 |
+
#===============================================================================
|
| 4 |
+
# scene-images
|
| 5 |
+
# ffmpeg scene thumbnails
|
| 6 |
+
#===============================================================================
|
| 7 |
+
|
| 8 |
+
# dependencies:
|
| 9 |
+
# ffmpeg
|
| 10 |
+
|
| 11 |
+
#===============================================================================
|
| 12 |
+
# script usage
|
| 13 |
+
#===============================================================================
|
| 14 |
+
|
| 15 |
+
usage () {
|
| 16 |
+
# if argument passed to function echo it
|
| 17 |
+
[ -z "${1}" ] || echo "! ${1}"
|
| 18 |
+
# display help
|
| 19 |
+
echo "\
|
| 20 |
+
$(basename "$0") -i input -c cutfile
|
| 21 |
+
|
| 22 |
+
-i input.(mp4|mov|mkv|m4v)
|
| 23 |
+
-c cutfile"
|
| 24 |
+
exit 2
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
#===============================================================================
|
| 29 |
+
# error messages
|
| 30 |
+
#===============================================================================
|
| 31 |
+
|
| 32 |
+
INVALID_OPT_ERR='Invalid option:'
|
| 33 |
+
REQ_ARG_ERR='requires an argument'
|
| 34 |
+
WRONG_ARGS_ERR='wrong number of arguments passed to script'
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
#===============================================================================
|
| 38 |
+
# check the number of arguments passed to the script
|
| 39 |
+
#===============================================================================
|
| 40 |
+
|
| 41 |
+
[ $# -gt 0 ] || usage "${WRONG_ARGS_ERR}"
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
#===============================================================================
|
| 45 |
+
# getopts check the options passed to the script
|
| 46 |
+
#===============================================================================
|
| 47 |
+
|
| 48 |
+
while getopts ':i:c:h' opt
|
| 49 |
+
do
|
| 50 |
+
case ${opt} in
|
| 51 |
+
i) input="${OPTARG}";;
|
| 52 |
+
c) cutfile="${OPTARG}";;
|
| 53 |
+
h) usage;;
|
| 54 |
+
\?) usage "${INVALID_OPT_ERR} ${OPTARG}" 1>&2;;
|
| 55 |
+
:) usage "${INVALID_OPT_ERR} ${OPTARG} ${REQ_ARG_ERR}" 1>&2;;
|
| 56 |
+
esac
|
| 57 |
+
done
|
| 58 |
+
shift $((OPTIND-1))
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
#===============================================================================
|
| 62 |
+
# variables
|
| 63 |
+
#===============================================================================
|
| 64 |
+
|
| 65 |
+
# get the input file name
|
| 66 |
+
input_nopath="${input##*/}"
|
| 67 |
+
input_name="${input_nopath%.*}"
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
#===============================================================================
|
| 71 |
+
# ffmpeg extract image
|
| 72 |
+
#===============================================================================
|
| 73 |
+
|
| 74 |
+
extract () {
|
| 75 |
+
output="${input_name}-[${seconds}].png"
|
| 76 |
+
ffmpeg \
|
| 77 |
+
-nostdin \
|
| 78 |
+
-hide_banner \
|
| 79 |
+
-stats -v panic \
|
| 80 |
+
-ss "${seconds}" \
|
| 81 |
+
-i "${input}" \
|
| 82 |
+
-q:v 2 -f image2 \
|
| 83 |
+
-vframes 1 \
|
| 84 |
+
"${output}"
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
|
| 88 |
+
#===============================================================================
|
| 89 |
+
# read file and run ffmpeg
|
| 90 |
+
#===============================================================================
|
| 91 |
+
|
| 92 |
+
count=1
|
| 93 |
+
while IFS= read -r seconds; do
|
| 94 |
+
extract
|
| 95 |
+
done < "${cutfile}"
|
code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/scene-time.sh
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/sh
|
| 2 |
+
|
| 3 |
+
#===============================================================================
|
| 4 |
+
# scene-time
|
| 5 |
+
# create ffmpeg cutlist
|
| 6 |
+
#===============================================================================
|
| 7 |
+
|
| 8 |
+
# dependencies:
|
| 9 |
+
# ffmpeg awk head grep
|
| 10 |
+
|
| 11 |
+
#===============================================================================
|
| 12 |
+
# script usage
|
| 13 |
+
#===============================================================================
|
| 14 |
+
|
| 15 |
+
usage () {
|
| 16 |
+
# if argument passed to function echo it
|
| 17 |
+
[ -z "${1}" ] || echo "! ${1}"
|
| 18 |
+
# display help
|
| 19 |
+
echo "\
|
| 20 |
+
$(basename "$0") -i input -o output
|
| 21 |
+
|
| 22 |
+
-i input
|
| 23 |
+
-o output"
|
| 24 |
+
exit 2
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
#===============================================================================
|
| 29 |
+
# error messages
|
| 30 |
+
#===============================================================================
|
| 31 |
+
|
| 32 |
+
INVALID_OPT_ERR='Invalid option:'
|
| 33 |
+
REQ_ARG_ERR='requires an argument'
|
| 34 |
+
WRONG_ARGS_ERR='wrong number of arguments passed to script'
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
#===============================================================================
|
| 38 |
+
# check the number of arguments passed to the script
|
| 39 |
+
#===============================================================================
|
| 40 |
+
|
| 41 |
+
[ $# -gt 0 ] || usage "${WRONG_ARGS_ERR}"
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
#===============================================================================
|
| 45 |
+
# getopts check the options passed to the script
|
| 46 |
+
#===============================================================================
|
| 47 |
+
|
| 48 |
+
while getopts ':i:o:h' opt
|
| 49 |
+
do
|
| 50 |
+
case ${opt} in
|
| 51 |
+
i) input="${OPTARG}";;
|
| 52 |
+
h) usage;;
|
| 53 |
+
o) output="${OPTARG}";;
|
| 54 |
+
\?) usage "${INVALID_OPT_ERR} ${OPTARG}" 1>&2;;
|
| 55 |
+
:) usage "${INVALID_OPT_ERR} ${OPTARG} ${REQ_ARG_ERR}" 1>&2;;
|
| 56 |
+
esac
|
| 57 |
+
done
|
| 58 |
+
shift $((OPTIND-1))
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
#===============================================================================
|
| 62 |
+
# variables
|
| 63 |
+
#===============================================================================
|
| 64 |
+
|
| 65 |
+
# get the input file name
|
| 66 |
+
input_nopath="${input##*/}"
|
| 67 |
+
input_name="${input_nopath%.*}"
|
| 68 |
+
|
| 69 |
+
# output file name
|
| 70 |
+
output_default="${input_name}-cutlist-$(date +"%Y-%m-%d-%H-%M-%S").txt"
|
| 71 |
+
|
| 72 |
+
|
| 73 |
+
#===============================================================================
|
| 74 |
+
# awk subtract 2nd line from first line - print start and duration
|
| 75 |
+
#===============================================================================
|
| 76 |
+
|
| 77 |
+
seconds () {
|
| 78 |
+
awk -F. 'NR > 1 {printf("%s%s%s\n"), prev, ",", $0-prev}; {prev = $0}' < "${input}" > "${output:=${output_default}}"
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
#===============================================================================
|
| 82 |
+
# convert sexagesimal to seconds - and subtract 2nd line from first line
|
| 83 |
+
# convert from seconds back to sexagesimal
|
| 84 |
+
#===============================================================================
|
| 85 |
+
|
| 86 |
+
minutes () {
|
| 87 |
+
awk -F: 'NF==3 { printf("%s\n"), ($1 * 3600) + ($2 * 60) + $3 } NF==2 { print ($1 * 60) + $2 } NF==1 { printf("$s\n"), 0 + $1 }' < "${input}" \
|
| 88 |
+
| awk 'NR > 1 {printf("%s%s%s\n"), prev, "\n", $0-prev}; {prev = $0}' \
|
| 89 |
+
| awk -F. 'NF==1 { printf("%02d:%02d:%02d\n"), ($1 / 3600), ($1 % 3600 / 60), ($1 % 60) }\
|
| 90 |
+
NF==2 { printf("%02d:%02d:%02d.%s\n"), ($1 / 3600), ($1 % 3600 / 60), ($1 % 60), ($2) }' \
|
| 91 |
+
| awk '{ORS = NR%2 ? "," : "\n"} 1' > "${output:=${output_default}}"
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
#===============================================================================
|
| 96 |
+
# timecode regex
|
| 97 |
+
#===============================================================================
|
| 98 |
+
|
| 99 |
+
# grab the first line of the file
|
| 100 |
+
check=$(head -n1 "${input}")
|
| 101 |
+
|
| 102 |
+
# minutes - match 00:00:00.000
|
| 103 |
+
minutes_regex='^[0-9]{1,2}:[0-9]{2}:[0-9]{2}([.]{1}[0-9]{1,3})?$'
|
| 104 |
+
|
| 105 |
+
# seconds - match 00:00:00.000
|
| 106 |
+
seconds_regex='^[0-9]{1,8}([.]{1}[0-9]{1,3})?$'
|
| 107 |
+
|
| 108 |
+
# grep for the minutes
|
| 109 |
+
minutes=$(echo "${check}" | grep -E "${minutes_regex}")
|
| 110 |
+
|
| 111 |
+
# grep for the seconds
|
| 112 |
+
seconds=$(echo "${check}" | grep -E "${seconds_regex}")
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
#===============================================================================
|
| 116 |
+
# check timecode and run function
|
| 117 |
+
#===============================================================================
|
| 118 |
+
|
| 119 |
+
if [ -n "${minutes}" ]; then
|
| 120 |
+
minutes
|
| 121 |
+
elif [ -n "${seconds}" ]; then
|
| 122 |
+
seconds
|
| 123 |
+
else
|
| 124 |
+
usage
|
| 125 |
+
fi
|
code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/Руководство по детекту сцен.txt
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Автоматическое разделение видео на отдельные сцены:
|
| 2 |
+
https://youtube.com/watch?v=nOeaFEHuFyM
|
| 3 |
+
|
| 4 |
+
Укажите диапазон в видео и разделите на отдельные сцены:
|
| 5 |
+
https://youtube.com/watch?v=SqvDCpWad9M
|
| 6 |
+
|
| 7 |
+
Шестидесятеричный формат - часы, минуты, секунды:
|
| 8 |
+
https://youtube.com/watch?v=GZgE6fYd_wg
|
code/NapoleonWils0n. Руководство по детекту сцен с помощью ffmpeg/Руководство по установке ffmpeg скриптов.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
https://www.youtube.com/watch?v=UHshlQvdwcQ
|
code/PySceneDetect v0.6.2/Fast cut-scene detection and split video into parts.mp4
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c7b65fc49cef3139ec2dff0163c98d8fdf2d153de64ed9567d28a16ba99d578c
|
| 3 |
+
size 11875006
|
code/PySceneDetect v0.6.2/PySceneDetect.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6a9f08a0dbc09a120a88140b860647811ac324be48896dda5efd74a93d840460
|
| 3 |
+
size 213486123
|
code/PySceneDetect v0.6.2/[GUI] SceneChangeDetector/SceneChangeDetector [ChuaN15].rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:739f921b72d09a3c9913fe253af3d50099d2d3d942fd76e6b0cb513f391e126f
|
| 3 |
+
size 4621760
|
code/PySceneDetect v0.6.2/[GUI] SceneChangeDetector/Описание.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
SceneChangeDetector разработан с использованием ASP.NET и библиотеки Python PySceneDetect. Он используется для обнаружения смены сцен в видео и автоматического разделения видео на отдельные клипы. Наиболее распространенные варианты его использования включают разделение домашнего видео или других исходных материалов на отдельные сцены, обработку и разделение материалов с камер наблюдения, а также автоматическое обнаружение и удаление рекламы из видеоисточников.
|
| 2 |
+
|
| 3 |
+
Пользователь сначала загрузит свое видео в систему. Тогда системе обычно требуется несколько минут, чтобы разделить видео на разные сцены. После завершения процесса пользователь получит электронное письмо со ссылкой на видео.
|
code/PySceneDetect v0.6.2/Материалы.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Обзорная статья автора PySceneDetect на Reddit:
|
| 2 |
+
https://www.reddit.com/r/Python/comments/429y5r/pyscenedetect_video_scene_cut_analysis_with
|
code/PySceneDetect v0.6.2/Обнаружение и классификация видеосцен. PySceneDetect, Places365 и Mozilla DeepSpeech Engine.docx
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:974c8642a6dbe44d59a4bb56d35b5dd5d2c45aeadaa04067f6ea34705cb7a37d
|
| 3 |
+
size 770493
|
code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/desktop.ini
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[.ShellClassInfo]
|
| 2 |
+
IconResource=C:\Windows\System32\SHELL32.dll,3
|
code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/python-scene-detection-tutorial.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:5262db96d40a4f53c77f38bdc441e0558102ff5c667479bdfb34e7c93f2656c8
|
| 3 |
+
size 4881122
|
code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/Описание.txt
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Этот репозиторий содержит примеры программ, соответствующие руководству из трех частей по обнаружению изменений сцены в видео с помощью Python и OpenCV, которое можно найти по адресу:
|
| 2 |
+
> Простое определение порога/перехода в черный цвет
|
| 3 |
+
> Оптимизированное/адаптивное пороговое обнаружение
|
| 4 |
+
> Подавление/отмена ложных изменений сцены (скоро!)
|
| 5 |
+
|
| 6 |
+
Вы можете получить последний пример кода/видео на странице релизов (https://github.com/Breakthrough/python-scene-detection-tutorial/releases).
|
| 7 |
+
|
| 8 |
+
Всего существует три программы (part1-threshold.py, part2-adaptive.py, [скоро] part3-content-aware.py), соответствующие соответствующей части руководства, ссылка на которое приведена выше. Подробности использования каждой программы можно найти в заголовке комментария к этому файлу.
|
| 9 |
+
|
| 10 |
+
С этим руководством связана PySceneDetect (https://bcastell.com/projects/PySceneDetect), надежная программа обнаружения сцен на основе OpenCV.
|
code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/Часть 1. Обнаружение порога_перехода в чёрный цвет.docx
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a9390b3a0a9c0c2bf2af0dbb0cc311e342735a5589bf21b8dd350ada3fb9fe83
|
| 3 |
+
size 238935
|
code/PySceneDetect v0.6.2/Обнаружение смены сцен на Python и OpenCV/Часть 2. Адаптивное пороговое обнаружение.docx
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:92ab3b04f103084c3c97f9050defb6d7fb22c438680602ab5230c5684417d461
|
| 3 |
+
size 291402
|
code/PySceneDetect v0.6.2/Описание.txt
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Софт и библиотека на Python и OpenCV для детекции обрывов/переходов на видео.
|
| 2 |
+
Репозиторий: https://github.com/Breakthrough/PySceneDetect
|
| 3 |
+
|
| 4 |
+
Как установить:
|
| 5 |
+
pip install scenedetect[opencv] --upgrade
|
| 6 |
+
|
| 7 |
+
Если нужен серверный (безголовый вариант):
|
| 8 |
+
pip install --upgrade scenedetect[opencv-headless]
|
| 9 |
+
|
| 10 |
+
---------------------------
|
| 11 |
+
https://scenedetect.com
|
code/PySceneDetect v0.6.2/Повышение эффективности.docx
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6cae4355897c2074e30587a9fd3535a2fb6be86dd9252fdb11366b5981a20d90
|
| 3 |
+
size 143903
|
code/SSCDNet/sscdnet.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:303a06c0ee4a4a2afce91afa845784c21c60232ac7aa8d2820523b46e41ab6a0
|
| 3 |
+
size 40640
|
code/SSCDNet/Описание.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Semantic Scene Change Detection Network (SSCDNet) - официальная реализация Коррелированной сиамской сети обнаружения изменений (CSCDNet) и Сети обнаружения семантических изменений на основе силуэтов (SSCDNet) из научной работы «Слабо контролируемое обнаружение семантических изменений сцены на основе силуэтов» (ICRA2020). (Подготавливаются данные SSDNet и PSCD...)
|
| 2 |
+
|
| 3 |
+
Этот код был разработан и протестирован с помощью Python v3.6.8, PyTorch v1.0 и CUDA v9.2.
|
code/SSCDNet/Слабо контролируемое обнаружение семантических изменений сцены на основе силуэтов.pdf
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:9f649014c8d230448c0033779b0f28fcef5397046001dadbcd6c0e0ffba5f55b
|
| 3 |
+
size 3354820
|
code/SSCDNet/Схема.png
ADDED
|
Git LFS Details
|
code/SceneChangeDet/SceneChangeDet.rar
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1fc583f2778401c974579325a868c6c06da0303f349b84ca601b920a2ec3f058
|
| 3 |
+
size 18295313
|