Protest Pulse · Method

How Pulsi counts the protests

Pulsi is a nightly participation index for the protests in Tirana since 31 May 2026. It measures how much crowd the News24 livestream shows each night, the same way every night. It is not a head count.

Updated 22 October 2026

The source

Each protest day is matched to one News24 livestream on YouTube; the day-by-day log on the Pulsi page links every stream. When a day had more than one action or stream, one is chosen as the day's series and the choice is recorded with the data. When there is no usable stream, the day keeps its note but has no figure.

From video to frames

Counting starts 20 minutes into the stream, to give people time to gather. The video is split into camera shots, and within shots that look like crowd views a full-resolution frame is taken every 10 seconds.

Counting each frame

Each frame goes through CLIP-EBC, an open crowd-counting model, using its two published checkpoints trained on the NWPU-Crowd dataset; the two estimates are averaged. Frames with fewer than 100 visible people are dropped as close-ups, graphics or empty views.

Checking by eye

The broadcast often puts the crowd in a split screen beside a speaker or a studio, or shows it on a studio video wall. Those frames can inflate a night's figures, so a sheet of each shot's strongest frame is checked by eye and such frames are removed. Since late September they are removed from all three figures; for earlier days they were removed from the peak where the review found them. Each day's decisions are recorded with the data on GitHub.

Three figures per night

The peak is the average of the 10 highest frames. Using ten frames instead of one keeps a single odd frame from deciding the whole night.

The mean and median are taken over all retained frames and describe the night as a whole.

The index

The raw figures are people visible in a frame, and they depend on where the cameras point. To compare nights, they are turned into an index: the peak of 6 June (Day 7), the highest in the first month of model results, is set to 50, and every other night is scaled by the same factor (index = raw × 50 / 2,582.5).

The three largest gatherings, 6 June, 20 June and 4 July, are anchored separately to on-the-ground estimates of the crowd's area and density, at 50, 100 and 60. So 100 is the largest day, 20 June; the values for those three days are editorial estimates, not model output.

What it can't tell you

Pulsi sees only what the camera sees: people outside the frame and people who came and went are not counted, while the same person can appear in many frames. Camera positions and the broadcaster's choices change from night to night, so small differences between nights mean little; the shape of the series over weeks is more reliable.

The model makes mistakes, especially with dense or distant crowds and in the dark. The index is not an attendance figure and shouldn't be converted into one.

The daily notes

Each night's note summarizes what happened, from the broadcast and news coverage. Figures from the police, the government or the organizers are attributed to them.

Data, code and corrections

  • The data (CSV)Every day with its index values, source and notes in both languages.
  • Code and full method (GitHub)The analysis scripts, the formulas and the review decisions for each day.
  • RSSOne item for every new day, for feed readers.

How to cite: Flamingo Revolution Diaspora, “Pulsi: daily participation index of the Tirana protests”, diaspora-zbarkon.com/en/pulsi (accessed [date]).

Found a mistake? Write to us and we'll correct it.

Back to Pulsi