Trendy

Jak to funguje: Systém rozpoznávání dopravních značek – Auto články o

Není žádným tajemstvím, že pro začínající řidiče je obtížné současně řídit auto, sledovat značení a přesto si všimnout dopravních značek. Důležitou dopravní značku však může minout i zkušený řidič. Důvodů může být mnoho: roztěkanost, únava atd. Systém rozpoznávání dopravních značek je navržen tak, aby v takových situacích poskytoval pojištění.

Samotná struktura systému je jednoduchá, na rozdíl od úloh, které má řešit. Mezi centrálním zrcátkem a čelním sklem je namontována videokamera, jejíž obraz zpracovává procesor, který vydává potřebná varování na displeji palubní desky. Kromě vizuální indikace lze vydávat také zvukové signály. Aby bylo zajištěno rozpoznání značek i za špatného počasí, je kamera často vybavena infračerveným reflektorem. V zásadě jsou systémy schopny detekovat značky s omezením rychlosti. Technika se ale neustále zdokonaluje a nyní je elektronika připravena upozorňovat řidiče na zákaz předjíždění, na jednosměrný provoz a v některých případech pro větší přesnost využít i data z navigačního systému.

Kamera se „kouká“ nejen do stran, ale i nahoru, tedy do míst, kde jsou obvykle umístěny dopravní značky. Rozsah systémů se neustále zvyšuje. V dnešní době dokáže elektronika rozpoznat dopravní značky na vzdálenost asi 100 metrů.

V angličtině je systém rozpoznávání značek často označován zkratkou RSR (Road Sign Recognition), ale automobilky se občas snaží přijít s něčím originálnějším. Například Opel nazývá svůj systém Opel Eye.

Ve většině případů systémy správně rozpoznávají znaky, ale je příliš brzy se na ně zcela spolehnout. Navzdory tisícům hodin továrního testování mohou systémy stále dělat chyby. Náraz může mít vysoká rychlost, špatné povětrnostní podmínky (sněžení, déšť) a dokonce i kamion zaparkovaný na kraji silnice. Ostatně to, co lidské oko vidí, není vždy v silách elektroniky, která je v tomto případě stále dimenzována pro ideální provozní podmínky. Vyplatí se jej proto vnímat nikoli jako nenahraditelného pomocníka, ale jako pomocný systém připravený pojistit roztržitého řidiče.

Nové verze systémů rozšiřují jejich znalostní základnu. Mercedes-Benz například naučil nejnovější generaci třídy S rozpoznávat značku „Zákaz vjezdu“. Pro dodatečné potvrzení jízdy ve špatném směru se systém spoléhá také na navigační data. Není to vtip, ale v Německu je ročně zaznamenáno asi 3 jízd pod značkou zákaz vjezdu. A to nemluvíme o pomalu se pohybujících městských ulicích, ale o dálnicích a hlavních dálnicích. Jasná indikace a zvukové varování mohou ochránit nepozorného řidiče.

Samořídící „auto Google“, kterému bylo na podzim roku 2012 povoleno jezdit pod lidským dohledem na veřejných komunikacích ve státě Kalifornie (USA), přirozeně „prošlo“ testem pravidel silničního provozu na výbornou a dokáže rozpoznat všechny značky. To ale není levné, takže do sériových vozidel se v současnosti instalují primitivnější systémy.

Auto Google vidí a rozumí téměř všemu: manévrům ostatních účastníků silničního provozu, dopravním značkám a semaforům. Jediná věc, kterou pravděpodobně ještě neumí, je mluvit řečí ptáků. Nicméně jen sada kamer, senzorů a další elektroniky pro takovou všestrannost bude stát kolem 250 000 dolarů.

Přečtěte si více
Rozšíření slovní zásoby: Nejlepší metody pro rozvoj řeči u dětí

Video názorně demonstruje fungování systému, který Ford nazývá Traffic Sign Recognition. Řídicí jednotka rozpoznává značky s omezením rychlosti, značky pro zrušení omezení rychlosti a značky se zákazem předjíždění. Výstražné signály se zobrazují na malém, ale jasném displeji přístrojové desky. Aby se zajistilo, že řidič bude včas věnovat pozornost varováním systému, obrázky značek na obrazovce časem slábnou a ustupují tak novým zprávám:

Tímto článkem otevírám sérii materiálů o analýze úkolů celoruského šampionátu „Digital Breakthrough“ souvisejících s počítačovým viděním. Řešení navržené v článku vám umožňuje získat místo v top 5 žebříčku. Zvláštností tohoto přístupu je, že nebudeme používat tréninková data poskytnutá organizátory soutěže. Na konci jsou uvedeny tipy na zlepšení řešení a také nápady, které mohou vést k prvnímu místu.

úvod

Automobilový průmysl je jedním z nejmodernějších průmyslových odvětví, které zahrnuje inovace z různých oblastí, aby poskytlo řidičům a cestujícím rychlost, bezpečnost a pohodlí při řízení. Pozornost mnoha výrobců automobilů se nyní soustředí na tvorbu vozů bez řidiče, což znamená implementaci celé řady softwarových a hardwarových řešení, která fungují mimo jiné na bázi technologií umělé inteligence.

Každým rokem je potřeba automatického systému rozpoznávání dopravních značek stále naléhavější. Tyto systémy jsou široce používány u autopilotů a asistentů řidiče pro zlepšení bezpečnosti motorových vozidel. Systémy mohou pomoci dodržovat stanovený rychlostní limit, dodržovat omezení průjezdu a předjíždění, což pomůže výrazně snížit nehodovost na silnicích.

Úkol

Vyvinout řešení, které dokáže rozpoznat dopravní značky v záběrech zaznamenaných DVR automobilu.

Popis vstupních dat

  • vlak/ — složka obsahující 778 snímků pořízených videorekordérem;
  • train.csv – obsahuje seznam postav pro každou fotografii;
  • test/ — obsahuje 388 obrázků, na kterých potřebujete identifikovat SPZ vozidla;
  • test.csv – obsahuje seznam všech obrázků v testovací sadě;
  • sample_solution.csv — ukázkový soubor k odeslání;

Vysvětlení údajů

Pro snadnou interpretaci výsledků byly dopravní značky převedeny na čísla od 1 do 70, kde:

číslo 1 odpovídá označení podle GOST „3.24“,

číslo 2 odpovídá označení podle GOST ‘1.16’,

číslo 3 odpovídá označení podle GOST ‘5.15.5’,

atd. pro následující znaky: ‘5.19.1’, ‘5.19.2’, ‘1.20.1’, ‘8.23’, ‘2.1’, ‘4.2.1’, ‘8.22.1’, ‘6.16’, ‘1.22’, ‘1.2’, 5.16′, 3.27.’ .6.10.1′, ‘8.2.4’, ‘6.12’, ‘5.15.2’, ‘3.13’, ‘3.1’, ‘3.20’, ‘3.12’, ‘7.14.2’, ‘5.23.1’, ‘2.4’, ‘5.6’, ‘4.2.3.’, ‘8.22.3.’ ‘5.15.1’, ‘7.3’, ‘3’, ‘2.3.1’, ‘3.11’, ‘6.13’, ‘5.15.4’, ‘8.2.1’, ‘1.34.3’, ‘8.2.2’, ‘5.15.3’, 1.17.’, ‘4.1.1’, 4.1.4 ‘3.25.’ 1.20.2′, ‘8.22.2’, ‘6.9.2’, ‘3.2’, ‘5.5’, ‘5.15.7’, ‘7.12’, ‘8.2.3’, ‘5.24.1’, ‘1.25’, ‘3.28’, ‘5.9.1’, 5.15.6 ‘8.1.1’, ​​’1.10.’ ‘6.11’, ‘3.4’, ‘6.10’, ‘6.9.1’, ‘8.2.5’, ‘5.15’, ‘4.8.2’, ‘8.22’, ‘5.21’, ‘5.18’, ‘XNUMX’.

Na co si dát pozor

Je důležité si uvědomit, že na jedné fotografii může být více nápisů, ale maximální počet nápisů na jedné fotografii pro naši sadu je osm.

Metrika kvality

Přesnost rozpoznání modelu je v úkolu důležitá, takže Recall bude aplikován na každý řádek sady.

Přečtěte si více
Jak vařit šťavnatou husu v troubě

Řešení problému

I letmý pohled na informace o úloze okamžitě ukazuje, že data jsou mírně řečeno nedostatečná. Máme 70 různých tříd a celkem 778 fotografií ke studiu. Je užitečné vykreslit histogram četností výskytu určitého znaku v trénovací sadě.

Za zmínku také stojí, že kvalita značení ponechává mnoho přání, a to i přesto, že seznam dopravních značek obsahuje značky, které nebudete schopni identifikovat. Například nějaký neznámý znak „3“. Je dobře, že tato problematická znamení nejsou příliš častá, proto je ignorujme.

Alternativní datová sada

Soubor dat, který nejlépe vyhovuje našim potřebám, je RTSD. Datový soubor RTSD obsahuje záběry poskytnuté společností “Geocentrum poradenství”. Snímky byly získány z širokoformátového videorekordéru, který natáčí rychlostí 5 snímků za sekundu. Rozlišení obrazu od 1280×720 do 1920×1080. Fotografie byly pořízeny v různých ročních obdobích (jaro, podzim, zima), v různou denní dobu (ráno, odpoledne, večer) a za různých povětrnostních podmínek (déšť, sníh, ostré slunce). Souprava používá dopravní značku 155, formát značení – COCO.

Některé statistiky

RSTD se liší počtem a složením znaků od souboru dat našeho problému. Takže přirozeně vyvstává další otázka: kolik znaků z původního problému pokrývá naše datová sada? Značky ze sady RTSD tvoří 65.2 % dopravních značek v našem problému.

Jak jsme viděli výše, znaky mají různé frekvence výskytu. Předpokládejme, že poměr znaků v tréninkové a testovací sadě je stejný. Jaký objem vlakové soupravy pokrývají znaky přítomné v RTSD? Značky ze soupravy RTSD pokrývají 72.4 % objemu všech dopravních značek ve vlakové soupravě. Tímto způsobem můžeme pokrýt většinu případů bez použití vlaku z našeho problému. Myslím, že tohle je?.

Nyní je čas naimportovat všechny potřebné knihovny.

import pandas as pd from tqdm.notebook import tqdm import os from shutil import copyfile, move import sys import json

Pojďme si stáhnout datovou sadu z Kaggle.

!pip install kaggle !kaggle datasets download -d watchman/rtsd-dataset !7z x rtsd-dataset.zip

Detektor objektů

Detektor bude yolov5, konkrétně yolov5m6 s rozlišením 1280 pixelů. Podle mého názoru je to nejlepší možnost, protože dopravní značky jsou malé, ale samotný obrázek je velký; Pokud model natrénujeme v rozlišení 640, může nám uniknout značné množství dopravních značek. Samozřejmě můžete vždy použít jinou architekturu. Účelem tohoto článku není vybrat optimální architekturu, ale demonstrovat, že je možné obsadit cenná místa v soutěži, aniž byste se uchýlili k přirážce organizátorů.

Převod datové sady do formátu YOLO

Toho lze dosáhnout několika způsoby. Použijte například službu Roboflow, ale pak budete muset nahrát všechny značky do jejich služby, což zabere poměrně hodně času. Jako alternativa – cvat, ale to vše trvá velmi dlouho, i když to bude vyžadovat pouze trpělivost a čas. Vždy můžete zapnout tvrdý režim a vše si napsat sami. Použijeme připravený skript z Ultralytika, ale udělejme na něm jednu změnu.

!git clone https://github.com/ultralytics/JSON2YOLO

Musíte upravit řádek 274 v souboru general_json2yolo.py takto:

h, w, f = img['height'], img['width'], img['file_name'].split('/')[1]

Přejděme přímo ke konverzi formátu COCO do formátu YOLO.

sys.path.append('./JSON2YOLO') from JSON2YOLO.general_json2yolo import convert_coco_json test_path = 'test_annotation' train_path = 'train_annotation' os.makedirs(train_path, exist_ok=True) os.makedirs(test_path, exist_ok=True) move('train_anno.json', os.path.join(train_path, 'train_anno.json')) move('val_anno.json', os.path.join(test_path, 'val_anno.json')) for folder in ['labels', 'images']: for path in [test_path, train_path]: os.makedirs(os.path.join(path, folder), exist_ok=True) convert_coco_json(train_path) for file in tqdm(os.listdir(os.path.join('new_dir/labels/train_anno'))): move(os.path.join('new_dir/labels/train_anno', file), os.path.join(train_path, 'labels', file)) convert_coco_json('./test_annotation/') for file in tqdm(os.listdir(os.path.join('new_dir/labels/val_anno'))): move(os.path.join('new_dir/labels/val_anno', file), os.path.join(test_path, 'labels', file))

Máme označení, potřebujeme jen obrázky, které mu odpovídají. No, pojďme je přidat taky.

test_labels = os.listdir(os.path.join(test_path, 'labels')) train_labels = os.listdir(os.path.join(train_path, 'labels')) test_labels = set(map(lambda x: x.split('.')[0], test_labels)) train_labels = set(map(lambda x: x.split('.')[0], train_labels)) images = 'rtsd-frames/rtsd-frames' for file in os.listdir(images): name = file.split('.')[0] if name in train_labels: move(os.path.join(images, file), os.path.join(train_path,'images', file)) if name in test_labels: move(os.path.join(images, file), os.path.join(test_path,'images', file))

Vytvořme soubor „trafic_signs.yaml“ s popisem cest a tříd použitých v datové sadě. Toto je povinný požadavek pro yolov5.

train: /home/jovyan/train_annotation/images # train images (relative to 'path') 128 images val: /home/jovyan/test_annotation/images # val images (relative to 'path') 128 images nc: 155 names: ['2_1', '1_23', '1_17', '3_24', '8_2_1', '5_20', '5_19_1', '5_16', '3_25', '6_16', '7_15', '2_2', '2_4', '8_13_1', '4_2_1', '1_20_3', '1_25', '3_4', '8_3_2', '3_4_1', '4_1_6', '4_2_3', '4_1_1', '1_33', '5_15_5', '3_27', '1_15', '4_1_2_1', '6_3_1', '8_1_1', '6_7', '5_15_3', '7_3', '1_19', '6_4', '8_1_4', '8_8', '1_16', '1_11_1', '6_6', '5_15_1', '7_2', '5_15_2', '7_12', '3_18', '5_6', '5_5', '7_4', '4_1_2', '8_2_2', '7_11', '1_22', '1_27', '2_3_2', '5_15_2_2', '1_8', '3_13', '2_3', '8_3_3', '2_3_3', '7_7', '1_11', '8_13', '1_12_2', '1_20', '1_12', '3_32', '2_5', '3_1', '4_8_2', '3_20', '3_2', '2_3_6', '5_22', '5_18', '2_3_5', '7_5', '8_4_1', '3_14', '1_2', '1_20_2', '4_1_4', '7_6', '8_1_3', '8_3_1', '4_3', '4_1_5', '8_2_3', '8_2_4', '1_31', '3_10', '4_2_2', '7_1', '3_28', '4_1_3', '5_4', '5_3', '6_8_2', '3_31', '6_2', '1_21', '3_21', '1_13', '1_14', '2_3_4', '4_8_3', '6_15_2', '2_6', '3_18_2', '4_1_2_2', '1_7', '3_19', '1_18', '2_7', '8_5_4', '5_15_7', '5_14', '5_21', '1_1', '6_15_1', '8_6_4', '8_15', '4_5', '3_11', '8_18', '8_4_4', '3_30', '5_7_1', '5_7_2', '1_5', '3_29', '6_15_3', '5_12', '3_16', '1_30', '5_11', '1_6', '8_6_2', '6_8_3', '3_12', '3_33', '8_4_3', '5_8', '8_14', '8_17', '3_6', '1_26', '8_5_2', '6_8_1', '5_17', '1_10', '8_16', '7_18', '7_14', '8_23']

Modelový trénink

!git clone https://github.com/ultralytics/yolov5 !cd "yolov5" !pip install -r requirements.txt !python train.py --img 1280 --batch -1 --epochs 40 --data "/home/jovyan/trafic_signs.yaml" --weights yolov5m6.pt --project "hackaton_trafic_signs" --name "yolov5m6"

Máme model, který identifikuje dopravní značky, přejděme k testovací sadě.

Přečtěte si více
Jak správně pást krávy - tipy a triky | Elektrický ovčák

Predikce na testovací datové sadě

Aplikujme náš detektor objektů na testovací datovou sadu.

!python detect.py --source --weights --save-txt --save-conf --name "yolov5m6_signs_test" --imgsz 1280 --conf-thres 0.25

Poznámka: RTSD neobsahuje token ‘5.19.2’, ale je v top 3 nejčastějších tokenech v trénovací sadě pro náš problém. Podívejme se, jak se detektor chová, když jsou na obrázku znaky ‘5.19.1’ a ‘5.19.2’. Ukazuje se, že pokud jsme v důsledku činnosti detektoru narazili na „5.19.1“ dvakrát, pak to není nic jiného než „5.19.1“ a „5.19.2“.

Pojďme se naučit, jak převést dopravní značky z RTSD do formátu našeho úkolu.

sings_rtsd = sings_rtsd = dict(zip(range(len(sings_rtsd)), [x.replace('_','.') for x in list(sings_rtsd.keys())])) sings_input = ['3.24', '1.16', '5.15.5', '5.19.1', '5.19.2', '1.20.1', '8.23', '2.1', '4.2.1', '8.22.1', '6.16', '1.22', '1.2', '5.16', '3.27', '6.10.1', '8.2.4', '6.12', '5.15.2', '3.13', '3.1', '3.20', '3.12', '7.14.2', '5.23.1', '2.4', '5.6', '4.2.3', '8.22.3', '5.15.1', '7.3', '3', '2.3.1', '3.11', '6.13', '5.15.4', '8.2.1', '1.34.3', '8.2.2', '5.15.3', '1.17', '4.1.1', '4.1.4', '3.25', '1.20.2', '8.22.2', '6.9.2', '3.2', '5.5', '5.15.7', '7.12', '8.2.3', '5.24.1', '1.25', '3.28', '5.9.1', '5.15.6', '8.1.1', '1.10', '6.11', '3.4', '6.10', '6.9.1', '8.2.5', '5.15', '4.8.2', '8.22', '5.21', '5.18']

Pojďme definovat pomocné funkce.

def parse_labeltxt(path): with open(os.path.join(path), 'r') as file: lines = file.readlines() labels = [sings_rtsd[int(x.split(' ')[0])] for x in lines] if labels.count('5.19.1')>1: labels.append('5.19.2') labels = list(set(labels)) return labels def rtsd2predict(labels): int_labels = [] for sign in labels: if sign in sings_input: int_labels.append(sings_input.index(sign) + 1) return int_labels

Předpovědi yolo transformujeme na dopravní značky RTSD a poté na štítky pro náš úkol.

test_csv = pd.read_csv('test.csv', delimiter=',') sample_solution = pd.read_csv('sample_solution.csv', delimiter=',') labels_path = '/home/jovyan/yolov5/runs/detect/yolov5m6_signs_test/labels' #заменить на путь, где у вас хранятся запуски yolov5 predicted_labels = <> for label in tqdm(os.listdir(labels_path)): predicted_labels[label[:-3]+'jpg'] = rtsd2predict(parse_labeltxt(os.path.join(labels_path, label)))

Poslední krok

Náš soubor řešení by neměl obsahovat názvy souborů, ale jejich id, které můžeme získat z test.csv. Bereme také v úvahu, že můžeme mít maximálně 8 dopravních značek, to znamená, že naše pole s predikcí dopravních značek je potřeba doplnit nulami, aby se jeho délka rovnala 8.

img2id = <> for index, row in test_csv.iterrows(): img2id[row['img']] = row['id'] for img in predicted_final.keys(): img_id = img2id[img] signs = predicted_final[img] + ((8-len(predicted_final[img]))*[0]) sample_solution[sample_solution['id']==img_id] = [img_id] + signs sample_solution.to_csv('solution.csv', index=False)

Nápady na vylepšení řešení

  • Označte data tréninkové sady pro ty dopravní značky, které v RTSD chybí. Tato metoda vám rozhodně dává +0.04-0.1 k vaší rychlosti.
  • Když se podíváte na tréninkovou datovou sadu a její označení, je zřejmé, že někdy musíte opustit dopravní značky, které jsou daleko, a někdy ne. Je možné, že zde existuje určitá korelace s tím, jaké konkrétní umístění se používá. To znamená, že má smysl experimentovat s jistotou a také vizualizovat celý soubor dat, abyste pochopili, v jakých případech došlo k chybám v označení.
  • Tento problém má smysl řešit od konce. Musíte pochopit, jak dobře jsou testovací data označena. Ručně označte všechny testovací obrázky a poté odešlete balíčky, což nám umožní zjistit, co od nás systém očekává. Tímto způsobem můžeme naše řešení „přizpůsobit“ odpovědi.
Přečtěte si více
Jaký materiál je vhodnější pro turistické markýzy

Výsledky

Problém sám o sobě je docela zajímavý, ale kvůli objemu a kvalitě označení je jakýkoli pokus o vylepšení řešení bezpředmětný. Podle mého názoru je tento přístup k řešení problému výzvou pro organizátory soutěže. Doufám, že je to povzbudí k tomu, aby se podrobněji zamysleli nad svými případy. Implementace tohoto řešení autorovi zabrala méně než den, ale i tento přístup vám umožňuje dostat se do top 5 žebříčku. Rád bych věřil, že tento článek bude užitečný všem, kteří svou soutěžní cestu teprve začínají.

Zúčastněte se a vyhrajte, hodně štěstí všem v šampionátech a hackathonech!

Veškerý kód je k dispozici na Github.

  • s
  • hackathon
  • digitální průlom
  • strojové učení
  • tutorial
  • neuronové sítě
  • soutěže
  • Umělá inteligence
  • počítačové vidění
  • počítačového vidění

Napsat komentář

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

Back to top button