Skip to content
crowd-datasetPublic

About

This repository contains code that extracts YouTube videos based on a mapping.csv file and performs object detection using YOLOv11. The primary objective of this work is to evaluate pedestrian behaviour in a cross-country or cross-cultural context using freely available YouTube videos.

Topics

Resources

Security policy

Stars

14 stars

Watchers

2 watching

Forks

Latest commit

 

History

7,391 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

City Road Observations With Dashcams (CROWD)

This repository contains code that extracts YouTube videos based on a mapping.csv file and performs object detection using YOLOv11. The primary objective of this work is to evaluate pedestrian behaviour in a cross-country or cross-cultural context using freely available YouTube videos.

This study presents a comprehensive cross-cultural evaluation of pedestrian behaviour during road crossings, examining variations between developed and developing states worldwide. As urban landscapes evolve and autonomous vehicles (AVs) become integral to future transportation, understanding pedestrian behaviour becomes paramount for ensuring safe interactions between humans and AVs. Through an extensive review of global pedestrian studies, we analyse key factors influencing crossing behaviour, such as cultural norms, socioeconomic factors, infrastructure development, and regulatory frameworks. Our findings reveal distinct patterns in pedestrian conduct across different regions. Developed states generally exhibit more structured and rule-oriented crossing behaviours, influenced by established traffic regulations and advanced infrastructure. In contrast, developing states often witness a higher degree of informal and adaptive behaviour due to limited infrastructure and diverse cultural influences. These insights underscore the necessity for AVs to adapt to diverse pedestrian behaviour on a global scale, emphasising the importance of incorporating cultural nuances into AV programming and decision-making algorithms. As the integration of AVs into urban environments accelerates, this research contributes valuable insights for enhancing the safety and efficiency of autonomous transportation systems. By recognising and accommodating diverse pedestrian behaviours, AVs can navigate complex and dynamic urban settings, ensuring a harmonious coexistence with human road users across the globe.

The dataset is available on kaggle. The dataset shall soon be made available on a permanent FAIR storage.

Dataset overview

  • Footage: 35,569.5 hours (1,482.1 days)
  • Videos: 80,308 unique videos split into 104,165 segments
  • Localities (cities): 10,237
  • Countries and territories: 238
  • Continents: 6
  • YOLO detections: 86,123 processed segments (one detection CSV each)
  • Detected objects (unique tracked objects, confidence ≥ 0.7): 31,050,010 persons, 81,888,691 cars, 2,434,215 bicycles, 10,320,404 motorcycles, 3,371,096 buses, 13,176,493 trucks
  • Last updated: 2026-10-21 17:43 UTC
All 238 countries and territories
# Country Cities Videos Footage (h) Analysed (h) Persons Cars Bicycles Motorcycles Buses Trucks
1 🇺🇸 United States 2,299 20,883 10,373.8 7,805.0 4,272,701 23,685,912 271,118 142,810 463,888 3,766,859
2 🇦🇺 Australia 212 4,112 1,725.5 1,161.3 575,432 3,841,888 38,915 39,827 87,817 631,717
3 🇬🇧 United Kingdom 358 3,184 1,691.6 1,496.8 2,669,605 3,286,323 258,876 153,027 259,935 557,811
4 🇷🇺 Russia 212 3,396 1,515.1 1,272.0 739,160 3,488,118 15,963 6,876 153,569 448,842
5 🇵🇭 Philippines 399 3,583 1,311.0 1,302.0 2,280,616 2,263,741 71,888 1,423,298 303,676 910,602
6 🇨🇦 Canada 229 3,545 1,234.7 988.3 746,694 2,850,553 68,576 19,519 55,088 371,391
7 🇻🇳 Vietnam 79 3,079 1,196.4 1,110.8 2,841,773 1,918,728 89,613 2,791,899 124,640 295,741
8 🇮🇩 Indonesia 176 3,159 1,019.6 969.2 1,868,154 1,870,317 24,313 1,816,459 108,349 471,997
9 🇰🇷 South Korea 84 853 822.4 792.3 350,283 1,627,830 20,330 52,974 103,482 176,255
10 🇫🇷 France 360 1,893 746.5 715.5 811,503 1,741,161 100,263 122,825 46,589 193,698
11 🇨🇳 China 149 1,229 693.0 623.6 477,193 1,757,527 50,356 190,159 101,437 205,625
12 🇩🇪 Germany 241 1,385 654.8 602.4 529,924 1,684,445 183,442 34,832 59,311 204,147
13 🇯🇵 Japan 233 1,753 610.8 552.0 344,686 1,055,513 49,372 21,845 77,232 280,424
14 🇧🇷 Brazil 130 1,453 604.4 531.9 519,071 1,513,479 33,527 149,938 54,774 192,895
15 🇳🇱 Netherlands 232 1,448 548.0 432.9 487,941 991,001 339,799 54,752 31,801 113,489
16 🇮🇳 India 300 1,509 484.0 450.1 1,188,926 1,005,608 63,801 686,912 124,460 335,983
17 🇺🇦 Ukraine 94 1,083 442.8 360.6 264,908 1,196,004 7,847 4,225 59,354 177,315
18 🇹🇭 Thailand 50 794 386.4 368.0 446,399 969,153 8,569 340,642 48,655 219,253
19 🇲🇲 Myanmar 19 536 371.5 368.9 377,334 1,481,396 43,638 40,982 98,845 251,629
20 🇲🇾 Malaysia 66 631 368.2 279.2 139,060 821,081 1,749 83,469 17,702 77,039
21 🇦🇪 United Arab Emirates 10 865 360.3 303.8 101,554 780,794 3,950 15,679 42,356 109,840
22 🇵🇱 Poland 283 892 350.9 322.9 211,161 860,875 20,381 7,004 32,348 82,692
23 🇮🇷 Iran 108 983 318.4 243.3 157,668 1,165,662 3,260 29,859 13,082 104,765
24 🇸🇪 Sweden 167 988 273.2 264.8 126,745 430,696 21,512 2,783 18,496 50,656
25 🇹🇷 Türkiye 87 570 272.1 227.0 268,694 842,597 4,209 36,123 55,842 130,713
26 🇮🇹 Italy 168 673 263.1 261.1 265,315 817,830 23,685 100,055 17,599 68,722
27 🇦🇷 Argentina 64 412 257.3 251.6 339,200 819,300 33,589 41,484 29,416 97,763
28 🇩🇰 Denmark 22 565 256.3 250.3 369,220 719,152 194,235 8,296 20,176 60,376
29 🇷🇴 Romania 91 633 242.6 239.9 192,777 1,091,080 6,707 5,071 27,553 98,506
30 🇫🇮 Finland 42 383 239.3 231.8 126,585 442,436 14,166 2,367 21,442 54,634
31 🇪🇸 Spain 251 659 232.6 220.0 265,869 579,582 15,145 61,646 22,167 63,447
32 🇰🇭 Cambodia 7 427 222.3 222.3 581,388 540,095 13,515 597,642 38,795 179,386
33 🇨🇿 Czechia 84 378 216.0 214.6 211,202 529,498 5,602 5,071 23,140 55,113
34 🇦🇹 Austria 45 850 202.9 199.8 125,373 502,771 17,385 14,242 22,985 82,568
35 🇺🇬 Uganda 19 516 193.1 40.1 210,110 97,690 5,333 116,814 9,743 31,876
36 🇭🇺 Hungary 34 473 173.3 171.4 302,411 1,021,085 14,872 8,332 50,805 124,089
37 🇵🇰 Pakistan 38 425 167.5 141.9 441,809 466,633 16,051 232,921 27,715 116,824
38 🇧🇬 Bulgaria 89 643 162.6 162.6 83,794 508,664 1,792 1,203 18,043 48,284
39 🇸🇬 Singapore 1 414 162.0 152.6 81,730 342,138 5,203 20,569 33,441 60,162
40 🇳🇿 New Zealand 160 605 161.2 141.3 76,612 365,330 4,575 3,368 13,541 53,467
41 🇻🇪 Venezuela 26 620 154.1 129.6 92,844 331,841 4,908 35,984 7,127 68,507
42 🇲🇽 Mexico 73 310 145.3 122.0 125,401 377,330 6,052 21,125 13,579 60,564
43 🇮🇪 Ireland 55 499 143.5 138.5 108,118 310,653 10,483 2,209 13,984 41,030
44 🇧🇾 Belarus 83 281 139.2 78.5 44,011 171,135 1,579 398 9,951 24,933
45 🇳🇴 Norway 68 421 139.1 136.9 85,184 283,525 7,453 1,997 13,853 38,237
46 🇿🇦 South Africa 59 481 138.7 129.4 90,590 325,224 1,701 4,647 12,966 60,022
47 🇸🇾 Syria 13 316 124.6 122.3 216,348 507,868 6,463 16,996 17,203 83,736
48 🇪🇬 Egypt 20 270 107.5 52.0 71,736 235,831 634 8,241 11,975 31,172
49 🇧🇩 Bangladesh 29 298 107.3 107.2 390,478 113,971 74,318 72,325 40,702 85,738
50 🇭🇰 Hong Kong 11 228 107.3 59.1 100,646 99,158 1,443 2,991 19,375 19,435
51 🇵🇹 Portugal 73 226 104.4 104.4 87,578 287,432 2,143 7,460 7,731 31,681
52 🇨🇭 Switzerland 94 302 100.2 92.5 103,933 188,046 21,150 13,360 9,502 24,085
53 🇬🇲 Gambia 29 361 95.4 95.4 226,529 285,640 14,671 20,858 8,740 64,562
54 🇳🇬 Nigeria 35 230 92.0 56.9 216,399 176,420 1,810 32,108 13,929 45,474
55 🇸🇱 Sierra Leone 47 184 79.3 79.1 170,227 48,806 1,877 49,358 4,591 23,204
56 🇯🇴 Jordan 13 250 78.3 78.3 46,155 311,691 181 983 7,319 39,417
57 🇨🇱 Chile 43 160 71.9 23.5 22,163 61,334 775 1,113 2,706 13,174
58 🇲🇳 Mongolia 4 130 71.4 71.4 88,118 304,976 1,881 1,654 9,124 25,710
59 🇭🇷 Croatia 88 281 71.3 71.2 52,249 228,297 4,591 4,309 5,509 19,685
60 🇬🇷 Greece 40 196 66.9 66.0 73,714 265,121 2,806 25,708 6,316 25,638
61 🇨🇾 Cyprus 17 252 66.4 66.2 26,967 202,441 1,081 5,007 4,165 28,218
62 🇪🇪 Estonia 6 302 65.3 65.0 33,674 167,480 1,206 418 8,464 16,981
63 🇧🇪 Belgium 61 191 63.0 62.3 65,468 167,638 14,859 3,856 7,204 23,728
64 🇧🇦 Bosnia and Herzegovina 60 291 62.0 48.8 50,620 157,116 865 576 4,488 13,869
65 🇨🇴 Colombia 36 131 61.7 41.4 86,062 89,103 5,878 39,551 6,101 17,256
66 🇺🇿 Uzbekistan 12 178 53.6 34.6 26,975 209,918 434 194 4,187 17,563
67 🇵🇪 Peru 29 94 53.1 53.1 84,003 147,775 5,452 12,966 9,566 30,312
68 🇹🇼 Taiwan 38 138 50.7 43.7 49,007 115,619 2,523 44,935 4,493 12,517
69 🇷🇸 Serbia 37 146 47.9 46.5 42,935 171,668 1,152 1,224 5,929 14,641
70 🇱🇰 Sri Lanka 15 128 47.7 47.3 70,859 99,910 1,065 25,398 17,602 40,207
71 🇲🇦 Morocco 35 135 47.6 46.9 85,390 175,883 3,788 17,447 5,038 21,670
72 🇦🇿 Azerbaijan 8 112 45.5 45.5 44,791 206,195 690 1,127 6,072 21,374
73 🇶🇦 Qatar 5 98 44.3 44.3 10,603 109,498 434 1,281 5,308 16,307
74 🇪🇹 Ethiopia 8 77 44.1 42.2 104,306 104,629 540 1,978 9,657 31,967
75 🇸🇦 Saudi Arabia 11 110 43.6 32.4 5,107 142,192 118 248 2,833 17,976
76 🇬🇪 Georgia 11 117 42.4 40.3 31,146 170,922 246 1,164 6,716 21,141
77 🇳🇵 Nepal 4 120 38.2 38.1 212,044 71,559 6,035 126,705 10,857 19,965
78 🇱🇻 Latvia 20 123 38.0 34.5 24,270 91,567 1,611 716 3,964 11,579
79 🇱🇧 Lebanon 60 154 35.2 35.2 22,732 146,170 182 7,506 2,695 17,820
80 🇨🇺 Cuba 25 168 34.6 9.9 24,271 5,125 2,110 3,773 719 2,701
81 🇱🇹 Lithuania 10 84 33.5 33.5 31,866 98,334 2,608 715 3,317 7,486
82 🇵🇷 Puerto Rico 60 159 33.1 10.1 3,778 30,191 82 125 280 4,859
83 🇲🇼 Malawi 51 113 32.4 29.9 67,538 30,370 9,781 5,080 1,788 8,925
84 🇰🇿 Kazakhstan 26 113 30.9 30.4 21,562 115,902 260 201 4,020 12,666
85 🇦🇲 Armenia 10 105 30.8 8.2 6,209 40,203 35 64 1,393 5,562
86 🇰🇪 Kenya 58 115 27.0 19.9 62,585 46,029 1,155 12,133 4,453 12,793
87 🇪🇨 Ecuador 15 56 25.4 22.8 27,801 68,164 685 4,730 3,522 12,731
88 🇺🇾 Uruguay 23 90 25.3 25.3 31,932 90,573 2,748 5,257 1,626 12,618
89 🇲🇰 North Macedonia 21 72 24.4 24.4 25,462 86,433 1,764 1,066 2,506 7,806
90 🇲🇩 Moldova 14 107 24.2 24.2 25,864 102,739 302 217 5,075 12,436
91 🇱🇦 Laos 10 60 22.9 22.9 23,497 49,112 526 22,212 1,271 19,464
92 🇧🇴 Bolivia 20 55 21.5 19.3 26,213 42,478 628 4,934 2,728 13,037
93 🇲🇨 Monaco 1 45 20.3 19.5 35,821 30,718 962 12,489 1,542 4,295
94 🇮🇱 Israel 18 68 19.9 19.0 14,470 65,564 2,335 3,088 2,706 5,634
95 🇽🇰 Kosovo 31 93 15.4 13.5 12,872 51,774 508 510 1,264 7,371
96 🇬🇹 Guatemala 9 23 15.3 12.6 13,328 32,754 527 7,132 1,411 9,393
97 🇦🇱 Albania 23 62 14.8 14.8 17,949 45,917 1,604 1,215 1,389 5,350
98 🇩🇿 Algeria 8 35 14.5 14.5 24,662 61,115 133 1,301 1,363 6,805
99 🇨🇬 Congo (Congo-Brazzaville) 5 38 13.9 11.8 26,483 22,471 229 3,047 1,058 5,202
100 🇮🇸 Iceland 14 40 13.2 12.8 7,211 28,191 474 68 952 4,491
101 🇱🇾 Libya 3 39 13.2 13.2 4,891 54,787 79 115 299 6,981
102 🇹🇲 Turkmenistan 1 85 11.9 11.9 3,731 22,595 47 6 812 2,774
103 🇬🇭 Ghana 10 39 11.4 11.4 22,184 27,168 670 4,453 2,213 8,526
104 🇮🇶 Iraq 10 40 11.4 9.6 4,150 33,761 120 477 523 4,834
105 🇴🇲 Oman 10 32 10.9 10.9 2,967 35,947 156 60 742 3,513
106 🇸🇻 El Salvador 6 13 10.8 5.3 7,666 13,960 246 2,318 687 3,575
107 🇭🇳 Honduras 8 23 10.3 7.2 7,734 20,112 380 3,007 1,061 4,816
108 🇲🇪 Montenegro 22 65 10.2 10.2 8,812 38,620 172 751 963 4,063
109 🇹🇿 Tanzania 14 51 9.5 5.2 12,790 7,858 657 3,490 1,331 3,023
110 🇵🇦 Panama 7 22 9.4 3.0 1,682 10,262 55 117 183 2,349
111 🇬🇾 Guyana 6 20 9.0 8.2 8,363 22,593 662 826 1,087 6,297
112 🇸🇮 Slovenia 26 49 8.9 8.5 9,937 25,347 1,570 356 897 2,050
113 🇧🇭 Bahrain 11 42 8.8 8.8 2,007 24,546 182 228 746 3,611
114 🇰🇬 Kyrgyzstan 7 40 8.4 8.4 6,645 30,471 161 69 1,493 4,913
115 🇯🇲 Jamaica 10 30 8.3 8.3 8,835 19,261 220 346 1,458 3,469
116 🇵🇸 Palestine 10 31 8.3 8.3 5,348 26,384 95 244 807 3,880
117 🇸🇰 Slovakia 13 27 8.0 7.4 5,559 22,126 292 193 879 2,484
118 🇬🇮 Gibraltar 1 21 7.9 7.9 7,384 14,720 384 3,883 630 2,258
119 🇲🇹 Malta 31 56 7.6 7.6 3,461 23,323 49 533 757 3,788
120 🇨🇮 Côte d'Ivoire 2 19 7.6 7.6 13,309 29,310 176 1,474 924 4,167
121 🇬🇳 Guinea 6 28 7.5 6.3 18,434 15,992 146 6,364 451 3,611
122 🇱🇺 Luxembourg 12 25 7.0 7.0 8,121 15,294 468 316 914 1,638
123 🇰🇼 Kuwait 2 21 6.9 6.9 2,664 23,894 27 74 1,067 2,654
124 🇱🇷 Liberia 11 43 6.8 6.8 26,168 16,747 120 9,633 970 5,277
125 🇸🇷 Suriname 3 19 6.7 5.4 2,262 16,386 130 506 521 2,645
126 🇿🇼 Zimbabwe 4 26 6.3 6.3 16,477 25,223 110 148 1,292 6,010
127 🇦🇬 Antigua and Barbuda 9 21 6.1 5.7 4,292 10,555 43 25 270 1,908
128 🇵🇾 Paraguay 8 18 5.9 5.9 6,004 19,678 299 3,007 470 4,024
129 🇻🇨 Saint Vincent and the Grenadines 11 25 5.7 5.7 3,913 7,296 23 30 546 1,835
130 🇧🇯 Benin 10 16 5.6 5.6 19,911 10,339 325 12,657 291 2,243
131 🇦🇫 Afghanistan 8 26 5.3 5.3 10,698 15,305 996 694 858 3,172
132 🇨🇫 Central African Republic 3 18 5.3 5.3 33,260 7,691 373 14,433 187 2,431
133 🇱🇮 Liechtenstein 16 59 5.2 5.2 1,156 8,408 176 210 434 1,474
134 🇹🇳 Tunisia 5 15 5.1 5.1 9,163 23,032 173 672 506 3,303
135 🇹🇹 Trinidad and Tobago 3 5 4.6 4.6 1,657 8,274 3 11 228 1,770
136 🇪🇷 Eritrea 11 27 4.6 4.6 14,201 7,216 3,305 138 286 1,719
137 🇦🇩 Andorra 8 45 4.6 4.6 4,008 12,742 84 1,183 644 2,748
138 🇳🇮 Nicaragua 8 17 4.6 4.3 5,973 9,241 589 2,642 460 3,022
139 🇬🇺 Guam 10 41 4.5 4.5 510 14,313 14 33 154 3,039
140 🇲🇴 Macau 2 15 4.5 4.5 3,030 5,239 47 653 889 951
141 🇰🇵 North Korea 1 19 4.4 4.4 14,070 3,924 1,823 102 932 771
142 🇨🇷 Costa Rica 10 19 4.3 4.3 4,316 10,203 253 765 448 2,157
143 🇲🇬 Madagascar 3 11 4.3 4.3 19,088 6,412 2,000 2,699 1,016 3,360
144 🇵🇫 French Polynesia 11 17 4.3 4.3 2,002 10,477 210 975 196 2,538
145 🇸🇳 Senegal 6 16 4.3 4.3 11,200 12,515 159 2,982 463 2,408
146 🇰🇾 Cayman Islands 5 17 4.2 4.2 759 10,150 84 36 319 2,019
147 🇬🇵 Guadeloupe 11 30 4.1 3.9 1,311 12,588 38 117 259 1,792
148 🇦🇴 Angola 2 17 4.1 4.1 11,170 13,849 70 951 1,041 3,558
149 🇿🇲 Zambia 4 13 3.7 3.6 7,055 6,968 408 96 527 2,244
150 🇷🇼 Rwanda 7 14 3.5 2.9 10,556 4,987 638 4,322 326 1,543
151 🇬🇱 Greenland 3 11 3.5 2.8 1,349 2,888 39 2 162 772
152 🇸🇲 San Marino 4 13 3.5 3.5 1,032 8,866 11 245 155 890
153 🇨🇩 Congo (Democratic Republic) 3 16 3.3 3.2 9,462 7,610 66 2,604 289 1,534
154 🇨🇲 Cameroon 9 16 3.2 3.2 9,836 11,413 42 2,935 200 1,714
155 🇫🇯 Fiji 3 9 3.2 3.0 2,017 6,661 6 23 428 1,497
156 🇬🇬 Guernsey 8 20 3.1 3.1 1,510 6,086 113 166 186 974
157 🇱🇨 Saint Lucia 7 20 3.1 2.8 2,447 6,450 16 42 532 1,784
158 🇬🇦 Gabon 6 17 3.0 3.0 4,690 6,478 33 81 182 1,924
159 🇭🇹 Haiti 1 6 2.9 2.9 8,084 4,643 45 1,580 425 2,678
160 🇩🇴 Dominican Republic 7 9 2.9 2.9 3,782 6,949 172 1,872 298 1,352
161 🇸🇴 Somalia 4 15 2.8 2.8 7,097 4,498 21 170 864 2,487
162 🇲🇺 Mauritius 7 13 2.8 2.8 3,494 7,076 76 1,004 455 1,505
163 🇧🇲 Bermuda 4 5 2.7 2.7 658 3,199 24 737 189 700
164 🇳🇨 New Caledonia 1 5 2.6 2.6 675 5,424 49 42 103 1,377
165 🇾🇪 Yemen 3 12 2.5 2.5 7,388 9,522 96 2,496 347 2,781
166 🇰🇲 Comoros 3 5 2.5 2.5 3,578 4,854 55 1,564 87 770
167 🇧🇼 Botswana 4 9 2.3 2.3 1,589 4,779 5 10 174 1,077
168 🇯🇪 Jersey 10 18 2.2 2.2 889 4,543 101 67 148 956
169 🇻🇬 British Virgin Islands 7 17 2.2 2.2 680 5,237 3 49 101 1,193
170 🇰🇳 Saint Kitts and Nevis 3 9 2.1 2.1 1,762 3,245 26 25 174 743
171 🇼🇸 Samoa 1 7 2.0 1.2 392 2,715 0 0 224 588
172 🇷🇪 Réunion 4 6 2.0 2.0 1,205 4,903 31 89 107 632
173 🇹🇯 Tajikistan 2 9 1.9 1.9 2,537 8,973 30 72 355 855
174 🇸🇸 South Sudan 1 5 1.9 1.9 6,672 3,931 76 2,770 166 1,453
175 🇳🇦 Namibia 4 10 1.8 1.8 1,457 3,452 18 11 95 876
176 🇫🇴 Faroe Islands 21 36 1.8 1.8 287 2,560 12 4 124 456
177 🇬🇫 French Guiana 1 3 1.7 1.7 831 5,927 59 387 71 1,292
178 🇮🇲 Isle of Man 8 19 1.6 1.6 1,351 6,939 24 645 209 1,150
179 🇧🇹 Bhutan 2 6 1.6 1.2 1,646 3,041 14 40 91 671
180 🇩🇯 Djibouti 3 5 1.5 1.5 746 1,537 5 116 243 1,306
181 🇱🇸 Lesotho 10 15 1.5 1.5 1,730 2,222 5 11 95 619
182 🇬🇩 Grenada 4 8 1.4 1.4 577 1,762 8 43 97 611
183 🇲🇫 Saint Martin 6 9 1.3 1.3 461 4,156 13 130 100 1,155
184 🇧🇮 Burundi 6 9 1.3 1.3 5,541 2,270 433 313 173 492
185 🇧🇧 Barbados 3 4 1.3 1.3 1,506 2,706 41 7 177 500
186 🇲🇿 Mozambique 5 8 1.3 1.3 1,953 1,850 34 149 119 462
187 🇲🇷 Mauritania 1 3 1.3 1.3 1,854 3,898 74 116 38 937
188 🇪🇭 Western Sahara 3 4 1.3 1.3 726 2,450 34 100 56 564
189 🇹🇬 Togo 6 11 1.2 1.2 2,940 1,458 59 1,696 55 370
190 🇵🇬 Papua New Guinea 2 6 1.2 1.2 1,095 1,656 0 0 216 443
191 🇲🇸 Montserrat 1 3 1.2 1.2 4,465 1,127 267 4,014 383 835
192 🇦🇸 American Samoa 9 13 1.1 1.1 266 2,385 5 1 127 1,119
193 🇧🇸 Bahamas 2 5 1.1 0.9 257 1,383 21 22 55 248
194 🇹🇨 Turks and Caicos Islands 2 4 1.0 1.0 102 1,469 0 2 23 212
195 🇻🇺 Vanuatu 1 5 1.0 1.0 1,038 1,438 14 3 156 601
196 🇹🇩 Chad 1 4 1.0 1.0 3,975 2,890 74 1,962 52 748
197 🇻🇮 United States Virgin Islands 3 5 1.0 1.0 399 2,765 0 7 72 779
198 🇲🇱 Mali 1 2 0.9 0.9 4,487 2,330 29 3,053 173 696
199 🇳🇷 Nauru 11 18 0.9 0.9 329 1,067 4 341 49 571
200 🇧🇫 Burkina Faso 1 5 0.8 0.8 2,932 2,972 321 2,752 55 460
201 🇸🇽 Sint Maarten 4 5 0.8 0.8 570 2,892 7 42 67 613
202 🇦🇼 Aruba 2 3 0.8 0.8 312 2,342 6 9 44 272
203 🇨🇼 Curaçao 1 3 0.8 0.8 32 1,635 0 0 15 195
204 🇦🇽 Åland Islands 1 1 0.8 0.8 110 617 26 4 11 98
205 🇲🇭 Marshall Islands 3 3 0.8 0.8 114 333 0 0 13 95
206 🇧🇳 Brunei 3 4 0.8 0.8 74 1,391 1 4 27 145
207 🇸🇯 Svalbard and Jan Mayen 1 3 0.7 0.7 60 497 5 5 39 169
208 🇧🇿 Belize 3 5 0.7 0.7 404 1,571 61 91 49 519
209 🇧🇶 Bonaire, Sint Eustatius and Saba 1 1 0.7 0.7 236 1,737 21 82 27 695
210 🇬🇶 Equatorial Guinea 1 5 0.7 0.7 805 2,063 12 9 51 373
211 🇫🇲 Micronesia 3 3 0.6 0.6 164 661 0 0 6 148
212 🇳🇪 Niger 1 2 0.6 0.6 2,224 1,023 66 266 7 126
213 🇵🇼 Palau 4 5 0.6 0.6 23 521 3 3 9 126
214 🇦🇮 Anguilla 4 5 0.6 0.6 57 769 0 1 15 178
215 🇸🇩 Sudan 2 6 0.6 0.6 1,080 3,294 8 181 140 654
216 🇧🇱 Saint Barthélemy 2 3 0.5 0.5 214 1,343 0 222 22 510
217 🇲🇵 Northern Mariana Islands 2 5 0.5 0.5 109 1,729 3 0 20 300
218 🇲🇻 Maldives 2 4 0.5 0.5 1,597 751 57 1,488 36 187
219 🇵🇲 Saint Pierre and Miquelon 1 1 0.4 0.4 76 1,119 2 5 18 372
220 🇹🇴 Tonga 1 1 0.4 0.4 92 810 1 1 41 256
221 🇸🇿 Eswatini 3 3 0.4 0.4 595 784 1 1 37 156
222 🇹🇻 Tuvalu 1 2 0.4 0.4 109 65 3 191 6 38
223 🇫🇰 Falkland Islands 1 4 0.3 0.3 37 82 0 0 18 93
224 🇨🇰 Cook Islands 2 5 0.3 0.3 88 329 7 125 10 73
225 🇸🇨 Seychelles 3 3 0.3 0.3 275 603 10 12 42 175
226 🇸🇭 Saint Helena 2 3 0.3 0.3 59 333 0 6 28 107
227 🇩🇲 Dominica 1 2 0.3 0.3 192 446 1 8 19 141
228 🇹🇱 Timor-Leste 5 5 0.3 0.3 274 124 0 83 31 59
229 🇳🇫 Norfolk Island 1 2 0.3 0.3 4 16 0 0 3 8
230 🇨🇻 Cabo Verde 2 2 0.2 0.2 301 546 17 16 29 144
231 🇲🇶 Martinique 3 4 0.2 0.2 99 545 1 6 7 69
232 🇸🇹 Sao Tome and Principe 1 1 0.2 0.2 491 196 20 193 6 91
233 🇬🇼 Guinea-Bissau 1 1 0.2 0.2 721 463 4 40 23 93
234 🇾🇹 Mayotte 2 2 0.2 0.2 125 253 0 25 20 50
235 🇸🇧 Solomon Islands 1 2 0.1 0.1 166 379 0 0 37 135
236 🇨🇽 Christmas Island 1 1 0.1 0.1 56 127 0 1 7 32
237 🇳🇺 Niue 3 3 0.1 0.1 0 39 0 0 3 9
238 🇰🇮 Kiribati 2 2 0.1 0.1 71 96 5 17 8 30
Top 200 cities by footage
# City Country Videos Footage (h) Analysed (h) Persons Cars Bicycles Motorcycles Buses Trucks
1 New York, NY 🇺🇸 United States 4,154 2,268.9 1,444.8 1,706,401 5,052,176 129,512 64,473 183,174 787,499
2 Chicago, IL 🇺🇸 United States 1,896 1,713.9 1,361.7 557,028 4,660,659 30,176 9,676 71,355 609,334
3 London 🇬🇧 United Kingdom 2,029 1,358.5 1,178.4 2,453,710 2,498,403 247,264 144,524 234,765 459,569
4 Los Angeles, CA 🇺🇸 United States 2,043 1,162.5 894.0 537,321 3,352,836 28,868 13,836 53,046 473,977
5 Hanoi 🇻🇳 Vietnam 2,153 876.1 837.6 2,271,937 1,607,428 63,791 2,164,743 100,239 215,239
6 Manila, Metro Manila 🇵🇭 Philippines 2,148 781.6 778.8 1,145,457 1,371,466 36,235 601,253 162,779 342,650
7 Sydney, NSW 🇦🇺 Australia 1,432 682.1 501.9 271,359 1,892,879 20,266 23,030 48,875 330,708
8 Saint Petersburg, Saint Petersburg 🇷🇺 Russia 689 566.0 566.0 290,101 1,405,043 6,951 1,923 68,078 166,481
9 Seoul 🇰🇷 South Korea 293 542.9 516.6 229,316 902,725 13,254 38,006 74,720 86,184
10 Jakarta 🇮🇩 Indonesia 1,644 463.3 447.8 746,405 985,480 6,244 663,413 59,104 232,593
11 Paris 🇫🇷 France 975 436.1 409.2 552,903 1,036,028 67,843 87,489 31,039 121,109
12 Toronto, ON 🇨🇦 Canada 924 399.7 391.4 463,377 1,279,686 42,527 12,535 26,332 146,625
13 Yangon 🇲🇲 Myanmar 488 357.1 354.5 350,278 1,460,982 40,640 20,580 95,807 243,678
14 Melbourne, VIC 🇦🇺 Australia 670 329.6 274.2 199,141 994,924 12,797 10,296 18,731 115,711
15 Moscow, Moscow 🇷🇺 Russia 505 327.5 305.9 198,432 972,537 4,619 3,304 33,888 137,535
16 Philadelphia, PA 🇺🇸 United States 562 315.7 297.7 142,077 960,721 8,349 4,166 14,431 144,502
17 Dubai 🇦🇪 United Arab Emirates 745 311.6 260.1 81,498 623,309 2,874 13,966 36,942 89,583
18 Bangkok 🇹🇭 Thailand 607 303.2 292.8 378,040 805,865 6,907 266,751 40,184 164,837
19 Cotabato, Maguindanao del Norte 🇵🇭 Philippines 693 287.1 287.1 729,903 576,485 15,873 519,204 96,566 403,247
20 Sao Paulo, SP 🇧🇷 Brazil 567 251.5 248.9 236,579 682,482 11,189 61,981 21,273 88,328
21 København 🇩🇰 Denmark 529 244.7 238.7 363,421 698,970 192,474 8,042 19,601 58,402
22 Kyiv, Kyiv 🇺🇦 Ukraine 569 240.6 234.5 163,823 890,032 4,840 2,486 39,375 123,287
23 Kuala Lumpur, KUL 🇲🇾 Malaysia 346 237.3 156.3 95,099 460,754 718 49,102 10,679 38,508
24 Warsaw 🇵🇱 Poland 371 227.2 218.0 151,696 647,305 14,195 5,468 23,763 54,370
25 Berlin 🇩🇪 Germany 459 219.4 210.4 252,279 781,310 81,816 20,448 27,597 102,307
26 Buenos Aires, CABA 🇦🇷 Argentina 286 216.7 212.5 303,287 708,316 30,223 34,209 27,282 78,056
27 Townsville, QLD 🇦🇺 Australia 436 207.5 6.2 959 15,490 61 115 259 3,646
28 Detroit, MI 🇺🇸 United States 558 205.9 198.8 25,570 548,493 1,192 808 5,802 92,523
29 Guangzhou, Guangdong 🇨🇳 China 245 205.8 205.8 129,697 565,446 13,030 48,679 36,144 74,742
30 Montreal, QC 🇨🇦 Canada 470 202.5 202.5 114,906 570,680 13,299 3,268 10,961 50,197
31 Phnom Penh 🇰🇭 Cambodia 387 201.9 201.9 547,864 502,464 12,588 564,323 35,663 166,564
32 Helsinki 🇫🇮 Finland 282 198.1 195.5 107,865 388,813 10,614 1,719 19,427 48,452
33 Rio de Janeiro, RJ 🇧🇷 Brazil 448 195.7 145.2 157,425 441,215 11,282 27,791 23,171 47,546
34 Prague 🇨🇿 Czechia 241 188.2 187.1 198,447 462,120 5,078 4,823 20,212 45,241
35 Miami, FL 🇺🇸 United States 467 186.8 144.8 96,891 433,052 5,809 7,981 6,482 59,999
36 Kampala 🇺🇬 Uganda 466 176.4 40.1 210,110 97,690 5,333 116,814 9,743 31,876
37 Vienna 🇦🇹 Austria 714 173.7 172.5 103,254 436,287 11,849 12,577 20,222 74,380
38 Istanbul 🇹🇷 Türkiye 317 172.5 128.9 160,023 494,905 1,408 20,086 34,516 76,076
39 Eindhoven 🇳🇱 Netherlands 329 171.2 171.1 157,940 402,576 109,956 15,504 10,035 39,405
40 Yogyakarta 🇮🇩 Indonesia 298 171.0 168.9 505,006 332,763 7,633 519,508 13,346 70,159
41 Perth, WA 🇦🇺 Australia 418 170.9 99.6 18,366 242,204 1,209 1,154 5,082 44,734
42 Tokyo, Tokyo 🇯🇵 Japan 253 170.2 139.2 176,774 250,287 19,589 9,299 26,281 76,096
43 Stockholm 🇸🇪 Sweden 549 170.0 167.9 84,535 272,625 13,009 1,853 12,814 33,713
44 Nashville, TN 🇺🇸 United States 854 168.2 24.6 29,278 58,625 293 243 1,472 9,800
45 Bucharest 🇷🇴 Romania 325 166.7 164.2 126,986 768,567 4,781 4,178 19,656 68,103
46 Budapest 🇭🇺 Hungary 432 166.0 164.3 297,919 1,006,590 14,328 8,210 50,346 122,520
47 Singapore 🇸🇬 Singapore 414 162.0 152.6 81,730 342,138 5,203 20,569 33,441 60,162
48 Vancouver, BC 🇨🇦 Canada 669 160.7 40.3 37,238 127,551 4,288 745 2,760 18,383
49 Sacramento, CA 🇺🇸 United States 413 159.5 158.0 17,385 548,148 1,273 972 6,082 97,520
50 Atlanta, GA 🇺🇸 United States 372 159.4 154.4 31,624 380,748 1,267 941 4,942 79,393
51 Houston, TX 🇺🇸 United States 238 158.9 36.3 9,135 87,402 303 110 1,334 15,737
52 Oldenburg 🇩🇪 Germany 172 152.7 150.0 80,109 221,155 43,435 3,352 7,404 22,413
53 Tyumen, Tyumen oblast 🇷🇺 Russia 306 147.5 147.3 92,426 428,881 1,999 537 19,867 49,241
54 Winnipeg, MB 🇨🇦 Canada 504 137.4 49.7 18,868 158,186 1,061 373 2,979 25,269
55 San Jose, CA 🇺🇸 United States 288 134.9 133.8 25,398 580,106 1,714 1,093 6,796 82,755
56 Sofia 🇧🇬 Bulgaria 429 132.4 132.4 68,315 419,963 1,316 910 15,132 36,911
57 San Francisco, CA 🇺🇸 United States 194 128.0 119.3 151,893 375,262 8,128 6,349 10,175 49,048
58 Den Haag 🇳🇱 Netherlands 259 126.8 24.4 17,237 73,901 11,683 2,891 2,087 7,860
59 Anchorage, AK 🇺🇸 United States 347 125.1 121.6 5,832 174,761 276 177 2,765 43,598
60 Dallas, TX 🇺🇸 United States 295 124.9 120.6 13,586 211,948 365 345 2,841 37,571
61 Washington, DC 🇺🇸 United States 217 123.9 118.0 80,735 353,897 6,526 2,341 8,202 47,413
62 Tehran 🇮🇷 Iran 266 122.4 55.3 40,265 267,292 1,103 15,061 4,567 24,450
63 Busan 🇰🇷 South Korea 143 121.7 121.7 66,773 304,102 2,522 8,513 12,317 38,578
64 Las Vegas, NV 🇺🇸 United States 172 120.0 69.4 39,565 173,761 326 591 3,586 22,099
65 Maracaibo, ZU 🇻🇪 Venezuela 505 119.6 119.2 80,947 307,185 4,467 30,463 6,089 63,208
66 Dublin 🇮🇪 Ireland 392 119.5 114.8 94,809 261,693 9,941 2,021 12,669 34,841
67 Oslo 🇳🇴 Norway 312 116.5 115.0 70,501 249,450 6,475 1,640 11,863 33,043
68 Portland, OR 🇺🇸 United States 183 113.1 90.5 55,768 215,451 3,746 872 4,358 27,877
69 Volsk, Saratov oblast 🇷🇺 Russia 502 111.2 0.0 – – – – – –
70 Phoenix, AZ 🇺🇸 United States 235 110.1 39.8 9,745 96,185 457 292 1,412 19,898
71 Amsterdam 🇳🇱 Netherlands 205 109.6 108.3 238,339 214,152 173,948 28,103 10,986 30,853
72 Hong Kong 🇭🇰 Hong Kong 199 99.3 56.2 95,898 94,454 1,185 2,867 18,406 18,096
73 Mumbai, MH 🇮🇳 India 263 98.5 93.0 232,809 317,101 6,219 94,627 18,328 71,425
74 Seattle, WA 🇺🇸 United States 204 97.4 0.0 – – – – – –
75 Darwin, NT 🇦🇺 Australia 310 93.9 44.6 12,507 95,060 454 930 1,832 19,780
76 Cairo 🇪🇬 Egypt 206 91.6 39.0 59,798 204,076 503 6,928 9,885 25,205
77 Kermanshah 🇮🇷 Iran 247 89.6 88.5 58,357 510,160 573 3,502 3,744 42,344
78 Cape Town 🇿🇦 South Africa 229 86.4 82.8 55,930 233,672 1,332 3,815 7,796 39,276
79 Minsk 🇧🇾 Belarus 115 84.8 24.1 18,245 94,211 457 216 4,464 11,568
80 München 🇩🇪 Germany 169 81.8 81.8 80,877 260,636 26,811 4,455 10,029 33,084
81 Baltimore, MD 🇺🇸 United States 210 80.6 79.2 21,870 240,536 474 424 3,940 36,626
82 Serrekunda 🇬🇲 Gambia 267 77.0 77.0 179,757 252,094 10,645 17,150 6,831 52,811
83 Sylhet 🇧🇩 Bangladesh 194 74.5 74.5 302,421 78,883 58,803 56,760 26,739 63,853
84 Ho Chi Minh City 🇻🇳 Vietnam 140 73.8 55.0 168,431 72,961 3,064 173,005 6,858 17,849
85 Denver, CO 🇺🇸 United States 204 71.6 58.4 16,772 113,558 1,325 582 2,031 20,464
86 Gamagori, Aichi 🇯🇵 Japan 266 70.3 68.8 12,856 144,912 3,164 1,480 6,700 38,038
87 Ulaanbaatar 🇲🇳 Mongolia 127 70.2 70.2 87,943 304,331 1,879 1,639 9,117 25,617
88 San Diego, CA 🇺🇸 United States 94 68.3 65.1 50,800 209,892 2,225 1,785 3,279 32,191
89 Brisbane, QLD 🇦🇺 Australia 179 68.2 67.5 31,363 187,883 1,308 1,918 4,481 34,722
90 Karachi, SD 🇵🇰 Pakistan 147 67.1 58.4 186,698 238,894 6,397 95,433 16,302 55,090
91 Damascus 🇸🇾 Syria 148 65.6 65.6 100,239 279,804 4,492 11,104 10,387 43,459
92 Amman 🇯🇴 Jordan 199 61.9 61.9 35,564 263,325 107 881 5,889 32,157
93 Semarang 🇮🇩 Indonesia 322 61.7 61.5 85,584 91,843 1,616 85,609 6,698 31,419
94 Auckland 🇳🇿 New Zealand 142 61.5 58.7 43,978 159,198 2,536 1,631 6,578 19,959
95 Denpasar 🇮🇩 Indonesia 28 60.6 36.5 125,556 57,117 2,188 142,913 2,004 15,020
96 Tallinn 🇪🇪 Estonia 281 60.4 60.4 31,328 158,890 1,075 374 8,114 15,862
97 Calgary, AB 🇨🇦 Canada 170 60.0 54.5 15,237 130,767 699 195 1,970 22,194
98 Ninh Binh 🇻🇳 Vietnam 197 58.2 55.8 61,841 55,887 6,806 71,260 3,687 15,457
99 Beijing, Beijing 🇨🇳 China 130 57.2 57.2 45,355 162,551 11,268 11,586 10,206 8,844
100 Catania 🇮🇹 Italy 144 56.5 56.5 17,124 125,837 199 8,707 1,660 6,666
101 Delhi, DL 🇮🇳 India 163 55.9 37.8 51,595 94,506 2,173 20,504 11,917 17,356
102 Boston, MA 🇺🇸 United States 108 54.0 35.0 53,953 96,954 2,750 769 2,391 14,297
103 Milan 🇮🇹 Italy 101 52.9 52.9 73,742 184,386 10,189 16,478 3,902 15,866
104 Orlando, FL 🇺🇸 United States 113 52.1 40.8 13,575 112,764 1,122 583 1,983 16,372
105 Aleppo 🇸🇾 Syria 137 51.0 50.3 109,909 209,868 1,733 4,556 6,149 36,402
106 Shenzhen, Guangdong 🇨🇳 China 141 50.8 46.2 37,599 113,673 4,293 13,064 9,837 13,954
107 Honolulu, HI 🇺🇸 United States 118 49.7 24.0 15,235 58,589 959 667 1,444 8,390
108 Shanghai, Shanghai 🇨🇳 China 65 49.1 40.0 53,160 86,157 6,478 14,750 6,013 6,637
109 Ben Tre 🇻🇳 Vietnam 99 49.0 44.6 140,156 31,560 4,697 138,142 3,292 11,874
110 Barcelona 🇪🇸 Spain 100 48.3 41.3 66,762 92,102 7,090 28,619 5,776 12,996
111 Santiago 🇨🇱 Chile 85 48.1 2.4 3,844 8,094 171 358 608 919
112 Mexico City, CDMX 🇲🇽 Mexico 75 47.2 42.4 52,019 120,584 2,579 4,669 4,066 12,100
113 Kolkata, WB 🇮🇳 India 150 46.6 45.6 119,686 74,046 21,248 34,029 18,923 35,086
114 Ninohe, Iwate 🇯🇵 Japan 247 44.2 44.2 7,095 74,697 390 333 5,606 24,760
115 Lviv, Lviv oblast 🇺🇦 Ukraine 145 44.2 16.3 25,400 44,522 386 202 2,937 6,041
116 Sarajevo 🇧🇦 Bosnia and Herzegovina 158 44.0 30.8 37,053 107,527 389 316 3,220 8,656
117 Toyohashi, Aichi 🇯🇵 Japan 158 43.3 42.6 10,689 87,598 2,765 875 4,699 24,684
118 Colombo 🇱🇰 Sri Lanka 106 43.0 42.8 63,356 88,764 843 21,477 15,464 34,393
119 Adelaide, SA 🇦🇺 Australia 123 42.5 42.1 9,398 127,687 911 567 2,790 17,139
120 Addis Ababa 🇪🇹 Ethiopia 68 42.3 40.4 97,122 102,712 472 1,800 8,940 30,449
121 Mashhad 🇮🇷 Iran 224 41.4 41.4 16,596 134,177 402 3,860 2,156 6,318
122 Surabaya 🇮🇩 Indonesia 106 41.1 37.9 71,753 59,969 1,193 62,451 1,969 10,740
123 Nam Dinh 🇻🇳 Vietnam 128 40.9 35.6 63,624 44,482 5,773 74,649 1,685 8,048
124 Zaozhuang, Shandong 🇨🇳 China 122 39.9 39.9 23,493 126,774 1,344 13,859 5,983 19,760
125 Doha 🇶🇦 Qatar 78 39.5 39.5 10,088 100,428 407 1,230 4,807 14,696
126 Zürich, ZH 🇨🇭 Switzerland 76 39.4 39.4 53,676 80,646 9,908 5,253 4,172 10,945
127 Austin, TX 🇺🇸 United States 69 39.0 33.8 18,344 88,770 1,449 789 1,443 18,723
128 Jersey City, NJ 🇺🇸 United States 104 38.6 31.5 13,242 96,385 1,040 613 1,785 12,427
129 Baku 🇦🇿 Azerbaijan 91 38.3 38.3 37,213 189,258 524 1,048 5,479 17,773
130 Madrid 🇪🇸 Spain 75 38.2 37.4 49,386 92,021 1,480 8,534 5,202 9,817
131 Rome 🇮🇹 Italy 73 37.7 36.8 57,411 145,068 2,234 12,687 3,480 10,865
132 Lisbon 🇵🇹 Portugal 70 37.3 37.3 30,103 111,823 1,071 3,689 3,349 11,815
133 Brussels 🇧🇪 Belgium 82 37.1 37.1 43,354 104,356 6,663 2,438 4,921 14,586
134 Nicosia 🇨🇾 Cyprus 126 37.0 37.0 10,741 121,456 466 2,889 2,331 16,521
135 Freetown 🇸🇱 Sierra Leone 90 36.7 36.7 93,685 39,617 676 21,317 3,852 18,564
136 Kathmandu 🇳🇵 Nepal 112 35.8 35.6 207,593 69,547 5,489 123,918 10,451 18,978
137 Wellington 🇳🇿 New Zealand 118 35.7 34.8 17,968 92,977 986 1,071 3,114 12,604
138 Zagreb 🇭🇷 Croatia 94 35.7 35.7 27,055 131,851 2,828 958 3,139 9,776
139 Johor Bahru, JHR 🇲🇾 Malaysia 30 35.1 29.1 10,728 110,190 179 7,636 2,193 9,741
140 Kharkiv, Kharkiv oblast 🇺🇦 Ukraine 75 35.1 4.2 1,736 13,439 43 22 377 1,815
141 Lagos, Lagos 🇳🇬 Nigeria 73 35.1 34.3 150,463 103,955 1,369 17,007 9,246 27,667
142 Genoa 🇮🇹 Italy 73 35.1 34.3 46,192 126,323 928 38,965 3,751 12,946
143 Asaba, Delta 🇳🇬 Nigeria 77 34.3 0.8 1,748 2,602 8 88 354 986
144 Chennai, TN 🇮🇳 India 46 34.0 34.0 86,371 43,707 1,507 39,207 14,592 23,969
145 Riga 🇱🇻 Latvia 97 33.9 31.0 22,370 85,284 1,482 673 3,787 10,979
146 Thessaloniki 🇬🇷 Greece 81 33.8 33.4 42,570 158,855 1,217 12,761 3,361 13,565
147 Belgrade 🇷🇸 Serbia 96 32.7 32.1 31,196 132,090 446 949 4,988 10,467
148 Bengaluru, KA 🇮🇳 India 92 32.6 30.2 68,846 64,323 1,172 44,449 10,857 23,174
149 Tampa, FL 🇺🇸 United States 52 32.4 30.2 9,708 77,906 599 383 907 12,090
150 Birmingham 🇬🇧 United Kingdom 115 31.4 31.4 15,647 99,371 452 331 3,131 12,724
151 Goiânia, GO 🇧🇷 Brazil 69 30.8 28.6 15,464 75,395 807 8,488 1,145 8,074
152 Rotterdam 🇳🇱 Netherlands 78 30.7 30.7 28,374 79,600 15,394 3,276 2,296 8,649
153 Edmonton, AB 🇨🇦 Canada 56 30.4 28.8 6,735 90,209 385 216 1,400 13,357
154 Riyadh 🇸🇦 Saudi Arabia 68 29.9 18.7 2,912 92,150 52 182 2,073 12,038
155 Tbilisi 🇬🇪 Georgia 75 29.6 28.3 21,518 126,225 124 1,027 4,603 14,487
156 Chengdu, Sichuan 🇨🇳 China 54 29.1 27.9 17,124 108,684 2,470 5,470 4,274 8,164
157 Kansas City, KS 🇺🇸 United States 53 29.1 26.4 3,353 60,130 91 68 826 10,550
158 Toshkent 🇺🇿 Uzbekistan 85 28.2 26.2 19,360 169,476 198 76 3,115 12,382
159 Milton Keynes 🇬🇧 United Kingdom 50 27.7 27.7 1,573 56,289 173 185 751 5,888
160 Yerevan 🇦🇲 Armenia 89 27.1 5.3 4,343 32,103 30 60 1,184 3,979
161 Lahore, PB 🇵🇰 Pakistan 89 26.9 11.7 37,406 45,089 1,435 23,507 1,479 8,244
162 Omaha, NE 🇺🇸 United States 82 26.7 7.4 1,386 18,252 56 39 212 3,181
163 Manchester 🇬🇧 United Kingdom 61 26.4 26.2 18,914 68,504 978 268 2,393 8,171
164 Havana 🇨🇺 Cuba 132 26.3 1.8 6,648 1,806 219 1,028 238 768
165 Pittsburgh, PA 🇺🇸 United States 54 25.8 23.9 13,181 49,044 580 242 1,098 7,794
166 Cherepovets, Vologda oblast 🇷🇺 Russia 176 25.0 24.5 25,909 71,495 65 25 4,084 10,354
167 Thiruvananthapuram, KL 🇮🇳 India 74 24.7 24.5 62,049 56,188 1,007 59,061 6,669 21,952
168 Lima, LI 🇵🇪 Peru 36 24.3 24.3 42,349 99,765 4,224 6,467 4,832 12,191
169 Frankfurt 🇩🇪 Germany 20 24.3 0.0 – – – – – –
170 Vilnius 🇱🇹 Lithuania 60 24.2 24.2 26,719 69,153 2,302 624 2,342 4,938
171 Daejeon 🇰🇷 South Korea 60 24.0 23.9 9,482 70,925 1,046 1,140 2,785 5,925
172 Islamabad, ICT 🇵🇰 Pakistan 57 23.9 23.6 29,256 69,216 1,253 13,868 2,143 9,481
173 Stavropol, Stavropol krai 🇷🇺 Russia 79 23.9 23.9 13,437 84,585 262 83 3,340 8,224
174 New Orleans, LA 🇺🇸 United States 34 23.7 21.8 23,581 52,522 1,217 356 1,248 11,118
175 Samarkand 🇺🇿 Uzbekistan 81 23.6 6.5 5,900 34,462 121 104 871 4,017
176 Charleston, SC 🇺🇸 United States 38 23.0 23.0 24,457 54,823 932 308 853 12,763
177 Sendai, Miyagi 🇯🇵 Japan 58 22.7 22.5 6,181 53,941 896 511 3,157 12,835
178 Ōsaka, Ōsaka 🇯🇵 Japan 52 22.5 21.2 29,007 41,703 7,570 1,635 3,054 9,231
179 Porto 🇵🇹 Portugal 27 22.4 22.4 29,125 56,586 360 1,671 1,825 6,486
180 Hangzhou, Zhejiang 🇨🇳 China 28 22.3 8.8 6,651 23,852 411 2,726 1,181 1,997
181 San Antonio, TX 🇺🇸 United States 26 22.2 11.1 8,981 21,950 350 146 423 4,316
182 Kyoto, Kyōto 🇯🇵 Japan 45 21.9 19.7 26,428 38,391 3,395 2,054 4,409 10,184
183 Taipei 🇹🇼 Taiwan 49 21.8 19.6 25,569 49,857 1,741 20,972 3,186 6,147
184 Cheongju 🇰🇷 South Korea 65 21.7 21.1 6,168 57,371 316 676 2,049 7,607
185 Ottawa, ON 🇨🇦 Canada 37 21.3 21.3 25,772 53,063 2,916 395 1,347 5,874
186 Chiang Mai 🇹🇭 Thailand 53 21.0 21.0 15,632 41,695 507 15,811 1,510 12,962
187 Sapporo, Hokkaidō 🇯🇵 Japan 61 20.9 20.8 7,760 35,309 523 92 2,059 4,800
188 Halifax, NS 🇨🇦 Canada 82 20.8 20.0 8,200 48,062 297 138 898 5,361
189 Medellín, ANT 🇨🇴 Colombia 53 20.8 2.9 5,392 7,277 141 1,864 478 962
190 Beirut 🇱🇧 Lebanon 68 20.5 20.5 16,855 101,182 106 6,178 1,850 10,127
191 Monaco 🇲🇨 Monaco 45 20.3 19.5 35,821 30,718 962 12,489 1,542 4,295
192 Manaus, AM 🇧🇷 Brazil 75 19.8 19.3 18,745 67,239 201 9,711 2,259 10,500
193 Chișinău 🇲🇩 Moldova 70 19.7 19.7 22,351 92,843 170 173 4,535 10,741
194 Ankara 🇹🇷 Türkiye 47 19.3 19.3 16,485 89,827 48 855 4,883 9,579
195 Malibu, CA 🇺🇸 United States 34 19.2 16.7 4,065 67,359 276 452 785 14,381
196 Nice 🇫🇷 France 32 19.0 18.2 31,342 47,380 3,513 7,303 1,300 5,498
197 Pattaya 🇹🇭 Thailand 35 19.0 13.0 15,622 32,422 200 13,824 1,828 10,178
198 Skopje 🇲🇰 North Macedonia 39 18.9 18.9 21,132 71,350 1,425 755 2,142 6,384
199 Johannesburg 🇿🇦 South Africa 76 18.6 18.2 14,194 42,414 66 428 2,293 8,813
200 Roseville, CA 🇺🇸 United States 46 18.4 18.4 1,251 69,292 107 123 559 12,479

Citation and usage of code

If you use this work for academic work please cite the following paper:

Alam, M. S., Bazilinska, O., & Bazilinskyy, P. (2026). A global dataset of continuous urban dashcam driving. arXiv preprint arXiv:2604.01044. Under review. Available at https://arxiv.org/abs/2604.01044

What the dataset contains, how it was collected and its known biases are described in the datasheet. Citation metadata is in CITATION.cff.

The code is open-source and free to use. It is aimed for, but not limited to, academic research. We welcome forking of this repository, pull requests, and any contributions in the spirit of open science and open-source code. For inquiries about collaboration, you may contact Md Shadab Alam (md_shadab_alam@outlook.com) or Pavlo Bazilinskyy (p.bazilinskyy@tue.nl).

Repository layout

Top folder: processing the videos and the analysis

  • main.py: downloads the videos of the mapping (from the FTP server, else YouTube) and runs YOLO tracking on their segments, writing one detection CSV per segment to the data folders; runs in a loop. helper_script.py holds its download, trimming and tracking code.
  • analysis.py: the tables, maps and figures of the dataset and the statistics in this README, from the mapping and, when available, the YOLO detections. count_detections.py counts the detections where the CSVs are and saves the counts (analysis_data/detection_counts.csv.gz), so that analysis.py and the GitHub Action can use them without the CSVs.
  • add_video.py: the page for adding videos and segments to the mapping by hand (templates in templates/).
  • common.py (configs, secrets, country codes, git, email), custom_logger.py and logmod.py (logging): shared by all scripts.

Top folder: proposing segments from YouTube channels (see Proposing segments)

  • propose_segments.py: proposes segments, localities, time of day and vehicle of a channel's videos, and serves the review page of a batch.
  • run_channels.py: works through the channels sheet, batch by batch; refresh_queue.py builds the queue of channels to look at again for new uploads.
  • review_hub.py: the page listing the batches to review, and applying and pushing reviewed segments.
  • sync_workers.py: brings the batches of the worker machines to the reviewing machine and the mapping to them.
  • review_merges.py: merging towns into the city whose metropolitan area they lie in; review_lessons.py: what the reviews say about the proposals.

Folders

  • utils/: the analysis and figure code used by analysis.py:
    • core/parsing.py (the mapping's list cells, the processed length of a segment), core/dataset_stats.py (totals);
    • analytics/contributors.py (who added each video), analytics/metrics_cache.py (YOLO class IDs, unique keys);
    • plotting/dataset_figures.py (the README figures), plotting/area_figures.py (county, region, smoothed and spike maps), plotting/maps.py (world and continent maps), plotting/map_labels.py (label placement), plotting/hover.py (popups shared by all figures), plotting/io.py (saving figures), plotting/constants.py.
  • release/: the weekly metadata update and the release files (update_info.py, make_crowd_jsonl.py, split_large_files.py, validation_release.py, weekly_metadata.sh); make_splits.py (the train, validation and test splits and the balancing weights in crowd_splits.csv: grouped by channel or by locality, so no source is in two splits); and the manual audits: sample_audit.py draws the stratified samples, audit_stats.py scores the label audit and evaluate_detections.py the detections from the manual review; annotate.py is the local browser tool for those audits (labels, review of the detector's boxes in frames, tracking errors in clips), which finds the videos and detection files in any number of folders.
  • tools/: maintenance scripts for the mapping and the data, e.g. download_videos.py, video_inventory.py, update_traffic_index.py, update_params.py and weekly_detection_counts.sh; the review of cuts is detect_cuts.py (candidates), review_cuts.py (the review page) and apply_cuts.py (splits the mapping and the detection files at the confirmed cuts).
  • dashboards/: pages and widgets that follow the pipeline (its own README).
  • analysis_data/: data files the analysis reads and writes: country tables (countries.csv, height_data.csv), the YOLO detection counts (detection_counts.csv.gz) and who added which video (video_contributors.csv). The mapping and metadata files (mapping.csv, mapping-NAME.csv, mapping_metadata.csv, crowd_index.jsonl, ...) and cut_times.csv stay in the top folder.
  • figures/: the figures of this README (PNG, HTML and, when made on purpose, EPS), and figure_hashes.json, which records what each file was made from, so that only changed figures are saved again (see Step 11); readme/ and screenshots/: images of this README and of the figures.
  • logs/: records kept by the scripts (traffic_index_log.csv, appended by tools/update_traffic_index.py).
  • archive/: old files no code uses any more (mappingsubmitted.csv).
  • tests/: tests of the scripts.
  • .github/workflows/: the weekly refresh of the README statistics and figures (dataset-figures.yml) and the linter.

Run the scripts with the virtual environment active (see Step 11).

Getting started

Tested with Python 3.12.13 and the uv package manager.

The project is configured to automatically select the appropriate PyTorch backend. On systems with a supported NVIDIA GPU and CUDA driver, uv installs a CUDA enabled version of PyTorch. If no supported GPU is detected, it automatically falls back to the CPU version.

Step 1: Install uv

uv is a fast Python package and environment manager.

macOS / Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

Windows PowerShell:

irm https://astral.sh/uv/install.ps1 | iex

Alternative, if Python and pip are already installed:

pip install uv

Step 2: Fix permissions if needed

In some environments, uv may need to create directories under:

macOS / Linux:

~/.local/share/uv/python

Windows:

%LOCALAPPDATA%\uv\python

If these directories were previously created by another user or with elevated privileges, you may encounter an error such as:

error: failed to create directory ... Permission denied (os error 13)

macOS / Linux

mkdir -p ~/.local/share/uv
chown -R "$(id -un)":"$(id -gn)" ~/.local/share/uv
chmod -R u+rwX ~/.local/share/uv

Windows PowerShell

New-Item -ItemType Directory -Force "$env:LOCALAPPDATA\uv"

icacls "$env:LOCALAPPDATA\uv" /grant "$($env:UserName):(OI)(CI)F"

Step 3: Verify uv

Check that uv is available:

uv --version

Step 4: Clone the repository

git clone https://github.com/crowd-dataset/crowd.git
cd crowd

Step 5: Install Python 3.12.13

The project is tested with Python 3.12.13.

Install it using uv:

uv python install 3.12.13

The repository contains a .python-version file so that uv can automatically select the correct Python version.

Step 6: Create the virtual environment

Create a virtual environment in .venv using Python 3.12.13:

uv venv --python 3.12.13

Step 7: Activate the virtual environment

macOS / Linux:

source .venv/bin/activate

Windows PowerShell:

.\.venv\Scripts\Activate.ps1

Windows Command Prompt:

.\.venv\Scripts\activate.bat

Step 8: Install the dependencies

Install the project dependencies from pyproject.toml:

uv pip install -r pyproject.toml

The project uses:

[tool.uv.pip]
torch-backend = "auto"

This allows uv to automatically select the appropriate PyTorch backend for the current machine.

For example:

  • NVIDIA GPU with a compatible CUDA driver → CUDA enabled PyTorch
  • No supported GPU → CPU PyTorch

No manual selection of a CUDA version should normally be required.

Note: Do not use uv sync for the initial installation if automatic PyTorch backend detection is required. Automatic torch-backend selection currently applies to the uv pip interface.

Step 9: Verify the PyTorch backend

Check which PyTorch backend was installed:

python -c "import torch; print('PyTorch:', torch.__version__); print('CUDA available:', torch.cuda.is_available()); print('CUDA version:', torch.version.cuda); print('Device:', torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'CPU')"

On an NVIDIA CUDA system, the output should look similar to:

PyTorch: 2.8.0+cu129
CUDA available: True
CUDA version: 12.9
Device: NVIDIA GeForce RTX 5090

On a machine without a supported GPU, CUDA available will be False and the CPU version of PyTorch will be used.

Step 10: Create config and secret

mapping.csv (the videos, segments and localities) is in the top folder of the repository. Copy the two templates in the top folder:

cp default.config config
cp default.secret secret

In config, set data to the folders that hold (or will hold) the YOLO output (bbox/*.csv in each), videos to the folders with the videos, and mapping to the mapping file (mapping.csv); the other parameters are described in Configuration of project. The scripts stop when there is no config. Fill in only the keys of secret you need (The secret file); the analysis needs none.

Step 11: Run the scripts

Run the scripts from the top folder of the repository with the virtual environment active:

python main.py                     # download the videos and run YOLO on their segments (runs in a loop)
python analysis.py                 # tables, figures and README statistics (YOLO counts from the data folders
                                   # or, without them, from analysis_data/detection_counts.csv.gz)
python count_detections.py --data /path/to/data   # count the YOLO detections and save the snapshot

analysis.py saves a figure (each of its HTML, PNG and EPS files) only when what it shows changed since it was last saved, as recorded in figures/figure_hashes.json, and renders the PNG and EPS files in parallel; an unchanged run takes about a minute. To save every figure again, delete figures/figure_hashes.json first.

The scripts in tools/ and release/ can be run as a file or as a module, and from any folder (they switch to the top folder, where mapping.csv and the other files are):

python tools/check_lists.py
python -m tools.check_lists

The tests run with python -m pytest tests (after uv pip install pytest); tests/test_reject_segments.py is a script run with python tests/test_reject_segments.py on the reviewing machine, as it needs its review plans. Some modules have a self-check: python -m utils.core.parsing, python -m utils.plotting.map_labels.

Configuration of project

Configuration of the project needs to be defined in config; copy default.config to start. The scripts stop when config is missing or has fewer entries than default.config. Entries marked optional may be left out. The config file has the following parameters:

Data and mapping

  • data: folders with the YOLO output (a bbox/ folder of detection CSVs in each).
  • videos: folders with the downloaded videos.
  • mapping: the mapping file (mapping.csv).
  • countries_analyse: ISO3 codes of the countries to analyse; empty for all.
  • min_confidence: minimum YOLO confidence of a detection counted in the analysis.

Video processing (main.py)

  • machine_name: name of the machine in the emails sent by main.py.
  • tracking_mode: run YOLO tracking and write the detection CSVs.
  • tracking_model: the YOLO model file (e.g. yolo11x.pt).
  • bbox_tracker: the tracker settings (bbox_custom_tracker.yaml, its track buffer set from track_buffer_sec).
  • track_buffer_sec: how long (s) a lost track is kept before it ends.
  • max_workers: segments processed at the same time.
  • download_workers: videos downloaded or prepared at the same time.
  • max_active_segments_per_video: segments of the same video processed at the same time: with 1, the workers take segments of different videos (with max_workers=3, 3 videos at once); with 2+, several workers may take segments of one video, which helps when a video has many segments.
  • runs_root: folder for YOLO's working files.
  • external_ssd: the videos are on an external drive: segments are trimmed on the internal drive (the last folder of videos).
  • ftp_server: server from which videos are fetched before trying YouTube (ftp_username and ftp_password, and optionally ftp_token, in secret).
  • delete_youtube_video, delete_runs_files, delete_labels: delete downloaded videos, YOLO's working files and its label files after processing.
  • save_annotated_video, save_annoted_img, save_tracked_img, display_frame_tracking: save an annotated video, save annotated or tracked frames, show the tracking while it runs.
  • snellius_mode, snellius_shard_mode: running as several tasks on the Snellius cluster, each taking its share of the segments.
  • sleep_sec, git_pull: pause (s) at the end of each loop of main.py, and pulling the repository then.
  • email_send, email_sender, email_recipients: email when a job finishes or crashes (see the secret file below).

Downloading from YouTube

  • client: pytubefix client ("WEB", "ANDROID" or "IOS").
  • need_authentication: sign in to YouTube for downloads with pytubefix.
  • update_package: update pytubefix and yt-dlp (on Mondays) before downloading.
  • Optional: use_pytubefix (false: yt-dlp only), cookies_file (a Netscape cookies file for yt-dlp), cookies_browser (yt-dlp's --cookies-from-browser, e.g. chrome) and js_runtime (yt-dlp's JavaScript runtime, e.g. node:/path/to/node).

Updating the mapping

  • update_pop_country, update_gini_value: update the countries' population and Gini index in the mapping from the World Bank when main.py starts.

Figures and output

  • font_family, font_size, plotly_template: look of the figures.
  • logger_level: level of console output: debug, info, warning or error.
  • Optional: open_html_figures (true: open every saved HTML figure in the browser) and save_eps (false: no EPS figures, as in the GitHub Action; EPS needs poppler's pdftops).

The secret file

API keys, passwords and usernames live in a file named secret (no extension) in the root of the project. It is ignored by git, so it is never committed. To create it, copy the template default.secret to secret and fill in the values you need. Any value can stay empty ("") if you do not use the feature it belongs to. Running the analysis on the released dataset needs none of them; running main.py needs at least an empty secret copied from the template.

The file is a single JSON object:

{
  "geonames_username": "",
  "bea_api_key": "",
  "tomtom_api_key": "",
  "restcountries_api_key": "",
  "email_smtp": "",
  "email_account": "",
  "email_password": "",
  "ftp_username": "",
  "ftp_password": "",
  "carto_api_key": "",
  "youtube_api_key": "",
  "locationiq_api_key": ""
}

Which keys you need depends on what you run:

  • analysis of the released dataset (analysis.py): none; carto_api_key is optional.
  • adding videos (add_video.py): geonames_username, restcountries_api_key, tomtom_api_key and youtube_api_key; bea_api_key for US localities.
  • proposing segments from channels (propose_segments.py): youtube_api_key; geonames_username and locationiq_api_key help.
  • updating the traffic index (tools/update_traffic_index.py): tomtom_api_key.
  • processing videos (main.py): ftp_username and ftp_password for the VideoFiles server; the email keys only if email_send is on in config.
Key Used by What for Where to get it
geonames_username add_video.py, propose_segments.py locality population, a fallback for coordinates, and place lookups free account at GeoNames; see below
bea_api_key add_video.py GDP of US localities free key from BEA; see below
tomtom_api_key add_video.py, tools/update_traffic_index.py traffic index from TomTom traffic flow free account at TomTom; see below
restcountries_api_key add_video.py country population, continent and Gini free account at REST Countries; see below
email_smtp, email_account, email_password main.py email when a job finishes (email_send in config) your email provider; see below
ftp_username, ftp_password main.py downloading videos from the VideoFiles server the maintainers (see Contact)
carto_api_key utils/plotting/maps.py optional: basemap tiles for the Mapbox-style maps without CARTO's watermark; without a key, CARTO's free basemap is used CARTO; see below
youtube_api_key propose_segments.py, add_video.py listing a channel's videos and their length, upload date and channel, without downloading them see below
locationiq_api_key propose_segments.py optional: faster place lookups (localities from titles, descriptions and chapters, and the towns along a drive "from A to B") see below

Getting a YouTube Data API key

The key is free; the default quota of 10,000 units a day covers several large channels (listing a channel's search results costs 100 units per 50 videos, video details 1 unit per 50 videos).

  1. Go to the Google Cloud console and sign in with the Google account you want the key to belong to.
  2. Create a project: project selector at the top → New project → give it a name (e.g. crowd) → Create, then select it.
  3. Open APIs & Services → Library, search for YouTube Data API v3 and click Enable.
  4. Open APIs & Services → Credentials → Create credentials → API key. Copy the key that appears.
  5. Recommended: click the new key → under API restrictions choose Restrict key → select YouTube Data API v3 → Save, so the key cannot be used for anything else.
  6. Put the key in secret as "youtube_api_key": "...".

Getting a LocationIQ key (optional)

propose_segments.py looks places up on OpenStreetMap: to guess a video's locality from a named place ("Al Khan Beach" is in Sharjah) and to split a drive "from A to B" into the towns along its route (about 25 lookups per such drive). Without a key it uses the public Nominatim server, which allows one request a second and refuses requests for a while when a busy day goes over that. LocationIQ runs the same OpenStreetMap search with a free key: 5,000 requests a day at two a second, with no payment details. With a key in secret, lookups go to LocationIQ; once its daily requests are used up, they fall back to the public server.

  1. Sign up for the free plan at locationiq.com and confirm your email address.
  2. Open the dashboard's Access Tokens page and copy the token there.
  3. Put it in secret as "locationiq_api_key": "...". Nothing else needs changing; running channel batches pick it up from their next chunk.

Getting a GeoNames username

GeoNames is free; an account allows 10,000 requests a day and 1,000 an hour.

  1. Create an account at geonames.org/login and confirm your email address with the link GeoNames sends.
  2. Sign in and open your account page. At the bottom, click Click here to enable the free web services. Requests are refused until this is done.
  3. Put your username (not your email address) in secret as "geonames_username": "...".

Getting a BEA API key

The U.S. Bureau of Economic Analysis key is free and is used only for localities in the USA.

  1. Fill in your name and email address at apps.bea.gov/API/signup.
  2. BEA emails you the key (a 36-character code); click the activation link in that email.
  3. Put the key in secret as "bea_api_key": "...".

Getting a TomTom API key

The traffic index uses TomTom's Traffic Flow API (segment data). Its free tier allows 20,000 requests a month, with no payment details needed.

  1. Create an account at developer.tomtom.com and confirm your email address.
  2. Open the Dashboard: a key is created with the account (Keys section). Copy it.
  3. Put it in secret as "tomtom_api_key": "...".

tools/update_traffic_index.py uses one request per locality and only queries localities where it is local daytime; requests beyond the free tier are refused unless payment details are added to the TomTom account.

Getting a REST Countries API key

add_video.py uses version 5 of the REST Countries API, which needs a key. The free plan allows 1,000 requests a month, with no payment details.

  1. Sign up at restcountries.com/sign-up and confirm your email address.
  2. Create an API key in the dashboard and copy it.
  3. Put it in secret as "restcountries_api_key": "...".

Email settings

main.py can email you when a job finishes (email_send, email_sender and email_recipients in config). It connects to the SMTP server over SSL on port 465.

  • email_smtp: the SMTP server of your provider, e.g. smtp.gmail.com for Gmail.
  • email_account: the full email address you send from.
  • email_password: for Gmail, an app password, not your normal password. Turn on 2-Step Verification for the Google account, then create an app password at myaccount.google.com/apppasswords and paste the 16 characters. Other providers have similar app passwords or use the account password.

Getting a CARTO key (optional)

The Mapbox-style maps (mapbox_map_*) use CARTO's free basemap, which shows a CARTO watermark. With a key, maps.py loads CARTO's basemap tiles with the key instead.

  1. Create an account at carto.com.
  2. In the CARTO Workspace, create an API access token under Developers → Credentials and copy it.
  3. Put it in secret as "carto_api_key": "...".

Example of YOLO output for a video with dashcam footage

Video: https://www.youtube.com/watch?v=_Wyg213IZDI.

Selection procedure

Segments of videos were not selected if frames are skipped

Video: https://www.youtube.com/watch?v=0K9vaQxKZ9k.

Snippets of videos are not analysed during the movement of camera

Video: https://www.youtube.com/watch?v=3jVszt_78_k.

Videos are excluded from analysis if the camera is unstable or shaking

Video: https://www.youtube.com/watch?v=uFG1_JBZUmM.

Snippets of videos captured in parking areas were excluded from analysis

Video: https://www.youtube.com/watch?v=U0pdQ8eZtHY.

Videos are excluded from analysis if another video is a part of main video

Video: https://www.youtube.com/watch?v=rdx7UFXYSz0.

Verification of segments

After segments were added, they were checked again by hand. The checks were done by Md Shadab Alam, on the main branch, for the segments of mapping.csv, including the videos that other contributors of this repository added (see Who added the videos).

Why a manual step. A retained segment should be one continuous, unedited stretch of driving. Watching all the footage again is not feasible, but an automatic detector of abrupt visual change can point to the few seconds where a cut is likely. The detector alone is not reliable enough to cut the data: a sudden change can be an edit, but also the entrance of a tunnel, a flash of sunlight or a passing lorry, and telling them apart needs context. So the detector proposes candidates, a person decides, and only the decisions of the person are applied. Among the candidates that could be judged so far, most were not cuts (about 59%), so splitting at every candidate would have broken many continuous segments.

1. Candidate cuts. python -m tools.detect_cuts runs FFmpeg scene-change detection (threshold 0.45) on the original video of each segment, over the segment only, merges times closer than 2 s, and writes the candidates to cut_times.csv with the video, the segment start, the frame rate and the time of the candidate. The threshold favours abrupt cuts: gradual transitions, and cuts between similar scenes, can be missed, and the detector does not find speed changes or advertisements.

2. Reviewing. python -m tools.review_cuts serves a page (port 5050) that plays the YouTube video from two seconds before to two seconds after each candidate. The reviewer marks the candidate as yes (a real cut), no (not a cut) or unavailable (YouTube no longer plays or embeds the video), and can add a note. The decision and the time of the review are saved in cut_times.csv.

In total, 52,838 cuts were analysed.

3. What the reviewer looked for.

  • Cuts in videos added by other contributors. The segments of the videos added by the other authors of the repository were checked for cuts, in the same way as the others.
  • Videos that are not at normal speed. Videos that play faster or slower than 1x (for example fast-forwarded footage or time-lapses) are not suitable, because speeds and crossing times in them are wrong. Such cases are noted, for example as fast forward.
  • Advertisements in the footage. An advertisement that was cut into the middle of a video is not footage of the road. Where one was found, it was removed from the segments by the reviewer.

4. Applying the result. python -m tools.apply_cuts applies the candidates marked yes. A cut at time t splits its segment in mapping.csv into a part that ends at floor(t) and a part that starts at ceil(t), so one to two seconds around the cut are dropped, and parts shorter than one second are discarded. The detection CSV of the segment is split at the same frames, with frame numbers restarted at 1 and the true frame rate read from the video (not the rounded one in the file name), so the split files stay aligned. Segments that become too short are removed, and detection CSVs that no longer match a segment in mapping.csv are removed from the data folder.

Description and analysis of dataset

Note: The interactive figures are displayed using htmlpreview.github.io, which may be blocked on some institutional or education networks. If an interactive figure does not open, try another network or download the corresponding .html file from the figures directory and open it locally in a web browser.

Description of dataset

Locations of cities with footage in dataset Locations of cities with footage in dataset. Note: continents are based on geography, i.e., the cities in Russia east from Ural mountains are shown as Asia.

Locations of cities with footage in dataset with density overlay of population Locations of cities with footage in dataset with a density overlay of population. Note: continents are based on geography, i.e., the cities in Russia east from Ural mountains are shown as Asia.

Locations of cities with footage in dataset with density overlay of the number of videos in the dataset Locations of cities with footage in dataset with a density overlay of the number of videos in the dataset. Note: continents are based on geography, i.e., the cities in Russia east from Ural mountains are shown as Asia.

Locations of cities with footage in dataset with density overlay of the total number of seconds of footage in the dataset Locations of cities with footage in dataset with a density overlay of the total number of seconds of footage in the dataset. Note: continents are based on geography, i.e., the cities in Russia east from Ural mountains are shown as Asia.

Amount of footage per country in Africa Amount of footage (hours) per country in Africa. Note: the colour scale is logarithmic; countries are grouped by the continent of their cities in the dataset; a country with cities on two continents (Russia, Türkiye) is coloured and labelled with its whole footage on both maps.

Amount of footage per country in Asia Amount of footage (hours) per country in Asia. Note: the colour scale is logarithmic; countries are grouped by the continent of their cities in the dataset; a country with cities on two continents (Russia, Türkiye) is coloured and labelled with its whole footage on both maps.

Amount of footage per country in Europe Amount of footage (hours) per country in Europe. Note: the colour scale is logarithmic; countries are grouped by the continent of their cities in the dataset; a country with cities on two continents (Russia, Türkiye) is coloured and labelled with its whole footage on both maps.

Amount of footage per country in North America Amount of footage (hours) per country in North America. Note: the colour scale is logarithmic; countries are grouped by the continent of their cities in the dataset; a country with cities on two continents (Russia, Türkiye) is coloured and labelled with its whole footage on both maps.

Amount of footage per country in Oceania Amount of footage (hours) per country in Oceania. Note: the colour scale is logarithmic; countries are grouped by the continent of their cities in the dataset; a country with cities on two continents (Russia, Türkiye) is coloured and labelled with its whole footage on both maps.

Amount of footage per country in South America Amount of footage (hours) per country in South America. Note: the colour scale is logarithmic; countries are grouped by the continent of their cities in the dataset; a country with cities on two continents (Russia, Türkiye) is coloured and labelled with its whole footage on both maps.

Amount of footage per US state Amount of footage (hours) per US state. Note: the colour scale is logarithmic.

Footage per US county Footage per US county (log colour scale): localities are assigned to the county they lie in. Hover over a county for its localities.

Footage per million people per US county Hours of footage per million people per US county (population: US Census Bureau estimates, 2024).

Share of night footage per US county Share of footage recorded at night per US county (counties with at least an hour of footage).

Footage per European region Footage per European region: Eurostat NUTS 2 regions for the EU, EFTA, the United Kingdom and candidate countries, and geoBoundaries regions for European Russia (west of the Urals), Ukraine, Belarus and Bosnia and Herzegovina; Moldova, Kosovo and small countries as a whole.

Footage per million people per European region Hours of footage per million people per European region (population: Eurostat, each region's latest year; for Russia, Ukraine, Belarus and Bosnia and Herzegovina, Wikidata's latest figure).

Share of night footage per European region Share of footage recorded at night per European region (regions with at least an hour of footage).

Footage per locality in the United States as spikes One spike per locality in the contiguous United States (Alaska and Hawaii are not in the view); height and colour show its hours of footage (log scale).

Footage per locality in Russia as spikes One spike per locality in Russia; height and colour show its hours of footage (log scale).

Footage per locality in Japan as spikes One spike per locality in Japan.

Where the footage is in Europe Where the footage is in Europe: hours of footage per 10,000 km², smoothed over about 50 km (log colour scale); grey: no footage nearby. Callouts mark the densest places.

Where the footage is in North America Where the footage is in North America.

Where the footage is in Asia Where the footage is in Asia.

Distance to the nearest footage in Europe Blind spots of the dataset in Europe: distance from every place to the nearest locality with at least an hour of footage. Callouts mark the places furthest from any footage.

Distance to the nearest footage in North America Blind spots of the dataset in North America.

Distance to the nearest footage in Asia Blind spots of the dataset in Asia.

Share of night footage in Europe, smoothed Share of footage recorded at night in Europe, smoothed over about 50 km and weighted by footage; grey where there is less than an hour of footage within 100 km.

Average upload year of the footage in Europe Average year of upload of the footage in Europe (weighted by footage): where the footage is recent and where it is older.

Number of videos against the amount of footage per locality, log scales Number of videos against the amount of footage per locality (log scales), coloured by continent, with every country and its flag in the legend on the right, in alphabetical order (scroll it in the HTML version; click a country to hide or show it); hover over a point for its details. The 40 localities with the most footage are labelled where there is room, the top 12 in larger black text; in the HTML version, zoom in to label every point.

Number of videos against the amount of footage per locality, linear scales The same on linear scales, which show how far the localities with the most footage lead, with the same country legend. The 40 localities with the most footage are labelled where there is room, the top 12 in larger black text; in the HTML version, zoom in to label every point.

Number of videos against the amount of footage per country, log scales Number of videos against the amount of footage per country (log scales), coloured by continent; hover over a point for its details. Countries are labelled with their flag and ISO3 code, the 30 with the most footage in larger black text; in the HTML version, zoom in to label every point.

Number of videos against the amount of footage per country, linear scales The same on linear scales, which show how far the countries with the most footage lead. The 30 countries with the most footage are labelled with their flag and ISO3 code where there is room; in the HTML version, zoom in to label every point.

Distribution by continent Footage (hours) by continent, by day and by night. Note: continents are based on geography, i.e., the cities in Russia east from Ural mountains are shown as Asia.

Time of upload of videos Number of videos by quarter of upload and continent. The current quarter (hatched) is not complete yet.

Distribution by type of vehicle Footage by the type of vehicle it is filmed from (log scale), with each type's share of the footage and of its footage at night.

Amount of footage per locality against its population Amount of footage per locality against its population. Large localities with little footage are candidates for adding videos.

Footage per locality against its population, relative to the trend Footage per locality against its population (log scales), coloured by whether a locality has more than three times, about, or less than a third of the footage its size predicts (the dotted least-squares line). Labelled: the most populous localities, those with the most footage, and the most under-covered cities of over a million people, which are the next ones to collect.

Amount of footage per locality against its gross metropolitan product Amount of footage per locality against its gross metropolitan product (GMP of the metropolitan area: localities in one metropolitan area share its GMP), with the Spearman rank correlation: whether economically large cities dominate the data.

Amount of footage per locality against its traffic index Amount of footage per locality against its traffic index (how much slower than free flow traffic is, from one TomTom reading per locality), for localities with a reading above 0, with the Spearman rank correlation.

Amount of footage per country against country indicators, showing whether some kinds of countries are over- or under-represented Amount of footage per country against country indicators, with the Spearman rank correlation and a trend line per panel, showing whether some kinds of countries are over- or under-represented.

Share of footage recorded at night per country Share of footage recorded at night per country. Countries with less than 10 hours of footage are grey, as their share is not reliable.

Share of footage recorded at night per European country Share of footage recorded at night per European country, printed on each (countries with at least 10 hours of footage; Russia and Türkiye whole).

Footage per million inhabitants per country Hours of footage per million inhabitants per country: coverage relative to country size (log scale; countries with less than 10 hours of footage are grey).

Footage per million inhabitants per European country Hours of footage per million inhabitants per European country, printed on each (log scale; countries with at least 10 hours of footage; Russia and Türkiye whole).

Footage per million people against GDP per person per country Hours of footage per million people against GDP per person (both log scales; circle size: population), coloured by whether a country has more than twice, about, or less than half the footage its wealth predicts (the dotted least-squares line). GDP per person at purchasing-power parity is the World Bank's latest value.

Share of footage from the largest channel per country Share of each country's footage that comes from its largest YouTube channel. Where it is high, one uploader's routes and camera dominate that country's data. Countries with less than 10 hours of footage are grey.

Type of vehicle the footage is recorded from, as a share of footage per continent Type of vehicle the footage is recorded from, as a share of footage per continent.

Share of footage coming from the largest YouTube channels Share of footage coming from the largest YouTube channels.

Distribution of the length of segments (parts of videos included in the dataset) Distribution of the length of segments (parts of videos included in the dataset).

Localities in the dataset, sized by footage Every locality in the dataset as a dot coloured by continent; the dot area is proportional to the hours of footage.

Localities in the dataset on a globe The same localities on a globe. The HTML version spins until you grab it; drag to turn it.

Localities in the dataset on a 3D globe with spikes The localities on a 3D satellite globe (NASA Blue Marble), with a spike for each locality whose height shows its hours of footage on a log scale, so localities with little footage are visible too. In the HTML version, a button merges neighbouring localities into one spike per area of about 200 km, which is easier to read where localities are dense. Each spike is orange for the share of its footage recorded by day and blue for the share at night. The HTML version spins until you grab it; drag to turn it, scroll to zoom.

Localities in the dataset on the spinning globe of the dashboards The spinning globe of the CROWD dashboards: every locality as a square that grows with its hours of footage, and the places with segments added in the last week (red) and month (amber). The HTML version loads the latest data when it opens (from the globe on bazilinskyy.github.io, rebuilt every night) and turns until you grab it; drag to turn it, hover over a place for its footage and new segments, and click it to watch its longest segment on YouTube.

Footage by continent, country and locality Footage by continent, country and locality, coloured by the share recorded at night. A country with localities on two continents (Russia, Türkiye) has a box in each. In the HTML version, click a box to zoom in down to the localities.

Share of footage against share of population per country Share of footage against share of population (of all countries in the dataset) for the countries among the 25 largest by footage or the 25 largest by population (log scale). Where the orange dot is left of the blue one, the country is under-represented.

Footage by population of locality per continent Share of footage by population of the locality, per continent and overall: what "urban" means in each part of the dataset.

Effective number of YouTube channels per country Effective number of YouTube channels per country (inverse Herfindahl index of the channels' shares of footage): 1 means a single uploader; n means as diverse as n channels with equal shares. Countries with less than 10 hours of footage are grey.

Effective number of channels against footage per country Effective number of YouTube channels against hours of footage per country (log scales; circle size: population), coloured by whether a country has more than twice, about, or less than half the channels its amount of footage predicts. Countries below the line rest on few uploaders, so their footage reflects few channels' routes, cameras and styles.

Where the 20 channels with the most footage film Where the 20 YouTube channels with the most footage film, numbered by footage, with the number of countries and hours of each (dot area proportional to hours). Travel channels span many countries; most large channels film in one country or city. In the HTML version, each channel's number links to the channel on YouTube.

Length of segments by continent and type of vehicle Length of segments by continent and by type of vehicle (boxes: quartiles; whiskers: 5th and 95th percentiles).

Detections in the footage (YOLO)

Objects detected in the footage by YOLO (yolo11x with tracking): unique tracked persons, cars, bicycles, motorcycles, buses and trucks, counted with a confidence of at least 0.7 and expressed per minute of analysed footage. The counts per segment are kept in analysis_data/detection_counts.csv.gz (video, start of the segment and the unique tracked objects of each class), which python count_detections.py --data <folder with bbox/> writes where the YOLO detection CSV files are (the first run reads about 900 GB of CSVs, in parallel with --workers; later runs read only new or changed files, cached in _output/). analysis.py, also in the GitHub Action, makes the tables and figures below from it, matched to the current mapping, so they stay up to date without the CSV files. Every Sunday at 20:00 (Amsterdam time), tools/weekly_detection_counts.sh on the machine with the data drive counts newly analysed footage and pushes analysis_data/detection_counts.csv.gz if it changed, ahead of the weekly refresh of the figures.

The detections are automatic outputs, not ground truth. What the detector sees depends on the camera, resolution and viewpoint, so the figures by vehicle type and by year of upload show these effects next to the comparisons between countries.

Based on the YOLO detections in 86,123 processed segments, last updated 2026-10-21 17:43 UTC.

Tables

Detections per continent
# Continent Analysed (h) Of footage (%) Localities Persons / min Cars / min Bicycles / min Motorcycles / min Buses / min Trucks / min
1 Africa 756.5 73.5 540 37.23 43.51 1.16 7.93 2.24 9.40
2 Asia 9,277.5 94.2 2,141 24.28 40.58 1.03 15.66 2.73 8.11
3 Europe 8,440.7 88.5 3,651 17.13 44.75 2.61 1.35 1.94 5.54
4 North America 9,030.0 75.7 2,285 9.71 50.13 0.65 0.39 1.00 7.86
5 Oceania 1,326.6 69.4 436 8.31 53.50 0.55 0.56 1.30 8.77
6 South America 1,127.0 86.3 398 18.47 47.95 1.32 4.45 1.78 7.03
7 All 29,958.2 84.2 9,451 17.27 45.56 1.35 5.74 1.88 7.33
Top 20 countries by pedestrians per minute (at least 10 analysed hours in at least 3 localities)
# Country Pedestrians / min 95% interval Analysed (h) Localities
1 🇳🇵 Nepal 92.85 25.71–96.55 38.1 4
2 🇳🇬 Nigeria 63.33 38.81–70.29 56.9 34
3 🇧🇩 Bangladesh 60.73 41.95–66.20 107.2 29
4 🇰🇪 Kenya 52.53 49.16–59.94 19.9 55
5 🇵🇰 Pakistan 51.89 38.88–68.35 141.9 37
6 🇮🇳 India 44.03 40.32–48.90 450.1 293
7 🇰🇭 Cambodia 43.59 24.48–45.17 222.3 7
8 🇻🇳 Vietnam 42.64 25.71–44.98 1,110.8 68
9 🇪🇹 Ethiopia 41.18 40.06–74.06 42.2 8
10 🇬🇲 Gambia 39.59 33.06–50.93 95.4 29
11 🇲🇼 Malawi 37.69 29.70–50.05 29.9 48
12 🇨🇬 Congo (Congo-Brazzaville) 37.40 5.83–38.06 11.8 3
13 🇸🇱 Sierra Leone 35.88 24.30–41.23 79.1 46
14 🇨🇴 Colombia 34.63 31.51–38.40 41.4 35
15 🇬🇭 Ghana 32.50 27.05–59.00 11.4 10
16 🇮🇩 Indonesia 32.12 26.05–41.46 969.2 175
17 🇲🇦 Morocco 30.32 26.78–36.30 46.9 34
18 🇬🇧 United Kingdom 29.73 9.51–32.97 1,496.8 353
19 🇸🇾 Syria 29.49 15.46–35.75 122.3 11
20 🇭🇺 Hungary 29.41 8.35–30.01 171.4 34
Top 20 localities by pedestrians per minute (at least 1 analysed hour)
# Locality Pedestrians / min Analysed (h)
1 🇮🇳 Varanasi 126.64 1.0
2 🇨🇫 Bangui 105.51 5.2
3 🇮🇳 Anantapur 103.57 1.2
4 🇵🇰 Dera Ismail Khan 98.21 1.2
5 🇵🇰 Sialkot 98.18 3.4
6 🇳🇵 Kathmandu 97.07 35.6
7 🇲🇬 Toamasina 89.05 1.3
8 🇵🇰 Multan 88.86 9.8
9 🇺🇬 Kampala 87.35 40.1
10 🇸🇱 Kenema 86.35 2.4
11 🇸🇱 Makeni 80.86 1.2
12 🇵🇰 Mansehra 76.74 2.1
13 🇮🇳 Gaya 76.16 3.0
14 🇳🇬 Lagos 73.20 34.3
15 🇳🇬 Ibadan 71.18 5.2
16 🇮🇳 Dehradun 71.17 1.3
17 🇵🇰 Abbottabad 70.47 1.9
18 🇵🇰 Faisalabad 70.15 1.8
19 🇸🇱 Bo 68.89 2.6
20 🇮🇳 Vadodara 68.30 1.3

Figures

Share of each country's footage that has been analysed with YOLO (countries with less than 10 hours of footage are grey). Share of each country's footage that has been analysed with YOLO (countries with less than 10 hours of footage are grey).

Pedestrians per minute of footage per country (unique tracked persons; countries with less than 10 analysed hours are grey). Pedestrians per minute of footage per country (unique tracked persons; countries with less than 10 analysed hours are grey).

Pedestrians per minute of footage per European country (countries with at least 10 analysed hours; Russia and Türkiye whole). Pedestrians per minute of footage per European country (countries with at least 10 analysed hours; Russia and Türkiye whole).

Pedestrians per minute of footage per country, with a 95% bootstrap interval over its localities (countries with at least 10 analysed hours in at least 3 localities). Pedestrians per minute of footage per country, with a 95% bootstrap interval over its localities (countries with at least 10 analysed hours in at least 3 localities).

How much footage a stable estimate of a locality needs: the width of its 95% bootstrap interval of pedestrians per minute over its segments (as a share of the rate) against its analysed hours (localities with at least 5 segments; segments of one drive are alike, so the true intervals are somewhat wider). How much footage a stable estimate of a locality needs: the width of its 95% bootstrap interval of pedestrians per minute over its segments (as a share of the rate) against its analysed hours (localities with at least 5 segments; segments of one drive are alike, so the true intervals are somewhat wider).

Pedestrians against cars per minute per locality (at least an analysed hour), split at the medians into walkable, busy, car-dominated and quiet streets. Pedestrians against cars per minute per locality (at least an analysed hour), split at the medians into walkable, busy, car-dominated and quiet streets.

Pedestrians per minute by population of the locality, per continent, with a 95% bootstrap interval over localities (groups with at least 3 localities and an analysed hour). Pedestrians per minute by population of the locality, per continent, with a 95% bootstrap interval over localities (groups with at least 3 localities and an analysed hour).

Road-user mix of the 30 localities with the most analysed footage, each as 100 squares (ordered by the share of pedestrians). Road-user mix of the 30 localities with the most analysed footage, each as 100 squares (ordered by the share of pedestrians).

Detected road users per minute of footage, per class, in the 40 countries with the most analysed footage (log colour scale). Detected road users per minute of footage, per class, in the 40 countries with the most analysed footage (log colour scale).

Pedestrians per minute of footage per locality, by continent. Pedestrians per minute of footage per locality, by continent.

Distribution of pedestrians per minute over segments of at least a minute (log scale). Distribution of pedestrians per minute over segments of at least a minute (log scale).

Mix of detected road users per continent. Mix of detected road users per continent.

Mix of detected road users in the 30 countries with the most analysed footage. Mix of detected road users in the 30 countries with the most analysed footage.

Share of two-wheelers (motorcycles and bicycles) among the detected vehicles per country (countries with less than 10 analysed hours are grey). Share of two-wheelers (motorcycles and bicycles) among the detected vehicles per country (countries with less than 10 analysed hours are grey).

Detected road users per minute by day and by night, per class and continent (log scale). Detected road users per minute by day and by night, per class and continent (log scale).

Pedestrians per minute of footage by day and by night per country (countries with at least an hour of each). Pedestrians per minute of footage by day and by night per country (countries with at least an hour of each).

Pedestrians per minute by the type of vehicle the footage is filmed from: the viewpoint changes what the detector sees. Pedestrians per minute by the type of vehicle the footage is filmed from: the viewpoint changes what the detector sees.

Detected road users per minute by year of upload (years with at least 10 analysed hours): newer cameras and higher resolutions can change what the detector sees. Detected road users per minute by year of upload (years with at least 10 analysed hours): newer cameras and higher resolutions can change what the detector sees.

Pedestrians per minute of footage per country (at least 10 analysed hours) against country indicators: population, road deaths, Gini index, median age and literacy (from the mapping), GDP per person, urban population, density and jobs in agriculture (World Bank), pedestrians among road deaths, registered vehicles, physical inactivity and obesity (WHO), mean temperature and rainfall (ERA5, World Bank climate portal) and the footage-weighted TomTom traffic index. Dashed lines: medians of equal-sized groups of countries along each indicator. Pedestrians per minute of footage per country (at least 10 analysed hours) against country indicators: population, road deaths, Gini index, median age and literacy (from the mapping), GDP per person, urban population, density and jobs in agriculture (World Bank), pedestrians among road deaths, registered vehicles, physical inactivity and obesity (WHO), mean temperature and rainfall (ERA5, World Bank climate portal) and the footage-weighted TomTom traffic index. Dashed lines: medians of equal-sized groups of countries along each indicator.

Pedestrians per minute of footage against GDP per person (countries with at least 10 analysed hours; circle size: population), coloured by whether a country has more than 1.5 times, about, or less than two-thirds of the pedestrians its wealth predicts. Pedestrians per minute of footage against GDP per person (countries with at least 10 analysed hours; circle size: population), coloured by whether a country has more than 1.5 times, about, or less than two-thirds of the pedestrians its wealth predicts.

Motorcycles as a share of detected vehicles against GDP per person, coloured by whether a country has more than twice, about, or less than half the share its wealth predicts. Motorcycles as a share of detected vehicles against GDP per person, coloured by whether a country has more than twice, about, or less than half the share its wealth predicts.

Bicycles per minute against GDP per person: cycling cultures stand out above the line. Bicycles per minute against GDP per person: cycling cultures stand out above the line.

Cars per minute against GDP per person: motorisation on the street, relative to wealth. Cars per minute against GDP per person: motorisation on the street, relative to wealth.

Road traffic deaths per 100,000 people against pedestrians per minute: countries with more or fewer deaths than their number of pedestrians on the street predicts. Road traffic deaths per 100,000 people against pedestrians per minute: countries with more or fewer deaths than their number of pedestrians on the street predicts.

Pedestrian road deaths per 100,000 people (road deaths times the WHO's pedestrian share of them, 2016) against pedestrians per minute: where walking is more or less deadly than the number of pedestrians on the street predicts (not countries where most road deaths are of an unknown road user, e.g. the Philippines). Pedestrian road deaths per 100,000 people (road deaths times the WHO's pedestrian share of them, 2016) against pedestrians per minute: where walking is more or less deadly than the number of pedestrians on the street predicts (not countries where most road deaths are of an unknown road user, e.g. the Philippines).

Pedestrians per minute per US county (counties with at least an hour of analysed footage). Pedestrians per minute per US county (counties with at least an hour of analysed footage).

Pedestrians per minute per European region (NUTS 2, and first-level regions of European Russia, Ukraine, Belarus and Bosnia and Herzegovina; regions with at least an hour of analysed footage). Pedestrians per minute per European region (NUTS 2, and first-level regions of European Russia, Ukraine, Belarus and Bosnia and Herzegovina; regions with at least an hour of analysed footage).

Bicycles per minute per European region: cycling regions stand out. Bicycles per minute per European region: cycling regions stand out.

Pedestrians per minute in Europe, smoothed over about 50 km; grey where there is less than an analysed hour within 100 km. Pedestrians per minute in Europe, smoothed over about 50 km; grey where there is less than an analysed hour within 100 km.

Walkable street minutes in Europe: the share of analysed minutes with at least 2 pedestrians and at most 10 cars per minute, smoothed over about 50 km. Walkable street minutes in Europe: the share of analysed minutes with at least 2 pedestrians and at most 10 cars per minute, smoothed over about 50 km.

Walkable street minutes per European country: the share of analysed minutes with at least 2 pedestrians and at most 10 cars per minute (countries with at least 10 analysed hours; Russia and Türkiye whole; the colours end at the 95th percentile, higher shares get the darkest). Walkable street minutes per European country: the share of analysed minutes with at least 2 pedestrians and at most 10 cars per minute (countries with at least 10 analysed hours; Russia and Türkiye whole; the colours end at the 95th percentile, higher shares get the darkest).

Motorcycles as a share of detected vehicles in Europe, smoothed over about 50 km. Motorcycles as a share of detected vehicles in Europe, smoothed over about 50 km.

Bicycles per minute in Europe, smoothed over about 50 km. Bicycles per minute in Europe, smoothed over about 50 km.

Pedestrians per minute per locality against its population (localities with at least an hour of analysed footage): busy and quiet streets for a city's size. Pedestrians per minute per locality against its population (localities with at least an hour of analysed footage): busy and quiet streets for a city's size.

Pedestrians per minute of footage per locality against its population. Pedestrians per minute of footage per locality against its population.

Adding videos to dataset

To add videos to the mapping file by hand, run python add_video.py. It opens a web form (a Flask app on a local port) for one video at a time. Fill in the locality, the state (optional, recommended for the USA 🇺🇸 and Canada 🇨🇦), the country (mandatory, chosen from a list) and the YouTube link, and click Fetch data. While you type the locality, the form suggests localities that are already in the mapping file.

Form with new video Adding a video to Delft, Netherlands 🇳🇱 (with no state), before fetching its data. While the locality is typed, the form suggests the matching locality already in the mapping file.

Fetch data checks whether the locality is already in the mapping file and looks up the rest. For the video: its upload date and channel from YouTube. For a new locality: its coordinates, population and gross metropolitan product (GDP), the country's population, road deaths, continent, literacy rate, average height, median age and Gini index, and the traffic index (see The secret file for the services used). The video plays next to the form, with the current second of the player, the last second of the video and a map of the locality.

Form with new locality The same video after fetching its data, from before Delft was in the mapping file: with no entry for Delft yet, the form adds it as a new locality. Its coordinates are shown on the map under the video; dragging the marker adjusts them.

Form with existing locality Kyiv, Ukraine 💙💛 is in the mapping file (with 569 videos), so the form adds the video to it. This video is in the mapping file already: the form shows its existing segments in red (here from second 1 to 1408) next to the player, so a new segment is added after them or the existing ones can be checked.

For each segment (part of a video), add the Time of day (day or night), the Vehicle the footage is filmed from, the Start time (seconds) and the End time (seconds) (larger than the start), and click Submit. A video can have several segments, each starting at or after the end of the previous one; the values of the video (upload date, channel) and of the locality are kept, so for each further segment only its start, end, time of day and vehicle need to be filled in. All values can be corrected in the form before submitting, and by hand in the mapping file later.

Shortcuts and click events

The form accepts the following shortcuts (when the cursor is not in a text field; they also work with non-Latin keyboard layouts):

  1. A: the current second of the video into "Start time (seconds)".
  2. S: the current second of the video into "End time (seconds)".
  3. D: the whole video: "Start time (seconds)" 0 and "End time (seconds)" the last second of the video. Clicking on "Last second" under the video does the same (and copies it).
  4. Q: "Day" for "Time of day".
  5. W: "Night" for "Time of day".

Proposing segments from YouTube channels

Instead of finding segments by hand in add_video.py, whole YouTube channels can be processed automatically: propose_segments.py downloads each video of a channel at low resolution, proposes segments, localities, time of day and vehicle type, and a curator reviews the proposals on a web page and applies the approved ones to the mapping file. Nothing is written to the mapping before a curator applies it.

1. Channels to process. run_channels.py takes channels from a Google Sheet (the sheet URL is set in run_channels.py): column A is the channel URL, column B its status and column C its country. It works from the bottom of the sheet up, through channels with an empty status, and proposes segments for each in chunks of videos (--chunk, default 15), each chunk in a new process, so changes to the code apply from the next chunk:

python run_channels.py

It runs until stopped (--max-minutes N stops after N minutes) and continues where it stopped when restarted. It cannot write to the sheet: it logs lines starting with SHEET: (set row N to Processing, Processed or Rejected) for the curator to copy into the sheet. Without a country in column C, it uses the channel's country on YouTube. A single channel can also be processed directly:

python propose_segments.py --channel https://www.youtube.com/@CHANNEL --country "Netherlands" --limit 20

The country must be written as in the add_video.py form. --single-city treats all of a channel's videos as one city (no drives from A to B), and --no-download proposes whole videos from YouTube metadata only. Downloading needs yt-dlp, ffmpeg and node; when YouTube asks to sign in, put a cookies.txt exported from your browser in the root of the project. The youtube_api_key in the secret file is needed to list channels (see The secret file).

2. What is proposed automatically. Videos are left out from their metadata when they are shorter than 5 minutes, live, portrait, or walking tours, time-lapses, compilations, crash videos, highway drives or road trips. For the others, a 160x90 copy is analysed at 2 frames per second:

  • segments: stationary stretches at the start and end are trimmed and stops longer than 3 minutes are cut out; hard cuts (edits), blank frames and title cards end a segment; footage with the camera facing the driver, not facing forward or shaking, and rural or highway stretches (from YOLO detections) are left out; segments shorter than 30 seconds are dropped. Whole videos are left out for picture-in-picture or skipped footage, and a channel where ten videos in a row have skips is rejected;
  • time of day: night when the sky or the street is dark for at least a minute, with a hint at dusk;
  • vehicle: the most common vehicle type of the channel's videos already in the mapping (a car, with a note, for a new channel);
  • locality: from the title, then the description, then the chapters (a video with chapters for several places is split), and otherwise a named place looked up on OpenStreetMap; drives "from A to B" are split into the towns along the route; a town within 30 km of a city with over a million people counts as that city unless it has 250,000 people itself;
  • re-uploads of a video already in the mapping are recognised and left out.

The proposals of a channel are kept in _output/proposals/<channel>/plan.json, with frames and signals of each video. Videos left out are listed on the review page with the reason:

Videos left out of the proposals Videos of the same channel as the Kyiv example of add_video.py, left out automatically: a video under 5 minutes, a walk, and a drive that skips footage (an edit cut).

3. Reviewing. Run python review_hub.py and open http://127.0.0.1:8770: it lists the channels with videos to review, and clicking one opens its review page (also available directly with python propose_segments.py --review _output/proposals/<channel>/plan.json).

Batches to review The review hub: channels with videos still to decide. For each video, the page shows the player, the title and description, a contact sheet of frames, a route map, and the proposed segments with the reasons for each cut. Per segment, the curator can change the start and end, switch day and night, approve, reject, split it at a time, move it to another locality, or add a new segment; per video, change the vehicle, locality, state and country (with a map for a new locality), approve the rest of the video or reject it. Shortcuts: A sets the start and S the end of a segment to the current time of the player, D takes the whole video, Q and W set day and night, and F puts the current time in the split box.

Review page The proposal for the Kyiv video used in the add_video.py example above: one segment from 0:01 to 23:30 in Kyiv, Ukraine (the locality guessed from the title, the vehicle from the channel's other videos in the mapping), with a contact sheet of frames and the video's description; it matches the segment added by hand (seconds 1 to 1408).

4. Applying. Apply adds the approved segments to the mapping file through the same code as the add_video.py form: the video, its segments, time of day, vehicle type, upload date and channel, and for a new locality a new row with its coordinates, population and other values. Applied segments are marked in plan.json and cannot be changed on the page any more. Overlapping segments are refused, and writes to the mapping file are locked, so several review pages and a running channel batch can be used at once. Do not stop a review page while it is applying.

5. Merging towns into cities. python review_merges.py serves a page at http://127.0.0.1:8772 with towns of under 250,000 people within 30 km of a city of over a million in the same state, side by side on maps: Y merges a town into the city, N keeps it separate. python review_merges.py --apply merges the accepted towns: their videos move to the city and their name is added to the city's other names.

Weekly update of video metadata

mapping_metadata.csv holds the YouTube metadata of every video in the mapping file (title, upload date, channel, views, description, chapters), and crowd_index.jsonl is the same dataset as JSON Lines, one object per segment, built from mapping.csv and mapping_metadata.csv without the free-text fields (titles, descriptions, chapters). Both are refreshed every Monday at 02:00 (Amsterdam time) by release/weekly_metadata.sh, run by cron on a Mac mini at TU/e in a fresh shallow clone made for each run and removed after it:

  1. it resets the clone to the latest main on GitHub;
  2. python -m release.update_info fetches the metadata of videos added since the last run and retries the videos with missing values (offline videos in the mapping keep being retried). Each video is written to the file as soon as it is fetched (a new video is appended as a row, so an interrupted run keeps what it has; a failed retry leaves its row as it was); rows of videos no longer in the mapping are dropped;
  3. python -m release.make_crowd_jsonl rebuilds crowd_index.jsonl;
  4. python -m release.split_large_files split splits a file over 99 MB into NAME_part1.EXT, NAME_part2.EXT, ... (each under 99 MB; CSV parts repeat the header), as GitHub refuses files over 100 MB;
  5. the two files (or their parts) are committed as "Weekly update of video metadata" and pushed. A file over 99 MB is never pushed: the job stops instead. When someone pushed in the meantime, the commit is replayed on top of theirs.

When the files are split, the whole file is not in the repository. release/update_info.py, release/make_crowd_jsonl.py and release/validation_release.py rebuild it from its parts when needed, or run python -m release.split_large_files join mapping_metadata.csv crowd_index.jsonl. The log of the job is in ~/Library/Logs/crowd-metadata.log on the mini. To run it elsewhere, clone the repository with push access and add 0 2 * * 1 /path/to/clone/release/weekly_metadata.sh >> /path/to/crowd-metadata.log 2>&1 to crontab -e (set PY to the Python of the environment if it is not ~/micromamba/envs/crowd/bin/python).

Who added the videos

Videos are added by several people, each in their own copy of the mapping file: mapping.csv is Pavlo's, mapping-olena.csv Olena's, mapping-shadab.csv and mapping-epfl.csv Shadab's and, in general, mapping-NAME.csv NAME's. Videos added to mapping.csv in commits from a contributor's own account (currently Shadab's and Faye's) are credited to that contributor. Each video is credited to the file it first appeared in. The credits are kept in analysis_data/video_contributors.csv: one row per video with the contributor, the time of the commit that added it (UTC) and the mapping file it first appeared in. It was built from the git history with python -m utils.analytics.contributors, and analysis.py (also in the GitHub Action) adds new videos from the commits of the last 60 days, so a video Olena added to mapping-olena.csv before it was reviewed into mapping.csv is hers; videos in no commit yet get the time of the last commit to their mapping file. It is the only record of who added what once the history of the mapping files is gone, so keep it when rewriting the repository's history. A video that appeared in mapping.csv and another file at the same time is credited to mapping.csv, as the other files are refreshed with copies of it. The table counts the videos in the dataset now.

# Contributor Videos Footage (h) Localities Countries First added Last added
1 Pavlo 72,504 32,310.8 7,554 232 2025-01-19 2026-10-21
2 Olena 4,852 1,755.1 948 90 2025-05-03 2026-10-21
3 Shadab 2,818 1,445.9 499 96 2023-12-17 2026-07-22
4 Margarida 54 24.9 34 4 2025-05-02 2025-06-05
5 Aloysia 38 18.0 17 2 2025-04-29 2025-07-08
6 Faye 42 14.8 29 11 2026-06-30 2026-07-12

Footage in the dataset over time by who added it Footage in the dataset over time, by who added it (cumulative hours of the videos in the dataset now, by the date they were added).

Contact

If you have any questions or suggestions, feel free to reach out to Md Shadab Alam (md_shadab_alam@outlook.com) or Pavlo Bazilinskyy (p.bazilinskyy@tue.nl).

Licence

Code: MIT License
CROWD dataset: Creative Commons Attribution 4.0 International (CC BY 4.0)

The dataset licence covers CROWD generated structured data, annotations, and derived computer vision outputs. It does not cover the underlying YouTube videos or other third party content.

CROWD does not redistribute the original YouTube videos, extracted frames, or images. Source videos remain subject to the rights of their respective owners and YouTube's Terms of Service.

About

This repository contains code that extracts YouTube videos based on a mapping.csv file and performs object detection using YOLOv11. The primary objective of this work is to evaluate pedestrian behaviour in a cross-country or cross-cultural context using freely available YouTube videos.

Topics

Resources

Security policy

Stars

14 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages