OpenSource AI and Neuromorphic Hardware

Deep Learning

Data Normalization 

Unsupervised Pattern Recognition

Parallel Stimuli Association

Emergent Semantics

CORTEX is a suite of algorithms and hybrid artificial neural networks that aims to provide researchers in the fields of AI, linguistics and animal behavior with powerful tools to derive meaning from vast pools of unclassified input.

CURRENT PROJECTS

Snail Vision:  Two projects to provide Arduino programmers with offline machine vision through the use of low resolution, full color cameras. Version 1 tested a novel camera based on an array of 7 RGB sensors. Version 2 utilizes a small code snippit to subsample the 8 bit raw Bayer array available via the Arducam Mini 5mp Plus and generate a 9x9 RGB image of  243 bytes. These small images can then be sent to the CM1k or NM500 neuromorphic chips for image recognition. The code snippet and instructions are provided at the bottom of the page. 

CM1k Breakout Board:  A project to provide a cheap solution to incorporating the CM1k neuromorphic chip (also known as the Cognimem or Neuromem 1000) in Arduino systems via I²C. This project is completed, and the breakout boards and Arduino library  are available at  https://www.openhardware.io/

TinyMind/ Emergent X: Artificial neural network generators and engines for autonomous robotics and general AI through the implementation of Hebbian / anti-Hebbian and global reward signal learning.  Will provide open-source Arduino libraries  in the near future. 

To fund our research, we accept donations, sell several apps on Google Play and design inexpenisive open-source robotics hardware. 

Contact: neuralnetworksolutions(at) gmail.com

SNAIL VISION 2.0

In the example sketches provided with the Arducam 5mp Mini Plus, locate ArduCAM_Mini_5MP_Plus_OV5642_RAW.

Open the sketch and replace uint8_t resolution = OV5642_2592x1944; with uint8_t resolution = OV5642_640x480;

Remove all SD card code and insert if (Serial.available() > 0) { immediately before myCAM.start_capture();

Replace the following code:

//Save as RAW format
for(i = 0; i < line; i++)
for(j = 0; j < column; j++)
{
VL = myCAM.read_fifo();
buf[m++] = VL;
if(m >= 256)
{
//Write 256 bytes image data to file from buffer
outFile.write(buf,256);
m = 0;
}
}
if(m > 0 )//Write the left image data to file from buffer
outFile.write( buf, m );m = 0;
//Close the file
outFile.close();

with: 

for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
for (int b = 1; b <= 2; b++) {
Serial.print(myCAM.read_fifo());
Serial.print("!");
}
for (int s = 1; s <= 68; s++) {
myCAM.read_fifo();
}
}
for (int x = 1; x <= 11; x++) {
myCAM.read_fifo();
}
for (int k = 0; k < 9; k++) {
Serial.print(myCAM.read_fifo());
Serial.print("!");
for (int t = 1; t <= 69; t++) {
myCAM.read_fifo();
}
}
for (int z = 1; z <= 32009; z++) {
myCAM.read_fifo();
}
}Serial.println();

This code ouputs the subsampled image from top to bottom, left to right. The first 18 bytes encode blue and green pixels. The next 9 bytes encode the red pixels, skipping the corresponding green pixel in the Bayer array. In order to assemble a human-recognizable RGB image, some additional code will have to be written to match the red pixels with their blue/green counterparts, but this is not neccesary for image recognition via the CM1k. The current code prints each pixel value to the serial port seperated by "!". To send the pixels directly to the CM1k, simply save each pixel to an array instead. 

Before sending the image to the CM1k, it is recommended to normalize the values so that the darkest pixel for a given image = 0, and the brightest pixel =  255. To do this, simply find the maximum and minimum of values of the pixels for a given image, and then scale that value range to 255.