2016-06-15 10 views
0

PsychoPy/PyGaze를 사용하여 자극을 표시하고 EyeTribe 눈 추적기로 눈 움직임을 추적하는 실험을했습니다. 이 실험에서는 각 프레임 (60Hz)에서 두 개의 시각적 자극의 크기를 업데이트합니다. 미리 각 프레임을 준비한 후 모든 화면 개체를 반복하여 제시합니다. 한편, 연속적인 소리가 재생됩니다. 이 모의 실험을 더미 모드 (마우스 움직임이 시선 위치에 대한 시뮬레이션으로 사용됨)로 실행하면 시각적 표현을위한 타이밍 문제가 없습니다. 그러나 시각 추적을 수행하는 동안 실험을 실행하면 시각적 표현의 타이밍이 더 이상 정확하지 않습니다 (프레임 지속 시간의 가변성 증가).타이밍 문제 Psychopy PyGaze EyeTribe 분광 추적 장치 (멀티 스레딩)

더 많은 스레딩을 시도했지만 PyGaze의 pytribe 스크립트에서 한 스레드가 눈 추적 스레드에서 오는 이벤트를 기다리고 있다는 증거를 찾을 수 없습니다. 그래서, 타이밍 문제를 일으키는 원인이 무엇인지 또는이를 해결하는 방법을 파악하는 방법을 모릅니다. (나는 그 문제를 충분히 구체적으로 설명하기를 희망한다).

답변

1

eyetrack 대 자극 렌더링을위한 별도의 스레드를 필요로하는 것보다 더 나쁩니다. 당신이 정말로 필요로하는 것은 프로세스 인으로, 파이썬 GIL (Global Interpreter Lock)을 피할 수 있습니다. GIL은 다른 스레드가 다른 프로세서에서 실행되는 것을 방지합니다.

시간 정밀도를 향상시키기 위해 저는 pygaze에서 iohub (사실 저는 믿을만한 eyetribe를 지원합니다)로 전환하는 것이 좋습니다. iohub는 가능한 한 기계의 다른 코어에서 실행되므로 자극 및 눈 데이터를 제 시간에 독립적으로 처리 할 수 ​​있으며 모든 동기화 항목을 처리합니다.

+0

친애하는 존을. 답변 해주셔서 감사합니다. 나는 당신의 시간을 달리 봤다. iohub를 사용하여 시력 추적 유무에 관계없이 프레임 데모. 시력 추적 기능이 없으면 평균 프레임 속도는 16.7ms (SD = 1.29)이고 프레임은 0.4 % 떨어지며 시력 추적을 통해 프레임이 2 % 떨어지면 평균 13.6ms (SD = 2.18)가됩니다. 내 CPU : Intel (R) Core (TM) i5-5300U CPU 2.30GHz. 시각적 프리젠 테이션의 타이밍이 내 모니터의 재생 빈도보다 어떻게 빨리 될 수 있습니까? 어떤 방식 으로든 눈길 추적 과정의 영향을받는 수직 간격을 차단합니까? – Hanne

+0

누군가가 동일한 문제에 부딪 힐 경우이 댓글을 추가하는 것입니다. Spyder 대신 명령 프롬프트에서 스크립트를 실행하면 시각적 프리젠 테이션의 타이밍이 iohub에서 양호합니다. – Hanne

+0

정보 Hanne 주셔서 감사합니다. 나는 (아마도) 디버깅을 가능하게하기 위해 실행되는 여러가지 부가적인 것들을 가지고 있기 때문에, 스파이더가 사람들에게 둔화 될 것이라고 항상 염려했다. 그건 그렇고, 위의 대답이 당신을 위해 작동한다면, 그것을 답으로 표시 할 수 있습니까? 건배 – Jon

1

Jon의 답변에 추가하기 : Hanne도 문제에 대해 이메일을 보내고 그녀가 Spyder에서 실험을 실행하고있는 것으로 나타났습니다. 명령 프롬프트에서 실행할 때 타이밍 문제가 없어야합니다. (분명히 GIL은 여전히 ​​주위에 있지만 실제로는 화면 타이밍에 영향을 미치지 않는 것 같습니다.)

앞으로 문제가 발생하지 않도록하기 위해 EyeTribe를 병렬로 실행할 수있는 클래스를 추가했습니다 방법. 참조 : https://github.com/esdalmaijer/PyTribe/blob/master/pytribe.py#L365

사용 예 :

 
if __name__ == "__main__": 

    from pygaze.display import Display 
    from pygaze.screen import Screen 
    from pytribe import ParallelEyeTribe 

    disp = Display() 

    scr = Screen() 
    scr.draw_fixation(fixtype='cross') 

    tracker = ParallelEyeTribe() 


    tracker.start_recording() 

    disp.fill(scr) 
    disp.show() 
    tracker.log("Stimulus onset") 

    time.sleep(10) 

    disp.show() 
    tracker.log("Stimulus offset") 
    tracker.stop_recording() 

    tracker.close() 
    disp.close()