1. Segment of Hands 2. Tracking Bats 3. Tracking Cells
Method and Implementation
Part1: To segment pianoist's hand, I ran a skin color detection on the original image. The wood structure of piano is also captured in skin color detection, so I crop the image so that only the area of the piano keys are captured. After I have the segmentation, I perform an object labeling algorithm to get the position of the centers of both hands, and draw a bounding box around the center to show position of hands.
Part2: I performs an alpha beta filter on each bat to predict the state of bat. Then, a detection is mapped to a prediction using greedy approach.
Part3: To segment cells, I use canny to find edges, and delations to segment cells. After i get a set of detections, use the same process as part 2 to track cells.
Part 1: mySkinDetect(): skin detection, getHandPositions(): object labeling
Part 2: findTrace(): alpha beta filter and data association
Part 3: cell(): segment, getPositions(): object labeling, findTrace(): alpha beta filter and data association
Part1: The segment is accurate.
Part2: When there is no occulation, the traces are accurate. I have implemented algorithms to handle occulation, but it is not effective.
Part3: When there is no occulation, the traces are accurate. It has the same problem detecting occulations, but it did well on detecting new cells and terminate old ones.
Discuss your method and results:
1. My algorithm successfully detect new objects and terminate old ones. However, it did not handle occulation effectively. Another situation failed is the bottom right corner, where there are lots of bats close to each other, the trace sometimes jumps from one bat to another one. This is probably due to greedy bipartite matching. It might performs better if using an optimal bipartite matching.
2. In each step, I match predictions with its closest detection within a range threshold. If a prediction does not find a detection, the track is terminated. If a detection does not map to a prediction, a new object is entering.
3. When objects touch each other, it become one blob so that one object is not able map to prediction. When this happens, I use object velocity to predict the next position in later frames and try to match detections. If an object fails matching within x frames, the track is terminated.
4. When there is spurious detections that do not connect with other measurements, the object cannot map to detections so track is terminated.
5. Advantages: When the object has a relatively steady speed or accerlation, the kenetic model performs well. When just considering distances, there could be situation that another object is closer to an object in next frame. In this case the other object would be mapped to object which is not optimal. With kenetic model, we can predict state of object according to previous states so the mapping would be more accurate.
The algorithm performs well in easy portions of data, but it does not perform well detecting occulations. An optimization would be using kalman filter and optimal bipartite matching.
Credits and Bibliography