Summary
Hello everyone, im a newbie to streamlit, im using streamlit-webrtc library at the moment. I’m following guide on github for real-time face recognition, everything work perfectly; beside that variable outside video_frame_callback paremeter in webrtc_streamer
stay the same when the camera is running. Let me show you guys my code for the problem.
I think it is related to threading problem cause the app will not rerun after the calling video_frame_callback parameter
My code
Main
result_queue: "queue.Queue[List[Detection]]" = queue.Queue()
df = pd.DataFrame(columns = ['Name', 'Score', 'Attendance time'])
leap = 0
st.title('Điểm danh', anchor = False)
left, right = st.columns(2, gap = 'large')
with right:
webrtc_ctx = webrtc_streamer(
key="object-detection",
mode=WebRtcMode.SENDRECV,
video_frame_callback=attendance,
media_stream_constraints={"video": True, "audio": False},
async_processing=True,
)
with left:
if st.checkbox("Show the predicted value", value = True):
if webrtc_ctx.state.playing:
dataframe = st.empty()
while True and (leap % 5 == 0):
result = result_queue.get()
result_list = [{'Name': result.name, 'Score': result.score, 'Attendance time': result.time}]
result_df = pd.DataFrame(result_list)
df = pd.concat([df, result_df], ignore_index = True)
dataframe.dataframe(df)
print(leap)
leap += 1
Attendance function
def attendance(frame: av.VideoFrame) -> av.VideoFrame:
image = frame.to_ndarray(format = 'bgr24')
image = imutils.resize(image, WINDOWS_WIDTH, WINDOWS_HEIGHT)
bboxs, landmarks = bf.get_face_bbox(image)
for i in range(len(bboxs)):
# Block of code to get face recognition, return name and score
detection = Detection(
name = str(name),
score = float(score)
time = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
)
// some code to show recogition on screen
result_queue.put(detection)
return av.VideoFrame.from_ndarray(image, format = 'bgr24')
Expected behaviour
Leap variable increment correctly, and saving to dataframe per 5 leap
Unexpected behaviour
- Leap variable did not increment, it stay the same at 0 when the camera is running. Everything work fine except that leap variable
Note
I’m not providing the full code because it is too long for reader, if you guys need I can provide in discussion. Many thanks if someone can help me solve this, i already desperate finding all the sources many day ago