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,679 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: 36,204.3 hours (1,508.5 days)
  • Videos: 82,484 unique videos split into 107,407 segments
  • Localities (cities): 10,538
  • Countries and territories: 238
  • Continents: 6
  • YOLO detections: 91,983 processed segments (one detection CSV each)
  • Detected objects (unique tracked objects, confidence ≥ 0.0): 34,582,015 persons, 97,105,972 cars, 2,544,466 bicycles, 11,293,405 motorcycles, 3,571,231 buses, 14,385,922 trucks
  • Last updated: 2026-11-02 00:25 UTC
All 238 countries and territories
# Country Cities Videos Footage (h) Analysed (h) Persons Cars Bicycles Motorcycles Buses Trucks
1 🇺🇸 United States 2,359 21,326 10,511.1 8,659.4 4,820,542 29,799,823 294,021 156,255 510,360 4,296,528
2 🇦🇺 Australia 213 4,124 1,729.0 1,380.7 720,050 5,101,216 48,930 52,316 109,753 770,771
3 🇬🇧 United Kingdom 379 3,238 1,703.9 1,510.1 2,867,090 3,590,817 261,883 154,434 262,716 570,646
4 🇷🇺 Russia 212 3,424 1,522.9 1,447.9 844,437 4,317,947 17,210 7,814 168,343 513,024
5 🇵🇭 Philippines 414 3,688 1,350.0 1,316.8 2,427,410 2,407,750 72,700 1,487,797 310,275 939,564
6 🇨🇦 Canada 239 3,733 1,273.7 1,028.5 818,846 3,272,258 71,926 20,308 57,635 395,753
7 🇻🇳 Vietnam 79 3,074 1,196.8 1,115.7 3,060,351 2,014,083 90,216 3,001,694 126,115 301,648
8 🇮🇩 Indonesia 177 3,192 1,033.6 1,018.6 2,135,172 2,062,675 26,720 2,098,743 113,916 501,032
9 🇰🇷 South Korea 84 855 822.8 818.9 386,095 1,963,479 21,093 56,226 113,188 188,634
10 🇫🇷 France 369 1,911 750.4 717.4 869,861 1,906,387 101,869 124,879 47,050 197,996
11 🇨🇳 China 160 1,275 714.3 629.5 506,472 1,961,536 50,851 197,943 103,161 211,319
12 🇩🇪 Germany 275 1,486 667.6 607.4 555,786 1,888,491 186,722 35,261 59,918 208,708
13 🇯🇵 Japan 241 1,802 623.1 595.7 439,838 1,275,282 54,810 24,860 86,925 314,918
14 🇧🇷 Brazil 131 1,472 613.6 540.4 551,015 1,703,926 34,597 155,795 55,591 198,772
15 🇳🇱 Netherlands 232 1,474 556.5 437.2 517,322 1,094,479 353,908 55,627 32,181 116,122
16 🇮🇳 India 303 1,531 488.3 476.8 1,358,956 1,161,598 66,826 757,324 134,181 363,542
17 🇺🇦 Ukraine 97 1,144 458.7 436.7 346,811 1,566,587 9,078 4,834 71,397 212,145
18 🇹🇭 Thailand 50 818 401.4 376.3 485,346 1,069,656 8,685 365,006 50,806 228,714
19 🇲🇾 Malaysia 70 652 372.2 282.2 142,606 893,879 1,759 85,354 17,961 78,616
20 🇲🇲 Myanmar 19 536 371.5 371.5 393,614 1,646,979 44,384 42,070 101,213 260,286
21 🇦🇪 United Arab Emirates 10 905 370.4 306.1 105,575 885,948 4,006 15,784 42,977 113,247
22 🇵🇱 Poland 283 918 361.9 337.0 231,202 1,002,233 21,276 7,242 33,761 87,286
23 🇮🇷 Iran 109 1,071 334.3 264.1 177,639 1,444,918 3,631 36,031 14,546 114,312
24 🇸🇪 Sweden 174 1,036 284.9 266.5 141,949 482,271 22,144 2,821 18,749 51,592
25 🇹🇷 Türkiye 88 572 272.4 226.7 285,629 942,601 4,225 36,528 56,256 133,176
26 🇮🇹 Italy 175 691 267.0 261.3 282,142 908,873 23,915 101,935 17,661 69,447
27 🇩🇰 Denmark 22 570 257.7 250.7 390,428 780,277 200,153 8,317 20,282 61,102
28 🇦🇷 Argentina 63 411 257.1 256.5 367,849 931,207 35,207 43,315 30,270 101,251
29 🇷🇴 Romania 99 679 250.5 240.6 197,719 1,221,247 6,691 5,080 27,652 99,364
30 🇫🇮 Finland 44 387 239.9 235.5 134,640 495,813 14,687 2,445 21,620 55,653
31 🇪🇸 Spain 253 664 233.2 225.5 291,818 649,738 15,891 65,026 23,092 65,410
32 🇨🇿 Czechia 114 477 230.1 214.6 222,975 584,974 5,613 5,080 23,244 55,781
33 🇰🇭 Cambodia 7 427 222.3 221.8 606,066 561,842 13,545 623,624 38,992 181,902
34 🇦🇹 Austria 49 907 211.2 201.6 133,417 563,773 18,117 14,410 23,235 84,480
35 🇺🇬 Uganda 19 522 195.0 84.9 501,747 190,827 15,869 251,438 17,576 64,307
36 🇭🇺 Hungary 35 565 190.6 171.0 311,642 1,114,936 14,911 8,344 51,006 125,623
37 🇧🇬 Bulgaria 100 736 176.5 162.6 85,581 569,432 1,797 1,204 18,114 48,875
38 🇵🇰 Pakistan 39 426 167.7 146.7 490,898 509,985 16,387 250,458 28,994 123,420
39 🇸🇬 Singapore 1 417 163.8 152.6 84,721 384,215 5,235 20,853 33,904 61,744
40 🇳🇿 New Zealand 162 620 163.4 144.9 81,718 433,001 4,647 3,418 13,862 56,781
41 🇻🇪 Venezuela 28 659 162.7 147.7 118,784 408,059 5,065 41,064 9,027 79,602
42 🇮🇪 Ireland 65 561 158.3 138.4 114,472 342,626 10,742 2,226 14,161 41,970
43 🇲🇽 Mexico 73 313 146.2 138.7 143,106 493,212 6,527 23,581 15,433 72,687
44 🇳🇴 Norway 68 431 143.0 137.7 89,964 311,168 7,494 2,000 13,929 38,717
45 🇿🇦 South Africa 59 490 142.2 130.9 95,473 361,609 1,715 4,681 13,247 61,876
46 🇸🇾 Syria 13 353 139.4 124.3 230,775 568,753 6,624 17,705 17,508 86,472
47 🇧🇾 Belarus 83 281 139.2 81.4 47,143 204,755 1,607 417 10,628 27,332
48 🇭🇰 Hong Kong 11 230 107.8 59.1 108,426 106,587 1,444 2,993 19,606 19,712
49 🇪🇬 Egypt 21 272 107.7 53.4 78,141 268,992 737 8,549 12,471 33,615
50 🇧🇩 Bangladesh 28 297 107.2 107.2 426,287 117,440 75,686 73,689 41,201 87,546
51 🇵🇹 Portugal 75 231 105.3 104.4 91,994 322,672 2,144 7,495 7,753 32,103
52 🇬🇲 Gambia 35 394 102.9 95.4 246,297 318,516 14,756 21,032 8,768 66,261
53 🇨🇭 Switzerland 96 309 101.9 92.5 109,911 204,142 21,512 13,549 9,618 24,486
54 🇯🇴 Jordan 16 330 98.3 78.3 47,950 357,720 181 983 7,339 40,130
55 🇳🇬 Nigeria 35 239 96.2 66.3 263,110 220,926 1,860 33,764 18,502 56,569
56 🇸🇱 Sierra Leone 47 185 79.5 79.1 187,292 51,000 1,879 51,201 4,608 23,656
57 🇨🇱 Chile 43 161 72.0 26.4 27,553 83,092 969 1,381 3,246 15,475
58 🇲🇳 Mongolia 4 130 71.4 71.4 91,858 344,610 1,883 1,686 9,246 26,363
59 🇭🇷 Croatia 89 282 71.3 71.2 53,717 253,352 4,602 4,328 5,525 19,844
60 🇨🇾 Cyprus 19 256 67.1 66.4 27,722 228,547 1,082 5,023 4,182 28,797
61 🇬🇷 Greece 40 196 66.9 66.5 77,114 293,048 2,854 26,381 6,361 26,228
62 🇪🇪 Estonia 8 312 66.6 65.3 34,638 184,453 1,216 420 8,537 17,236
63 🇧🇪 Belgium 60 190 62.9 62.6 71,821 190,482 15,473 3,904 7,398 24,351
64 🇹🇼 Taiwan 39 186 62.6 43.7 51,993 127,694 2,546 46,958 4,547 12,812
65 🇧🇦 Bosnia and Herzegovina 61 296 62.4 62.0 69,752 222,699 1,056 702 5,842 16,960
66 🇨🇴 Colombia 36 131 61.7 50.9 117,370 129,247 6,718 51,817 7,850 21,360
67 🇺🇿 Uzbekistan 13 180 54.8 53.6 46,774 355,390 722 332 6,388 27,457
68 🇵🇪 Peru 29 95 53.6 53.1 88,967 163,413 5,474 13,113 9,663 31,275
69 🇦🇿 Azerbaijan 8 122 51.2 45.5 46,348 235,810 694 1,139 6,123 21,861
70 🇷🇸 Serbia 37 156 49.4 46.5 44,020 186,903 1,154 1,225 5,946 14,798
71 🇲🇦 Morocco 37 138 48.7 47.3 93,249 201,231 3,877 18,016 5,101 22,238
72 🇱🇰 Sri Lanka 17 133 48.6 47.3 74,781 106,111 1,066 25,811 17,807 41,272
73 🇸🇦 Saudi Arabia 11 122 46.2 32.4 5,162 169,306 118 248 2,843 18,349
74 🇶🇦 Qatar 5 98 44.3 44.3 10,813 125,797 434 1,284 5,347 16,648
75 🇪🇹 Ethiopia 8 77 44.1 42.2 123,021 125,171 542 1,984 9,835 34,724
76 🇬🇪 Georgia 12 119 42.8 42.4 33,673 201,005 246 1,328 7,185 22,399
77 🇱🇻 Latvia 20 124 38.4 38.0 26,293 105,683 1,706 748 4,275 12,473
78 🇳🇵 Nepal 4 120 38.2 38.2 225,002 72,918 6,060 131,456 10,910 20,116
79 🇱🇧 Lebanon 62 157 35.4 35.2 23,417 163,967 184 7,670 2,710 18,124
80 🇨🇺 Cuba 25 165 34.4 34.3 117,049 49,556 4,702 16,595 3,856 14,402
81 🇱🇹 Lithuania 11 86 33.9 33.5 32,986 106,385 2,629 716 3,324 7,526
82 🇩🇿 Algeria 8 62 33.8 14.5 26,027 68,925 133 1,304 1,372 6,901
83 🇵🇷 Puerto Rico 60 159 33.1 19.4 4,934 70,393 115 434 442 9,614
84 🇲🇼 Malawi 51 115 32.9 31.5 78,660 32,742 10,602 5,436 1,821 9,274
85 🇰🇿 Kazakhstan 26 116 31.9 30.8 22,288 134,602 260 202 4,090 13,041
86 🇦🇲 Armenia 10 105 30.8 23.9 21,166 153,527 126 319 4,473 15,760
87 🇰🇪 Kenya 58 118 27.7 19.9 70,040 50,504 1,168 12,731 4,621 13,321
88 🇪🇨 Ecuador 14 58 26.7 22.8 28,852 75,067 686 4,759 3,540 13,055
89 🇲🇰 North Macedonia 21 75 26.6 24.4 26,662 98,030 1,779 1,072 2,519 7,901
90 🇺🇾 Uruguay 23 90 25.3 25.3 33,471 99,796 2,762 5,329 1,627 12,799
91 🇲🇩 Moldova 14 111 25.3 24.2 26,690 113,963 302 217 5,094 12,595
92 🇱🇦 Laos 11 62 23.1 22.9 24,568 53,800 528 23,150 1,272 20,247
93 🇧🇴 Bolivia 20 55 21.5 21.5 33,175 52,027 775 5,899 3,121 15,024
94 🇲🇨 Monaco 1 45 20.3 20.3 38,846 32,963 1,033 13,199 1,598 4,440
95 🇮🇱 Israel 18 68 19.9 19.0 15,117 74,185 2,391 3,131 2,717 5,690
96 🇦🇱 Albania 23 63 15.5 14.8 19,340 52,118 1,616 1,220 1,398 5,443
97 🇽🇰 Kosovo 31 93 15.4 15.4 16,804 66,243 815 885 1,405 8,619
98 🇬🇹 Guatemala 9 23 15.3 15.3 18,049 46,886 685 9,016 1,774 12,444
99 🇲🇪 Montenegro 24 91 14.6 10.2 9,014 42,328 173 753 965 4,093
100 🇨🇬 Congo (Congo-Brazzaville) 5 38 13.9 11.8 29,968 24,408 229 3,092 1,062 5,312
101 🇮🇸 Iceland 14 40 13.2 12.8 7,533 31,458 475 68 955 4,582
102 🇱🇾 Libya 3 39 13.2 13.2 4,990 64,240 79 115 299 7,120
103 🇬🇭 Ghana 12 43 12.3 11.4 24,607 31,824 671 4,579 2,247 8,944
104 🇹🇲 Turkmenistan 1 85 11.9 11.9 3,824 26,509 47 6 817 2,832
105 🇮🇶 Iraq 10 41 11.6 9.8 4,343 38,747 120 480 539 4,969
106 🇴🇲 Oman 10 32 10.9 10.9 3,127 45,003 156 60 744 3,576
107 🇸🇻 El Salvador 6 13 10.8 10.8 18,428 34,086 379 4,727 1,585 7,774
108 🇭🇳 Honduras 8 23 10.3 10.3 13,436 34,316 572 5,064 1,410 7,641
109 🇬🇳 Guinea 7 45 10.1 6.3 20,346 18,081 147 6,727 454 3,761
110 🇹🇿 Tanzania 13 50 9.4 9.0 28,697 22,586 1,073 8,485 2,785 6,395
111 🇵🇦 Panama 7 22 9.4 9.4 6,520 36,612 151 679 720 6,998
112 🇬🇾 Guyana 6 20 9.0 9.0 9,187 28,212 748 864 1,186 7,344
113 🇸🇮 Slovenia 26 49 8.9 8.5 10,356 27,123 1,574 357 900 2,071
114 🇧🇭 Bahrain 11 42 8.8 8.8 2,042 28,027 182 229 750 3,663
115 🇯🇲 Jamaica 10 31 8.7 8.3 9,336 21,367 223 356 1,471 3,556
116 🇰🇬 Kyrgyzstan 7 40 8.4 8.4 6,778 33,286 161 72 1,501 4,983
117 🇵🇸 Palestine 10 31 8.3 8.3 5,509 29,388 95 245 812 3,923
118 🇸🇰 Slovakia 13 27 8.0 7.4 5,756 25,217 292 193 883 2,516
119 🇬🇮 Gibraltar 1 21 7.9 7.9 7,673 16,102 386 3,982 632 2,282
120 🇲🇹 Malta 31 56 7.6 7.6 3,580 28,190 50 534 761 3,930
121 🇨🇮 Côte d'Ivoire 2 19 7.6 7.6 14,132 33,563 176 1,491 927 4,248
122 🇱🇺 Luxembourg 12 25 7.0 7.0 8,621 16,715 475 316 917 1,657
123 🇰🇼 Kuwait 2 21 6.9 6.9 2,718 27,860 27 74 1,073 2,699
124 🇱🇷 Liberia 11 43 6.8 6.8 28,778 18,445 121 10,027 983 5,412
125 🇸🇷 Suriname 3 19 6.7 6.7 3,821 22,472 175 713 757 3,641
126 🇿🇼 Zimbabwe 4 26 6.3 6.3 18,762 28,919 112 147 1,302 6,236
127 🇦🇬 Antigua and Barbuda 9 21 6.1 6.1 4,896 12,483 52 26 279 2,036
128 🇵🇾 Paraguay 8 18 5.9 5.9 6,265 21,646 300 3,071 471 4,110
129 🇪🇷 Eritrea 11 29 5.8 4.6 15,426 7,443 3,418 138 286 1,732
130 🇻🇨 Saint Vincent and the Grenadines 11 25 5.7 5.7 4,066 8,161 23 30 549 1,879
131 🇧🇯 Benin 10 16 5.6 5.6 21,948 11,234 325 13,514 293 2,270
132 🇬🇺 Guam 10 44 5.5 4.5 511 17,057 14 33 154 3,148
133 🇦🇫 Afghanistan 8 26 5.3 5.3 13,045 18,705 1,027 728 890 3,491
134 🇨🇫 Central African Republic 3 18 5.3 5.3 38,834 7,971 375 15,448 187 2,454
135 🇱🇮 Liechtenstein 16 59 5.2 5.2 1,175 9,182 176 210 434 1,491
136 🇹🇳 Tunisia 5 15 5.1 5.1 10,132 26,250 173 676 507 3,371
137 🇸🇳 Senegal 6 21 5.1 4.3 12,027 13,457 159 3,041 466 2,450
138 🇹🇹 Trinidad and Tobago 3 5 4.6 4.6 1,723 9,873 3 11 229 1,814
139 🇦🇩 Andorra 8 45 4.6 4.6 4,311 14,526 84 1,199 649 2,824
140 🇳🇮 Nicaragua 8 17 4.6 4.6 6,405 10,464 600 2,780 483 3,249
141 🇬🇬 Guernsey 8 24 4.5 3.1 1,575 6,630 113 166 187 986
142 🇲🇴 Macau 2 15 4.5 4.5 3,426 6,072 47 658 917 986
143 🇰🇵 North Korea 1 19 4.4 4.4 15,858 4,007 1,874 103 934 773
144 🇨🇷 Costa Rica 10 19 4.3 4.3 4,443 10,745 253 769 450 2,188
145 🇲🇬 Madagascar 3 11 4.3 4.3 23,805 7,053 2,068 2,796 1,017 3,460
146 🇵🇫 French Polynesia 11 17 4.3 4.3 2,054 12,019 210 985 196 2,632
147 🇰🇾 Cayman Islands 5 17 4.2 4.2 764 10,965 83 36 319 2,040
148 🇬🇵 Guadeloupe 11 30 4.1 4.1 1,466 15,765 41 118 285 1,953
149 🇦🇴 Angola 2 17 4.1 4.1 11,795 15,013 70 959 1,047 3,617
150 🇿🇲 Zambia 4 13 3.7 3.7 7,413 7,263 410 96 532 2,294
151 🇷🇼 Rwanda 7 14 3.5 2.9 13,643 5,940 643 4,842 327 1,609
152 🇬🇱 Greenland 3 11 3.5 3.5 1,601 4,186 42 4 186 967
153 🇸🇲 San Marino 4 13 3.5 3.5 1,033 9,251 11 245 155 894
154 🇨🇩 Congo (Democratic Republic) 3 16 3.3 3.2 10,412 8,123 66 2,680 289 1,549
155 🇨🇲 Cameroon 9 16 3.2 3.2 10,497 12,297 42 3,015 200 1,731
156 🇫🇯 Fiji 3 9 3.2 3.2 2,210 7,945 6 24 454 1,671
157 🇱🇨 Saint Lucia 7 20 3.1 3.1 2,637 7,941 17 45 591 2,042
158 🇬🇦 Gabon 6 17 3.0 3.0 4,951 7,125 33 81 182 1,966
159 🇭🇹 Haiti 1 6 2.9 2.9 8,800 4,956 45 1,599 432 2,797
160 🇩🇴 Dominican Republic 7 9 2.9 2.9 3,892 7,216 172 1,900 298 1,365
161 🇸🇴 Somalia 4 15 2.8 2.8 8,102 4,946 21 172 881 2,647
162 🇲🇺 Mauritius 7 13 2.8 2.8 3,727 7,593 76 1,021 457 1,523
163 🇧🇲 Bermuda 4 5 2.7 2.7 665 3,426 24 747 189 715
164 🇳🇨 New Caledonia 1 5 2.6 2.6 678 6,105 49 42 103 1,410
165 🇾🇪 Yemen 3 12 2.5 2.5 7,733 10,455 96 2,542 348 2,854
166 🇰🇲 Comoros 3 5 2.5 2.5 3,655 5,007 55 1,568 87 776
167 🇧🇼 Botswana 4 9 2.3 2.3 1,646 5,688 5 10 174 1,109
168 🇯🇪 Jersey 10 18 2.2 2.2 908 4,816 101 68 148 969
169 🇻🇬 British Virgin Islands 7 17 2.2 2.2 693 5,394 3 49 101 1,205
170 🇰🇳 Saint Kitts and Nevis 3 9 2.1 2.1 1,807 3,326 26 25 174 746
171 🇼🇸 Samoa 1 7 2.0 2.0 600 4,406 0 0 265 720
172 🇷🇪 Réunion 4 6 2.0 2.0 1,254 5,554 31 90 107 643
173 🇹🇯 Tajikistan 2 9 1.9 1.9 2,684 11,087 30 72 355 878
174 🇸🇸 South Sudan 1 5 1.9 1.9 8,871 4,502 76 3,089 168 1,511
175 🇳🇦 Namibia 4 10 1.8 1.8 1,760 5,176 18 11 95 936
176 🇫🇴 Faroe Islands 21 36 1.8 1.8 294 2,928 12 4 125 472
177 🇬🇫 French Guiana 1 3 1.7 1.7 850 7,399 59 389 71 1,349
178 🇮🇲 Isle of Man 8 19 1.6 1.6 1,428 7,437 24 689 210 1,162
179 🇧🇹 Bhutan 2 6 1.6 1.6 2,519 4,667 20 79 120 953
180 🇩🇯 Djibouti 3 5 1.5 1.5 764 1,675 5 116 245 1,383
181 🇱🇸 Lesotho 10 15 1.5 1.5 1,858 2,512 5 11 95 648
182 🇬🇩 Grenada 4 8 1.4 1.4 585 1,858 8 43 97 617
183 🇲🇫 Saint Martin 6 9 1.3 1.3 468 4,583 13 132 100 1,182
184 🇧🇮 Burundi 6 9 1.3 1.3 5,894 2,341 436 314 173 493
185 🇧🇧 Barbados 3 4 1.3 1.3 1,700 3,063 42 7 179 514
186 🇲🇿 Mozambique 5 8 1.3 1.3 2,000 1,892 34 150 119 465
187 🇲🇷 Mauritania 1 3 1.3 1.3 2,055 4,774 74 116 38 980
188 🇪🇭 Western Sahara 3 4 1.3 1.3 767 2,863 34 101 56 578
189 🇹🇬 Togo 6 11 1.2 1.2 3,040 1,492 59 1,735 55 372
190 🇵🇬 Papua New Guinea 2 6 1.2 1.2 1,133 1,765 0 0 217 444
191 🇲🇸 Montserrat 1 3 1.2 1.2 6,844 1,223 274 6,156 393 892
192 🇦🇸 American Samoa 9 13 1.1 1.1 269 2,750 5 1 127 1,200
193 🇧🇸 Bahamas 2 5 1.1 1.1 358 1,866 21 24 63 294
194 🇹🇨 Turks and Caicos Islands 2 4 1.0 1.0 102 1,577 0 2 23 218
195 🇻🇺 Vanuatu 1 5 1.0 1.0 1,064 1,485 14 3 157 613
196 🇹🇩 Chad 1 4 1.0 1.0 4,357 3,011 75 2,048 52 764
197 🇻🇮 United States Virgin Islands 3 5 1.0 1.0 399 2,875 0 7 72 787
198 🇹🇴 Tonga 1 2 0.9 0.4 95 1,134 1 1 41 279
199 🇲🇱 Mali 1 2 0.9 0.9 5,096 2,540 29 3,350 174 705
200 🇳🇷 Nauru 11 18 0.9 0.9 329 1,072 4 343 49 571
201 🇧🇫 Burkina Faso 1 5 0.8 0.8 3,127 3,133 325 2,983 55 463
202 🇸🇽 Sint Maarten 4 5 0.8 0.8 632 3,217 7 42 67 621
203 🇦🇼 Aruba 2 3 0.8 0.8 312 2,372 6 9 44 272
204 🇨🇼 Curaçao 1 3 0.8 0.8 32 1,756 0 0 15 197
205 🇦🇽 Åland Islands 1 1 0.8 0.8 112 770 26 4 11 100
206 🇲🇭 Marshall Islands 3 3 0.8 0.8 114 340 0 0 13 95
207 🇧🇳 Brunei 3 4 0.8 0.8 74 1,456 1 4 27 146
208 🇸🇯 Svalbard and Jan Mayen 1 3 0.7 0.7 60 529 5 5 39 173
209 🇧🇿 Belize 3 5 0.7 0.7 409 1,622 61 91 49 526
210 🇧🇶 Bonaire, Sint Eustatius and Saba 1 1 0.7 0.7 237 1,967 21 82 27 734
211 🇬🇶 Equatorial Guinea 1 5 0.7 0.7 828 2,165 12 9 51 379
212 🇫🇲 Micronesia 3 3 0.6 0.6 165 680 0 0 6 148
213 🇳🇪 Niger 1 2 0.6 0.6 2,932 1,126 66 270 7 128
214 🇵🇼 Palau 4 5 0.6 0.6 23 548 3 3 9 127
215 🇦🇮 Anguilla 4 5 0.6 0.6 57 788 0 1 15 178
216 🇸🇩 Sudan 2 6 0.6 0.6 1,101 3,448 8 181 141 663
217 🇧🇱 Saint Barthélemy 2 3 0.5 0.5 218 1,485 0 225 22 525
218 🇲🇵 Northern Mariana Islands 2 5 0.5 0.5 109 1,819 3 0 20 304
219 🇲🇻 Maldives 2 4 0.5 0.5 1,708 768 57 1,557 36 187
220 🇵🇲 Saint Pierre and Miquelon 1 1 0.4 0.4 76 1,203 2 5 18 382
221 🇸🇿 Eswatini 3 3 0.4 0.4 653 890 1 1 37 162
222 🇹🇻 Tuvalu 1 2 0.4 0.4 118 68 3 211 6 40
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 339 7 125 10 74
225 🇸🇨 Seychelles 3 3 0.3 0.3 280 620 10 12 42 176
226 🇸🇭 Saint Helena 2 3 0.3 0.3 60 347 0 6 28 107
227 🇩🇲 Dominica 1 2 0.3 0.3 192 466 1 8 19 144
228 🇹🇱 Timor-Leste 5 5 0.3 0.3 278 125 0 84 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 567 17 16 30 145
231 🇲🇶 Martinique 3 4 0.2 0.2 99 553 1 6 7 69
232 🇸🇹 Sao Tome and Principe 1 1 0.2 0.2 525 205 20 204 6 91
233 🇬🇼 Guinea-Bissau 1 1 0.2 0.2 776 487 4 40 23 94
234 🇾🇹 Mayotte 2 2 0.2 0.2 125 264 0 25 20 50
235 🇸🇧 Solomon Islands 1 2 0.1 0.1 168 390 0 0 38 135
236 🇨🇽 Christmas Island 1 1 0.1 0.1 57 132 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 74 102 5 17 8 31
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,179 2,280.4 1,470.3 1,832,920 5,726,186 132,939 66,353 186,612 815,162
2 Chicago, IL 🇺🇸 United States 1,896 1,713.9 1,701.9 713,628 6,574,579 39,424 12,501 89,547 794,980
3 London 🇬🇧 United Kingdom 2,038 1,363.4 1,180.9 2,632,307 2,672,124 249,529 145,538 236,802 467,612
4 Los Angeles, CA 🇺🇸 United States 2,047 1,164.8 1,089.2 647,916 4,613,976 33,409 17,639 66,525 600,247
5 Hanoi 🇻🇳 Vietnam 2,151 876.0 837.5 2,424,080 1,676,026 63,948 2,301,030 100,554 217,041
6 Manila, Metro Manila 🇵🇭 Philippines 2,179 793.6 793.6 1,234,980 1,481,787 36,913 636,588 168,528 358,530
7 Sydney, NSW 🇦🇺 Australia 1,432 682.0 682.0 399,269 2,822,235 29,697 34,706 68,127 448,501
8 Saint Petersburg, Saint Petersburg 🇷🇺 Russia 689 566.0 566.0 297,884 1,534,337 6,959 1,923 68,492 168,517
9 Seoul 🇰🇷 South Korea 294 543.0 542.9 261,221 1,138,257 14,008 41,210 84,270 97,020
10 Jakarta 🇮🇩 Indonesia 1,674 475.0 472.5 838,608 1,089,241 6,600 740,038 63,212 246,701
11 Paris 🇫🇷 France 981 437.9 410.3 597,476 1,126,516 68,949 88,940 31,323 123,781
12 Toronto, ON 🇨🇦 Canada 885 375.3 373.6 491,485 1,301,773 44,351 12,820 25,461 138,084
13 Yangon 🇲🇲 Myanmar 488 357.1 357.1 365,295 1,623,845 41,365 20,924 98,139 252,165
14 Melbourne, VIC 🇦🇺 Australia 671 329.8 312.1 213,303 1,218,183 13,359 11,063 21,201 131,170
15 Moscow, Moscow 🇷🇺 Russia 505 327.5 327.5 214,143 1,172,898 4,806 3,583 36,218 152,129
16 Dubai 🇦🇪 United Arab Emirates 779 320.6 260.2 84,298 693,915 2,877 14,020 37,278 91,282
17 Philadelphia, PA 🇺🇸 United States 564 316.6 297.7 146,579 1,071,550 8,386 4,177 14,456 146,815
18 Bangkok 🇹🇭 Thailand 625 313.6 293.3 397,188 874,639 6,930 276,661 40,549 168,457
19 Cotabato, Maguindanao del Norte 🇵🇭 Philippines 739 301.4 287.0 762,978 595,688 15,892 535,140 97,078 412,619
20 Sao Paulo, SP 🇧🇷 Brazil 566 251.1 249.6 248,005 748,836 11,517 63,161 21,444 89,873
21 København 🇩🇰 Denmark 534 246.1 239.1 384,482 757,903 198,371 8,060 19,704 59,110
22 Kyiv, Kyiv 🇺🇦 Ukraine 576 242.4 234.5 167,637 993,383 4,849 2,489 39,574 125,363
23 Kuala Lumpur, KUL 🇲🇾 Malaysia 346 237.3 159.1 97,861 488,945 727 50,334 10,895 39,393
24 Warsaw 🇵🇱 Poland 391 236.9 218.0 157,200 715,347 14,247 5,484 23,846 54,856
25 Berlin 🇩🇪 Germany 460 219.4 210.4 264,273 873,904 83,063 20,563 27,706 103,961
26 Buenos Aires, CABA 🇦🇷 Argentina 286 216.7 216.1 326,712 799,840 31,682 35,728 28,015 80,544
27 Townsville, QLD 🇦🇺 Australia 436 207.5 6.2 967 16,946 61 115 259 3,737
28 Detroit, MI 🇺🇸 United States 559 206.6 199.2 26,440 608,888 1,203 814 5,832 94,345
29 Guangzhou, Guangdong 🇨🇳 China 245 205.8 205.8 133,101 614,446 13,130 49,544 36,604 76,299
30 Rio de Janeiro, RJ 🇧🇷 Brazil 465 203.6 146.7 163,951 489,625 11,304 28,259 23,330 48,225
31 Montreal, QC 🇨🇦 Canada 472 203.2 203.2 122,326 641,567 13,433 3,302 11,036 50,954
32 Phnom Penh 🇰🇭 Cambodia 387 201.9 201.3 571,210 522,075 12,618 588,950 35,841 168,858
33 Helsinki 🇫🇮 Finland 284 198.6 196.7 112,793 429,462 10,680 1,721 19,525 49,127
34 Prague 🇨🇿 Czechia 269 196.7 187.1 209,912 508,633 5,088 4,832 20,302 45,692
35 Miami, FL 🇺🇸 United States 467 186.8 144.8 99,616 477,642 5,820 7,990 6,488 60,965
36 Budapest 🇭🇺 Hungary 520 183.1 164.4 307,084 1,099,775 14,395 8,242 50,555 124,155
37 Vienna 🇦🇹 Austria 766 181.8 173.5 109,291 489,394 12,122 12,691 20,406 76,036
38 Kampala 🇺🇬 Uganda 471 178.2 68.2 404,441 163,845 10,066 215,904 15,266 53,395
39 Stockholm 🇸🇪 Sweden 582 178.0 169.6 95,871 304,628 13,295 1,858 12,926 34,293
40 Tokyo, Tokyo 🇯🇵 Japan 259 172.5 170.2 259,142 336,484 23,710 11,812 32,564 92,696
41 Istanbul 🇹🇷 Türkiye 317 172.5 128.9 170,292 547,699 1,409 20,210 34,776 77,396
42 Eindhoven 🇳🇱 Netherlands 329 171.2 171.2 162,292 435,704 111,943 15,541 10,050 39,732
43 Yogyakarta 🇮🇩 Indonesia 298 171.0 168.9 533,348 345,857 7,646 549,320 13,370 70,843
44 Perth, WA 🇦🇺 Australia 418 170.9 99.6 18,872 272,695 1,209 1,157 5,095 45,650
45 Vancouver, BC 🇨🇦 Canada 711 170.7 40.3 38,811 139,606 4,311 746 2,763 18,614
46 Bucharest 🇷🇴 Romania 331 169.6 165.0 130,061 857,986 4,801 4,188 19,749 68,862
47 Nashville, TN 🇺🇸 United States 856 168.7 51.5 37,893 145,831 497 355 2,234 22,416
48 Singapore 🇸🇬 Singapore 417 163.8 152.6 84,721 384,215 5,235 20,853 33,904 61,744
49 Atlanta, GA 🇺🇸 United States 373 159.7 154.7 32,717 423,664 1,270 943 4,958 81,366
50 Sacramento, CA 🇺🇸 United States 413 159.5 158.0 17,540 614,371 1,273 972 6,089 99,491
51 Houston, TX 🇺🇸 United States 238 158.9 37.4 9,717 100,673 315 119 1,383 16,586
52 Winnipeg, MB 🇨🇦 Canada 570 154.1 59.1 21,126 204,135 1,231 425 3,261 29,636
53 Oldenburg 🇩🇪 Germany 173 153.0 151.4 82,063 236,585 43,991 3,357 7,435 22,631
54 Tyumen, Tyumen oblast 🇷🇺 Russia 306 147.5 147.5 95,141 482,654 2,000 538 19,971 49,974
55 Sofia 🇧🇬 Bulgaria 464 140.6 132.4 69,793 471,103 1,321 911 15,195 37,361
56 Washington, DC 🇺🇸 United States 251 139.1 121.3 86,395 421,265 6,710 2,408 8,490 49,484
57 San Jose, CA 🇺🇸 United States 288 134.9 134.9 25,981 655,825 1,736 1,111 6,901 84,585
58 Tehran 🇮🇷 Iran 313 132.3 69.6 52,110 380,653 1,291 19,820 5,565 30,477
59 Den Haag 🇳🇱 Netherlands 270 131.7 27.8 19,638 98,650 13,069 3,301 2,360 9,188
60 Dublin 🇮🇪 Ireland 426 129.9 114.9 100,657 288,687 10,200 2,042 12,828 35,654
61 San Francisco, CA 🇺🇸 United States 194 128.0 128.0 173,821 462,468 8,962 6,884 10,965 54,916
62 Maracaibo, ZU 🇻🇪 Venezuela 535 125.7 119.2 82,775 333,647 4,471 30,736 6,100 64,464
63 Anchorage, AK 🇺🇸 United States 347 125.1 122.7 5,861 199,273 276 177 2,781 45,133
64 Dallas, TX 🇺🇸 United States 295 124.9 120.6 13,963 239,842 365 345 2,841 38,376
65 Busan 🇰🇷 South Korea 143 121.7 121.7 69,400 348,689 2,527 8,548 12,381 39,265
66 Las Vegas, NV 🇺🇸 United States 172 120.0 111.0 60,345 321,846 573 926 5,824 41,881
67 Oslo 🇳🇴 Norway 321 119.9 115.0 74,207 274,151 6,511 1,643 11,909 33,429
68 Volsk, Saratov oblast 🇷🇺 Russia 525 116.5 89.1 40,112 155,727 299 241 4,104 17,041
69 Baltimore, MD 🇺🇸 United States 325 116.5 79.5 22,656 273,572 484 426 3,958 37,368
70 Portland, OR 🇺🇸 United States 185 114.7 90.8 57,267 236,884 3,756 873 4,378 28,336
71 Amsterdam 🇳🇱 Netherlands 207 110.9 108.3 256,026 227,672 182,306 28,327 11,015 31,177
72 Phoenix, AZ 🇺🇸 United States 228 106.8 44.7 9,484 121,463 451 293 1,494 24,917
73 Hong Kong 🇭🇰 Hong Kong 200 99.6 56.2 103,516 101,745 1,186 2,868 18,631 18,363
74 Mumbai, MH 🇮🇳 India 263 98.5 98.0 258,652 359,189 6,469 102,036 19,407 76,972
75 Seattle, WA 🇺🇸 United States 206 97.5 2.5 3,081 6,736 198 53 164 546
76 Darwin, NT 🇦🇺 Australia 310 93.9 44.6 12,771 105,322 454 933 1,835 20,261
77 Cairo 🇪🇬 Egypt 206 91.6 39.0 62,617 225,545 503 6,961 9,939 25,647
78 Cape Town 🇿🇦 South Africa 237 89.8 82.8 57,449 258,070 1,333 3,830 7,821 39,978
79 Kermanshah 🇮🇷 Iran 247 89.6 88.5 59,387 577,645 573 3,505 3,746 42,779
80 Minsk 🇧🇾 Belarus 115 84.7 26.9 19,992 117,544 481 235 5,100 13,656
81 München 🇩🇪 Germany 170 82.1 81.8 84,961 289,323 27,266 4,465 10,061 33,590
82 Serrekunda 🇬🇲 Gambia 273 78.5 77.0 195,185 282,496 10,698 17,296 6,850 54,231
83 Amman 🇯🇴 Jordan 262 78.5 61.9 37,103 303,513 107 881 5,905 32,768
84 Ho Chi Minh City 🇻🇳 Vietnam 141 74.9 60.0 206,416 87,338 3,361 211,366 7,776 20,792
85 Sylhet 🇧🇩 Bangladesh 194 74.5 74.5 329,931 80,917 59,886 57,802 27,021 65,202
86 Damascus 🇸🇾 Syria 163 72.4 65.6 104,871 306,275 4,564 11,498 10,456 44,470
87 Brisbane, QLD 🇦🇺 Australia 188 71.7 67.5 31,938 197,023 1,317 1,928 4,513 35,310
88 Denver, CO 🇺🇸 United States 204 71.6 58.4 17,410 134,277 1,325 581 2,038 21,062
89 Gamagori, Aichi 🇯🇵 Japan 271 71.6 68.8 13,153 161,444 3,182 1,487 6,737 39,329
90 Ulaanbaatar 🇲🇳 Mongolia 127 70.2 70.2 91,683 343,965 1,881 1,671 9,239 26,270
91 San Diego, CA 🇺🇸 United States 94 68.2 68.2 55,195 256,391 2,337 1,874 3,415 34,968
92 Karachi, SD 🇵🇰 Pakistan 147 67.1 63.2 209,864 263,480 6,697 105,138 17,546 60,258
93 Semarang 🇮🇩 Indonesia 322 61.7 61.7 92,280 98,757 1,624 92,742 6,749 32,420
94 Auckland 🇳🇿 New Zealand 142 61.5 61.5 47,632 190,328 2,563 1,657 6,810 21,915
95 Tallinn 🇪🇪 Estonia 288 61.2 60.4 32,061 174,551 1,075 374 8,149 15,986
96 Denpasar 🇮🇩 Indonesia 28 60.6 60.6 239,875 103,387 4,156 284,862 3,168 25,458
97 Calgary, AB 🇨🇦 Canada 170 60.0 60.0 22,254 170,303 954 248 2,358 25,440
98 Ninh Binh 🇻🇳 Vietnam 197 58.2 55.8 65,871 59,322 6,843 76,410 3,702 15,669
99 Delhi, DL 🇮🇳 India 165 57.8 57.6 98,456 167,913 3,782 39,965 18,744 31,632
100 Beijing, Beijing 🇨🇳 China 130 57.2 57.2 47,041 175,888 11,385 11,687 10,252 8,869
101 Aleppo 🇸🇾 Syria 155 57.0 50.6 117,001 233,299 1,749 4,638 6,259 37,306
102 Catania 🇮🇹 Italy 144 56.5 56.5 17,419 140,478 199 8,775 1,665 6,724
103 Shanghai, Shanghai 🇨🇳 China 79 56.2 40.0 56,793 93,459 6,533 15,032 6,043 6,679
104 Boston, MA 🇺🇸 United States 110 54.6 35.0 58,107 106,705 2,760 770 2,398 14,554
105 Milan 🇮🇹 Italy 104 54.2 52.9 78,811 204,153 10,266 16,666 3,909 16,019
106 Orlando, FL 🇺🇸 United States 113 52.1 52.1 17,140 156,895 1,255 652 2,565 20,453
107 Shenzhen, Guangdong 🇨🇳 China 143 51.6 46.2 39,411 125,997 4,331 13,374 9,926 14,122
108 Honolulu, HI 🇺🇸 United States 118 49.7 24.0 15,995 65,301 960 669 1,447 8,588
109 Ben Tre 🇻🇳 Vietnam 99 49.0 44.6 151,402 32,419 4,750 148,535 3,321 12,171
110 Santiago 🇨🇱 Chile 86 48.3 2.6 3,883 9,327 174 360 647 1,271
111 Barcelona 🇪🇸 Spain 100 48.3 46.8 78,935 107,455 7,795 31,623 6,632 14,301
112 Mexico City, CDMX 🇲🇽 Mexico 75 47.2 42.4 55,326 133,085 2,590 4,691 4,081 12,249
113 Kolkata, WB 🇮🇳 India 150 46.6 45.9 131,183 78,970 21,787 35,016 19,196 35,944
114 Toyohashi, Aichi 🇯🇵 Japan 170 45.7 42.6 11,140 98,404 2,794 876 4,731 25,546
115 Lviv, Lviv oblast 🇺🇦 Ukraine 150 45.0 44.2 62,463 131,483 966 381 8,372 17,761
116 Mashhad 🇮🇷 Iran 251 44.6 41.4 16,932 149,750 402 3,882 2,166 6,353
117 Ninohe, Iwate 🇯🇵 Japan 247 44.4 44.1 7,161 81,846 390 333 5,640 25,418
118 Sarajevo 🇧🇦 Bosnia and Herzegovina 159 44.1 44.0 55,695 168,303 579 442 4,571 11,698
119 Baku 🇦🇿 Azerbaijan 100 43.3 38.3 38,449 217,459 527 1,060 5,529 18,189
120 Colombo 🇱🇰 Sri Lanka 107 43.1 42.8 66,996 94,312 843 21,806 15,645 35,260
121 Adelaide, SA 🇦🇺 Australia 123 42.5 42.5 9,589 144,333 917 567 2,813 17,586
122 Addis Ababa 🇪🇹 Ethiopia 68 42.3 40.4 115,291 123,221 474 1,806 9,115 33,185
123 Surabaya 🇮🇩 Indonesia 106 41.1 37.9 76,546 62,767 1,232 66,304 1,974 10,890
124 Nam Dinh 🇻🇳 Vietnam 128 40.9 35.6 67,264 46,449 5,821 79,561 1,689 8,133
125 Zaozhuang, Shandong 🇨🇳 China 123 40.0 39.9 24,179 141,876 1,348 14,078 6,007 20,080
126 Doha 🇶🇦 Qatar 78 39.5 39.5 10,295 115,819 407 1,233 4,840 15,020
127 Zürich, ZH 🇨🇭 Switzerland 76 39.4 39.4 57,294 87,354 10,073 5,345 4,264 11,207
128 Austin, TX 🇺🇸 United States 69 39.0 33.8 19,552 105,605 1,457 790 1,453 19,517
129 Rome 🇮🇹 Italy 76 38.7 36.7 63,696 163,290 2,244 12,898 3,499 10,965
130 Jersey City, NJ 🇺🇸 United States 104 38.6 35.1 15,146 123,022 1,190 691 2,027 13,948
131 Madrid 🇪🇸 Spain 76 38.2 37.4 55,365 102,996 1,483 8,631 5,232 9,974
132 Asaba, Delta 🇳🇬 Nigeria 84 38.0 9.7 19,671 27,231 41 622 4,592 10,524
133 Wellington 🇳🇿 New Zealand 125 37.3 34.8 18,816 110,183 987 1,074 3,130 12,874
134 Nicosia 🇨🇾 Cyprus 127 37.3 37.0 10,889 137,042 466 2,896 2,334 16,776
135 Lisbon 🇵🇹 Portugal 70 37.3 37.3 31,376 124,157 1,072 3,710 3,362 11,946
136 Kharkiv, Kharkiv oblast 🇺🇦 Ukraine 80 37.2 35.1 24,393 105,583 322 259 3,611 12,058
137 Brussels 🇧🇪 Belgium 82 37.1 37.1 47,072 118,563 6,812 2,465 5,031 14,930
138 Freetown 🇸🇱 Sierra Leone 91 36.9 36.7 102,242 41,711 676 21,742 3,869 18,994
139 Johor Bahru, JHR 🇲🇾 Malaysia 39 36.8 29.1 10,897 123,426 179 7,710 2,194 9,837
140 Kathmandu 🇳🇵 Nepal 112 35.7 35.7 220,231 70,843 5,498 128,573 10,501 19,109
141 Zagreb 🇭🇷 Croatia 94 35.7 35.7 27,817 147,683 2,835 958 3,150 9,856
142 Lagos, Lagos 🇳🇬 Nigeria 73 35.1 34.3 168,544 111,389 1,374 17,402 9,296 28,192
143 Genoa 🇮🇹 Italy 73 35.1 34.3 47,640 135,749 928 39,880 3,761 13,035
144 Chennai, TN 🇮🇳 India 47 34.8 34.0 90,190 44,683 1,507 39,928 14,681 24,217
145 Riga 🇱🇻 Latvia 98 34.4 33.9 24,183 98,511 1,558 704 4,078 11,828
146 Bengaluru, KA 🇮🇳 India 97 34.3 32.5 80,872 75,362 1,237 51,157 12,119 25,982
147 Belgrade 🇷🇸 Serbia 106 34.2 32.1 31,869 142,501 446 950 5,003 10,565
148 Thessaloniki 🇬🇷 Greece 81 33.8 33.4 43,803 174,434 1,217 12,889 3,364 13,658
149 Tampa, FL 🇺🇸 United States 52 32.4 32.4 10,866 91,150 633 396 983 12,910
150 Birmingham 🇬🇧 United Kingdom 119 32.3 31.4 16,010 111,770 452 331 3,145 12,970
151 Riyadh 🇸🇦 Saudi Arabia 79 32.3 18.7 2,938 111,390 52 182 2,081 12,310
152 Rotterdam 🇳🇱 Netherlands 80 31.0 30.7 29,958 89,885 15,849 3,300 2,304 8,778
153 Goiânia, GO 🇧🇷 Brazil 69 30.8 28.8 15,865 85,432 807 8,619 1,146 8,190
154 Edmonton, AB 🇨🇦 Canada 56 30.4 30.4 7,755 105,060 402 217 1,530 14,082
155 Chengdu, Sichuan 🇨🇳 China 57 30.3 27.9 17,404 115,943 2,479 5,513 4,291 8,216
156 Tbilisi 🇬🇪 Georgia 75 29.6 29.6 23,420 148,631 124 1,190 4,914 15,300
157 Kansas City, KS 🇺🇸 United States 53 29.1 27.8 3,482 71,522 94 70 857 11,488
158 Toshkent 🇺🇿 Uzbekistan 86 28.7 28.2 20,874 208,217 200 84 3,287 13,238
159 Milton Keynes 🇬🇧 United Kingdom 50 27.7 27.7 1,585 65,583 173 187 752 5,973
160 Pittsburgh, PA 🇺🇸 United States 58 27.6 23.9 13,679 52,589 580 244 1,098 7,870
161 Annaba 🇩🇿 Algeria 40 27.1 7.9 17,553 39,520 114 866 720 3,975
162 Yerevan 🇦🇲 Armenia 89 27.1 20.1 18,207 140,848 119 315 4,164 13,759
163 Lahore, PB 🇵🇰 Pakistan 89 26.9 11.7 40,182 48,905 1,440 24,541 1,482 8,359
164 Omaha, NE 🇺🇸 United States 82 26.6 26.1 3,443 86,561 181 211 695 12,840
165 Manchester 🇬🇧 United Kingdom 61 26.4 26.2 20,158 75,360 981 268 2,401 8,283
166 Havana 🇨🇺 Cuba 129 26.2 26.2 98,261 46,170 2,797 13,826 3,375 12,455
167 Cherepovets, Vologda oblast 🇷🇺 Russia 176 25.0 24.5 26,836 77,993 65 25 4,097 10,486
168 Hangzhou, Zhejiang 🇨🇳 China 35 24.9 8.8 6,905 25,486 414 2,780 1,186 1,999
169 Lima, LI 🇵🇪 Peru 37 24.7 24.3 44,246 110,551 4,244 6,512 4,856 12,370
170 Thiruvananthapuram, KL 🇮🇳 India 74 24.7 24.5 64,978 58,448 1,023 61,737 6,718 22,364
171 Daejeon 🇰🇷 South Korea 61 24.3 24.0 9,720 79,368 1,046 1,141 2,795 5,982
172 Frankfurt 🇩🇪 Germany 20 24.3 0.0 – – – – – –
173 Vilnius 🇱🇹 Lithuania 60 24.2 24.2 27,749 74,129 2,322 625 2,345 4,959
174 Samarkand 🇺🇿 Uzbekistan 81 23.9 23.5 24,145 140,637 407 234 2,900 13,034
175 Islamabad, ICT 🇵🇰 Pakistan 57 23.9 23.6 30,443 75,869 1,256 14,131 2,143 9,602
176 Stavropol, Stavropol krai 🇷🇺 Russia 79 23.9 23.9 13,759 93,659 262 83 3,365 8,364
177 New Orleans, LA 🇺🇸 United States 34 23.7 21.8 25,997 60,205 1,223 356 1,254 11,443
178 Brampton, ON 🇨🇦 Canada 75 23.1 22.9 5,341 114,696 162 124 1,566 12,067
179 Charleston, SC 🇺🇸 United States 38 23.0 23.0 25,616 60,499 934 308 853 13,020
180 Sendai, Miyagi 🇯🇵 Japan 58 22.7 22.5 6,350 64,201 898 511 3,185 13,403
181 Ōsaka, Ōsaka 🇯🇵 Japan 52 22.5 21.2 31,030 45,743 7,723 1,642 3,074 9,491
182 Porto 🇵🇹 Portugal 27 22.4 22.4 31,466 65,534 360 1,680 1,831 6,603
183 San Antonio, TX 🇺🇸 United States 26 22.2 11.1 9,257 23,720 350 146 424 4,357
184 Ottawa, ON 🇨🇦 Canada 38 22.1 22.1 29,945 61,718 3,099 432 1,485 6,471
185 Kyoto, Kyōto 🇯🇵 Japan 45 21.9 19.7 28,572 42,313 3,422 2,068 4,455 10,468
186 Taipei 🇹🇼 Taiwan 50 21.8 19.6 27,758 55,496 1,764 22,112 3,229 6,334
187 Sapporo, Hokkaidō 🇯🇵 Japan 62 21.8 20.8 7,971 39,771 526 92 2,070 4,873
188 Cheongju 🇰🇷 South Korea 65 21.7 21.4 6,303 66,092 316 676 2,069 7,761
189 Skopje 🇲🇰 North Macedonia 42 21.1 18.9 21,867 79,024 1,435 757 2,149 6,441
190 Chiang Mai 🇹🇭 Thailand 53 21.0 21.0 16,101 44,903 508 16,273 1,513 13,247
191 Halifax, NS 🇨🇦 Canada 82 20.8 20.8 9,402 54,252 342 149 1,004 5,668
192 Chișinău 🇲🇩 Moldova 73 20.8 19.7 23,126 103,674 170 173 4,552 10,888
193 Medellín, ANT 🇨🇴 Colombia 53 20.8 10.0 24,671 29,479 718 11,404 1,774 3,569
194 Beirut 🇱🇧 Lebanon 68 20.5 20.5 17,401 112,506 108 6,327 1,864 10,267
195 Monaco 🇲🇨 Monaco 45 20.3 20.3 38,846 32,963 1,033 13,199 1,598 4,440
196 Pattaya 🇹🇭 Thailand 36 19.9 19.0 30,427 49,365 286 22,521 3,284 13,820
197 Manaus, AM 🇧🇷 Brazil 75 19.8 19.8 20,325 76,162 214 10,206 2,301 10,836
198 Ankara 🇹🇷 Türkiye 47 19.3 19.3 16,759 98,754 48 858 4,915 9,692
199 Malibu, CA 🇺🇸 United States 34 19.2 16.7 4,135 78,658 276 452 786 14,809
200 Nice 🇫🇷 France 32 19.0 18.2 33,313 50,774 3,540 7,408 1,300 5,547

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 91,983 processed segments, last updated 2026-11-02 00:25 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 819.6 76.3 563 44.34 47.56 1.32 10.37 2.37 9.90
2 Asia 9,531.9 94.9 2,148 25.86 44.71 1.04 16.52 2.76 8.28
3 Europe 8,767.5 90.2 3,696 17.84 49.18 2.58 1.33 1.94 5.62
4 North America 9,994.7 82.5 2,468 10.05 56.68 0.64 0.42 1.00 8.10
5 Oceania 1,550.6 80.8 437 8.72 60.13 0.58 0.62 1.35 9.04
6 South America 1,175.3 88.7 398 19.70 53.06 1.33 4.65 1.80 7.21
7 All 31,839.5 87.9 9,710 18.10 50.83 1.33 5.91 1.87 7.53
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 🇺🇬 Uganda 98.48 85.51–114.36 84.9 19
2 🇳🇵 Nepal 98.26 27.58–102.13 38.2 4
3 🇧🇩 Bangladesh 66.25 45.15–72.26 107.2 28
4 🇳🇬 Nigeria 66.14 39.72–78.00 66.3 35
5 🇰🇪 Kenya 58.79 54.46–65.94 19.9 55
6 🇨🇺 Cuba 56.92 30.19–61.26 34.3 25
7 🇵🇰 Pakistan 55.79 42.01–76.81 146.7 37
8 🇪🇹 Ethiopia 48.57 47.40–81.71 42.2 8
9 🇮🇳 India 47.50 43.12–54.57 476.8 291
10 🇻🇳 Vietnam 45.71 27.37–48.44 1,115.7 68
11 🇰🇭 Cambodia 45.55 25.44–47.25 221.8 7
12 🇬🇲 Gambia 43.04 35.10–55.98 95.4 29
13 🇨🇬 Congo (Congo-Brazzaville) 42.32 5.83–43.13 11.8 3
14 🇲🇼 Malawi 41.64 32.74–55.76 31.5 49
15 🇸🇱 Sierra Leone 39.48 24.98–45.91 79.1 46
16 🇨🇴 Colombia 38.42 34.78–42.84 50.9 36
17 🇬🇭 Ghana 35.95 30.04–59.72 11.4 10
18 🇮🇩 Indonesia 34.94 27.79–45.60 1,018.6 176
19 🇲🇦 Morocco 32.84 28.53–39.51 47.3 35
20 🇬🇧 United Kingdom 31.64 9.89–35.38 1,510.1 358
Top 20 localities by pedestrians per minute (at least 1 analysed hour)
# Locality Pedestrians / min Analysed (h)
1 🇮🇳 Varanasi 277.62 1.0
2 🇨🇫 Bangui 123.28 5.2
3 🇮🇳 Anantapur 118.73 1.2
4 🇺🇬 Mubende 109.17 3.2
5 🇲🇬 Toamasina 108.70 1.3
6 🇵🇰 Dera Ismail Khan 108.37 1.2
7 🇵🇰 Sialkot 105.14 3.4
8 🇺🇬 Kabale 103.17 3.1
9 🇳🇵 Kathmandu 102.68 35.7
10 🇸🇱 Kenema 100.05 2.4
11 🇵🇰 Multan 99.96 9.8
12 🇺🇬 Kampala 98.79 68.2
13 🇲🇸 Salem 98.57 1.2
14 🇵🇰 Mansehra 93.53 2.1
15 🇮🇳 Gaya 91.63 3.0
16 🇸🇱 Bo 90.46 2.6
17 🇸🇱 Makeni 88.17 1.2
18 🇲🇬 Antananarivo 85.38 2.7
19 🇷🇼 Kigali 83.35 2.5
20 🇳🇬 Lagos 82.00 34.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 74,649 32,938.3 7,819 234 2025-01-19 2026-11-01
2 Olena 4,883 1,762.6 951 91 2025-05-03 2026-10-29
3 Shadab 2,818 1,445.7 500 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