%% Download all the example material % % 1 - Download the latest MEYE model in ONNX format % ------------------------------------------------------------------------- % Download the .onnx file from the assets here: % https://github.com/fabiocarrara/meye/releases % EXAMPLE data can be found in this folder: % https://drive.google.com/drive/folders/1BG6O5BEkwXkNKC_1XuB3H9wbx3DeNWwF?usp=sharing % % 2 - Download an example image of a simple mouse eye from: % https://drive.google.com/file/d/1hcWcC1cAmzY4r-SIWDIgUY0-gpbmetUL/view?usp=sharing % % 3 - Download an example of a large image here: % https://drive.google.com/file/d/16QixvUMtojqfrcy4WXlYJ7CP3K8vrz_C/view?usp=sharing % % 4 - Download an example pupillometry video here: % https://drive.google.com/file/d/1TYj80dzIR1ZjpEvfefH_akhbUjwpvJta/view?usp=sharing %% EXAMPLE 1 % ------------------------------------------------------------------------- % Predict the pupil from a simple image of an eye % Clean up the workspace clearvars, clc % Change these values according to the filenames of the MEYE model and the % simple pupil image MODEL_NAME = 'meye_20220124.onnx'; IMAGE_NAME = 'pupilImage_simple.png'; % Initialize a MEYE object meye = Meye(MODEL_NAME); % Load the simple image img = imread(IMAGE_NAME); % Predict a single image [pupilMask, eyeProb, blinkProb] = meye.predictImage(img); % Plot the results of the prediction subplot(1,3,1) imshow(img) title('Original Image') subplot(1,3,2) imagesc(pupilMask) title(sprintf('Prediction (Eye:%.2f%% - Blink:%.2f%%)',eyeProb*100,blinkProb*100)) axis off, axis image subplot(1,3,3) imshowpair(img, pupilMask) title('Merge') %% EXAMPLE 2 % ------------------------------------------------------------------------- % Binarize the pupil prediction and get the pupil size in pixels % Clean up the workspace clearvars, close all, clc % Change these values according to the filenames of the MEYE model and the % simple pupil image MODEL_NAME = 'meye_20220124.onnx'; IMAGE_NAME = 'pupilImage_simple.png'; % Initialize a MEYE object meye = Meye(MODEL_NAME); % Load the simple image img = imread(IMAGE_NAME); % Predict a single image % You can automatically binarize the prediction by passing the "threshold" % optional argument. This number can be between 0 and 1. If omitted, the % function returns a raw probability map instead of a binarized image pupilBinaryMask = meye.predictImage(img, 'threshold', 0.4); imshowpair(img, pupilBinaryMask) title(sprintf('Pupil Size: %u px', sum(pupilBinaryMask,'all'))) %% EXAMPLE 3 % ------------------------------------------------------------------------- % Predict the pupil on a large image where the eye is a small portion of % the image % Clean up the workspace clearvars, close all, clc % Change these values according to the filenames of the MEYE model and the % simple pupil image MODEL_NAME = 'meye_20220124.onnx'; IMAGE_NAME = 'pupilImage_large.png'; % Initialize a MEYE object meye = Meye(MODEL_NAME); % Load the simple image img = imread(IMAGE_NAME); % Predict the image pupilMask = meye.predictImage(img); % As you can see from this image, the prediction is not perfect. This is % because MEYE was trained on images that tightly contained the eye. subplot(1,2,1) imshowpair(img, pupilMask) title('Tomal Image prediction (low-quality)') % In order to solve this issue it is possible to restrict the prediction to % a rectangular Region of Interest (ROI) in the image. This is done simply % by passing the optional argument "roiPos" to the predictImage function. % The roiPos is a 4-elements vector containing X,Y, width, height of a % rectangular shape. Note that X and Y are the coordinates of the top left % corner of the ROI ROI = [90,90,200,200]; pupilMask = meye.predictImage(img, 'roiPos', ROI); % Plot the results with the ROI and see the difference between the 2 methods subplot(1,2,2) imshowpair(img, pupilMask) rectangle('Position',ROI, 'LineStyle','-.','EdgeColor',[1,0,0]) title('ROI prediction (high quality)') linkaxes set(gcf,'Position',[300,600,1000,320]) %% EXAMPLE 4 % ------------------------------------------------------------------------- % Show a preview of the prediction of an entire pupillometry video. % % As you saw you can adjust a few parameters for the prediction. % If you want to get a quick preview of how your pre-recorded video will be % processed, you can use the method predictMovie_Preview. % Here you can play around with different ROI positions and threshold % values and see what are the results before analyzing the whole video. % Clean up the workspace clearvars, close all, clc % Change these values according to the filenames of the MEYE model and the % simple pupil image MODEL_NAME = 'meye_20220124.onnx'; VIDEO_NAME = 'mouse_example.mp4'; % Initialize a MEYE object meye = Meye(MODEL_NAME); % Try to play around moving or resizing the ROI to see how the performances change ROI = [70, 60, 200, 200]; % Change the threshold value to binarize the pupil prediction. % Use [] to see the raw probability map. Use a number in the range [0:1] to binarize it threshold = 0.4; meye.predictMovie_Preview(VIDEO_NAME,"roiPos", ROI,"threshold",threshold); %% EXAMPLE 5 % Predict the entire video and get the results table % Clean up the workspace clearvars, close all, clc % Change these values according to the filenames of the MEYE model and the % simple pupil image MODEL_NAME = 'meye_20220124.onnx'; VIDEO_NAME = 'mouse_example.mp4'; % Initialize a MEYE object meye = Meye(MODEL_NAME); % Try to play around moving or resizing the ROI to see how the performances change ROI = [70, 60, 200, 200]; % Change the threshold value to binarize the pupil prediction. % Use [] to see the raw probability map. Use a number in the range [0:1] to binarize it threshold = 0.4; % Predict the whole movie and save results in a table T = meye.predictMovie(VIDEO_NAME, "roiPos", ROI, "threshold", threshold); % Show some of the values in the table disp(head(T)) % Plot some of the results subplot 311 plot(T.frameTime,T.isEye, 'LineWidth', 2) title('Eye Probability') ylabel('Probability'), xlim([T.frameTime(1) T.frameTime(end)]) subplot 312 plot(T.frameTime,T.isBlink, 'LineWidth', 2) title('Blink Probability') ylabel('Probability') xlim([T.frameTime(1) T.frameTime(end)]) subplot 313 plot(T.frameTime,T.pupilArea, 'LineWidth', 2) title('Pupil Size') xlabel('Time (s)'), ylabel('Pupil Area (px)') xlim([T.frameTime(1) T.frameTime(end)])