Количеството снимки, които всички правим с мобилните си телефони, е просто невероятно и този брой нараства с подобряването на камерите, налично повече пространство на мобилните устройства и облачни решения като iCloud или Google Photos, които ги синхронизират със сървърната инфраструктура.

От потребителската база на Storyo знаем, че средно потребителите имат около 1000 до 1500 снимки на своите устройства (iOS и Android) и ако скочим до 98-ия процентил, виждаме, че 2% от нашата потребителска база има повече от това 20 000 снимки.

Организацията на снимките е гореща тема, която разглеждаме от създаването на първоначалната версия на Storyo през юли 2014 г., която вече направихме достъпна и в нашия собствен SDK за iOS и Android.

Винаги сме разглеждали организацията на снимките като състояща се от две големи, относително независими области:

  • Автоматично откриване на истории - откриване на подходящи истории или набори от снимки за потребителите и;
  • Автоматичен избор на снимки - директен процес на подреждане за даден набор от снимки, избрани автоматично или чрез ръчен поток.

Историите са съставени от групи снимки и могат да се показват с много различни организации. Ние винаги сме подкрепяли организирането на историите хронологично в перспектива на историята, за да представим времева линия на ролките на камерата на потребителите. Нашите потребители са потвърдили този подход, като близо 40% от историите, играни в Storyo, започват с щракване върху автоматична история.

След това е изключително важно да решите как да изберете индивидуални снимки от този първоначален набор. Например, история за пътуване може лесно да има повече от 200 снимки и ако някой иска да създаде кратко видео или малка фото книга, трябва да реши как да избере набор от снимки за наличните степени на свобода - като 25 второ видео или фотокнига от 25 страници.

Трябва ли да изберем 25-те най-добри снимки според критерии, базирани на компютърно зрение, или трябва да запазим историята възможно най-подходяща, като идентифицираме глави и след това изберем най-добрите снимки, като се има предвид контекстът на главата? Със Storyo ние силно вярваме във втория подход – организиране на история в глави и по-късно решаване кои снимки са правилните за добавяне.

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

В Storyo ние сме фокусирани върху предоставянето на най-добрите изживявания на потребителите и с мощта на мобилните устройства днес, локалното изпълнение определено е най-добрият начин, ако необходимото пространство не е критичен фактор.

Тази статия ще се съсредоточи върху това как да създадете поток за подготвяне на снимки, който използва разказване на истории и компютърно зрение / задълбочено обучение, въз основа на това, което сме изградили в приложението Storyo и SDK на Storyo за създаване на фотокнига и времева линия на видео.

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

Филтриране на нежелани изображения

Знаем добре, че фотоапаратите на нашите мобилни телефони са пълни с боклук — снимки на бели дъски на среща, за да запазим информацията, преди някой да я изчисти, снимки на листовка, за да запазим подробностите за хотела, в който ще останем за няколко ваканционни дни , и така нататък и така нататък.

Освен тези сценарии, ние сме склонни да забравяме да изтрием снимки, които изглеждат ужасно поради някакво неволно движение на нашата цел или защото е било на закрито и условията на осветление са били лоши.

Въпреки че тези снимки могат да имат значение за постигането на конкретна цел, те обикновено са извънредни в контекста на „снимките като спомени“. И така, как да се отървем от тях?

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

Дълбокото обучение се развива с невероятна скорост и количеството инструменти, предлагани от големи играчи като Google, Apple и Microsoft на разработчици и неразработчици, нараства с висока скорост.

Независимо от използваната услуга, сегашната тенденция за маркиране на изображения с класификатори като „Документ“ или „Бяла дъска“ е свързана с използването на предварително обучена конволюционна невронна мрежа за класифициране в много категории. Тези модели ще се научат да идентифицират много общи характеристики и с малка добавка могат да се използват за добра екстраполация към други категории съдържание, за което не са били обучени.

Ако искате да обучите свой собствен набор от категории, като използвате модел като този, просто трябва да обучите финален слой (или слоеве), нанасящи тези общи функции към вашето съдържание с много малък набор от изображения. Microsoft предлага няколко услуги чрез своята инфраструктура Azure и по-специално услугата Cognitive, Google разполага със своите мощни Firebase услуги и наскоро пусна Cloud AutoML за обучение на персонализирани модели, а Apple предлага Create ML, създаден да работи на Mac и да обучава модели за неговата екосистема.

Както при всички модели за дълбоко обучение, размерът има значение и ако искате да стартирате модели локално, това може да е недостатък. С iOS 12 обаче Apple реализира малка стъпка, която ще позволи на приложенията да направят огромен скок напред с изпълнение на задълбочено обучение на мобилни устройства – те добавиха базов модел за класификация към пакета на операционната система.

Използвайки Create ML на Apple за плъзгане и пускане на няколко нежелани изображения – като снимки на документи – можем да създадем нов модел с малък набор от байтове, които да бъдат присвоени на приложение, вместо обичайния мащаб от няколко MB.

Независимо от използвания инструмент и тъй като за обучението не са необходими много изображения, важно е да бъдете внимателни. Добра стратегия е да създадете категория като „бяла дъска“ и няколко други като контрола. Например, тази контролна категория може да има снимки на хора пред бяла дъска на заден план, за да смекчи грешната класификация и следователно да филтрира добрите изображения.

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

Групиране на подобни снимки

Групирането на подобни изображения може да бъде нещо доста обективно, без директно разбиране на съдържанието, или може да бъде нещо по-относително и по-близо до човешката интерпретация на съдържанието.

Нека сега да вземем два примера, за да илюстрираме по-добре и двете ситуации. Ще започнем с две изображения на риба, които лесно могат да бъдат съпоставени чрез идентифициране на няколко ключови точки на прекъсване и ще ги сравним на ниво „пиксел“, дори ако цветът не съвпада и изображенията не са напълно еднакви ( Фиг. 1).

Сега ще разгледаме две изображения със стадо риби, където рибите непрекъснато се движат, очаквайки храна да бъде пусната във водата (фиг. 2). Вашият мозък веднага ще ви каже, че тези снимки представляват подобни изображения. Въпреки това, ако искате да търсите точки на прекъсване и съпоставяне на пиксели, няма да успеете. Всъщност тези две изображения не са еднакви или дори частично еднакви.

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

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

Класиране на изображения

След като групирате подобни изображения, трябва да изберете най-добрия кандидат, който да представлява всяка група. В този процес могат да се използват няколко фактора и ние ще изброим само няколко, които считаме за подходящи от практическа гледна точка.

Нека започнем с едно просто и обикновено съгласувано: наличието на лица. Можете да откриете дали лице присъства в изображение, като използвате готови SDK, предлагани от Android и iOS. Ако има лице, можете да използвате това, както и неговия размер, за да повлияете на относителното класиране. „Разпознаването на лица“ вече преминава и към задълбочено обучение и следователно е доста мощно, което означава, че неясни лица могат лесно да бъдат открити! Ще стигнем до това по-късно.

Разпознаването на ориентири на лица, което се използва от забавни приложения като MSQRD, също може да представлява важна част от информацията. Ориентирът представлява конкретна точка на лицето и неговата относителна позиция може да се използва за извършване на неща като откриване дали очите са отворени или затворени или дори усмивки. Отново, по-сложни оценки могат да бъдат направени чрез специфични методи за дълбоко обучение, за да се направи извод за (доброто) настроение на лицето с малко повече байтове, добавени към приложението.

При откриването на забележителност на лице е важно да не забравяте, че в екосистемата на iOS можете да включите iCloud с интернет слой в средата. Ако искате да увеличите точността на тези маркировки, може да се окажете, че имате нежелана мрежова зависимост, която може драстично да повлияе на изживяването, предлагано на вашите потребители.

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

Старите методи, които търсят съседни пиксели като Laplacian или малко по-сложни, включващи Haar Wavelet, могат да свършат работа. Тъй като има много уебсайтове, които говорят за тези методи, ви предлагаме да ги проучите малко повече онлайн или да си купите книга за компютърно зрение.

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

Друг добър кандидат, който да ни помогне в процеса на класиране, е да имаме показател за естетика. Тъй като естетиката по своята същност е субективна, дълбокото обучение отново е добър кандидат да ни помогне. Тествахме няколко модела и този, който ни остави доволни, беше NIMA: Neural Image Assessment, който предсказва каква е хистограмата от класификации между 1 и 10, която група от хора би дала на определено изображение.

Чрез прогнозиране на класификационния диапазон е възможно да се направи извод не само за средното класиране, но и за показатели за променливост като стандартно отклонение. Ако променливостта е ниска, резултатът представлява единодушие, независимо от средната стойност. От друга страна, ако е високо, това отразява, че картината не е ясно добра или лоша.

Например, на фиг. 3 е възможно да проверите резултатите за доста подобни изображения, направени с iPhone X без филтри отляво и маскирани от филтър за дълбочина отдясно. Средното класиране се повишава с този специален филтър, а стандартното отклонение на класификацията намалява, което означава, че моделът предвижда, че хората ще харесват повече снимката вдясно и мнението вероятно ще бъде единодушно.

Въпреки това, не бъдете твърде уверени в тези резултати. NIMA са били обучавани в публични състезания по фотография, което създава известно пристрастие към видовете снимки, на които са били обучавани. Например, изображение със замъгляване на движението, причинено от неспокойно куче, може да изглежда много зле, но NIMA ще създаде много добра класификация за него!

В крайна сметка смятаме, че добра стратегия за класиране на изображения е използването на индекс, който използва всички променливи, описани по-горе. Това обаче е извън обхвата на тази статия. Може да разкрием как го правим в Storyo SDK в друга статия, посветена на тази конкретна тема в близко бъдеще.

Разказване на истории въз основа на времето и пространството

Сега, когато имаме филтрирани лоши изображения, групирани по подобен начин и избрани най-добрите изображения във всяка група, може да се окаже, че имаме повече снимки от желаните.

Например, ако имате 100 различни снимки (което лесно може да се случи в контекст на пътуване) и искате да покажете снимките си като видео слайдшоу с точно 60 секунди за споделяне в Instagram, как ще направите това? Ако приемем, че видеоклипът не трябва да показва повече от 1 снимка наведнъж и че всяка снимка трябва да се вижда за 2 секунди, как да изберем 30 снимки от вече подбраните 100?

Това е мястото, където разказването на истории може да ви помогне. Преди обаче да се впуснем в него, нека първо да поговорим малко за пространството и времето за метаинформация на снимките. Снимките, направени от камера на устройството, винаги ще имат свързано с тях времево клеймо и могат също така да имат местоположение чрез променливи за географска ширина и дължина, ако потребителят е конфигурирал тези точки от данни да бъдат активни.

Възможно е да използвате тези 3 променливи и да ги клъстерирате чрез метод за клъстериране, като използвате набора от данни, изчислен преди това. Ако географската ширина и дължина не присъстват, можем да ги оставим постоянни във всички снимки или просто да изчислим групиране само с времеви променливи.

Приложението Storyo и Storyo SDK използват метод за групиране, базиран на плътност (Mean Shift), който гарантира липса на случайни фактори. Има много методи за клъстериране, които изискват произволна инициализация и които не винаги гарантират абсолютно същите клъстери, когато се изпълняват няколко пъти. Случаен фактор, който в крайна сметка ще промени избора ви, може лесно да бъде възприет като грешка от вашия потребител.

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

Представете си сега, че някой пътува от Ню Йорк за Европа и има 3 различни снимки, направени на летище JFK, преди пътуването му да започне. И тогава този човек посещава Рим, където са направени 30 различни снимки, последван от Венеция с 50 различни снимки. След това потребителят хваща самолет за Париж и пътуването завършва със 17 различни снимки.

Тъй като има огромна географска разлика между САЩ, Италия и Франция, първото сегментиране на клъстери се случва по държави, като първият възел представлява снимки, направени в JFK, втората група снимки, направени в Италия, а третата в Париж.

Снимките на JFK са много ограничени в пространството и времето и по този начин процесът на групиране приключва там. Представете си сега, че потребителят е прекарал един ден в Рим, два дни във Венеция и още един ден в Париж.

Възелът Италия е разделен от доминиращите географски области, с Рим в първия възел и Венеция във втория. През деня, прекаран в Рим, потребителят е направил 10 различни снимки рано сутринта, 5 следобед и 15 по време на вечеря с няколко местни приятели. Тъй като времето там беше кратко, потребителят не се движеше много в града и разделянето на клъстерите приключи, доминирано от времевата празнина между трите комплекта снимки (сутрин, следобед и вечеря).

Въпреки че прекараха два дни във Венеция, потребителят не прекара много време в снимки, направи само 30 снимки на първия ден и 20 на втория ден. В този сценарий клъстерирането завърши в листен възел за ден 1 и друг листов възел за ден 2.

И накрая, през деня, прекаран в Париж, потребителят е направил 7 снимки по време на обяд и още 10 през нощта, завършвайки с 2 детски възела, разделени на времевата разлика между двата фотографски момента.

Сега, когато имаме скелет, трябва да го използваме! За да направим това, ще вземем нашите предварително дефинирани 60 секунди и ще ги пуснем в основата на дървото в поток на делегиране на време за представяне.

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

Нека да видим как 60-секунден поток на делегиране може да се осъществи в основен възел чрез условно изпращане на време съответно до възли JFK, Италия и Париж. Не забравяйте, че имаме следното съотношение 3 : 80 : 17 различни снимки с 2 секунди като единица. Ако присвоим 2 секунди на JFK, 48 секунди на Италия и 10 секунди на Париж, ще запазим пропорциите доста разумни и ще приемем, че първата делегация е успяла.

Сега трябва условно да делегираме време за представяне във възлите Италия и Франция независимо. Започваме с Италия, където отделяме 48 секунди за Рим и Венеция в съотношение 30:50 и можем да запазим успеха, като делегираме 18 секунди на Рим и 30 секунди на Венеция.

Продължавайки в Италия, ще се опитаме да делегираме 18 секунди в Рим за сутрин, следобед и вечеря в съотношение 10 : 5 : 15. Това дава директно разделение съответно на 6, 3 и 9 секунди. 3 и 9 не са кратни на 2 и затова трябва да намерим баланс. Добра възможност е да премахнете 1 секунда от вечерята и да я дадете на следобеда, завършвайки с разделяне съответно на 6, 4 и 8 секунди. Тъй като вече няма деца, делегирането в клона в Рим приключва тук.

Венеция е следващият град, който управлява делегацията. 30 секунди ще бъдат разделени на ден 1 и ден 2 с пропорция 30 : 20, което води до успешно делегиране от 18 секунди за ден 1 и 12 секунди за ден 2. Отново няма деца и делегирането спира.

Все още трябва да управляваме делегацията на Париж, на която бяха оставени 10 секунди, като ги разделихме в съотношение 7:10 и завършихме с приблизително 4 секунди до обяда и 6 до вечерта/вечерята.

След като установим този поток на делегиране, трябва да изберем снимки. За да опростим нашата последна стъпка, ще създадем обобщена таблица.

Не забравяйте, че вече имаме изчислено класиране за всички снимки, които са били използвани за избор на снимка в група от подобни снимки. Вече можем да използваме същото класиране, за да избираме във всяка група. Тъй като те са много по-сегментирани, сега можем просто да изберем тези с по-висок ранг.

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

Бъдете нащрек за бъдещи статии от тази поредица, в които ще изследваме автоматичното откриване на истории, а след това ще продължим с набор от статии, описващи подробно как моделите за дълбоко обучение могат да се използват като част от потока на куриране. Останете на линия, а дотогава опитайте Storyo и ни кажете какво мислите!