Napady

Určení počtu pater domu z jeho fotografie bez strojového učení / Habr

V tomto článku představím dle mého názoru zajímavé řešení problému počítačového rozpoznávání objektů na obrázku bez použití tréninku.

Úkol: mít fotografii vícepodlažní budovy a pokusit se určit počet pater v ní.

Dobrý odhad na počet pater může být dán počtem vertikálních oken v domě. Okna, balkony a další předměty jsou dobrou charakteristikou podlah (zejména v obytných budovách). Budu se konkrétně dívat na obytné budovy, jejichž obrázky lze snadno najít na internetu. Předem je třeba upozornit na jedno důležité omezení: dům na snímku musí být zobrazen zcela svisle, aby bylo možné vizuálně detekovat všechna podlaží.

Úkol lze racionálně rozdělit do dvou etap:

  1. Vyhledejte svislý „pruh“ oken, který bude třeba spočítat. Dva dílčí úkoly: zaprvé musíte hledat okna v oblasti obrázku, kterou zabírá dům, a zadruhé, oken v obytných budovách je hodně, nemá smysl je všechna rozebírat. Mezi nimi je nutné vybrat vertikální sekvenci, která je nejvhodnější pro následnou analýzu.
  2. Určení počtu podlaží (oken nebo jiných charakteristických objektů) pro určenou plochu domu.

Tento článek je věnován především prvnímu kroku řešení. Druhý krok je stále ve vývoji, ale uvedu i některé výsledky jeho řešení.

Krok 1: Najděte oblast s okny

Základní myšlenkou je, že množství jasně viditelných identických objektů (jako jsou okna) seřazených na domě vytváří periodickou sekvenci jasu pixelů. Toto je sekvence, kterou je třeba najít. Níže jsou uvedeny hlavní fáze algoritmu.

Nejprve převeďte obrázek do stupňů šedi a upravte jeho měřítko (použil jsem obrázky 400x600px)

Obr.1 Původní černobílý snímek

  1. Výběr relativně úzkého (40px) pruhu v celé výšce na obrázku (obr. 2, spodní obrázek bez bodů)
  2. Průměrování jasu v celé šířce pásma. Výsledkem je přímka w rozložení průměrného jasu po výšce domu (obr. 2 horní graf). Je na něm dobře patrná periodická struktura charakteristická pro oblast, kde jsou okna. Okna umístěná ve stínu jsou méně viditelná, ale to nebude bolet.
  3. Vypočítá se rozdíl dw mezi hodnotami w a w posunutý o vzdálenost sh. Výčtovou metodou nalezneme takovou hodnotu posunu sh, abychom dosáhli maximálního snížení mediánu rozdílů dw (obr. 2, spodní graf).


    Obr. 2 „Lišta“ oken

Nestačí však najít obrazový pás, ve kterém byl medián nejvíce snížen. Faktem je, že oblasti se zelení nebo oblohou, s malými hodnotami posunu, mohou způsobit větší snížení než okna. Pokud ale vykreslíte závislost střední hodnoty na hodnotě posunu pro pruhy s okny a bez oken, všimnete si klíčového rozdílu: při hodnotách posunu blízkých výšce podlaží má graf s okny jasně viditelné extrémy. Není tedy třeba měřit absolutní dosaženou úroveň mediánu, ale jeho maximální pokles od maxima v procesu zvyšování posunu pro každé okno. Toto je klíčový bod.

žádná okna s okny

Obr.3 Změna středního průměrného jasu v s rostoucím posunem

Níže je kód python3 s komentáři.

image = Image.open("raf_data/32.jpg").resize((600,400)) #Открываем изображение. img = np.array(image.convert("L"), dtype=float)/255 SEARCH_WIDTH = 40 # Ширина поискового окна x_opt = [0, 1] # Здесь будут сохранены результаты: положение окна и оптимальный сдвиг sh_range = range(1,100) # Диапозон изменения сдвига kmax = 0 # Цикл по различным положениям поискового окна for x in range(0, img.shape[1]-SEARCH_WIDTH, int(SEARCH_WIDTH/2)): amax = 0 amin = 1 # Цикл по различным значениям сдвига for sh in sh_range: # Вычисление целевой переменной w = img[:,x:x+SEARCH_WIDTH].mean(axis=1) aim = (pd.DataFrame(w)-pd.DataFrame(w).shift(sh))[sh:].abs().median().values[0] # Вычисление максимального снижения aim при данном сдвиге sh if aim>amax: amax = aim amin = amax if aimkmax: x_opt = [x, sh, w] kmax = aim_k print('координата окна: , оптимальный сдвиг: '.format(x_opt[0], x_opt[1]))

Na obr. 2 jsou vyznačeny body umístěné ve vzdálenosti nalezeného posunu. Jak vidíte, dobře označují každé okno. Tito. Již známe výšku podlahy!
Uvažovaný algoritmus dělá dobrou práci při hledání pravidelných zón na fasádách široké škály obytných budov (obr. 4).

Přečtěte si více
Kůdci rajčat: Škůdci rajčat a jak je kontrolovat - Agro-Market

Krok 2. Výpočet počtu podlaží

V tomto kroku začínají hlavní potíže. Další akce mohou být následující:

  1. Odhadněte výšku domu analýzou křivky rozdílů v průměrném jasu nebo pomocí strojového učení). Vydělte výšku domu výškou podlahy, abyste získali počet pater.
  2. V okně nalezeném v prvním kroku hledejte objekty podobné oknům a přímo je spočítejte, například speciálními body.

Zdá se přirozené vyzkoušet nejprve první metodu: protože výška podlah je známá, zbývá určit výšku domu. Schémata podobná těm, která jsou uvedena v kroku 1, se však ukazují jako špatně vhodná pro určení výšky domu, s přihlédnutím ke všem možným hranicím a přechodům. V některých případech je možné získat dobré příklady práce, ale pro trvale dobré výsledky jsou zapotřebí přístupy využívající strojové učení.

Obr.5 Určení výšky domu pomocí náhodného lesa

  • python3
  • strojové učení
  • rozpoznávání obrazu

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Back to top button