Giter Club home page Giter Club logo

haar.js's Introduction

HAAR.js

Note: FILTER.js project, for Image Processing and Computer Vision, includes a HaarDetector plugin which can be seen as the continuation of this project.

Feature Detection Library for JavaScript (uses HTML5 canvas on browser and canvas alternative on Node)

Based on Viola-Jones Feature Detection Algorithm using Haar Cascades and improvement Viola-Jones-Lienhart et al Feature Detection Algorithm

This is a port of OpenCV C++ Haar Detection and of JViolaJones Java) to JavaScript.

there is also a php version: HAARPHP

Light-weight (~11kB minified, ~5kB gzipped).

Haar.js Face Detection Haar.js Many Faces Detection Haar.js Mouth Detection Haar.js Eyes Detection

Contents

Live Examples

How To use

You can use the existing openCV cascades to build your detectors.

To do this just transform the opencv xml file to javascript or json format using the haartojs (php) tool (in cascades folder)

examples:

to use opencv's haarcascades_frontalface_alt.xml in javascript do:

haartojs haarcascades_frontalface_alt.xml > haarcascades_frontalface_alt.js

this creates a javascript file: haarcascades_frontalface_alt.js which you can include in your html file or node file

the variable to use in javascript is similarly haarcascades_frontalface_alt (both in browser and node)

to transform a cascade xml file to json format do:

haartojson haarcascades_frontalface_alt.xml > haarcascades_frontalface_alt.json

The structure of the .js and .json formats is exactly the same, so you can interchange between the two freely

HAAR.js works both in the browser and in Node.js (supporting parallel computations with Parallel.js)

NOTE HAAR.js (0.4.4+) (and the generated cascades) support umd-style generic loading capability for: commonjs / node , amd , browsers script tags

Runing inside the browser

Loading with script tags.

You can run the example face.html or mouth.html inside your browser.

Running inside node

For running in nodejs, the package has a dependency on canvas.

Canvas alternatives for nodejs:

  1. CanvasLite
  2. node-canvas

To work properly node-canvas needs some system dependencies. You can find instruction on https://github.com/Automattic/node-canvas/wiki

You can find an example inside examples/nodes.js for both alternatives.

Example Output

node examples/node.js
processing the picture
[{"x":84,"y":90,"width":202,"height":202,"area":40804}]

Loading with requirejs

As a third option, you can load the library with requireJS, both in the browser in node. There is an example of loading with RequireJS inside node in examples/require.js. The configuration would be the same inside a browser

Supporting parallel computation

The parallel.js library is included in this repository, see the face.html example for how to use. In most cases using parallel computation (if supported) can be much faster (eg eye.html example)

Where to find Haar Cascades xml files to use for feature detection

Usage Ideas

TODO

  • optimize detector for real-time usage on browsers (eg. -> https://github.com/liuliu/ccv) [DONE use parallel.js]
  • add selection option, detection is confined to that selection (eg detect nose while face already detected) [DONE]
  • check if some operations can use fixed-point arithmetic, or other micro-optimizations [DONE where applicable]
  • keep up with the changes in openCV cascades xml format (will try)

see also:

  • Abacus advanced Combinatorics and Algebraic Number Theory Symbolic Computation library for JavaScript, Python
  • MOD3 3D Modifier Library in JavaScript
  • Geometrize Computational Geometry and Rendering Library for JavaScript
  • Plot.js simple and small library which can plot graphs of functions and various simple charts and can render to Canvas, SVG and plain HTML
  • HAAR.js image feature detection based on Haar Cascades in JavaScript (Viola-Jones-Lienhart et al Algorithm)
  • HAARPHP image feature detection based on Haar Cascades in PHP (Viola-Jones-Lienhart et al Algorithm)
  • FILTER.js video and image processing and computer vision Library in pure JavaScript (browser and node)
  • Xpresion a simple and flexible eXpression parser engine (with custom functions and variables support), based on GrammarTemplate, for PHP, JavaScript, Python
  • Regex Analyzer/Composer Regular Expression Analyzer and Composer for PHP, JavaScript, Python
  • GrammarTemplate grammar-based templating for PHP, JavaScript, Python
  • codemirror-grammar transform a formal grammar in JSON format into a syntax-highlight parser for CodeMirror editor
  • ace-grammar transform a formal grammar in JSON format into a syntax-highlight parser for ACE editor
  • prism-grammar transform a formal grammar in JSON format into a syntax-highlighter for Prism code highlighter
  • highlightjs-grammar transform a formal grammar in JSON format into a syntax-highlight mode for Highlight.js code highlighter
  • syntaxhighlighter-grammar transform a formal grammar in JSON format to a highlight brush for SyntaxHighlighter code highlighter
  • SortingAlgorithms implementations of Sorting Algorithms in JavaScript
  • PatternMatchingAlgorithms implementations of Pattern Matching Algorithms in JavaScript
  • CanvasLite an html canvas implementation in pure JavaScript
  • Rasterizer stroke and fill lines, rectangles, curves and paths, without canvaσ
  • Gradient create linear, radial, conic and elliptic gradients and image patterns without canvas
  • css-color simple class to parse and manipulate colors in various formats

haar.js's People

Contributors

foo123 avatar joeyvanderbie avatar bryant1410 avatar

Stargazers

Manrike Villalobos Báez avatar Colter Bowman avatar  avatar Mitchell Johnson avatar Jean Christophe Roy avatar Salman Adhikari avatar yangmin avatar Eduardo Arruda avatar Alex Sholk avatar Tata Brian David Kongnyuy avatar Muhammet Ali Köker avatar Ines avatar Wajdi avatar Karl Lindberg & Kilian Güntner avatar Shahar Marcus avatar Jose Abraham Garcia avatar Léo Martin avatar  avatar Gabin Desserprit avatar  avatar  avatar Emre Barack Sokullu avatar Dylan Larrabee avatar Heartlander avatar Matt avatar MY avatar OftenGuy avatar Mutalisk avatar Powerlift_Noob avatar Thanh Nguyen avatar Aqil Contractor avatar Vincent J avatar Roman Hossain Shaon avatar Ishan Marikar avatar Vis avatar Travis Arnold avatar  avatar 翎栋 avatar mohamed chrif lajnef avatar Diana Quintanilla Perez avatar Talus avatar Viktor Sokolov avatar alex31 avatar Robin Tomar avatar Muhammad Ubaid Raza avatar Vahid Ghaderi avatar Amin Ghs avatar RUBY KUMARI avatar Mary Grace Garcia avatar Vishwa avatar Abhimanyu Aryan avatar Hu Jiade avatar CheatModeON avatar Volodymyr Pavlenko avatar crapthings avatar Zero avatar  avatar Jerry.Shi avatar  avatar neewbee avatar  avatar vulcangz avatar Jordan Piepkow avatar  avatar Diego Soria Rios avatar Ahsan Javed avatar Alex Rouillard avatar Bruno Carvalho avatar  avatar  avatar Andrey Sheka avatar Simon Duff avatar Richard avatar Michael Radionov avatar  avatar Fabio Dias Rollo avatar Raghav Dinesh avatar  avatar xx avatar Mahesh Ranaweera avatar  avatar Olle Lauri Boström avatar  avatar Joe avatar Nathan Smith avatar jonas bosson avatar Charles avatar Aral Roca Gomez avatar tacigar avatar  avatar Ajinkya Puar avatar immatt2015 avatar  avatar Lang LEE avatar Michele Toni avatar Bee Ing avatar Xiaohui F avatar Yue Zhao avatar Menno van Ens avatar Savino Basanisi avatar

Watchers

Patrycjusz Szydło avatar oleang avatar tom zhou avatar Andre Cassal avatar onecoding avatar Mandar Shinde avatar James Cloos avatar Alexander Katin avatar Jean-Claude Richard avatar Andrés B. avatar  avatar Stéphane Adam Garnier avatar Oscar Rendon avatar Hsuching avatar Michael Anthony avatar Einstein Hassan Zaman avatar  avatar Muhammet Ali Köker avatar BRTom avatar Ron Dagdag avatar Ivan Jacobs avatar  avatar  avatar  avatar  avatar Vis avatar Pratyush singh avatar Raphael Medeiros avatar Manu Schiller avatar  avatar

haar.js's Issues

Manifest file prevents haartojs from running

I'm not sure if this is do to my Java inexperience, but whenever I try to run the haartojs.jar file, it does not run. My error seems to be with the manifest heading? Any help would be appreciated.

Cannot read property 'rects' of undefined

this is my haar file

<?xml version="1.0"?> <opencv_storage> <myhaar type_id="opencv-haar-classifier"> <size> 20 20</size> <stages> <_> <trees> <_> <_> <feature> <rects> <_> 7 16 6 4 -1.</_> <_> 7 18 6 2 2.</_></rects> <tilted>0</tilted></feature> <threshold>-0.0323070399463177</threshold> <left_val>0.8604652881622315</left_val> <right_val>-1.0000020265579224</right_val></_></_></trees> <stage_threshold>0.8604652881622315</stage_threshold> <parent>-1</parent> <next>-1</next></_> <_> <trees> <_> <_> <feature> <rects> <_> 0 2 4 11 -1.</_> <_> 2 2 2 11 2.</_></rects> <tilted>0</tilted></feature> <threshold>0.0154317598789930</threshold> <left_val>-1.</left_val> <right_val>0.6949151754379273</right_val></_></_></trees> <stage_threshold>0.6949151754379273</stage_threshold> <parent>0</parent> <next>-1</next></_> <_> <trees> <_> <_> <feature> <rects> <_> 1 0 15 16 -1.</_> <_> 1 4 15 8 2.</_></rects> <tilted>0</tilted></feature> <threshold>0.1195845976471901</threshold> <left_val>-0.8895025849342346</left_val> <right_val>0.7351595759391785</right_val></_></_> <_> <_> <feature> <rects> <_> 0 6 20 7 -1.</_> <_> 5 6 10 7 2.</_></rects> <tilted>0</tilted></feature> <threshold>0.1091756969690323</threshold> <left_val>-0.8640195131301880</left_val> <right_val>0.6678310036659241</right_val></_></_></trees> <stage_threshold>-0.2216715961694717</stage_threshold> <parent>1</parent> <next>-1</next></_> <_> <trees> <_> <_> <feature> <rects> <_> 0 4 20 2 -1.</_> <_> 5 4 10 2 2.</_></rects> <tilted>0</tilted></feature> <threshold>0.0437872111797333</threshold> <left_val>-0.6330271959304810</left_val> <right_val>0.7582414746284485</right_val></_></_> <_> <_> <feature> <rects> <_> 11 17 2 3 -1.</_> <_> 11 18 2 1 3.</_></rects> <tilted>0</tilted></feature> <threshold>3.7808620836585760e-003</threshold> <left_val>-0.7312806248664856</left_val> <right_val>0.7276245951652527</right_val></_></_></trees> <stage_threshold>0.0269609093666077</stage_threshold> <parent>2</parent> <next>-1</next></_> <_> <trees> <_> <_> <feature> <rects> <_> 6 0 8 2 -1.</_> <_> 6 1 8 1 2.</_></rects> <tilted>0</tilted></feature> <threshold>0.0229575894773006</threshold> <left_val>-0.5850620269775391</left_val> <right_val>0.8867923021316528</right_val></_></_> <_> <_> <feature> <rects> <_> 15 6 4 14 -1.</_> <_> 15 13 4 7 2.</_></rects> <tilted>0</tilted></feature> <threshold>-0.0248031206429005</threshold> <left_val>0.3715035021305084</left_val> <right_val>-0.7250819802284241</right_val></_></_></trees> <stage_threshold>-0.2135584950447083</stage_threshold> <parent>3</parent> <next>-1</next></_> <_> <trees> <_> <_> <feature> <rects> <_> 8 0 3 2 -1.</_> <_> 8 0 3 1 2.</_></rects> <tilted>1</tilted></feature> <threshold>-3.0379199888557196e-003</threshold> <left_val>0.5267180204391480</left_val> <right_val>-1.0000020265579224</right_val></_></_></trees> <stage_threshold>0.5267180204391480</stage_threshold> <parent>4</parent> <next>-1</next></_> <_> <trees> <_> <_> <feature> <rects> <_> 5 15 3 4 -1.</_> <_> 5 16 3 2 2.</_></rects> <tilted>0</tilted></feature> <threshold>1.7002030508592725e-003</threshold> <left_val>0.5254240036010742</left_val> <right_val>-0.7560986876487732</right_val></_></_> <_> <_> <feature> <rects> <_> 0 10 20 4 -1.</_> <_> 5 10 10 4 2.</_></rects> <tilted>0</tilted></feature> <threshold>0.1169022992253304</threshold> <left_val>-0.6004660129547119</left_val> <right_val>0.6980428099632263</right_val></_></_></trees> <stage_threshold>-0.0750420093536377</stage_threshold> <parent>5</parent> <next>-1</next></_> <_> <trees> <_> <_> <feature> <rects> <_> 2 7 11 2 -1.</_> <_> 2 7 11 1 2.</_></rects> <tilted>1</tilted></feature> <threshold>0.0232701301574707</threshold> <left_val>-1.</left_val> <right_val>0.3333333134651184</right_val></_></_></trees> <stage_threshold>0.3333333134651184</stage_threshold> <parent>6</parent> <next>-1</next></_> <_> <trees> <_> <_> <feature> <rects> <_> 7 6 9 3 -1.</_> <_> 6 7 9 1 3.</_></rects> <tilted>1</tilted></feature> <threshold>2.3264440242201090e-003</threshold> <left_val>0.3698633015155792</left_val> <right_val>-1.0000009536743164</right_val></_></_></trees> <stage_threshold>0.3698633015155792</stage_threshold> <parent>7</parent> <next>-1</next></_> <_> <trees> <_> <_> <feature> <rects> <_> 7 6 8 3 -1.</_> <_> 6 7 8 1 3.</_></rects> <tilted>1</tilted></feature> <threshold>-3.1593269668519497e-003</threshold> <left_val>-1.</left_val> <right_val>0.4285714924335480</right_val></_></_></trees> <stage_threshold>0.4285714924335480</stage_threshold> <parent>8</parent> <next>-1</next></_></stages></myhaar> </opencv_storage>

Ever say this error, i convert it with your batch files but anything, thanks.

Can I use this for real time face tracking?

Actually, I had used Haar cascade frontal face detector in python, but I want to use it in my node project, searching for the javascript implementation I came around this project. So I wanted to know if this can work for real time face detection in js?
The functionality that I'm working on is, when capturing the video from the webcam, if the face is non-frontal ,the face will be not detected and then alert the user to look back at the screen.
Please comment on its feasibility implementing in javascript.

convert selection to image

hi, how i can convert my selection area to an image and how i can train my own haarcascade, i ever get an error, my error is "rects is undefined" thanks

Video demo

Hi,
have you done any experiment with video at all?!

Thanks

Failed to load Main-Class manifest attribute from haartojs.jar

Failed to load Main-Class manifest attribute from
haartojs.jar

got this error while trying to convert. Any suggestions?

Thank you for sharing this project. Oh, and I couldn't find a licence file, under which one did you release your work?

Cheers

New image

When i test the mouth detection with new its unable to detect .it just detect with default images.is there any condition to apply when detecting

Examples are not working with other images like haar-mouth-detection.png or Faces.jpg (images in the repository)

Hello, I downloaded this repository, and the examples are working with model1.jpg. But the mouth example does not work with the image in repository: haar-mouth-detection.png or the face example with Faces2.jpg

I was trying with some of my images and the mouth example did not work with them. Hence I tried with the haar-mouth-detection.png, and it did not work with the same either.

Can you pls point out what could be the problem.

Secondly and most important, I want to use the mouth example to be able to detect a smiling face? I checked one of the usage examples, but the online demo does not work accurately. Any other usage examples which can capture smile detection?

Haar.Js video demo problems

I have downloaded your example for face detection and it works fine. However, when I change the example to run the face detection on live video in an interval loop, or even using a static image with multiple faces inside an interval loop, nothing is being detected. I am trying to compare two different pieces of code, Haar.js and JsObjDetect on facial recognition for real time video, however neither is detecting any objects at all. Therefore I am aware I must be doing something, but I am not sure what. Attached is my code, and any helpful insight would be appreciated:

'''''javascript

<script src="../js_objectdetect_src/js/objectdetect.js"></script>
<script src="../js_objectdetect_src/js/objectdetect.frontalface.js"></script>
<script src="../js_objectdetect_src/js/objectdetect.eye.js"></script>

<script src="../js_objectdetect_src/js/jquery.js"></script>
<script src="../js_objectdetect_src/js/jquery.objectdetect.js"></script>

<script>
$.fn.highlight = function(rect, color) {
    $("<div />", {
        "css": {
            "border":   "2px solid " + color,
            "position": "absolute",
            "left":     ($(this).offset().left + rect[0]) + "px",
            "top":      ($(this).offset().top  + rect[1]) + "px",
            "width":    rect[2] + "px",
            "height":   rect[3] + "px"
        }
    }).appendTo("body");
}
</script>
<script type="text/javascript" src="./haar-detector.js"></script>
<script type="text/javascript" src="./cascades/haarcascade_frontalface_alt.js"></script>
</head>
<body>
<div>Face Detection with OpenCV haar cascades in Javascript</div>
<div id="container" style="position:relative;">
    <H1>Image Canvas</H1>
    <canvas id='imagecnvs' width'320' height='240'></canvas>
</div>
<div style="font-size:18px"><a href="http://nikos-web-development.netai.net/">Nikos M.</a></div>
<H1>Live Video</H1>
<video id="live" width="320" height="240" autoplay style="display: inline;"></video>
<div>
    <H1>Video Canvas</H1>
    <canvas width="320" id="vidcanvas" height="240"></canvas> 
</div>
<H1>Target Image</H1>
<img id="target" style="display: inline;" width='320' height='240'/>

<H1>JSOBJ Target Image</H1>
<img id="jsobjtarget" style="display: inline;" width='320' height='240'/>

<script>
function pixel_location(x,y,width,size)
{
    return (x+(y*width))*size;
}

function setPixel(imageData, x, y, r, g, b, a) {
    var index = (x + y * imageData.width) * 4;
    imageData.data[index+0] = r;
    imageData.data[index+1] = g;
    imageData.data[index+2] = b;
    imageData.data[index+3] = a;
}
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;

var video = document.querySelector('live');

if (navigator.getUserMedia) 
{
    navigator.getUserMedia({audio: true, video: true}, function(stream) 
    {
        if (navigator.webkitGetUserMedia) 
        {
            video.src = window.webkitURL.createObjectURL(stream);
            alert("1");
        } else
        {
            video.src = stream; // Opera
            alert("2");
        }
    }, onFailSoHard);
}
else
{
    alert("3");
    video.src = 'somevideo.webm'; // fallback.
}

var onFailSoHard = function(e) {
    console.log('Unable to get video stream!!', e);
};

var imgcanvas=document.getElementById('imagecnvs');
var video = document.getElementById('live');
var videocanvas=document.getElementById('vidcanvas');
var detector;
var image=new Image();
var j = 0;
var i = 0;

timer = setInterval(
    function () 
    {
        imgcanvas.width=320;
        imgcanvas.height=240;
        videocanvas.getContext('2d').drawImage(live, 0, 0, 320, 240);
        var img = videocanvas.getContext('2d').getImageData(0, 0, 320, 240).data;
        var ctx2  = imgcanvas.getContext('2d');
        var theImage = ctx2.getImageData(0, 0, imgcanvas.width, imgcanvas.height);
        var img1 = ctx2.createImageData(theImage);
        //var mvc = videocanvas.getContext('2d');
        //mvc.drawImage(live,0,0,320,240);
    for (j = 0; j < 240; j++) {
        for (i = 0; i < 320; i++) {
            x = i;
            y = j;
            r = img[pixel_location(x,y,imgcanvas.width,4)];
            g = img[pixel_location(x,y,imgcanvas.width,4)+1];
            b = img[pixel_location(x,y,imgcanvas.width,4)+2];
            //alert("r="+r + "g="+g+"b="+b);
            setPixel(img1, x, y, r, g, b, 255); // 255 opaque
        }
    }
    ctx2.putImageData(img1,0,0);
    image.src = videocanvas.toDataURL('image/jpg');
    image.width = 320;
    image.height = 240;
    jsobjtarget.src = target.src = image.src;
    new HAAR.Detector(haarcascade_frontalface_alt).image(target).complete(function(){
        if (this.objects.length > 0)
            alert(this.objects.length+" Objects found");
        for(i=0; i< this.objects.length; i++){
            var rect=this.objects[i];
            var ctx=ctx2//.getContext('2d');
            ctx.strokeStyle="rgba(0,0,0,1)";
            ctx.strokeRect(rect.x,rect.y,rect.width,rect.height);
        }
    }).detect(1, 1.25, 0.1, 1, true);
    $("#jsobjtarget").objectdetect("all", {classifier: objectdetect.frontalface}, function(faces) {
        for (var i = 0; i < faces.length; ++i) {
            $(this).highlight(faces[i], "red");

        }
    });
}, 250
);
</script>

'''''

Ruby script

Hi,
Thank you for your providing of the HAAR scripting, and I made the XML to JS translation script by Ruby. Can I add your commit?

Thanks,
Yumi

Error Convert XML file to JS

I try to convert haarcascade xml file to haarcascade js file on Mac terminal and get the error:

rqmac:cascades rqmac$ php haartojs.php haarcascade_lefteye_2splits.xml
Notice: Undefined offset: 2 in /Users/rqmac/Desktop/cascades/haartojs.php on line 240
(function(root) { var ={size1:160,size2:20,stages:[{thres:-7.6678442955017090e-01,trees:[{feats:[
Notice: Uninitialized string offset: 0 in /Users/rqmac/Desktop/cascades/haartojs.php on line 169
{
Notice: Uninitialized string offset: 0 in /Users/rqmac/Desktop/cascades/haartojs.php on line 176
Notice: Uninitialized string offset: 0 in /Users/rqmac/Desktop/cascades/haartojs.php on line 191
Notice: Uninitialized string offset: 0 in /Users/rqmac/Desktop/cascades/haartojs.php on line 202
thres:,has_l:false,l_val:0,l_node:,has_r:false,r_val:0,r_node:,rects:[
Notice: Uninitialized string offset: 0 in /Users/rqmac/Desktop/cascades/haartojs.php on line 210
Fatal error: Cannot use string offset as an array in /Users/rqmac/Desktop/cascades/haartojs.php on line 210
....
....

When I checked the xml file, i found the different format with your example cascade include file in Haar.js. I try to convert this xml file (from opencv-node):
https://github.com/peterbraden/node-opencv/blob/master/data/haarcascade_lefteye_2splits.xml

I hope you can solve this issue, thank you.

Using explicit Global

Hi,

I am currently trying to user HAAR.js inside a node.js project.
Since the code is not common AMD, I'm loading the code with requirejs.

With requirejs 2.0 (http://requirejs.org/docs/api.html#config-shim), I could load the files if the variables were true global.

In the browser, the way the files are loaded, the variable are already global =>
Do you think it's possible inside haar-detector.js to remove the var of

var HAAR=HAAR||{};

and the

System.out.print("var " 

inside the Test class of the jar ?

By the way, I'm not doing a PullRequest because the java files are not the repo.

explain parameters

Hi,

nice implementation. It works really well in the latest Chrome browser.

But I don't understand these parameters yet:

baseScale, scale_inc, increment, min_neighbors, doCannyPruning

Could you explain them a bit more?
Thx

Mouth.html demo is a mess

Hi. I'm a little bit confused ... i tried your demo and for me it's not workin at all.
The mouse.htm, but even all the detection i can try after creating js files (following your guideline).

I don't mean to be aggressive, but is this supposed to be like this ?

Capture d e cran 2013-03-06 a 00 27 52

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.