A 12-year-old boy, who suffered a serious facial injury, and a 54-year-old bus driver were flown by air ambulance from the scene in Stanley, County Durham, to hospital in Newcastle.
Police said there were around 50 children and two adults on board the single-decker and double-decker which appeared to have collided head-on close to a junction on the A693 at around 8.20am.
Maureen Davison, who runs a burger van near the crash site, said she heard a “huge bang” and looked up.
Her son, who works with her and was in his car at the time, got out and went to help.
She said: “I’ve never heard a sound like it.
“I shouted to my son and he got out of his car and got the driver out and got all the kids off the bus.
“There was blood all over them and they were screaming. It was like a horror story - really, really bad.”
She described seeing injured people lying on the grass waiting to be treated.
Children who were not badly hurt were taken to the nearby Oxhill pub where teachers met them.
They are pupils at either St Bede’s in Lanchester or Tanfield Comprehensive School and are aged between 11 and 18.
Parents have been informed.
Police said the 54-year-old driver was flown to the Royal Victoria Infirmary (RVI) in Newcastle with serious injuries.
The Great North Air Ambulance Service said the 12-year-old, who attends Tanfield Comprehensive, was in a stable condition when he was handed over to hospital staff.
The other bus driver - a 27-year-old from Newton Aycliffe - suffered minor injuries and was taken to hospital.
Ambulances took seven children to hospital and another 12 were taken by other means, all with minor injuries.
They were taken to the RVI, the Queen Elizabeth in Gateshead and the University Hospital of North Durham.
Superintendent Colin Williamson said: “As the investigation into this collision continues, the roads in the area remain closed and we would like to thank everyone for their patience.”
Ken Ball, Durham and Darlington Fire and Rescue Service district commander for Derwentside, said the operation to free the trapped bus driver was “prolonged”.
“When the first crew arrived they confirmed one driver was trapped on the yellow bus going up the hill, multiple casualties involved, the majority of which were walking wounded,” he said.
“When we arrived the police were in attendance and we had to get some sort of control as there was lots of walking wounded.
“The police did an excellent job along with paramedics to get them treated.
“Our priority was then to get the driver of the yellow bus released, it was a straightforward rescue for us but it was prolonged due to the fact there was two buses in a serious entanglement.”