Distributed Mentor Project

About Me

Research

Course Work

Extracurricular Activities

Resume

Distributed Mentor Project

Weekly Journal

Introduction

Project

Goals

Mentor

Fellow Researcher

Weekly Journal

Final Report

Living in Boston

Pictures

Week 3

Week 1

Week 2

Week 3

Week 4

Week 5

Week 6

Week 7

Week 8

Week 9

Week 10

Monday

I looked over the OpenCV documentation today, which is pretty scarce. I also looked around to see if other people had provided any better documentation for OpenCV, and that helped some. When we try to run anything from the OpenCV library on Christen's computer it can't find the shared library, so it looks like we need to ask Nahur for more help. If we're lucky all of the bugs were worked out when we installed on my system so the install on Christen's machine will take less than a week, but we don't have much hope of that.

Tuesday

We spent an hour and a half this morning identifying bats in grayscale infrared images for Diane, a Boston University undergraduate doing research this summer. She's working with bat tracking software, and needed some humans to go through and identify the number of bats they saw in order to compare our answers to what the computer was finding. It was a pain to do, because the bats were very small and overlapping, so you couldn't tell if there were three bats in a blob, or one, or maybe it was a leaf on the tree, or what. Also, there were close to a thousand bats in some of the images, so it was a lot of work. After that I looked over the OpenCV documentation some more, trying to figure out what it can do and what functions we might want to time. After lunch, Margrit took Christen, Diane, and I into a classroom and taught us some introductory Computer Vision techniques, which was very helpful but would have been more helpful 2 weeks ago. But at least now we have some place to start with our research.

Wednesday

I can't tell if today was a productive day or not. I spent a large part of the morning looking over the OpenCV library, which has several hundred functions, and picking out which ones I thought would be appropriate to include in the timing table we're making. The list included edge detection, contour finding, thresholding, motion detection, and other fairly basic but very useful functions. I then spent an hour trying to convince the list, which was a simple text file, to print properly. The printers kept chopping off the edges and doing other obnoxious things, and I finally just called it good enough. By that time, it was time for the weekly Sensorium meeting. The guy who wrote the assembly code we need to actually do the timing came to the meeting, which was good because we had some questions about it. Everyone had been talking for weeks about how they didn't want "wall clock" times for how long it takes algorithms to run, because that might not all be time the algorithm actually spent running. Instead, they wanted the number of clock cycles, because that should be absolute. The code we were given, however, gave wall clock time, but it still is more accurate because most functions which report the time are not guaranteed to report the time as soon as a function stops, and are only accurate to 0.01 milliseconds, while the assembly code accuracy is a function of the processor speed, and is normally accurate to fractions of nanoseconds. Then we discussed the OpenCV functions and decided that most of them are overkill for the timing we want to do. For example, the simplest, most often used form of motion detection is to find the difference between each pixel in 2 consecutive frames, but the OpenCV motion detection function tracks motion over a much larger range and displays the older motion fainter than the newer motion. We decided that a lot of the OpenCV stuff shouldn't be used for timing because of this. Instead, Margrit wants us to write our own code to do a simple task, like face detection, and time that. I'm getting very frustrated because every time I think I understand what we should be doing, it changes, and I don't have the background neccessary to go out and get decent timing results because I don't know the most efficient or the most useful way of coding these functions. I'd really like some resources or additional guidance but have not received it.

Thursday

I looked over the course website for Margrit's Image and Video Computing class today, and worked through the first homework assignment, which involves face detection. The base code she wants us to work from uses an image format called portable pixmap format, or ppm, which seems to be a rather obscure format, so I spent a large amount of time trying to find and install software I could use to convert other image formats to ppm format. I finally gave up and just used the single image I had available to me, a ppm of Margrit. I found the red, green, and blue values of 15 points in her face, and used these to find the average RGB values of her skin, the range of RGB values, and the range of percentages for red, green, and blue. I used this information to create a program which read in the ppm image of her face, found all of the "skin pixels", and produced an image with all of the skin turned black. It was fairly accurate, finding most of her face and very little of her blond hair, but I'm going to try to improve it a bit. After that, I can use other Computer Vision methods to compute the area of her face, find its center, etc. If I start getting more noise, I can also identify which of the "blobs" (Yes, that's a technical term I learned here, I didn't make it up.) is her face. I also found that, even though the program xv wasn't installed on my computer, I could access Margrit's computer and run it from there, so I can convert other pictures and make a more generic program, since right now the face detection is tailored very specifically to one iamge. I'd like to see if I can detect my own face. Christen's will be a bigger challenge, since her hair color is so close to her skin color it will be hard to differentiate.

Friday

I added code to my skin detector so that it produces a second image which displays all of the skin pixels as black and all of the other pixels as white (a binary image). I can use this binary image later to determine which blob is the face. I also converted the pictures of several people in the Image and Video Computing group and tested my skin detector on them. The skin in the images tended to be much pinker than the skin in the image I based the detector on (due to different lighting conditions and a different camera) so the detector doesn't work very well on other people. It actually detects the teeth as skin quite often, and in one image an entire wall was detected but very little of the face. Since my real purpose isn't to have a skin detector which is accurate over a wide range of skin tones, but rather to find the amount of time it takes for the skin detection function to run, I think my detector is good enough.