With a dramatic increase in emergency department (ED) visit rates over the last four decades, both in the United States and around the world [24, 19, 20, 29] , accurate and timely triage is essential for assuring patients' safety and optimal resource allocation. Crowding in the ED can affect the triage process, leading to longer waiting times for triage, longer ED length of stays and potentially poorer outcomes [14] . More acutely, crowding in ED during a pandemic such as COVID-19 could increase the risk for health professionals as well as patients.
Computer-aided triage systems have been proposed over the years with the help of browser-based applications that exchange information with existing medical records [1] , wearable sensors [11] and automatic initial interpretation of CT scans [12] . However, most existing methods either require significant interaction between the patients and the healthcare workers or need active input from the patients. Hence, there is an emerging need for an automatic triage system that works passively and requires minimal attention and interaction from both patients and health professionals. In this work, we focus on real-time identification of febrile status and cyanosis in patients, since these are two critical symptoms in the recent COVID-19 crisis.
The Emergency Severity Index (ESI), used by most EDs in the United States [17] , records the febrile state of young children and manifestation of cyanosis in all age groups. While core temperature is difficult to measure non-invasively, there is some evidence that infrared cameras are able to do so to some level of acceptable accuracy [8] . In particular, we considered temperature in the forehead area and color distribution of the lip as indicators for the febrile state and cyanosis.
Many systems that detect a febrile state via infrared imaging [22, 26, 27, 13] have been reported and evaluated over the years and a deep learning method was introduced for face segmentation in [13] . Cyanosis is a bluish discoloration of the skin or other areas of the peripheral body resulting from poor circulation or inadequate oxygenation of the blood. More specifically, it is due to increased concentration of reduced hemoglobin (Hb) in the circulation and is clinically evident at an oxygen saturation of 85% or less. Mild cyanosis is more challenging to detect. Cyanosis can be observed in the lips, ears, trunk, nailbed, hands and conjunctiva. Circumoral areas (around the mouth) have been compared in detecting cyanosis resulting from arterial hypoxemia. It has been noted that while the tongue is the most sensitive area, the lips are more specific ( [6] , chapter 45). For this work, we therefore focused on the lips, since they are easier to observe than the tongue and have been identified in ED emergency response assessment systems.
Our proposed system consists of a low cost minicomputer -a Raspberry Pi (RasPi), a Google Coral USB accelerator tensor processing unit (TPU), a visible camera and a thermal camera, which are all portable and relatively inexpensive. By leveraging object detection and machine learning classification techniques, the system was designed to be capable of segmenting out regions of interest and classify febrile state and cyanosis in real-time.
Hardware configuration. Fig. 1 shows the proposed system. The various parts and their approximate costs are: a RasPi 4 with 4 GB of RAM ($55) and a 16 GB microSD card ($7), a Google Coral USB accelerator ($74.99), a visible light (Red, Green and Blue; RGB) RasPi Camera v2 ($10.99) and a FLIR Lepton 3.5 Radiometry Long-Wave Infrared Camera ($200) with its associated IO module ($100). The total offthe-shelf cost of the system is around $450. The visible light and thermal videos are captured at 25hz and 9hz, respectively. The RasPi was used as the main processor which takes in the video streams, processes them and can display the resulting video in real-time on an external monitor (via the HDMI connector). The forehead and lip detection were computed on the Google Coral USB accelerator, since this part of the algorithm required a deep neural network and hence significantly more computational power. The full setup can be seen Overview of algorithms. Our algorithm performs two functions: fever estimation and cyanosis classification. For fever estimation, we detect the forehead region, and for cyanosis classification we detect the lip region. These regions are then analyzed to identify color distributions indicative of fever or cyanosis using a post processing machine learning algorithm. The overall flow is shown in Fig. 3 and a more detailed description of the algorithms now follows. Forehead and lip detection. To detect and segment out the forehead and lips for further analysis, a computer visionbased human pose detection algorithm knows as PoseNet is used [23] . This algorithm uses a convolutional neural network to regress the six degrees of freedom camera pose from a single RGB image in an end-to-end manner with no need for additional engineering or optimisation. PoseNet detects "keypoints" -the image coordinates of key parts of the body, such as the elbow, knee, eyes and nose. We use the keypoints of the left and right eye as references to identify a bounding box around the forehead and lips. If we define the distance between the eyes to be D pixels, for the forehead, we use a bounding box that has width 2D and a height 1.2D. The base of the bounding box is 0.2D below the eyes. This ensures that the forehead-eyes area is captured. This is an important site, since the inner canthus of the eye is consistently the warmest area on the head and the most suitable area for fever detection [28] . For the lips, we move a distance D below the eyes and create a bounding box with width D and height 0.5D. These values were set empirically (through trial and error using the authors) to best capture the lips. In future experiments these values can be optimized on larger datasets. Note that the coordinates obtained by applying this heuristic are rounded to the closest integer value. Fig. 4 shows an example of the forehead and lip detection on one of the authors using this approach in the visible spectrum (upper plot) and the corresponding FLIR image (lower plot). Note that the images have slight FOV, image angle and translational differences since the cameras cannot take images from the same location in space and operate at different (non-synchronous) sampling rates.
It is important to note that there are other state-of-theart object detection algorithms that are capable of detecting faces, such as YOLO [25] . YOLO can also be used to segment out the forehead and lips. However, using PoseNet in this implementation allows for rapid deployment on the Google Coral Accelerator TPU and is therefore simple to implement in real time. Another benefit of using PoseNet is that the keypoints generated by it for the rest of the body could potentially be used in the future to further enhance assessment of other symptoms such as posture or balance abnormalities, or behaviors such as vomiting, falls, and tonicclonic seizures.
Febrile state detection. Unlike the previous studies, our proposed system detects key points using visible light video and then transforms the coordinates of the bounding boxes of the region of interest (ROI) to coordinates in the thermal video. After finding the ROI in the thermal video, the average of the ten pixels exhibiting the highest temperatures were averaged to produce a final temperature estimate. Lastly, a threshold was set to determine the febrile state.
Thermal output calibration. To achieve a more accurate measurement of the body temperature, we followed the guidelines from the FLIR Lepton 3.5 datasheet [10] and methods detailed in previous studies [13] that used a similar infrared camera and performed the radiometry calibration on the FLIR Lepton camera. The conversion from the 14 bit pixel values from the FLIR Lepton camera to a temperature in Celsius can be written as: 5 .) The reference temperature of the water was measured three times using a Braun IRT6500 thermometer and averaged. The reference has an accuracy of ±0.2 • C within the 35 − 42 • C measurement range. Also, the top ten pixels in the heat source were selected and averaged as the final output of the FLIR Lepton camera. R (camera responsivity) and O (the offset) in Eq. 1 are then fitted using the above-described experiment via a nonlinear least square method with soft l1 loss as follows:
The Root Mean Square Error (RMSE) metric was used to evaluate the fitting error. The fitted curve was then implemented to convert pixels values to temperature output.
Since the forehead-eyes area is detected in the visible light image sequences, a coordinates transformation is needed to find the forehead-eyes location in the thermal video. The transformation depends on the resolutions and FOVs of the two cameras and the relative physical displacement between them. The resolution of the RasPi Camera was set at 1640 × 1232 pixels and the corresponding FOV was 62.2 • horizontally and 48.8 • vertically. The resolution of the FLIR Lepton camera was set to be 160 × 120 pixels and the corresponding FOV was 57 • horizontally and 71 • diagonally. Since there only exist less than 2 cm distance and consequently a small angle difference between the cameras, the transformation can be expressed as:
Where xL, yL are the coordinates for the left vertex of the bounding box and xR, yR denote the right vertex.
x ratio , y ratio are the resolution ratios between RasPi Camera and FLIR Lepton Camera. And x bias , y bias are the view difference caused by different FOVs and can be calculated as:
(4) In practice, because of the angle difference and distance between the cameras, which varies with different mounting schemes, empirical offsets were added to ensure accurate transformation.
Threshold selection. The Merck Manual [3] defines fever as an elevated body temperature that is higher than 37.8 • C orally [16] and Cleveland clinic advised patients with a fever higher than 100.4 • F / 38 • C to isolate themselves as of April 2020 [7] . Forehead (temporal) temperature is usually 0.5 • F (0.3 • C) to 1 • F (0.6 • C) lower than an oral temperature measurement [9] . Experimental setup. The preliminary test was conducted on a healthy male subject. A heated cloth was put on the subject's forehead to raise the temperature of the subject's forehead. The estimated temperature from the proposed system was recorded immediately after a measurement from the thermometer in the center of the subject's forehead. The subject was sitting one meter away from the cameras. The RMSE between the estimated value and temperature from the thermometer was used to evaluate the accuracy of our proposed system.
Once the lip region is segmented from the face, an algorithm to detect cyanosis is applied to the region. Various algorithms were tested on a small dataset. The algorithm that performed the best is used to classify images from the camera as cyanotic or non-cyanotic. Leave-one-out cross validation method was used to report the results.
We created a small dataset consisting of images of cyanotic and non-cyanotic lips from the internet. It consists of 35 images of cyanotic lips and 35 images of non-cyanotic lips. The images belong to various races, ages and genders, although this is not balanced. The number of lighter skin colored images are higher than darker skin images, more so for cyanotic images. Also, the number of images of young to middle-aged people is higher than the number of images of other age groups. This is due to the limited number and types of cyanotic images available on the internet. The dataset is included in our Github repository [5] .
Classification algorithm. We implemented three classifiers: K nearest neighbors (KNN), logistic regression (LR) and support vector classifier (SVC). The input to these classifiers were frequency of pixel intensities from each channel (R, G, B channels) using a simple histogram with eighteen equally spaced bins (six for each of the three color channels). The rationale behind this was that the color distribution would be different in cyanotic and non-cyanotic lips, but there would be some colors in common. In other words, not all of the lip would be cyanotic, and some areas outside of the lip would be included. The bins representing these colors could then be regularized out. For the KNN algorithm, we used k=3 neighbors, uniform weights and the Euclidean distance metric. (We chose three clusters for the KNN to capture the two classes plus noise.) L2 regularization was used for the logistic regression implementation. For the SVC a regularization parameter C = 2 was chosen via grid search. Radial basis function kernel was used to make SVC a non-linear classifier. We used the sklearn package in Python3.7.3 for each of these implementations and used the default values for parameters not stated above.
Febrile state detection. Fig. 6 shows the measurements used in the calibration process and the fitted results. The calibrated values of R and O were determined to be 580061 and 25113, respectively, and the resultant RMSE was 0.57 • C 2 . Fig. 7 shows the measured data points in the preliminary experiment, in which the proposed system achieved an RMSE of 0.41 • C and a Pearson correlation coefficient of 0.96. When applying 37.4 • C as the threshold for febrile state detection, an accuracy of 96.7% and an area under receiver operating characteristic curve (AUC) of 0.97 were achieved. 7 . Estimated temperature vs. temperature measured from thermometer. The correlation between the parameters was found to be 0.96 and the RMSE difference between them was 0.41 • C. 1, 2, 3 show the confusion matrices for each classifier. Fig. 8 shows the receiver operating characteristic curve and AUC of each classifier. Table 4 summarizes the accuracies, AUC, sensitivity and specificity of the three classification models. . CC-BY 4.0 International license It is made available under a author/funder, who has granted medRxiv a license to display the preprint in perpetuity.
is the (which was not peer-reviewed) The copyright holder for this preprint . https://doi.org/10.1101/2020.04.09.20059840 doi: medRxiv preprint features by the logistic regression classifier, since this is easier to interpret that the parameters of the SVR or KNN. Fig.  9 shows the weights for the eighteen features used (six bins each for each of the three R, G and B channels). The first six features correspond to the red channel (R1 -R6). The next six features correspond to the green channel (G1 -G6) and the last six features correspond to the blue channel (B1 -B6).
Forehead and lip segmentation. Detecting and segmenting out the forehead and lips is the first step in our pipeline. The accuracy of this stage can determine the accuracy of the remaining stages. This step is dependent on the performance of PoseNet, which sometimes has false positive detection of people. In this implementation, it is limited to detecting 10 people at a time.
Fever detection. Previous meta-reviews suggest that peripheral temperature may not be sufficient to determine fever [21, 18] . This suggests that our proposed system, along with all traditional methods that measure peripheral temperature, like an ear thermometer, are not suitable to be used to perform an accurate diagnosis of febrile state. However, the proposed system is useful to perform mass early screening of the febrile state as a triage tool. The body temperature varies throughout the day in accordance with the circadian rhythm ( [6] , chapter 218). Taking this into account and having a dynamic threshold can reduce the number of false positive and false negative fever detection. Besides, body temperature could vary based on the ambient temperature. Having a reference temperature can help solve this issue. Additionally, the thermal camera in selection does not innately have the level of accuracy required for this task. Thus, a calibration for the targeted temperature range needs to be performed. However, the temperature calibration of the thermal camera is not a trivial task and can be inaccurate depending various aspects, like environmental temperature and surface condition. Also, a previous study suggests that improper use and interpretation of the infrared camera can lead to inaccurate triage [15] . Hence, it is important to understand that the proposed system is only reliable for the designated task under limited conditions. For example, the presence of common cosmetics or clothing such as a turban or hijab can affect the accuracy of the estimated temperature from thermal camera [30] . With a higher budget, the use of a thermal camera with higher accuracy and, if possible, one which is pre-calibrated can lead to a more reliable system. But a higher cost will inevitably lower the accessibility of the system. Cyanosis detection. For the detection of cyanosis, out of the three classification approaches evaluated, the SVC exhibited the highest accuracy (77.1%) and KNN has the highest AUC (0.93), although this is not significantly higher than the AUC of 0.91 for the SVR. The SVR also produces the fewest false negatives (missed cynaosis), which at triage, is probably the most important feature of this system. For the open source implementation, we therefore chose the SVR, although we note this is somewhat arbitrary at this point given the size of the data set we used.
To visualize the effect of the features on the overall classification we plot the LR coefficients for each features (see Fig.  9 ). It can be observed that the red channel exhibits higher importance for cyanosis detection. When creating a histogram of the pixel values with six equally spaced bins for each of the three color channels, it can be seen that every channel (R, G and B) contributes to the classification.
Limitations. We note that the lip cyanosis dataset we used is relatively small and contains relatively good quality images. In the wild, the quality of images is not guaranteed to be high. This may be due to variations in lighting, occlusions, movement, angle of presentation, distances much greater than 1m, among other issues. Consistency of ambient lighting is an important factor to ensure correct classification of cyanosis [6] . Camera parameters such as field of view and shutter speed can also influence the absolute color detected by the camera. Applying a color correction by using a color reference in the frame can solve this issue [2] . Cosmetics applied to and around the lip can also interfere with the classification. In practice, we observed that if the mouth is open or teeth are visible, the cyanosis classifications tend to be inaccurate. Lighting conditions also play a major role in the algorithm's output.
Perhaps the most important issue to consider is that of skin color and the variation of presentation of cyanosis across the human race. This is an under-explored area of research, but research into racial bias in facial recognition algorithms [4] has highlighted just how dangerous it can be to use these algorithms out-of-the-box, without tuning to a population or thought about the bias it can create.
In this work, we have proposed a system that can detect fever and cyanosis using a combination of visible light and thermal camera operating on an edge computation platform that is running state-of-the-art deep learning. The system does not require any direct interaction between the device and either patients or healthcare workers. The source code needed to replicate our proposed system can be found on Github [5] . It is important to note that PoseNet is image size and rotationally invariant (at least for most behaviors), and although we optimize the analysis to work at a 1m distance from the camera, this invariance should create a robustness to movement to and from the camera, as well as within the frame. Many improvements can be made to this system to increase the classification performance and stability, including larger population studies and end-to-end deep learning. However, the need for something is acute and will be increasingly so in low resource areas. We therefore feel it is appropriate to release this work prior to peer-review to solicit feedback and encourage others to improve the system.
Through this work, put together as a rapid response under a few days under lockdown, we hope to provide a starting point for automatic triage in clinical settings. Improving on this work could lead to novel implementations that can help streamline triage in clinics and hospitals, potentially during the current pandemic, where non-contact and rapid screening has distinct advantages for infection reduction.