<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>ImageMonkey - Blog</title>
    <description>ImageMonkey - a public, open source image dataset
</description>
    <link>http://myblog.***.***/blog/</link>
    <atom:link href="http://myblog.***.***/blog/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Wed, 12 Feb 2020 21:53:01 +0100</pubDate>
    <lastBuildDate>Wed, 12 Feb 2020 21:53:01 +0100</lastBuildDate>
    <generator>Jekyll v3.5.2</generator>
    
      <item>
        <title>ImageMonkey reaches the 100k milestone</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://imagemonkey.io&quot;&gt;ImageMonkey&lt;/a&gt; is a public open source image dataset with powerful APIs and a tight integration of existing machine learning frameworks.&lt;/p&gt;

&lt;p&gt;As of last week it seems that we’ve finally cracked the 100k milestone - the ImageMonkey dataset now contains over 100k CC0 licensed images, ~140k labeled objects, ~25k validations and over 100k annotated objects.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2020-02-09-ImageMonkey-100k/progress.png&quot; alt=&quot;Progress over time&amp;lt;br&amp;gt;(The timestamp for image uploads wasn't there at the beginning,&amp;lt;br&amp;gt;that's why the black line chart is missing some data points)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It’s now almost three years ago since I started working on ImageMonkey - at that time mainly to scratch my own itch. Back then, I was working on another project, which I thought had the potential to blow up (actually it flopped totally, but that’s a different story) and for that project I was looking for labeled gym equipment datasets to train a neural net on it. As it turned out annotated images are really hard to find - and it gets even harder if you are looking for a public domain dataset.&lt;/p&gt;

&lt;p&gt;That’s when I thought to myself: Wouldn’t it be great if there exists such a public dataset? A dataset that’s not owned by a big company where you have to fear that at some point they will shut down the service and everything is lost (yeah, looking at you Yahoo). &lt;strong&gt;A dataset created by people for people.&lt;/strong&gt; A dataset where &lt;em&gt;eyerbody&lt;/em&gt; can contribute to. Something that’s easy to use.&lt;/p&gt;

&lt;p&gt;There are millions of people in the world running around with their smartphones, snapping pictures of their dogs, cats and what they have for lunch. Wouldn’t that be great image material for a public domain dataset?&lt;/p&gt;

&lt;p&gt;When creating ImageMonkey one of the primary goals was always simplicity and ease of use. ImageMonkey wasn’t primarily designed to be used by the “hardcore data labeler” (that’s not to say that that we do not provide tools for those as well), it was rather designed to be used the ordinary man and and woman. In order to accomplish that, the whole process of collecting data was split up in different tasks (“task based approach”).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2020-02-09-ImageMonkey-100k/annotation_rework.gif&quot; alt=&quot;Annotating objects&quot; /&gt;&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/blog/assets/article_images/2020-02-09-ImageMonkey-100k/validation.gif&quot; width=&quot;50%&quot; alt=&quot;Validating objects&quot; /&gt;&lt;/center&gt;

&lt;p&gt;The traditional worflow of annotating an object usually looks like this:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;collect an image&lt;/li&gt;
  &lt;li&gt;draw a bounding box around the object of interest&lt;/li&gt;
  &lt;li&gt;label it appropriately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With ImageMonkey it’s different. Every of those tasks can be done individually. You love taking pictures, but don’t want to tag them with labels? No problem, just upload the pictures without labels - that’s perfectly fine. You enjoy labeling images (I’ve heard that some people find that quite relaxing) but don’t want to draw bounding boxes around the objects? That’s fine, just do the labeling. As you can see, the complex task of annotating objects is broken down in much simpler tasks. The cool thing about that is, that it’s now possible to build APIs around those functionalities and use those APIs to create other applications.&lt;/p&gt;

&lt;p&gt;In the &lt;a href=&quot;https://www.youtube.com/watch?v=ji5_MqicxSo&quot;&gt;Last Lecture&lt;/a&gt; (if you haven’t seen it, I highly encourage you to do so), Randy Pausch talks about &lt;em&gt;head fake&lt;/em&gt; - a situation in which someone believes they are learning one thing, but are really learning something different. I am a huge fan of this concept and personally I think it not only works for learning something, but also for &lt;em&gt;doing&lt;/em&gt; something.&lt;/p&gt;

&lt;p&gt;While working on ImageMonkey I tried to make use of head fakes and incorporate them into the software I was building. Then, let’s be honest here: Collecting data for a dataset can be tedious and boring - so why not make it more fun?&lt;/p&gt;

&lt;p&gt;With the ImageMonkey Browser Extension and ImageMonkey - The Game I tried exactly that.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/bbernhard/imagemonkey-chrome-extension&quot;&gt;ImageMonkey Browser Extension&lt;/a&gt; shows a random validation each time you open a new browser tab. 
&lt;img src=&quot;/blog/assets/article_images/2017-10-28-ImageMonkey-v0.2/google-chrome-extension.gif&quot; alt=&quot;ImageMonkey Browser Extension&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.imagemonkey.thegame&quot;&gt;ImageMonkey - The Game&lt;/a&gt; uses gamification concepts to make image collecting more fun.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2020-02-09-ImageMonkey-100k/imagemonkey_thegame.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;powerful-api-and-tight-integrations-of-existing-ml-frameworks&quot;&gt;Powerful API and tight integrations of existing ML frameworks&lt;/h1&gt;
&lt;p&gt;ImageMonkey’s task based approach made it possible to build a REST API around all its functionality, which not only allows developers to easily export data, but also gives them the possibility to feed back data their own.&lt;/p&gt;

&lt;p&gt;Due to the &lt;a href=&quot;https://imagemonkey.io/libraries&quot;&gt;tight integration&lt;/a&gt; of existing machine learning frameworks like &lt;a href=&quot;https://www.tensorflow.org/&quot;&gt;Tensorflow&lt;/a&gt; and &lt;a href=&quot;https://github.com/matterport/Mask_RCNN&quot;&gt;Mask RCNN&lt;/a&gt; it’s possible to train a neural net for image classification, object detection and object segmentation with just a handful of commands.&lt;/p&gt;

&lt;p&gt;e.g If you want to train a cat/dog image classifier via transfer learning on a pre-trained inception-v3 model, all you need to do is:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;
      docker pull bbernhard/imagemonkey-train:latest-gpu
      docker run --runtime=nvidia -it bbernhard/imagemonkey-train:latest-gpu
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;
      monkey train --labels=&quot;cat|dog&quot; --type=&quot;image-classification&quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The monkey script automatically downloads the necessary data from ImageMonkey, configures the tensorflow pipeline and then starts tensorflow for training. When the training is done, the script spits out a ready-to-go &lt;code&gt;graph.pb&lt;/code&gt; file.&lt;/p&gt;

&lt;h1 id=&quot;what-exactly-is-a-public-open-source-image-dataset&quot;&gt;What exactly is a public open source image dataset?&lt;/h1&gt;

&lt;p&gt;Every line of code that was ever written for the ImageMonkey project is available on &lt;a href=&quot;https://github.com/ImageMonkey&quot;&gt;Github&lt;/a&gt; - i.e if you want to spin up your own (private) ImageMonkey instance for collecting data you can easily do that. But it’s not only that. Every item in the ImageMonkey dataset is licensed under the CC0 license. Which basically means you can do the f*ck you want with it - no strings attached. Furthermore, the whole dataset (i.e the images + an obfuscated database dump) gets uploaded to the internet archive on a regular basis (see &lt;a href=&quot;https://imagemonkey.io/public_backup&quot;&gt;here&lt;/a&gt; for details).&lt;/p&gt;

&lt;h1 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h1&gt;

&lt;p&gt;Hosting ImageMonkey (and all it’s services) costs money. At the moment everything’s running on two big Hetzner bare metal servers (one of them being a GPU instance). And while the server costs are still affordable for me, I would really like to see ImageMonkey getting &lt;a href=&quot;https://imagemonkey.io/supportus&quot;&gt;self sustainable&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apart from that, I’ll be working on:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;a better annotation editor&lt;/li&gt;
  &lt;li&gt;improve the ML pipeline to provide models for download on a regular basis&lt;/li&gt;
  &lt;li&gt;some general improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;thanks&quot;&gt;Thanks&lt;/h1&gt;
&lt;p&gt;Last but not least I want to thank &lt;a href=&quot;https://github.com/dobkeratops&quot;&gt;@dobkeratops&lt;/a&gt; - ImageMonkey wouldn’t be where it is right now without your help. Thanks a lot for all your contributions!&lt;/p&gt;

&lt;h1 id=&quot;want-to-contribute&quot;&gt;Want to contribute?&lt;/h1&gt;
&lt;p&gt;Any help is really appreciated - whether it is &lt;a href=&quot;https://github.com/ImageMonkey&quot;&gt;help with the codebase&lt;/a&gt;, &lt;a href=&quot;https://imagemonkey.io/donate&quot;&gt;contributions to the dataset&lt;/a&gt; or &lt;a href=&quot;https://imagemonkey.io/supportus&quot;&gt;financial support&lt;/a&gt;. Let’s create our public image dataset together!&lt;/p&gt;

&lt;script src=&quot;https://code.jquery.com/jquery-3.1.1.slim.min.js&quot; integrity=&quot;sha256-/SIrNqv8h6QGKDuNoLGA4iret+kyesCkHGzVUUV0shc=&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css&quot; integrity=&quot;sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u&quot; crossorigin=&quot;anonymous&quot; /&gt;

&lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js&quot; integrity=&quot;sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;!--&lt;script type=&quot;text/javascript&quot; src=&quot;/assets/js/toast.js&quot;&gt;&lt;/script&gt;--&gt;

&lt;div class=&quot;divider-30&quot;&gt;&lt;/div&gt;

&lt;center&gt;&lt;h5&gt;Want to read more about ImageMonkey?&lt;/h5&gt;&lt;/center&gt;
&lt;center&gt;&lt;h5&gt;Subscribe now!&lt;/h5&gt;&lt;/center&gt;

&lt;iframe name=&quot;hiddenFrame&quot; width=&quot;0&quot; height=&quot;0&quot; border=&quot;0&quot; style=&quot;display: none;&quot;&gt;&lt;/iframe&gt;
&lt;center&gt;&lt;form id=&quot;register-newsletter&quot;&gt;
    &lt;input id=&quot;email&quot; type=&quot;text&quot; name=&quot;newsletter&quot; required=&quot;&quot; placeholder=&quot;Enter your email address&quot; /&gt;
    &lt;input type=&quot;submit&quot; class=&quot;btn btn-custom-3 submit-button&quot; value=&quot;SIGN UP&quot; /&gt;
&lt;/form&gt;&lt;/center&gt;
&lt;div id=&quot;register-successful&quot; class=&quot;hide&quot; role=&quot;alert&quot;&gt;
    &lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;alert&quot; aria-label=&quot;Close&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&amp;times;&lt;/span&gt;&lt;/button&gt;
&lt;/div&gt;

&lt;script&gt;
$('#register-newsletter').submit(function(e) {
	subscribe();
    return false;
});

function validateEmail(email) {
    var re = /^(([^&lt;&gt;()\[\]\\.,;:\s@&quot;]+(\.[^&lt;&gt;()\[\]\\.,;:\s@&quot;]+)*)|(&quot;.+&quot;))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(email);
}

function postEmail(email){
    var url = encodeURI(&quot;https://api.imagemonkey.io/v1/blog/subscribe&quot;);
    $.ajax({
        url: url,
        dataType: 'json',
        type: 'POST',
        data: JSON.stringify({email: email}),
        complete: function(data){
        },
        success: function(data){
            $('#register-successful').html('&lt;center&gt;Successfully signed up&lt;/center&gt;');
            $('#register-successful').removeClass('hide').addClass('alert alert-success').fadeTo(2000, 500).slideUp(500, function(){
                $(&quot;#register-successful&quot;).slideUp(500);
            });
        },
        error: function (xhr, status, errorThrown){
            $('#register-successful').html(&quot;&lt;center&gt;Couldn't sign up&lt;/center&gt;&quot;);
            $('#register-successful').removeClass('hide').addClass('alert alert-danger').fadeTo(2000, 500).slideUp(500, function(){
                $(&quot;#register-successful&quot;).slideUp(500);
            });
        }
    });
}


function subscribe() {
	var emailAddress = $(&quot;#email&quot;).val();
    console.log(emailAddress)
    $(&quot;#register-newsletter&quot;).trigger(&quot;reset&quot;);
	validateEmail(emailAddress);
	if (!validateEmail(emailAddress)) {
		$('#register-successful').html(&quot;&lt;center&gt;Please enter a valid email address&lt;/center&gt;&quot;);
		$('#register-successful').removeClass('hide').addClass('alert alert-danger').fadeTo(2000, 500).slideUp(500, function(){
	    	$(&quot;#register-successful&quot;).slideUp(500);
		});
		return;
	}

	postEmail(emailAddress);
}

&lt;/script&gt;

&lt;style type=&quot;text/css&quot;&gt;
.submit-button {
  	color: #fff;
  	background-color: #57ad68;
  	border-color: #4cae4c;
}

.submit-button:hover {
	color: #fff;
	background-color: #449d44;
	border-color: #398439;
}

.divider-30{ 
	width:100%; 
	min-height:1px; 
	margin-top:30px; 
	margin-bottom:30px;  
	display:inline-block; 
	position:relative;
}
&lt;/style&gt;

</description>
        <pubDate>Sun, 09 Feb 2020 13:34:25 +0100</pubDate>
        <link>http://myblog.***.***/blog/general/2020/02/09/ImageMonkey-100k-0.html</link>
        <guid isPermaLink="true">http://myblog.***.***/blog/general/2020/02/09/ImageMonkey-100k-0.html</guid>
        
        
        <category>general</category>
        
      </item>
    
      <item>
        <title>We made some progress</title>
        <description>&lt;p&gt;It’s now almost 30 days since the &lt;a href=&quot;https://imagemonkey.io/blog/general/2017/10/06/ImageMonkey-Introduction.html&quot;&gt;last blog post&lt;/a&gt; and we made some really good progress. If you haven’t kept up with us, then here’s a quick summary:&lt;/p&gt;

&lt;h1 id=&quot;content-moderation&quot;&gt;Content Moderation&lt;/h1&gt;
&lt;p&gt;One of the core principles of ImageMonkey is: Keep it open and accessible for &lt;strong&gt;everybody&lt;/strong&gt; - without the need to sign up. While this is great from the user experience point of view, it brings some serious problems with it:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;How can we make sure the uploaded content doesn’t contain any sensitive material?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Manual content moderation is possible, but doesn’t scale. That’s why we are investing some time and energy into mechanisms which (hopefully) can assist us with content moderation. One of those mechanisms is a NSFW detection engine, which pre-classifies each uploaded image with a NSFW score. This for sure can’t replace manual content moderation entirely, but definitely could help us to identify problematic images early in the process.&lt;/p&gt;

&lt;p&gt;We started our experiment with a handful &lt;a href=&quot;https://github.com/bbernhard/imagemonkey-playground/blob/master/conf/nsfw/nsfw.json&quot;&gt;more or less randomly selected&lt;/a&gt; P**rnhub and Youtube videos, which were split up in frames and fed to a neural net. With now 10k frames in each category (NSFW/SFW) we already get some pretty decent results. Of course it is still far away from being perfect and produces some false positives, but as an initial attempt I am pretty satisfied with the result. The whole thing is still in an alpha phase and was only trained on nudity, but if you want to give it a try: It’s available &lt;a href=&quot;https://imagemonkey.io/playground&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2017-10-28-ImageMonkey-v0.2/nsfw-experiment.png&quot; alt=&quot;NSFW detection&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;dataset-statistics&quot;&gt;Dataset Statistics&lt;/h1&gt;

&lt;p&gt;The dataset statistics tab was completely reworked and now provides more detailed statistical insight into the dataset.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2017-10-28-ImageMonkey-v0.2/statistics.png&quot; alt=&quot;Dataset Statistics&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important Info&lt;/strong&gt; At ImageMonkey we are taking your privacy seriously, that means we do &lt;strong&gt;not&lt;/strong&gt; store any personal information (like your IP address) in our database. Neither do we send your IP address to some external service to determine your geolocation. Instead, ImageMonkey uses a local geolocation database for the geolocation lookup.&lt;/p&gt;

&lt;h1 id=&quot;multi-validation-mode&quot;&gt;Multi Validation Mode&lt;/h1&gt;

&lt;p&gt;Another feature that’s still in beta mode, but already available for try out, is the &lt;strong&gt;Multivalidation Mode&lt;/strong&gt;. The Multivalidation Mode is inspired by that &lt;a href=&quot;https://www.reddit.com/r/MachineLearning/comments/75gqit/p_imagemonkey_whats_next/do6fm1p/&quot;&gt;reddit comment&lt;/a&gt; and allows users to validate multiple images in one go. You can enable it in the &lt;em&gt;validation tab&lt;/em&gt; by clicking ‘m’ on your keyboard.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2017-10-28-ImageMonkey-v0.2/multi-validation.gif&quot; alt=&quot;Multivalidation Mode&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;detecting-malicious-behavior&quot;&gt;Detecting malicious behavior&lt;/h1&gt;

&lt;p&gt;While a completely open and publicly modifiable dataset has it’s benefits, it also gives users the possibility to destroy the dataset’s quality by maliciously voting for the wrong label on purpose.We for sure can’t prevent that, but we can try to make it harder. For that reason a history table was introduced, which now keeps track of every single action that’s performed on the dataset and in which way it affected the dataset.&lt;/p&gt;

&lt;p&gt;Together with a browser fingerprint we get some pretty good information about the image’s state and how it changes over time (e.q if an image transitions from being classified as an ‘apple’ to being ‘not an apple’ in a very short time, it could be an malicious attempt).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important info&lt;/strong&gt; We do &lt;strong&gt;not&lt;/strong&gt; store any personal information (like your IP address or your browser version) of you. The only thing we are storing is an anonymized hash.&lt;/p&gt;

&lt;h1 id=&quot;possibility-to-choose-a-label-on-upload&quot;&gt;Possibility to choose a label on upload&lt;/h1&gt;

&lt;p&gt;Up to now it wasn’t possible to select a label other than the one that was randomly chosen by the system. As this was quite inflexible and resulted in users pressing the refresh button of their browsers until the desired label would eventually show up, we decided to change that behavior.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2017-10-28-ImageMonkey-v0.2/label-selection.png&quot; alt=&quot;Choose a label&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;experiments&quot;&gt;Experiments&lt;/h1&gt;

&lt;p&gt;There are also some ongoing experiments and proof of concepts, which haven’t made it into an ImageMonkey release yet.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Pre-annotation of video frames (based on background subtraction):&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2017-10-28-ImageMonkey-v0.2/background-subtraction.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Using the grabcut algorithm to select objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2017-10-28-ImageMonkey-v0.2/grabcut.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Gamification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2017-10-28-ImageMonkey-v0.2/game.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Validate an image each time you open a new browser tab&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/blog/assets/article_images/2017-10-28-ImageMonkey-v0.2/google-chrome-extension.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;want-to-contribute&quot;&gt;Want to contribute?&lt;/h1&gt;
&lt;p&gt;Once again, I would like to thank &lt;a href=&quot;https://github.com/dobkeratops&quot;&gt;@dobkeratops&lt;/a&gt; for all the awesome ideas, the feedback and technical advice. Many thanks for your contribution!&lt;/p&gt;

&lt;p&gt;As ImageMonkey and all it’s parts are completely OpenSource, every contribution is highly appreciated. In case you want to check it out, here are some links:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-core&quot;&gt;https://github.com/bbernhard/imagemonkey-core&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-client&quot;&gt;https://github.com/bbernhard/imagemonkey-client&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-playground&quot;&gt;https://github.com/bbernhard/imagemonkey-playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-chrome-extension&quot;&gt;https://github.com/bbernhard/imagemonkey-chrome-extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-admin&quot;&gt;https://github.com/bbernhard/imagemonkey-admin&lt;/a&gt;&lt;/p&gt;

&lt;script src=&quot;https://code.jquery.com/jquery-3.1.1.slim.min.js&quot; integrity=&quot;sha256-/SIrNqv8h6QGKDuNoLGA4iret+kyesCkHGzVUUV0shc=&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css&quot; integrity=&quot;sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u&quot; crossorigin=&quot;anonymous&quot; /&gt;

&lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js&quot; integrity=&quot;sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;!--&lt;script type=&quot;text/javascript&quot; src=&quot;/assets/js/toast.js&quot;&gt;&lt;/script&gt;--&gt;

&lt;div class=&quot;divider-30&quot;&gt;&lt;/div&gt;

&lt;center&gt;&lt;h5&gt;Want to read more about ImageMonkey?&lt;/h5&gt;&lt;/center&gt;
&lt;center&gt;&lt;h5&gt;Subscribe now!&lt;/h5&gt;&lt;/center&gt;

&lt;iframe name=&quot;hiddenFrame&quot; width=&quot;0&quot; height=&quot;0&quot; border=&quot;0&quot; style=&quot;display: none;&quot;&gt;&lt;/iframe&gt;
&lt;center&gt;&lt;form id=&quot;register-newsletter&quot;&gt;
    &lt;input id=&quot;email&quot; type=&quot;text&quot; name=&quot;newsletter&quot; required=&quot;&quot; placeholder=&quot;Enter your email address&quot; /&gt;
    &lt;input type=&quot;submit&quot; class=&quot;btn btn-custom-3 submit-button&quot; value=&quot;SIGN UP&quot; /&gt;
&lt;/form&gt;&lt;/center&gt;
&lt;div id=&quot;register-successful&quot; class=&quot;hide&quot; role=&quot;alert&quot;&gt;
    &lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;alert&quot; aria-label=&quot;Close&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&amp;times;&lt;/span&gt;&lt;/button&gt;
&lt;/div&gt;

&lt;script&gt;
$('#register-newsletter').submit(function(e) {
	subscribe();
    return false;
});

function validateEmail(email) {
    var re = /^(([^&lt;&gt;()\[\]\\.,;:\s@&quot;]+(\.[^&lt;&gt;()\[\]\\.,;:\s@&quot;]+)*)|(&quot;.+&quot;))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(email);
}

function postEmail(email){
    var url = encodeURI(&quot;https://api.imagemonkey.io/v1/blog/subscribe&quot;);
    $.ajax({
        url: url,
        dataType: 'json',
        type: 'POST',
        data: JSON.stringify({email: email}),
        complete: function(data){
        },
        success: function(data){
            $('#register-successful').html('&lt;center&gt;Successfully signed up&lt;/center&gt;');
            $('#register-successful').removeClass('hide').addClass('alert alert-success').fadeTo(2000, 500).slideUp(500, function(){
                $(&quot;#register-successful&quot;).slideUp(500);
            });
        },
        error: function (xhr, status, errorThrown){
            $('#register-successful').html(&quot;&lt;center&gt;Couldn't sign up&lt;/center&gt;&quot;);
            $('#register-successful').removeClass('hide').addClass('alert alert-danger').fadeTo(2000, 500).slideUp(500, function(){
                $(&quot;#register-successful&quot;).slideUp(500);
            });
        }
    });
}


function subscribe() {
	var emailAddress = $(&quot;#email&quot;).val();
    console.log(emailAddress)
    $(&quot;#register-newsletter&quot;).trigger(&quot;reset&quot;);
	validateEmail(emailAddress);
	if (!validateEmail(emailAddress)) {
		$('#register-successful').html(&quot;&lt;center&gt;Please enter a valid email address&lt;/center&gt;&quot;);
		$('#register-successful').removeClass('hide').addClass('alert alert-danger').fadeTo(2000, 500).slideUp(500, function(){
	    	$(&quot;#register-successful&quot;).slideUp(500);
		});
		return;
	}

	postEmail(emailAddress);
}

&lt;/script&gt;

&lt;style type=&quot;text/css&quot;&gt;
.submit-button {
  	color: #fff;
  	background-color: #57ad68;
  	border-color: #4cae4c;
}

.submit-button:hover {
	color: #fff;
	background-color: #449d44;
	border-color: #398439;
}

.divider-30{ 
	width:100%; 
	min-height:1px; 
	margin-top:30px; 
	margin-bottom:30px;  
	display:inline-block; 
	position:relative;
}
&lt;/style&gt;

</description>
        <pubDate>Sat, 28 Oct 2017 14:34:25 +0200</pubDate>
        <link>http://myblog.***.***/blog/general/2017/10/28/ImageMonkey-v0.2.html</link>
        <guid isPermaLink="true">http://myblog.***.***/blog/general/2017/10/28/ImageMonkey-v0.2.html</guid>
        
        
        <category>general</category>
        
      </item>
    
      <item>
        <title>Let's create our own image dataset</title>
        <description>&lt;p&gt;It’s now a week since I posted about ImageMonkey on &lt;a href=&quot;https://www.reddit.com/r/MachineLearning/comments/731zwb/p_imagemonkey_a_public_open_source_image_database/&quot;&gt;reddit&lt;/a&gt;. While the initial rush on ImageMonkey has slowed down and the load on the server stabilized again, it’s time to reflect and plan the next development steps.&lt;/p&gt;

&lt;h1 id=&quot;thanks-reddit&quot;&gt;Thanks reddit&lt;/h1&gt;
&lt;p&gt;First of all, I would like to thank the reddit community for all the great feedback and suggestions. It was my very first post on reddit and I wasn’t expecting much, so I was really blown away to see that much load on the server. Hell, you guys even managed to take the server down temporarily!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;As it turned out there was a bug in the database connection pool handling which caused the number of open connections to grow rapidly until the point there were no connections left anymore. I am really glad that the &lt;em&gt;restart-the-application-every-10-minutes-cronjob-hack&lt;/em&gt; “worked”, otherwise I would have bitten myself in the ass for not doing any load testing beforehand.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To give you some figures: In the first two days after the reddit post we got an incredible amount of &lt;strong&gt;3002 image validations, 696 annotations and 20 donations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Thanks, reddit!&lt;/p&gt;

&lt;h1 id=&quot;goals&quot;&gt;Goals&lt;/h1&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;How do you want to convince people to label images?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think that’s the question it all comes down to in the end. I am pretty sure there aren’t many people out there that would use the words ‘labeling images’ and ‘having fun’ in one sentence. So in order to make the whole project work, we need to make the process of labeling images a painless and smooth as possible.&lt;/p&gt;

&lt;p&gt;The following is a list of things that I would like to accomplish with ImageMonkey:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;KISS&lt;/strong&gt; As I would assume there are not many people out there that actually have fun in labeling images, I think it’s very important to make the process of labeling images as painless and fun as possible. If we make the labeling process too complicated people probably won’t use it. &lt;br /&gt;&lt;br /&gt;It would for sure be awesome to have a really fine granual labeled dataset, but in my opinion it would already be a huge accomplishment to identify some simple things (&lt;em&gt;apple&lt;/em&gt;, &lt;em&gt;banana&lt;/em&gt;, &lt;em&gt;smartphone&lt;/em&gt;) reliable.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Contributer friendly&lt;/strong&gt; Another point that’s really important for me is the possibility for users to contribute. As most of the backend stuff is written in Golang and not everybody knows Golang we should try to move as much “logic” a possible to config files. Scenes, Objects and Labels should be defined in (JSON like?) config files, so that users can easily create a pull request if they want to add something.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Tight feedback loop&lt;/strong&gt; I think it could be beneficial to have some sort of online playground where users can upload pictures and the system tries to classify them. Over time we should see that the model gets better and better in classifiying images. Such a feedback loop could motivate users to actually invest time in improving the dataset’s quality, as they see a direct impact.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Open for contribution but closed for malicious modification&lt;/strong&gt; Everybody should be able to contribute (preferable without registration). Malicious attempts should be (automatically) detected and (if possible) prevented. If we can’t detect it, we should at least be able to revert the malicious changes.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Easy wins/fail fast&lt;/strong&gt; As this is just a hobby project, we should focus on the “easy wins” first and try to rule out ideas, that need huge implementation effort but won’t get us the desired results. I am usually not a fan of mockups, but I think here it could really save us some time in evaluating ideas.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;“Do one thing philosophy”&lt;/strong&gt; I am a big fan of Unix’ “Do one thing and do it well philosophy”. I think with such a complex project it’s pretty easy to “overdo things” in order to cover every possible use case. So it might be a good idea to figure out what we want in the end and break down the functionality in tiny apps/extensions with each of them fulfilling one specific purpose. I am afraid that if we put all the functionality in one application, that users will feel overwhelmed and don’t know what they need to do. What I want to avoid is, that we make the base application so complicated and bloated that only “hardcore users” want to use it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Aim for fast results&lt;/strong&gt; If we want to get some traction and recoginition we probably also need to attract users that are not technicians. So it could be beneficial to concentrate on some really “basic” image recognition first (with keeping the big picture in mind). For a normal user it’s probably already pretty impresive if they can upload a picture of a dog and the dog gets marked. They most probably don’t care if it’s a labrador or a shepherd.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h1&gt;

&lt;p&gt;There are a lot of things going on in our issues tracker. The following list should give you an overview about the most important actions we want to tackle.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Online Playground&lt;/strong&gt; As already mentioned, I think this one could add some playful character to the site and motivate people to participate. I recently added a proof of concept (you can try it out &lt;a href=&quot;https://imagemonkey.io/playground&quot;&gt;here&lt;/a&gt;). The model uses inception-v3 as base and was re-trained with the &lt;em&gt;dog&lt;/em&gt;, &lt;em&gt;cat&lt;/em&gt; and &lt;em&gt;apple&lt;/em&gt; pictures in our dataset. The idea is to daily (at least as long as our dataset is so small) re-train the model to always serve the latest build. I haven’t yet tried to performance test the implementation, so at that point it’s really more a proof-of-concept ;)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Report Button&lt;/strong&gt; Just to be on the save side (with the law) we should add a button where users can report inappropriate content.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;(Mockup-based) Evaluation&lt;/strong&gt; &lt;a href=&quot;https://github.com/dobkeratops&quot;&gt;@dobkeratops&lt;/a&gt; added some really nice ideas that we should consider implementing. But as most of them probably require some fundamental changes in the UI, the database layout and our config file structure, I think it could make sense to evaluate those ideas by either by implementing a proof-of-concept or some (UI) Mockups.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Statistics&lt;/strong&gt; Rich statistics could help guide people to do labelling that increases the breadth of the database.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Make project more contributer friendly&lt;/strong&gt; Currently the README is pretty detailed, which could scare off contributers. I think it could make sense to invest some time in making the “onboarding” more smoothly (e.q automate the manual steps; create a Dockerfile…)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Remove manual unlocking&lt;/strong&gt; Currently every uploaded donation gets unlocked manually in order to make sure that the uploaded content doesn’t contain any sensitive material. While this is a good idea in ensuring that we don’t accidentally become a hoster of sensitive material (nudity, racist content..) it simply doesn’t scale. In order to keep ImageMonkey open and accessible for everybody we should start investigating early in methods to prevent malicious attempts (i.e nudity detection, blocking users with malicious intentions..)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Logo&lt;/strong&gt; Every project needs a logo, right?&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;want-to-contribute&quot;&gt;Want to contribute?&lt;/h1&gt;
&lt;p&gt;First of all, I would like to thank &lt;a href=&quot;https://github.com/dobkeratops&quot;&gt;@dobkeratops&lt;/a&gt; for all the &lt;a href=&quot;https://github.com/bbernhard/imagemonkey-core/issues&quot;&gt;awesome ideas and suggestions&lt;/a&gt; - very much appreciated! It’s always great to see such passion and contribution in Open Source projects - that’s what Open Source is all about.&lt;/p&gt;

&lt;p&gt;As ImageMonkey and all it’s parts are completely OpenSource, every contribution is highly appreciated. In case you want to check it out, here are some links:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-core&quot;&gt;https://github.com/bbernhard/imagemonkey-core&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-client&quot;&gt;https://github.com/bbernhard/imagemonkey-client&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-playground&quot;&gt;https://github.com/bbernhard/imagemonkey-playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-chrome-extension&quot;&gt;https://github.com/bbernhard/imagemonkey-chrome-extension&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/bbernhard/imagemonkey-admin&quot;&gt;https://github.com/bbernhard/imagemonkey-admin&lt;/a&gt;&lt;/p&gt;

&lt;script src=&quot;https://code.jquery.com/jquery-3.1.1.slim.min.js&quot; integrity=&quot;sha256-/SIrNqv8h6QGKDuNoLGA4iret+kyesCkHGzVUUV0shc=&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css&quot; integrity=&quot;sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u&quot; crossorigin=&quot;anonymous&quot; /&gt;

&lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js&quot; integrity=&quot;sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;

&lt;!--&lt;script type=&quot;text/javascript&quot; src=&quot;/assets/js/toast.js&quot;&gt;&lt;/script&gt;--&gt;

&lt;div class=&quot;divider-30&quot;&gt;&lt;/div&gt;

&lt;center&gt;&lt;h5&gt;Want to read more about ImageMonkey?&lt;/h5&gt;&lt;/center&gt;
&lt;center&gt;&lt;h5&gt;Subscribe now!&lt;/h5&gt;&lt;/center&gt;

&lt;iframe name=&quot;hiddenFrame&quot; width=&quot;0&quot; height=&quot;0&quot; border=&quot;0&quot; style=&quot;display: none;&quot;&gt;&lt;/iframe&gt;
&lt;center&gt;&lt;form id=&quot;register-newsletter&quot;&gt;
    &lt;input id=&quot;email&quot; type=&quot;text&quot; name=&quot;newsletter&quot; required=&quot;&quot; placeholder=&quot;Enter your email address&quot; /&gt;
    &lt;input type=&quot;submit&quot; class=&quot;btn btn-custom-3 submit-button&quot; value=&quot;SIGN UP&quot; /&gt;
&lt;/form&gt;&lt;/center&gt;
&lt;div id=&quot;register-successful&quot; class=&quot;hide&quot; role=&quot;alert&quot;&gt;
    &lt;button type=&quot;button&quot; class=&quot;close&quot; data-dismiss=&quot;alert&quot; aria-label=&quot;Close&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&amp;times;&lt;/span&gt;&lt;/button&gt;
&lt;/div&gt;

&lt;script&gt;
$('#register-newsletter').submit(function(e) {
	subscribe();
    return false;
});

function validateEmail(email) {
    var re = /^(([^&lt;&gt;()\[\]\\.,;:\s@&quot;]+(\.[^&lt;&gt;()\[\]\\.,;:\s@&quot;]+)*)|(&quot;.+&quot;))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(email);
}

function postEmail(email){
    var url = encodeURI(&quot;https://api.imagemonkey.io/v1/blog/subscribe&quot;);
    $.ajax({
        url: url,
        dataType: 'json',
        type: 'POST',
        data: JSON.stringify({email: email}),
        complete: function(data){
        },
        success: function(data){
            $('#register-successful').html('&lt;center&gt;Successfully signed up&lt;/center&gt;');
            $('#register-successful').removeClass('hide').addClass('alert alert-success').fadeTo(2000, 500).slideUp(500, function(){
                $(&quot;#register-successful&quot;).slideUp(500);
            });
        },
        error: function (xhr, status, errorThrown){
            $('#register-successful').html(&quot;&lt;center&gt;Couldn't sign up&lt;/center&gt;&quot;);
            $('#register-successful').removeClass('hide').addClass('alert alert-danger').fadeTo(2000, 500).slideUp(500, function(){
                $(&quot;#register-successful&quot;).slideUp(500);
            });
        }
    });
}


function subscribe() {
	var emailAddress = $(&quot;#email&quot;).val();
    console.log(emailAddress)
    $(&quot;#register-newsletter&quot;).trigger(&quot;reset&quot;);
	validateEmail(emailAddress);
	if (!validateEmail(emailAddress)) {
		$('#register-successful').html(&quot;&lt;center&gt;Please enter a valid email address&lt;/center&gt;&quot;);
		$('#register-successful').removeClass('hide').addClass('alert alert-danger').fadeTo(2000, 500).slideUp(500, function(){
	    	$(&quot;#register-successful&quot;).slideUp(500);
		});
		return;
	}

	postEmail(emailAddress);
}

&lt;/script&gt;

&lt;style type=&quot;text/css&quot;&gt;
.submit-button {
  	color: #fff;
  	background-color: #57ad68;
  	border-color: #4cae4c;
}

.submit-button:hover {
	color: #fff;
	background-color: #449d44;
	border-color: #398439;
}

.divider-30{ 
	width:100%; 
	min-height:1px; 
	margin-top:30px; 
	margin-bottom:30px;  
	display:inline-block; 
	position:relative;
}
&lt;/style&gt;

</description>
        <pubDate>Fri, 06 Oct 2017 20:34:25 +0200</pubDate>
        <link>http://myblog.***.***/blog/general/2017/10/06/ImageMonkey-Introduction.html</link>
        <guid isPermaLink="true">http://myblog.***.***/blog/general/2017/10/06/ImageMonkey-Introduction.html</guid>
        
        
        <category>general</category>
        
      </item>
    
  </channel>
</rss>
