ImageMonkey / imagemonkey-core

ImageMonkey is an attempt to create a free, public open source image dataset.
https://imagemonkey.io
47 stars 10 forks source link

Q.. component labels, workflow #205

Open dobkeratops opened 5 years ago

dobkeratops commented 5 years ago

some general comments & ideas ...

(i) r.e the importance of component labels:- (a) could they accelerate training: because they narrow down feature detectors more? (b) could they give more expressive power with the curated label list, i.e. labelling components even if you dont have the labels for the object yet ("wheel / container" (.. on a wheelie-bin , or on a wheelbarrow.)

(ii) regarding the current workflow I still think components are hard to use i.e. i haven't been able to find them in search mode; it also doesnt' work well to automatically add components for the main label (because the system doesn't know which components are visible)

(iii) I still think Label-Me's hierarchy idea is extremely useful (although this is a whole extra dimension to UI, so it might be a lot of work): it lets you ground the annotations into a tree - this could sidestep the need for seperate "head/dog", "head/person" etc labels - instead what you do is label a "head", (and "paw", "tail" ..) ,and group it under an enclosing "dog" label. This could work well re. (i)(b). e.g. if you have a "wheel", "handle", "container" labels, then group them as one unit, you've described a "wheelbarrow", without needing the 'wheelbarrow' label yet

regarding UI there's the complexity of code but also user discovery. LabelMe uses drag-drop in a tree view, I think that's fairly intuitive .. but it still isn't obvious. I was trying to do it with lines to indicate parent-child links (more of a general purpose geometry editor) and I dont think would be too complex for casual users.

There's another idea which might suit your app better, which is to present a cropped/labelled region as a new image, then labels added within it could be considered children; perhaps you could say "annotate parts of this dog" to make it clear you shouldn't label parts behind/infront of it in this view.

failing anything like that, just being able to annotate components without grouping would still be useful IMO.

(iv) some suggestions for more component labels:-

bbernhard commented 5 years ago

Thanks a lot for your suggestions, very much appreciated!

You are right, there are currently no component labels available. The last few days/weeks there was a bit less activity on the site, so I decided to use the time to do a bit of much needed code refactoring and maintenance stuff.

------ on a side note ---- I've added the possibilty to create image collections. Image Collections are a simple way to structure/group image uploads. In case you want to create a new Image Collection, navigate to your profile -> Collections.

profile_collections

After you've create a image collection, you can pass the image collection's name as parameter to the HTTP request to automatically add the image to your collection. (I'll later extend the documentation here with an example)

edit: I've also added your ./low-res-batch contributions to an image collection....so you should see an image collection in your profile.


regarding the component labels: I think there is no technical restriction why annotating a component label won't work. So I guess, what I could do is, make a few component labels (like wheel/car paw/dog, ..) productive. That way, one can already start working on those labels, while we incrementally improve the visual appearance (label hierarchy).

I also like the idea of showing cropped images in case one annotates a component...I think that would be pretty cool. Still have to think, whether the cropping should be done on the server side or the client side...

dobkeratops commented 5 years ago

nice , it' probably good to have a consolidation phase.. break/cleanup etc; and dipping back into it after time away i notice many things have evolved. Still busy in Rust-land, just got some GL/Mac hiccups to clean up. definitely keeping this in mind to come back to with plenty of ideas for AI/vision..

bbernhard commented 5 years ago

The following labels are now productive:

I started yesterday with the component labels integration. At the moment I am playing a bit with opencv to see how expensive it would be to create image crops on the server side. Not sure yet, if it's better to do that on the server -or the client side. My gut feeling tells me, that a server side solution would probably be the "cleaner" solution..I guess not every CPU (e.q: smartphone) is capable of doing the image processing in a decent amount of time. And if it is capable, I think it could drain the battery...

On the other hand, I am also not sure how much additional load this will create on the server side. I think the best solution would probably be to spin up another instance in the cloud in order to offload the image processing. But looking at my monthly bills of ~200EUR/month...I probably shouldn't spin up another one :/

dobkeratops commented 5 years ago

awesome, i suppose failing actually cropping you could just zoom on the region , although that means serving pieces the user wont see .. hmmm. maybe there's a way for the user to keep the image and just shift focus between regions to apply internal labels until they choose to move on

But looking at my monthly bills of ~200EUR/month...

yikes..

how does that breakdown between bandwidth, storage and processor time? is that just image monkey or do you run other projects aswell?

I've never actually tried running a physical server at home (i keep reading it's non-trivial r.e. security..) and did briefly tinker with digital ocean. but never ran anything

bbernhard commented 5 years ago

awesome, i suppose failing actually cropping you could just zoom on the region , although that means serving pieces the user wont see .. hmmm. maybe there's a way for the user to keep the image and just shift focus between regions to apply internal labels until they choose to move on

Yeah, I am currently also not really sure what's the best way to highlight the areas of interest. I played a bit with OpenCV and I think I am now almost at a point where I have a working PoC. At the moment it's all really simple: If you search for a component label (e.q: wheel/car) in the annotation browse mode, the database gets queried for all car annotations. In case car annotations are found, the image will be modified and everything that's not relevant for accomplishing the annotation task, will be blacked out.

e.q:

image_cropped

Not sure yet though, if the area should really be blacked out. I guess it could be better, to just to brighten the area of interest a bit, and make the remaining pixels a bit darker.

how does that breakdown between bandwidth, storage and processor time? is that just image monkey or do you run other projects aswell?

It's just this project. When hosting projects, I always try to use different machines for different projects, in order to keep the software dependencies at a minimum. In the past, I've tried to host multiple projects on one server, but in general, I am not a big fan of that. If the projects are totally different, I always had to pull in a tons of dependencies...which makes maintenance (keeping the system up-to-date with security updates,...) of the system really hard.

Currently, disk space and bandwith is not a problem at all. As the images are cached and served by cloudflare, most of the image requests do not actually hit the ImageMonkey server, but the cloudflare servers instead. That reduces the bandwith significantly. In terms of disk space: all the images use ~5GB of disk space.

At the moment the costs are:

Digitalocean: ~80,- Hetzner (GPU machine): 120,-

I have to admit, that the GPU machine is not really necessary for keeping the site up and alive. It's more for fun and to play a bit with neural nets.