Data Forwarder Auto Label?

@janjongboom I have almost figured things out. Thanks for your help Jan. Hopefully I can make a video soon. My present playlist about the Arduino PortentaH7 is here.

Latest issue, I am using the data forwarder which works fine, but I have just clued in that I can’t auto send the label with the data. Edge Impulse is expecting a batch of data that all works for the same label. Then change the label and upload the next batch. I am used to sending an xDataSet with a matching yDataSet of labels. Can Edge Impulse, using the data forwarder, accept a label with the data? Any suggestions for my use case?

Hi @Rocksetta, if you have the data and the label already then wrapping it in the JSON according to the acquisition format is by far the easiest. If you have some example I’m happy to put a script together to do so.

1 Like

That would be really useful. Can the script ignore the encryption keys just to test if dummy data is working?

I am just trying to do the absolute microcontroller basic program of having 8 generic digital inputs and 4 digital output labels. I can generate data from my Arduino like the following. Say the 8 inputs are temperature sensors triggered at a set temperature and the 4 outputs are turning on or off room heaters.

Training Data --> Training Target (labels)
[0,0,0,1,0,1,0,0],[1,0,1,0]
[0,1,0,1,0,1,0,0],[1,1,1,0]
[1,0,0,0,0,1,0,0],[1,0,0,0]

The data could also be formatted as input first then output, although the above would be easier to generate.

[0,0,0,1,0,1,0,0]
[0,1,0,1,0,1,0,0]
[1,0,0,0,0,1,0,0]

[1,0,1,0]
[1,1,1,0]
[1,0,0,0]

I have a longer explanation here.

This could probably be programmed much easier using traditional programming and if statements, but it is a good ML starting point for my Robotics students.

Note: These labels (target data) are digital but in practice the output from the NN would be floats.

Thanks for the help @janjongboom. It makes much more sense now that I understand that each label gets it’s own JSON file and you can easily upload multiple JSON files.

Each of my JSON files looks like this

{"protected":{"ver":"v1","alg":"none","iat":1603914126},"signature":"0","payload":{"device_type":"TEST","interval_ms":10,"sensors":[{"name":"sensor1","units":"N/A"}],"values":[0,0,0,1,0,0,1,0]}}

which in expanded format looks like and can be explained at https://docs.edgeimpulse.com/reference#data-acquisition-format

{
   "protected":{
      "ver":"v1",
      "alg":"none",
      "iat":1603914126
   },
   "signature":"0",
   "payload":{
      "device_type":"TEST",
      "interval_ms":10,
      "sensors":[
         {
            "name":"sensor1",
            "units":"N/A"
         }
      ],
      "values":[
         0,
         0,
         0,
         1,
         0,
         0,
         1,
         0
      ]
   }
}

What is really nice here, is that the encryption and device name is not relevant just for testing since I am uploading using the dashboard data acquisition part of the website.

Next step, looking at using the C++ library or the Arduino Library on an Arduino, on windows and Ubuntu. Windows will need the long file name issue solved.

See forum here and here

1 Like

Ok, the “platform.local.txt” file issue to fix long file names in windows using the Arduino regular IDE was not a big deal. I was thinking I was going to have to edit the file for all my includes, but it really is just taking this file and putting it in the main arduino folder for in my case mbed 1.3.0 right beside the file called platform.txt.

The only really confusing part is that AppData is a hidden directory and the file for me was in:

C:\Users\MYUSERNAME\AppData\Local\Arduino15\packages\arduino\hardware\mbed\1.3.0

So on windows just go to “users” find yourself and the type “/AppData” without the qoutes that will get you to the Local folder and you can find your Arduino board after that.

The file you need to save is here

By @aurel new platform.local.txt

Just check that in windows it actually was saved with the .txt ending, at first mine didn’t.

Next issue. When using the Arduino Library, which example program to use. I think all the programs are going to run the newly generated model, just not all the programs are going to make sense running your new model if you are using custom data inputs and outputs. I will have to look into it.

Next issue. When using the Arduino Library, which example program to use. I think all the programs are going to run the newly generated model, just not all the programs are going to make sense running your new model if you are using custom data inputs and outputs. I will have to look into it.

Use the static buffer example for custom models.

@janjongboom, I want to start making some videos about my awesome experience with EdgeImpulse soon. Is there any chance of bundling the platform.local.txt file in its own folder with the arduino library download. Makes most sense there. Perhaps in a folder called “for windows users” with a readme.txt file that explains where to put it. I never know if changes like this are easy or ridiculously difficult to do.

@Rocksetta the underlying issue is almost fixed in Arduino - so I hope to see this live in the IDE and CLI tools very soon. See https://github.com/arduino/arduino-cli/pull/961

1 Like

My OV7670 Camera with the Nano 33 Ble Sense is now working so now I need to test if the images are being uploaded correctly.

So @janjongboom or @aurel I wish to load an image using the data uploader onto my impulse to see what it looks like. A sensible method for testing that process would be to load some data that I have taken off my impulse using the live classification " Classify existing test sample" and copying it’s raw data.

Here is my test JSON file adapted from above, but using a 3 byte 48 x 48 image that is already on Edge Impulse. Since this upload doesn’t work assume my issue is with the formatting of this json file.

Any suggestions? The following is saved as a json file called say test03.json. I then used the data uploaded in the “devices” main drop down list.

{
   "protected":{
      "ver":"v1",
      "alg":"none",
      "iat":1610168279
   },
   "signature":"0",
   "payload":{
      "device_type":"TEST",
      "interval_ms":5000,
      "sensors":[
         {
            "name":"image (rgba)",
            "units":"N/A"
         }
      ],
      "values":[0xc8cabd, 0xc6c8bb, 0xc3c5b8, 0xcbcdc0, 0xcbcdc0, 0xc9cbbe, 0xcccec1, 0xcfd1c4, 0xcfd1c4, 0xd4d7c9, 0xced2c3, 0xcfd3c5, 0xcdd1c3, 0xcdd1c3, 0xcfd3c5, 0xcdcfc2, 0xc9cbbe, 0xd0d4c6, 0xd0d4c6, 0xd0d4c6, 0xced1c4, 0xd3d6cb, 0xd5d8cd, 0xd3d6cd, 0xced1c6, 0xd7dbce, 0xd0d3c8, 0xcbcdc1, 0xd1d3c4, 0xd2d5c9, 0xd0d3c9, 0xd7dacf, 0xd4d7cc, 0xcbcdc2, 0xd0d2c7, 0xd0d2c6, 0xcaccc0, 0xced0c4, 0xced0c5, 0xcbcdc2, 0xd4d6cb, 0xd1d3c8, 0xd2d4cb, 0xd5d7cc, 0xcdcdc6, 0xd3d4cc, 0xd4d6cc, 0xd5d8ce, 0xc6c8bb, 0xc6c8bb, 0xc5c7ba, 0xced0c3, 0xcaccc0, 0xced0c3, 0xc7c9bc, 0xc6c8bb, 0xd0d2c5, 0xcfd1c3, 0xced1c4, 0xcacec1, 0xd0d4c5, 0xc8ccbe, 0xcacdc1, 0xd1d5c9, 0xcdd1c3, 0xd2d6c8, 0xcdd1c3, 0xd1d5c8, 0xd0d3c7, 0xd4d7cd, 0xd6d9d0, 0xd3d6cd, 0xd4d7cc, 0xcbcec3, 0xd5d8cd, 0xd0d3c8, 0xcacdc1, 0xced1c5, 0xd4d7ce, 0xd6d9ce, 0xd6d9cd, 0xd0d1c6, 0xcfd0c7, 0xced0c7, 0xcfd1c6, 0xd4d5cc, 0xd4d5cc, 0xcaccc2, 0xcacbc2, 0xd1d2c9, 0xd8dad1, 0xd6d9d0, 0xd3d6cb, 0xcfd0c8, 0xd2d4ca, 0xd2d5cc, 0xc4c6b9, 0xc5c7ba, 0xc5c7ba, 0xcdcfc2, 0xc9cbbe, 0xc9cbbe, 0xcfd1c4, 0xc5c7ba, 0xcdd1c3, 0xcccec2, 0xc7cabf, 0xc8ccbe, 0xcccfc2, 0xccd0c3, 0xcacdc2, 0xcdd0c6, 0xced2c4, 0xccd0c3, 0xcacec0, 0xcdd0c4, 0xd6d9cf, 0xd5d8d0, 0xd8dbd2, 0xd2d5cc, 0xd6d9cd, 0xcbcec3, 0xd1d4ca, 0xd7dad2, 0xcdd0c6, 0xd2d5cb, 0xd5d8cf, 0xcfd2c8, 0xd7dacf, 0xd1d3ca, 0xced1c8, 0xd0d3ca, 0xced1c6, 0xd5d8ce, 0xd4d5cd, 0xd6d8ce, 0xcbcdc4, 0xcbccc3, 0xd3d5cb, 0xd5d8cf, 0xd5d8ce, 0xd3d4ca, 0xcfd0c7, 0xd3d7cd, 0xc7c9bc, 0xc3c5b8, 0xc4c6b9, 0xc5c7ba, 0xcaccbf, 0xc7c9bc, 0xcbcdc0, 0xcdcfc2, 0xc9ccbf, 0xcaccc2, 0xcfd3c7, 0xc8ccc0, 0xcccfc2, 0xcdd0c5, 0xcbcec4, 0xcdd0c6, 0xced1c6, 0xc7cabf, 0xcbcec3, 0xd1d4ca, 0xd5d8cf, 0xd0d3c8, 0xd6d9cf, 0xd4d7ce, 0xd3d6cd, 0xd3d6cd, 0xd1d4cb, 0xd5d8cf, 0xcfd2c8, 0xd0d3c9, 0xd2d5cd, 0xd0d3c8, 0xd1d4c9, 0xd0d3c9, 0xd0d3ca, 0xced1c8, 0xd3d6cc, 0xd1d2c8, 0xcfd0c6, 0xdadcd1, 0xd5d6cd, 0xcacbc4, 0xd0d0c9, 0xd4d7ce, 0xd0d2c9, 0xd1d2ca, 0xd2d4cc, 0xd0d2c9, 0xc6c8bb, 0xc3c5b8, 0xc3c5b8, 0xc4c6b9, 0xc4c6b9, 0xc8cabd, 0xcaccbf, 0xcbcdc0, 0xc7cabc, 0xcfd2c6, 0xd0d3c8, 0xc4c7bc, 0xccd0c3, 0xced1c7, 0xcccfc7, 0xcfd2c9, 0xced1c8, 0xcdd0c6, 0xd0d3c9, 0xd2d5cc, 0xcfd2c9, 0xcfd2c9, 0xd2d5cc, 0xd1d4cb, 0xd2d5cc, 0xd4d7ce, 0xd2d5cc, 0xd5d8cf, 0xd1d4cb, 0xd0d3ca, 0xd1d4cb, 0xcfd2c8, 0xcfd2c6, 0xd2d5cc, 0xcdd0c7, 0xc9ccc3, 0xdaddd3, 0xd5d7ce, 0xcecfc5, 0xd3d5cb, 0xd0d1c9, 0xcfd0c7, 0xd3d6cd, 0xd3d5cc, 0xcccdc5, 0xd0d1c9, 0xd7d9cf, 0xcecfc7, 0xc6c8bb, 0xc3c5b8, 0xc6c8bb, 0xc6c8bb, 0xc4c6b9, 0xc7c9bc, 0xc6c9bc, 0xc6c8bb, 0xcacec0, 0xcfd3c7, 0xc8ccc0, 0xcbcec2, 0xcbcec4, 0xcacdc4, 0xcbcec5, 0xd2d5cd, 0xd5d8ce, 0xd4d7ce, 0xcfd2c9, 0xcfd2c9, 0xcfd2c9, 0xd3d6cd, 0xd3d6cd, 0xd6d9d0, 0xd4d7cd, 0xd3d6cd, 0xd0d3ca, 0xd1d4cb, 0xd1d4cb, 0xd2d5cc, 0xd2d5cc, 0xd1d4cb, 0xcdd0c7, 0xd4d7ce, 0xd1d4cb, 0xd0d3ca, 0xd8dbd3, 0xd5d7cc, 0xcfd0c7, 0xcccec4, 0xcbcbc4, 0xd1d3cb, 0xd4d7cf, 0xced0c5, 0xcfd0c7, 0xd3d4cc, 0xd6d7cd, 0xcecfc6, 0xc3c5b8, 0xc6c8bb, 0xc4c6b9, 0xc5c7ba, 0xc6c8bb, 0xc8cbbe, 0xc4c8ba, 0xc3c7b9, 0xc3c7bb, 0xc6cabe, 0xc7cbbe, 0xced1c6, 0xced0c8, 0xcccec5, 0xced1c7, 0xd0d3ca, 0xd0d3c9, 0xd4d7cc, 0xd5d8cf, 0xd4d7ce, 0xd3d6cd, 0xd3d6cd, 0xcdd0c6, 0xd3d6cc, 0xd6d9cf, 0xd5d8cf, 0xd2d5cd, 0xd4d7ce, 0xd0d3ca, 0xd4d7ce, 0xd5d8cf, 0xcccfc6, 0xd5d8cf, 0xd4d7ce, 0xd8dbd2, 0xd9dcd3, 0xcfd2c9, 0xcccdc4, 0xcccec4, 0xced0c6, 0xd3d5cd, 0xd6d9d0, 0xd5d9d0, 0xd0d1c8, 0xd0d2c7, 0xd2d3c9, 0xcdcec7, 0xcdcec6, 0xbfc1b4, 0xc1c3b6, 0xc4c6b9, 0xc3c5b9, 0xc3c5b8, 0xc4c6ba, 0xc3c7bc, 0xbfc2b6, 0xb9bcb2, 0xc0c3ba, 0xcaccc3, 0xc9cdc4, 0xccd1c7, 0xc6cdc5, 0xc7cec6, 0xcfd5ca, 0xcdd1c8, 0xced0c6, 0xd1d4ca, 0xd4d7ce, 0xd3d6cc, 0xcfd2c8, 0xced1c8, 0xced1c6, 0xd1d4ca, 0xd8dbd2, 0xd7dacf, 0xdbded5, 0xd7dad1, 0xd2d5cc, 0xcdd0c7, 0xc9ccc4, 0xd4d7ce, 0xd6d9d1, 0xd5d8cf, 0xdaddd3, 0xd1d4ca, 0xcfd2ca, 0xd3d6cc, 0xd0d1c9, 0xd0d1c9, 0xcfd2c9, 0xd1d4cb, 0xd2d4cc, 0xd3d4cb, 0xd0d1c9, 0xced0c6, 0xcfd1c7, 0xc3c5b8, 0xc2c4b7, 0xbfc1b4, 0xbec0b3, 0xc0c2b6, 0xbcbeb2, 0xbdc0b6, 0xb9bcb1, 0xb5b8af, 0xb8bbb2, 0xc0c3ba, 0xc6c9bf, 0xc7d0c7, 0x6e8499, 0x7c8c9d, 0xc3cdc6, 0xd2d6cc, 0xcbcec5, 0xced1c8, 0xcdd0c6, 0xcfd2c8, 0xd1d4ca, 0xd1d4cc, 0xd2d5ca, 0xd5d8cf, 0xd7dad1, 0xd1d4ca, 0xd0d3ca, 0xd0d3ca, 0xcccfc6, 0xcdd0c7, 0xd3d6cd, 0xd2d5cc, 0xd2d5cb, 0xd9dcd3, 0xd9dcd3, 0xd8dbd1, 0xd7dad1, 0xd3d6cd, 0xced0c7, 0xcacbc3, 0xcbccc4, 0xcbcdc5, 0xc9cac2, 0xcecfc8, 0xd4d5ce, 0xcecfc6, 0xd0d2c7, 0xc1c3b6, 0xc3c5b9, 0xbfc1b4, 0xbabdb1, 0xbfc2b9, 0xbabdb2, 0xb8bbb0, 0xb6b9af, 0xb9bcb3, 0xb2b5ac, 0xbabdb4, 0xbcbfb6, 0x7e93a0, 0x426487, 0xb0bcb9, 0x94a1ab, 0xafb8bb, 0xd3d7cf, 0xcacec7, 0xcaccc5, 0xcdd0c7, 0xd2d5cc, 0xd3d6ce, 0xd4d7cf, 0xd1d4c9, 0xd1d4c9, 0xd4d7ce, 0xcccfc5, 0xcccfc5, 0xcccfc6, 0xcfd2c9, 0xd7dad1, 0xcfd2c9, 0xd5d8d0, 0xd9dcd3, 0xd8dbd2, 0xd9dcd3, 0xd3d6cd, 0xcccfc5, 0xd1d2c8, 0xcfd1c8, 0xcacdc4, 0xd0d3ca, 0xcdd0c7, 0xcbccc4, 0xcfd0c8, 0xcdcec6, 0xd0d1c8, 0xb9bbae, 0xbcbeb1, 0xbcbeb0, 0xbbbeb3, 0xbabdb5, 0xb5b8af, 0xb6b9af, 0xb4b7ad, 0xbbbeb5, 0xb9bcb3, 0xb5b8ae, 0xc3c2b6, 0x7d8c9a, 0x3b5c81, 0x778b9e, 0x5c6d89, 0x9b9faa, 0xc0c3c4, 0xbec1bf, 0xcdd0c9, 0xc8cbc4, 0xc8cbc2, 0xcdd0c5, 0xd1d4c9, 0xcccfc7, 0xcfd2c8, 0xd5d8ce, 0xd8dbd2, 0xd2d5cc, 0xcccfc6, 0xcccfc6, 0xd4d7ce, 0xd0d3ca, 0xd8dbd3, 0xd6d9d2, 0xd4d7ce, 0xd9dcd3, 0xd1d4cb, 0xd2d5cc, 0xcdd0c7, 0xced0c8, 0xcdd0c7, 0xd4d7ce, 0xd3d6cd, 0xd0d2c9, 0xc8c8c1, 0xcbccc3, 0xcbcbc4, 0xc2c4b7, 0xbfc1b5, 0xbbbeb0, 0xbdc0b5, 0xb5b8b0, 0xb7bab1, 0xb5b8af, 0xb3b6ad, 0xbcbfb6, 0xb9bcb3, 0xbebeb3, 0xd3cbbe, 0xd4cbc1, 0x999ea4, 0x5e7089, 0x4b5e78, 0x5c6372, 0x85868e, 0xb5b5b7, 0xc5c6c3, 0xbec2bc, 0xc3c6be, 0xced1c9, 0xcccfc5, 0xcccfc7, 0xced1c8, 0xd8dbd2, 0xd8dbd1, 0xd5d8cf, 0xcdd0c7, 0xd0d3ca, 0xd4d7cf, 0xd3d6cd, 0xd4d7cf, 0xd3d6cd, 0xd3d6cd, 0xd7dad1, 0xd3d6cc, 0xd0d3ca, 0xd2d5cc, 0xd0d3ca, 0xcdd0c7, 0xcfd2c9, 0xd3d6cd, 0xcfd2c8, 0xced1c8, 0xcecfc6, 0xc9cbc0, 0xc5c8be, 0xbfc3b6, 0xbbbeb2, 0xbec1b8, 0xb7bab0, 0xb8bbb1, 0xbbbeb5, 0xb6b9af, 0xbabdb3, 0xb8baae, 0xd0cbbf, 0xb3aaa1, 0xb3a89d, 0xd3c4b6, 0xb0aa9e, 0x7a7b7f, 0x787d8c, 0xc7c4c6, 0xaea9a3, 0x848a93, 0xa9adac, 0xcaccc4, 0xcdd0c9, 0xc8cbc2, 0xd1d4cc, 0xcfd2c9, 0xd3d6cd, 0xd8dbd2, 0xd4d7ce, 0xd4d7ce, 0xd2d5cd, 0xd4d7d0, 0xd7dad2, 0xd5d8cf, 0xd1d4cb, 0xd2d5cc, 0xd7dad1, 0xd3d6cd, 0xcccfc6, 0xd3d6cd, 0xd3d6cd, 0xced1c8, 0xcccfc6, 0xd3d6cd, 0xcdd0c7, 0xd7dad2, 0xcfd2c8, 0xc7c9bd, 0xc3c6b9, 0xbcbfb3, 0xb8bbb1, 0xc1c4bb, 0xbdc0b7, 0xb7bab1, 0xb8bbb2, 0xbec1b7, 0xb9bab1, 0xcbc9be, 0xccc3b8, 0x8f867f, 0xbfb3a8, 0xccc1b4, 0xa2988c, 0xb2aba5, 0xa7a2a3, 0xa8a5aa, 0xa4abb7, 0x6c7b8d, 0xa9aba9, 0x8c969f, 0xb1b8b8, 0xd4d7cd, 0xd0d4cb, 0xc9ccc3, 0xc8cbc3, 0xd4d7d1, 0xd7dad2, 0xced1ca, 0xd4d7d0, 0xd7dbd4, 0xd4d8d1, 0xd8dbd3, 0xd3d6cc, 0xd0d3ca, 0xd4d7d0, 0xd5d8d0, 0xd2d5cb, 0xd3d6cd, 0xcdd0c7, 0xd1d4cb, 0xced1c8, 0xd0d3ca, 0xd2d5cc, 0xd5d8cf, 0xd2d5cb, 0xcccfc4, 0xc0c3b6, 0xb8bbb1, 0xbbbeb4, 0xbabdb4, 0xbfc2ba, 0xbbbeb5, 0xb4b7ae, 0xb1b4ab, 0xbebeb3, 0xd7d0c3, 0x958d83, 0xb5aba1, 0xd5c8bb, 0xbab0a6, 0xbbb2a9, 0xd4cfcb, 0xcec9c7, 0x9f9fa3, 0x54667e, 0x415d7c, 0x5a6e89, 0x65758e, 0xc0c2c3, 0xabb2b9, 0xc6cdc9, 0xc7cac0, 0xc2c5bc, 0xc8cac4, 0xd4d7d0, 0xd2d5ce, 0xd6d9d2, 0xd4d8d1, 0xd6dbd4, 0xd8dbd4, 0xd7dad1, 0xd2d5cc, 0xd7dad2, 0xd9dcd4, 0xd4d7ce, 0xd1d4cb, 0xd1d4cb, 0xcfd2c9, 0xcbcec4, 0xd4d7ce, 0xd4d7cd, 0xd2d5cc, 0xd2d5cb, 0xd1d4cb, 0xbabdb1, 0xbabdb3, 0xbdc0b5, 0xb2b5ab, 0xb6b9b1, 0xb7bab1, 0xb7bbb2, 0xb3b5aa, 0xd6d1c4, 0xa39e8e, 0x918b7e, 0xd9cdc0, 0xb7ada1, 0xaca39a, 0xd4ccc8, 0xe5e0e4, 0xeeeaee, 0xe1dbdc, 0xc0c0c5, 0x707f94, 0x2c4467, 0x465973, 0x687586, 0x596985, 0xc1c6cd, 0xb7bebf, 0xc6ccc7, 0xc7cac3, 0xc3c6bf, 0xd3d6cf, 0xd2d5ce, 0xd4d6cf, 0xd2d5ce, 0xd6d9d2, 0xd6d9d1, 0xd7dad1, 0xd7dad1, 0xd8dbd2, 0xd4d7ce, 0xcdd0c7, 0xd0d3c9, 0xd0d3c9, 0xcdd0c5, 0xd1d4cb, 0xd1d4ca, 0xcdd0c7, 0xd4d7ce, 0xd8dbd2, 0xbbbdb2, 0xc0c3ba, 0xb9bcb2, 0xb2b5aa, 0xb3b6ac, 0xb3b6ae, 0xbbbeb5, 0xc6c5ba, 0xc0b8ac, 0x817c6e, 0xc9bfb2, 0xc0b5a7, 0x918678, 0xc8c1ba, 0xdbd7d8, 0xe3e0e5, 0xeceaf0, 0xd7d3d8, 0xe0dcdd, 0xd8d7d6, 0x989da6, 0x414f67, 0x294163, 0x4b5e79, 0x727e8f, 0x7f8b9e, 0xcfd4d3, 0xc7cac5, 0xbec1ba, 0xc8cbc4, 0xcbcec8, 0xd0d3cd, 0xc9ccc5, 0xd2d5ce, 0xd8dbd3, 0xd6d9cf, 0xd5d8ce, 0xd8dbd2, 0xd5d8cf, 0xcfd2c9, 0xced1c8, 0xd0d3c9, 0xd0d3c9, 0xced1c8, 0xd2d5cb, 0xcdd0c7, 0xd2d5cc, 0xd0d2c9, 0xc1c3b9, 0xbbbeb4, 0xb8bbb2, 0xb4b7ad, 0xb5b8af, 0xb1b4ab, 0xb5b7b1, 0xcac5ba, 0x8b8476, 0xb1a79b, 0xd2c6b9, 0x958b7b, 0xb0a599, 0xdcd6d4, 0xd8d6db, 0xe9e7ec, 0xedebf0, 0xeeeef2, 0xe1d4da, 0xf2c5ce, 0xe8d3d3, 0xbfbcbe, 0x616875, 0x44536c, 0x435977, 0x798798, 0x8c929f, 0x8993a8, 0xd4d8d7, 0xcfd1cb, 0xc4c8c0, 0xc8cac4, 0xc8cbc4, 0xc9ccc4, 0xd5d8d1, 0xd6d9d2, 0xd5d8ce, 0xd2d5cc, 0xd0d3ca, 0xcccfc6, 0xd2d5cc, 0xd3d6cd, 0xd2d5cc, 0xcfd2c9, 0xd2d5cc, 0xd0d3ca, 0xd1d4cb, 0xc8c9c1, 0xbfc2b7, 0xbcbfb4, 0xb9bcb3, 0xaeb1a9, 0xb4b7ab, 0xa4ada7, 0x5c7087, 0x5f6d75, 0x8d8e80, 0xded1c4, 0xa49a8b, 0x91877b, 0xd4ceca, 0xd8d6d7, 0xedebf0, 0xd8d6db, 0xb4b1b6, 0xd5d6db, 0xeed8e0, 0xf8a5b9, 0xefcad0, 0xcbc6bd, 0x625f5f, 0x888483, 0x90949f, 0x415470, 0x3e5373, 0x657188, 0xb3b7c1, 0x9ea6b1, 0xd4d8d2, 0xc7cbc3, 0xcacdc6, 0xc3c6bf, 0xcdd0ca, 0xd3d6ce, 0xd4d7cf, 0xd1d4cb, 0xd0d3ca, 0xd1d4cb, 0xcccfc6, 0xd4d7cd, 0xcbcec4, 0xcccfc6, 0xd5d8cf, 0xd0d3ca, 0xd1d4cb, 0xcdcec6, 0xc2c3ba, 0xbabdb4, 0xb9bcb3, 0xb5b7ae, 0xb0b5ac, 0x62798d, 0x284871, 0x254263, 0x4c5f70, 0x7c7c79, 0x847b6d, 0xbcb3a9, 0xdcd7d8, 0xe4e1e6, 0xe6e4e8, 0x9a989d, 0xb2b0b5, 0xc7c5ca, 0xb1aeb2, 0xece1e4, 0xe7ddd8, 0x7e7e7b, 0x5b5a5f, 0x948b85, 0x455062, 0x3f5677, 0x344a6d, 0x41506c, 0x3a4b6b, 0x7e879b, 0xbec2c9, 0xb9c2c3, 0xd0d4cd, 0xcfd3cb, 0xc8cbc3, 0xc6c9c1, 0xd2d5cc, 0xd2d5cc, 0xd1d4cb, 0xd5d8cf, 0xced1c8, 0xcdd0c6, 0xc8cbc1, 0xd2d5cc, 0xd3d6cd, 0xd1d4cb, 0xd4d7ce, 0xd0d1c9, 0xc5c7be, 0xc1c4b9, 0xbcbfb5, 0xbbbdb4, 0x9ea6aa, 0x495978, 0x8b9697, 0x6e8294, 0x1c3c62, 0x294157, 0x606667, 0xa7a197, 0xd3cbc8, 0xf1edee, 0xdfdde1, 0xbfbdc2, 0xc3c1c6, 0xb9b8bc, 0xd2ced3, 0xece8e5, 0xa6a59e, 0x4e5559, 0x5e6878, 0x5c6d84, 0x26456c, 0x26466d, 0x505f77, 0x6f7687, 0x485b7c, 0x506077, 0x57637e, 0x9aa3b1, 0xd1d5d4, 0xc1c9c6, 0xcbcec6, 0xbfc2b9, 0xcfd2c9, 0xcdd0c7, 0xd0d3cb, 0xd3d6ce, 0xcccfc7, 0xcdd0c7, 0xcccfc7, 0xd5d8d0, 0xd4d7cf, 0xd4d7ce, 0xd6d9cf, 0xd3d6cd, 0xc8ccc1, 0xc6c9be, 0xc6c8be, 0xc1c4bb, 0xb8bcb8, 0x9ca1a5, 0x969c99, 0x5e6b80, 0x59697d, 0x3b5169, 0x25384f, 0x3f464b, 0x817e79, 0xc4bdb7, 0xebe6e7, 0xe8e6eb, 0xcac8cd, 0xcfced3, 0xefeaeb, 0xcdc8c0, 0x505453, 0x707072, 0x525f77, 0x294366, 0x445e7f, 0x27496e, 0x415874, 0x696b74, 0x80808b, 0x55667f, 0x31496e, 0x788193, 0x78839b, 0x98a4b2, 0xdddfd7, 0xc4c9bf, 0xc5c8bf, 0xc9cdc4, 0xd2d5ce, 0xcbcec8, 0xc7cac2, 0xcdd0c8, 0xced1cb, 0xcbcec6, 0xd1d4cb, 0xd7dad1, 0xd5d8cf, 0xd2d5cc, 0xc8cbc0, 0xbdc0b4, 0xbfc1b6, 0xbec1b8, 0xbec1b8, 0xbabeb5, 0x9ea4a3, 0x8e9397, 0xbcbcb9, 0x606a7a, 0x2d3f55, 0x3a4757, 0x54595f, 0x5f605d, 0xa8a59e, 0xe1dbd8, 0xede8ed, 0xece8ea, 0xe7e1dc, 0x797873, 0x5a5a5d, 0x6a707c, 0x293954, 0x5d626d, 0x4f5258, 0x556070, 0x3a5476, 0x314a6c, 0x4f596a, 0x767782, 0x697284, 0x344a69, 0x3a5073, 0x8f95a0, 0x858d9e, 0xaeb7bf, 0xccd0c8, 0xc5c8c0, 0xd1d4cd, 0xcccfc7, 0xcacdc4, 0xc9ccc4, 0xcbcec7, 0xc9ccc3, 0xcccfc6, 0xd5d8cf, 0xd3d6cd, 0xcfd2cb, 0xc6c9be, 0xbbbeb3, 0xc0c1b9, 0xbfc0b8, 0xbdc0b6, 0xbfc2b9, 0xbabdb3, 0xc3c6bb, 0xa2a4a1, 0x757b80, 0x8c8d8d, 0x4a505d, 0x404a5b, 0x354155, 0x333f4b, 0x7b7d7a, 0xcec7c1, 0xede4dd, 0x9e9891, 0x565453, 0x717076, 0x35445e, 0x475261, 0x4f4e50, 0x484748, 0x4b494c, 0x5e5f6b, 0x51637e, 0x2e4a6f, 0x41516a, 0x676d78, 0x39465b, 0x4e596b, 0x4f586b, 0x3a4a67, 0xaab0bd, 0xb2b7be, 0xaeb2b1, 0xcbcdc3, 0xcfd2c8, 0xd0d3ca, 0xc9ccc3, 0xcbcec5, 0xcccfc6, 0xcccfc6, 0xcfd2c9, 0xd2d5cd, 0xd4d7d0, 0xc7cabf, 0xc3c6bd, 0xc6c9c0, 0xbec2b9, 0xbbbeb4, 0xc0c3ba, 0xbdc0b7, 0xc4c7be, 0xbdc1b8, 0xb1b5ab, 0x9fa09c, 0x5e606a, 0x828486, 0x555c6f, 0x959bab, 0x505c6b, 0x596266, 0x96918a, 0x54504c, 0x535050, 0x4d5260, 0x3a455c, 0x535356, 0x4c4a4c, 0x514f51, 0x595758, 0x484648, 0x56545a, 0x596479, 0x30486a, 0x24354d, 0x4a505e, 0x54545b, 0x4c515a, 0x424f60, 0x4b566b, 0x545c73, 0xa8abb0, 0xbabebd, 0xb6bbb6, 0xcbcec5, 0xcbcfc6, 0xcfd2c9, 0xcfd2c9, 0xd0d3ca, 0xd3d6ce, 0xd0d3cd, 0xd1d4cd, 0xc6c9c0, 0xc9ccc3, 0xc4c7be, 0xbfc2b9, 0xb8bbb1, 0xbbbeb4, 0xc1c4bb, 0xc4c7be, 0xc3c6bd, 0xbabdb4, 0xa1a59d, 0x9d9f98, 0xa29f9b, 0x7f7f81, 0xa29f9a, 0xa3a6ad, 0x344861, 0x353f47, 0x4c4b49, 0x43454a, 0x384052, 0x52555d, 0x4b4949, 0x555253, 0x5a5657, 0x575454, 0x595759, 0x4d4b4e, 0x4f4e55, 0x344055, 0x313c50, 0x56575f, 0x545259, 0x545258, 0x525867, 0x3d5573, 0x576881, 0x878e9b, 0x6a778e, 0xbac0c8, 0xced2cf, 0xc5c9c3, 0xc6c9c0, 0xd2d5cc, 0xd3d6cd, 0xcfd2cb, 0xced1ca, 0xd2d5ce, 0xc4c7bd, 0xc6c9c0, 0xbfc3b9, 0xc3c6bd, 0xbdc0b5, 0xb7baaf, 0xbec1b8, 0xc2c5bc, 0xc4c7be, 0xbbbeb6, 0xb4b6ab, 0xb3b4a9, 0x979892, 0x9b9993, 0x949089, 0x6e727c, 0x3e4c62, 0x48576a, 0x5a5d64, 0x494c56, 0x424756, 0x4a4a4c, 0x514f51, 0x565354, 0x4f4b4c, 0x494647, 0x49484a, 0x4a484c, 0x5d6069, 0x39495e, 0x434853, 0x514f54, 0x55545a, 0x474955, 0x5f6370, 0x68707f, 0x435163, 0x344662, 0x495973, 0x9499a5, 0x8b909d, 0xcbd0d1, 0xd0d2cc, 0xced0c9, 0xcaccc4, 0xc7c9c0, 0xcbcdc5, 0xcbcec7, 0xc7cabe, 0xbfc2b7, 0xc0c3b8, 0xc3c6ba, 0xbdc1b4, 0xbec1b8, 0xc1c4ba, 0xc2c5ba, 0xbec1b6, 0xc1c4bb, 0xb7b9ae, 0xb1b3a7, 0xafb1a5, 0xb5b7ab, 0x929390, 0x747578, 0x989896, 0x374764, 0x414f69, 0x6f737b, 0x414d61, 0x52545a, 0x4c4b4b, 0x514f51, 0x524f50, 0x4e4c4d, 0x444246, 0x57565b, 0x515e74, 0x243d5c, 0x3e4a5a, 0x515157, 0x4b505a, 0x344962, 0x374f6b, 0x3b4452, 0x3a3e48, 0x464c58, 0x47576a, 0x53657b, 0x787e8f, 0xbdbec4, 0xadafb6, 0xbdc1be, 0xcbcdc5, 0xc9cbc3, 0xc9c9c2, 0xcbcbc5, 0xc6c8bd, 0xc4c6ba, 0xc1c3b7, 0xbfc2b5, 0xb5b7ab, 0xbfc2b7, 0xc6c9be, 0xc0c3b8, 0xbcbfb5, 0xc5c8bf, 0xbbbeb4, 0xbabdb3, 0xafb4a5, 0xb3b7ab, 0xafb2a9, 0xaaab9f, 0x7e807f, 0x636979, 0x858990, 0x374a68, 0x203c60, 0x3f4e66, 0x585a65, 0x524e53, 0x4e4c4f, 0x555355, 0x545254, 0x55606f, 0x294163, 0x1e3659, 0x53647e, 0x676f7e, 0x505b6f, 0x3c4b62, 0x4d627c, 0x36465e, 0x3f4752, 0x464a52, 0x334859, 0x627183, 0x838290, 0x575e70, 0x808796, 0xc8c8c8, 0xbdc1c2, 0xc8ccc9, 0xc9cac3, 0xd0d4cd, 0xc1c3b8, 0xc7c9bc, 0xc5c7ba, 0xbbbdb0, 0xb4b6aa, 0xbcbeb3, 0xc4c7bc, 0xbdc0b5, 0xbec1b8, 0xc5c8bf, 0xb7bab1, 0xbec1b8, 0xafb3a6, 0xafb3a7, 0xbcbfb4, 0xb1b4a9, 0x9da098, 0xa2a398, 0x7e8186, 0x5a657e, 0x606e82, 0x273e5f, 0x314563, 0x5d6576, 0x59595f, 0x48464a, 0x575a63, 0x3f516e, 0x253b5f, 0x414e66, 0x546079, 0x738299, 0x2f3b4d, 0x5d5c65, 0x969195, 0x898d9a, 0x31425a, 0x3d4b5e, 0x465d73, 0x78767a, 0x868890, 0x757f92, 0x6e7b8d, 0x98a1ae, 0xa1a9b7, 0xa9b3b6, 0xbdc4c0, 0xd5d8d1, 0xc2c4b8, 0xc5c7ba, 0xc2c4b8, 0xbcbeb1, 0xbdbfb5, 0xc3c6ba, 0xbdc1b4, 0xb6b9ae, 0xc0c3b9, 0xbabdb4, 0xb9bcb3, 0xbcbfb5, 0xb8bab0, 0xb3b6a9, 0xbabeaf, 0xb5b8ac, 0xb7bab0, 0xb1b4a8, 0x8d9090, 0x969592, 0x8c8e94, 0x3e4c6b, 0x4b5873, 0x2f4163, 0x4a576f, 0x545662, 0x3b465f, 0x696e7b, 0x425877, 0x314f73, 0x586275, 0x4d566a, 0x4a4e5a, 0x9f9796, 0xd9cfc8, 0xa3a0a2, 0x6f7c91, 0x696f7d, 0x928d92, 0x6e6d78, 0x4e6985, 0x516b84, 0x838e9f, 0x7a8599, 0xa2a8af, 0xa9b5b4, 0xb2bbba, 0xd0d3cb, 0xc1c3b6, 0xc2c4b7, 0xbfc1b4, 0xb7b9ac, 0xbec0b3, 0xc0c3b7, 0xbec1b6, 0xb6baad, 0xbdc0b6, 0xbabdb4, 0xb8bbb1, 0xbbbeb5, 0xc2c5bd, 0xbabeb1, 0xb6baac, 0xbdc1b3, 0xb5b9ac, 0xb4b6ad, 0xb9bcb2, 0xa9aca1, 0x878a8d, 0x81848a, 0x7f808b, 0x313f5d, 0x2f4160, 0x7b7a85, 0x6e6269, 0x4f5468, 0x697484, 0x62758d, 0x51617a, 0x646a7b, 0x6b686d, 0x99908d, 0xd1c8c4, 0x85888e, 0x777e8e, 0x6c6970, 0xa5948b, 0x908c90, 0x969ba6, 0x95a5b8, 0x7a889c, 0xb0aaa9, 0xaeb0b2, 0x95a0a2, 0xced1ca, 0xd1d2cc, 0xc0c2b5, 0xbec0b3, 0xc1c3b6, 0xb7b9ac, 0xb8b9ac, 0xb6b8ac, 0xc2c4b8, 0xbec0b4, 0xb4b6ab, 0xb6b9b1, 0xb9bcb3, 0xbabdb4, 0xbec1b8, 0xbfc2b9, 0xbcbfb4, 0xb9bdaf, 0xb1b5a7, 0xbabdb1, 0xbbbeb5, 0xbabdb3, 0xb4b6aa, 0xa8a99e, 0x6e707c, 0x797c84, 0x818794, 0x344361, 0x78737d, 0x808a9e, 0x6b7182, 0xac9e91, 0x999b9f, 0x435d7f, 0x757a87, 0x8b8686, 0x999799, 0x44464c, 0x4a4b51, 0x65656f, 0x767881, 0x6b6c72, 0xa29da1, 0xd1ced3, 0xdadbe1, 0xcdc9ce, 0xaeafaf, 0xcbcfca, 0xd2d5ce, 0xcccdc7, 0xbfbfb3, 0xbebeb2, 0xc3c5b8, 0xbbbdb0, 0xb7b9ac, 0xbcbeb1, 0xbbbdb0, 0xb3b5a8, 0xb4b5aa, 0xb6b8b0, 0xb9bcb3, 0xb9bcb3, 0xbcbfb6, 0xbabdb4, 0xbfc2b7, 0xb8bdae, 0xb3b7a9, 0xb8bcaf, 0xbcbfb5, 0xbcbfb4, 0xb8bdaf, 0xb6b8ad, 0xa1a29c, 0xa2a298, 0x85868d, 0x747a8d, 0x556782, 0x4b668a, 0x536a8e, 0x78808f, 0x8c8e9b, 0x666978, 0x636c7d, 0x455974, 0x708194, 0x707780, 0x363f4b, 0x5c5d62, 0x545d6b, 0x55565d, 0x979297, 0xc9c4c5, 0xe7e3e3, 0xefecee, 0xd1d0d1, 0xcdcec9, 0xcdcfc8, 0xcbccc6, 0xbfbfb3, 0xc3c2b7, 0xbebeb2, 0xbbbeb1, 0xbdbfb2, 0xbec0b3, 0xb6b8ab, 0xb5b7a9, 0xb8bbae, 0xb9bcb2, 0xb3b6ac, 0xbbbeb5, 0xbdc0b7, 0xbdc0b7, 0xb9bcb2, 0xbabdb2, 0xbcc0b2, 0xb7bbae, 0xbbbeb2, 0xb6b9ac, 0xb6b8ac, 0xb9bbae, 0xb7b9ab, 0xb2b4a9, 0x959693, 0xa7a59f, 0x787e8f, 0x374c6f, 0x4d6484, 0x7386a6, 0x848ea2, 0x6b6c77, 0x6c6d7b, 0x596478, 0x294564, 0x385c7e, 0x697c92, 0x545b65, 0x4b4f5b, 0x868084, 0xc3bcbe, 0xf6edec, 0xf2eae9, 0xe9e1e0, 0xefebeb, 0xd8d7d3, 0xcacbc5, 0xd3d4ce, 0xc1c1b5, 0xc5c5b9, 0xbdbdb1, 0xbfc0b3, 0xbcbeb1, 0xbec0b3, 0xb6b8ab, 0xbdbfb2, 0xc0c3b6, 0xb7baaf, 0xb7b9ae, 0xbcbfb5, 0xbdc0b6, 0xbabdb4, 0xbabdb4, 0xb9bcb3, 0xb5b9ac, 0xb8bcae, 0xb9bcaf, 0xb0b2a5, 0xb9bbae, 0xb7b8ac, 0xb8bbad, 0xb6b8ab, 0xb6b7ad, 0xa7a8a0, 0x7c7f85, 0x989696, 0x6c7386, 0x344f78, 0x7589a6, 0x96a1b4, 0x45546f, 0x55585f, 0x54545a, 0x3e4f65, 0x4c5f77, 0x505766, 0x716e73, 0xaba5a9, 0xf1eae9, 0xfffbf8, 0xfdfaf5, 0xfef7f4, 0xf3ebe9, 0xd8d6d1, 0xcdcfc8, 0xd3d3ce, 0xc1c1b5, 0xc2c2b6, 0xbfbfb3, 0xc3c4b7, 0xbbbeb1, 0xb8baad, 0xbbbdb0, 0xbabcaf, 0xb8baae, 0xb5b7a9, 0xb9bbaf, 0xbbbeb4, 0xbfc2b9, 0xb9bcb4, 0xb9bcb3, 0xb6b9af, 0xb1b3a6, 0xb8b9ac, 0xbbbdb0, 0xb2b4a7, 0xbbbdb0, 0xb5b7aa, 0xbbbdb0, 0xbbbdb0, 0xb3b5a9, 0xb3b5aa, 0xafb2a4, 0x9f9f95, 0x757884, 0x868992, 0x566680, 0x45648d, 0x355782, 0x2f4968, 0x464853, 0x6a6a76, 0x495567, 0x828187, 0xb6b2b4, 0xcac4c5, 0xf6f1ef, 0xfffffd, 0xfefefc, 0xfffffb, 0xe5e0dd, 0xd2d1cd, 0xd5d6d0, 0xd4d5cf, 0xc6c6ba, 0xc1c2b4, 0xbfc0b2, 0xc4c4b8, 0xbbbdb0, 0xb8baad, 0xbfc1b4, 0xb6b8ab, 0xb0b2a5, 0xb2b4a7, 0xb7b9ad, 0xb8bbb0, 0xbbbeb5, 0xb3b6ab, 0xb3b6ac, 0xb6b9ad, 0xb3b5a8, 0xafb1a4, 0xb6b8ab, 0xbbbdb0, 0xb8baad, 0xbabcaf, 0xbabcaf, 0xbdbfb2, 0xc1c4b6, 0xbdc0b2, 0xbcbdb1, 0xa9ab9e, 0xa8aaa2, 0xa8a6a0, 0x576072, 0x657185, 0x4f6483, 0x274d79, 0x40516c, 0x505c75, 0x6e7a8d, 0xb0aaaa, 0xccc7c9, 0xe9e1e0, 0xf1ebe8, 0xfbfbf8, 0xffffff, 0xf4f2f0, 0xd7d4d0, 0xd5d6d0, 0xd4d5cf, 0xd5d6d0, 0xc7c6ba, 0xc4c2b6, 0xc0bfb2, 0xc0c0b4, 0xbebfb2, 0xbbbdb0, 0xbabcaf, 0xb8baad, 0xb0b2a5, 0xb8baad, 0xbcbfb2, 0xb6b9ac, 0xbabeb0, 0xb4b6a9, 0xb5b7aa, 0xb4b8ab, 0xbcbfb2, 0xb1b3a6, 0xb8baad, 0xb7b9ac, 0xb7b9ac, 0xbfc1b4, 0xbbbdb0, 0xb4b6a9, 0xc3c7b9, 0xc4c9bb, 0xbfc1b4, 0xb9bbae, 0xb6b8ab, 0xb1b3ac, 0x9fa19f, 0x9c9a95, 0x6a7185, 0x5b6e8b, 0x596d8a, 0x5f6d83, 0x8592a9, 0x878c9f, 0xa5a1a5, 0xd9cfcd, 0xe0d7d5, 0xf3eeec, 0xfbfbfa, 0xdcd9d6, 0xcecdc8, 0xcfd0ca, 0xcecfc9, 0xd7d7d2, 0xc5c3b6, 0xc6c4b7, 0xbcbcb0, 0xbdbdb1, 0xc4c3b8, 0xbab9ae, 0xb4b6a9, 0xbec0b3, 0xb3b5a8, 0xb7b9ac, 0xbabeb0, 0xb5b9ab, 0xb5baac, 0xb4b7ab, 0xb5b7ab, 0xb2b5a7, 0xbbbeb0, 0xb5b7aa, 0xb6b8ab, 0xb6b8ab, 0xb7b9ac, 0xbcbeb1, 0xbec0b3, 0xb6b7ab, 0xc1c4b7, 0xc1c5b7, 0xc0c3b6, 0xc0c2b5, 0xb6b8ab, 0xbcbeb3, 0xc6c8bd, 0xb5b6af, 0x8a8e92, 0xb4b2ae, 0x68758b, 0x3d5576, 0x4e627d, 0x8a8c96, 0xb6adac, 0xb5adad, 0xc5bfbb, 0xe4e0dd, 0xe4e3df, 0xcccbc6, 0xcecec9, 0xcacbc4, 0xc9c9c4, 0xd9d9d4, 0xc4c2b4, 0xbdbcb0, 0xbdbdb1, 0xbebeb2, 0xbdbeb1, 0xb6b7a9, 0xbcbeb1, 0xb7b9ac, 0xb4b6a9, 0xbcbeb1, 0xb8bbae, 0xb6baac, 0xb7baad, 0xb5b7ab, 0xb2b4a7, 0xb0b2a5, 0xb8baad, 0xb8baad, 0xb3b5a8, 0xb4b6a9, 0xb9bbae, 0xb9bbae, 0xb7b9ac, 0xbabcaf, 0xbcbeb1, 0xb9bcaf, 0xbec0b3, 0xbabcaf, 0xb8baad, 0xbdbfb3, 0xb6b8ab, 0xc1c3b7, 0xc2c4b8, 0xadaea8, 0x6a707f, 0x8b8e95, 0x707789, 0x81838f, 0xc2bbb9, 0xbfbdbb, 0xbcbcb4, 0xc9c7c1, 0xd0cfca, 0xcbcac5, 0xcdcec6, 0xd3d4cc, 0xcccbc6, 0xd0cfcb, 0xc6c3b7, 0xb9baac, 0xb9baad, 0xb9b9ad, 0xb6b6aa, 0xb9baac, 0xb5b7a9, 0xaeafa2, 0xb0b1a5, 0xb1b4a6, 0xb9bcae, 0xb6baac, 0xb1b2a5, 0xb5b7aa, 0xb3b5a8, 0xadafa2, 0xb7b9ac, 0xb6b8ab, 0xb6b8ab, 0xb0b2a5, 0xb9bbaf, 0xb3b5a7, 0xb2b4a7, 0xbabcaf, 0xbbbdb0, 0xb9bbae, 0xbdbfb2, 0xb7b9ac, 0xb3b5a8, 0xb1b3a6, 0xb4b6a9, 0xc0c2b5, 0xbec0b5, 0xbdbfb6, 0xbebfb8, 0xa2a29b, 0x868a94, 0xa8abad, 0x8a8c88, 0xb4b5b2, 0xc8c9c0, 0xcccec5, 0xcdcfc6, 0xcdcec4, 0xcacbc3, 0xd7d8d0, 0xd3d3cb, 0xcdccc7, 0xc7c5b8, 0xbbbbae, 0xb6b7aa, 0xb3b3a8, 0xb9b9ad, 0xb8b9ab, 0xacad9f, 0xabab9d, 0xa8a99c, 0xacafa1, 0xb8baad, 0xb5b7aa, 0xadafa2, 0xb0b4a6, 0xb6baac, 0xadafa2, 0xb1b3a6, 0xb5b7aa, 0xb5b7aa, 0xb4b6a9, 0xaeb0a2, 0xb2b4a7, 0xb1b3a6, 0xb9bbae, 0xb9bbae, 0xb6b8ab, 0xbbbdb0, 0xb8baad, 0xb8baad, 0xb3b5a8, 0xbcbeb1, 0xbfc1b4, 0xbcbeb2, 0xbbbdb2, 0xc0c1b7, 0xbbbdb5, 0x9a9d9e, 0x979b9a, 0x9da29e, 0xc3c4be, 0xcbcac0, 0xc8b9ac, 0xc7ada0, 0xd0c3b6, 0xcdcdc3, 0xd5d5cd, 0xd3d3cb, 0xd0cfca, 0xc6c4b7, 0xbebfb1, 0xb4b5a7, 0xb3b3a7, 0xb7b7ab, 0xb5b6a8, 0xabac9e, 0xa5a698, 0xadaea0, 0xb4b6a9, 0xafb1a4, 0xabada0, 0xaeafa3, 0xa8ab9e, 0xb1b5a7, 0xb3b6a9, 0xaaac9f, 0xadafa2, 0xafb1a3, 0xadafa1, 0xaeb0a2, 0xaeb0a2, 0xaeb0a3, 0xbcbeb1, 0xb6b8ab, 0xb3b5a8, 0xb9bbae, 0xb5b7aa, 0xafb1a4, 0xb4b6a9, 0xc2c4b7, 0xb8b9af, 0xbcbdb5, 0xbdbeb5, 0xbbbcb4, 0xc3c4bc, 0xc6c7bf, 0xacb0ac, 0xb7b9b3, 0xc3c3b9, 0xcfcdc3, 0xc8ada0, 0xcba496, 0xd4c3b7, 0xcdcbc2, 0xd2d2ca, 0xd6d6ce, 0xd1d1ca, 0xb9b7aa, 0xbbbbad, 0xbcbdaf, 0xb5b6a8, 0xb2b2a5, 0xb1b2a4, 0xb2b3a5, 0xa6a799, 0xaaab9d, 0xa8aa9c, 0xa5a79a, 0xb0b2a5, 0xacaea1, 0xadafa2, 0xb3b6a8, 0xb0b3a5, 0xa7a99c, 0xaeb0a3, 0xaaac9f, 0xaaac9e, 0xb2b4a5, 0xaeafa1, 0xb0b2a4, 0xb5b7ab, 0xb4b6a8, 0xb5b7a9, 0xb2b4a8, 0xb3b5a8, 0xb4b6a9, 0xafb1a4, 0xb9bbb0, 0xb5b7ae, 0xb5b6af, 0xc3c4bc, 0xc2c3ba, 0xc1c3ba, 0xc3c4ba, 0xc3c3b9, 0xc3c3b9, 0xc6c6bc, 0xc8c7bd, 0xc7c4b8, 0xcac7bb, 0xd5d5cb, 0xd0d0c7, 0xcdcdc5, 0xd9d9d1, 0xdeded6, 0xb9b7aa, 0xb8b9ab, 0xb9baac, 0xb8b9ab, 0xacad9f, 0xb2b3a5, 0xadaea0, 0xa3a496, 0xaaab9d, 0xadafa1, 0xa5a79a, 0xb6b8ab, 0xa9ab9e, 0xadafa2, 0xb5b7aa, 0xadafa2, 0xa5a79a, 0xb4b6a9, 0xaaab9d, 0xadae9f, 0xacada0, 0xa5a698, 0xaaac9e, 0xb6b8aa, 0xb3b6a8, 0xb2b4a6, 0xadafa2, 0xafb1a4, 0xb2b4a7, 0xb3b5aa, 0xb5b7ab, 0xb0b2a9, 0xb5b6af, 0xc2c3bb, 0xbebfb5, 0xc8c9c0, 0xc2c2b8, 0xbfbfb5, 0xc9c9bf, 0xc9c8bf, 0xc8c9be, 0xc8c8be, 0xc8c8be, 0xd1d1c7, 0xd5d5cb, 0xd0d0c6, 0xd7d7ce, 0xdeded6, 0xb9b8ab, 0xb2b3a5, 0xb3b4a6, 0xb2b3a5, 0xacad9f, 0xafb0a2, 0xa5a698, 0xa1a294, 0xa7a89a, 0xafb0a3, 0xa6a79b, 0xb4b6a9, 0xa8aa9d, 0xaeb0a3, 0xb0b2a5, 0xabada0, 0xa7a99c, 0xb3b5a8, 0xa9ab9e, 0xaaab9d, 0xacad9f, 0xa7a89a, 0xa5a698, 0xb8b9ab, 0xb1b2a4, 0xb4b5a7, 0xb2b4a7, 0xb0b2a5, 0xaeb0a5, 0xb6b8ae, 0xb5b6ae, 0xb0b1a7, 0xb7b8ae, 0xc1c2b9, 0xbcbdb4, 0xc7c9c0, 0xc4c4bb, 0xc4c4ba, 0xc9cac0, 0xc8c8be, 0xc8c8be, 0xc9c9bf, 0xd1d1c7, 0xd1d1c7, 0xd7d7cd, 0xd4d4ca, 0xd8d8d0, 0xdadad4, 0xb4b5a7, 0xafb0a2, 0xb1b2a4, 0xafb0a2, 0xa9aa9c, 0xaeafa1, 0xa7a89a, 0xa4a597, 0xa4a597, 0xacac9f, 0xaaab9e, 0xacada1, 0xa9ab9e, 0xabada0, 0xaaac9f, 0xb0b2a5, 0xaaac9f, 0xacaea1, 0xafb1a4, 0xabac9e, 0xacad9f, 0xadaea0, 0xaaab9d, 0xb4b5a7, 0xafb0a2, 0xb6b7a9, 0xb5b7aa, 0xb1b3a6, 0xafb1a6, 0xb4b6ab, 0xb9b9b2, 0xb1b2a8, 0xb6b9ad, 0xc2c3ba, 0xc1c3b9, 0xc6c7bf, 0xc7c7be, 0xccccc3, 0xc7c7bd, 0xcdcdc3, 0xc9c9bf, 0xc9c9bf, 0xd3d3c9, 0xd3d3c9, 0xd6d6cc, 0xd6d6cc, 0xd8d8ce, 0xdcdbd6]
   }
}



Which gets this negative report

Uploading 1 file...

[1/1] Failed to upload base04.json Invalid message body, was specified to be JSON but could not decode message (Unexpected token x in JSON at position 318)

Done. Files uploaded successful: 0. Files that failed to upload: 1.

I just got the Portenta Vision Shield envie-camera working similar to the OV7670 :grinning: :100: so the above data uploader ability is now doubly important.

I solved a bit of the problem. The data uploader needs the raw data in the form of floats like the classifier debug sends not like the RGB888 format

works

0.152941, 0.152941, 0.152941, 0.156863,

doesn’t work

0xc9cbbe, 0xcccec1, 0xcfd1c4, 0xcfd1c4,

Is that a bug in the data uploader? as the RGB888 format is much easier to work with than floats when debugging. Anyway I should be good for the moment.

OK, now I need help @janjongboom or @aurel

I can now upload raw float decimal format data from my Nano33BleSense with the ov7670 Camera and it shows up in the data acquisition section

which should be an image like this

but in the live classification section when I try to load the data, (which is obviously incorrect) I get this:

Digging a bit, it looks like I am uploading 3 times as much data. for a 48 x 48 RGB888 image I should upload 2304 items, but in my case I upload 6912 items exactly 3 times as much. Almost like the float decimal format seems to be a decimal for each color of RGB.

Here is my uploader json file, which uploads, but is not correct.

Can’t load the file so it is here on my github

my-bad-uploader.json

looks kind of like this

{
   "protected":{
      "ver":"v1",
      "alg":"none",
      "iat":1610168279
   },
   "signature":"0",
   "payload":{
      "device_type":"TEST",
      "interval_ms":7000,
      "sensors":[
         {
            "name":"image (rgba)",
            "units":"N/A"
         }
      ],
      "values":[0.941177, 0.454902, 0.156863, ... lots more ..., 0.941177, 0.454902, 0.125490]
   }
}

Any suggestions? I just want to check what images I am loading before spending time designing models.

@Rocksetta Uploading images goes a little differently, as it only uses the JSON payload for metadata, but then uses attachments to upload the JPG or PNG file. See https://github.com/edgeimpulse/example-ingestion-jpg for an example.

Anyway, easiest would be to just upload a JPG or PNG image if you have one, the uploader supports both of them. If you only have the framebuffer you can upload with the edge-impulse-framebuffer2jpg tool that is part of the CLI:

$ edge-impulse-framebuffer2jpg --framebuffer "XXX" --width 48 --height 48 --output-file frame.jpg
$ edge-impulse-uploader frame.jpg

Note that you’ll need v1.10.3 of the CLI.

If your framebuffer is too much characters you can also put the features in a file and then use --framebuffer-file argument instead.

1 Like

Thank you, that makes a lot more sense. Couple of interesting points:

  1. The raw image seems much more fuzzy than your edge impulse posted image, do you have any smoothing functions working on the data for the viewer or is it the original resolution?

image

  1. The comma seperated raw data in RGB888 (0xcfd1c3, 0xd0d2c5, 0xd2d4c7 …) works good (see above), however comma separated debugging data (the decimal float data 0.564706, 0.988235, 0.721569 …) seems to confuse the conversion.

My data has 6912 values but I get this error.

edge-impulse-framebuffer2jpg --framebuffer-file “frame05.txt” --width 48 --height 48 --output-file frame05.jpg

Invalid length for snapshot, expected 2304 or 6912 values, but got 36288

At least the true raw RGB888 data is working well, so I am good for now. Thank you @janjongboom

LOL :joy: :joy:, not really sure if I should call this success or not. If you look closely you can see it is a selfie. I think I have some color conversion issues. Something working is always better than nothing working.

image

1 Like

This is getting fun. If I adjust the rgb565 to rgb equation to something else I found it looks a little better

void r565_to_rgb(uint16_t color, uint8_t *r, uint8_t *g, uint8_t *b) {

      *r = ((((color >> 3) & 0x1F) * 527) + 23) >> 6;
      *g = ((((((color & 0xE0) >> 5) | ((color & 0x03) << 3)) & 0x3F) * 259) + 33) >> 6;
      *b = (((color & 0x1F) * 527) + 23) >> 6;
}

image

I will have to dig a bit deeper, perhaps the OV7670 does something unique with it’s colors. Typically I have screwed something up, but at least I am getting an image.

@Rocksetta

  1. The image in the studio is before resizing, the ‘raw features’ is after resizing (so I guess 48x48 pixels) which explains the bluriness.
  2. Correct, comma separated values are not supported in the framebuffer tool.
  3. Is it a monochrome camera by any chance? I think Portenta H7 has that…

In that case you probably want:

// single byte per pixel
uint8_t frame_buffer[FRAME_BUFFER_COLS * FRAME_BUFFER_ROWS] = { 0 };

...

/**
 * This function is called by the classifier to get data
 * We don't want to have a separate copy of the cutout here, so we'll read from the frame buffer dynamically
 */
int cutout_get_data(size_t offset, size_t length, float *out_ptr) {
    // so offset and length naturally operate on the *cutout*, so we need to cut it out from the real framebuffer
    size_t bytes_left = length;
    size_t out_ptr_ix = 0;

    // read byte for byte
    while (bytes_left != 0) {
        // find location of the byte in the cutout
        size_t cutout_row = floor(offset / CUTOUT_COLS);
        size_t cutout_col = offset - (cutout_row * CUTOUT_COLS);

        // then read the value from the real frame buffer
        size_t frame_buffer_row = cutout_row + cutout_row_start;
        size_t frame_buffer_col = cutout_col + cutout_col_start;

        // grab the value and convert to r/g/b
        uint8_t pixel = frame_buffer[(frame_buffer_row * FRAME_BUFFER_COLS) + frame_buffer_col];

        uint8_t r = pixel
        uint8_t g = pixel;
        uint8_t b = pixel;

        // then convert to out_ptr format
        float pixel_f = (r << 16) + (g << 8) + b;
        out_ptr[out_ptr_ix] = pixel_f;

        // and go to the next pixel
        out_ptr_ix++;
        offset++;
        bytes_left--;
    }

    // and done!
    return 0;
}

(and train a model on grayscale values naturally)

  1. That makes sense about the images on EdgeImpulse

  2. I am good now with the data uploader, thank you. The code below saves an 80x80 raw data RGB888 file as a jpg. Still having color issues but I am working on it.

edge-impulse-framebuffer2jpg --framebuffer-file "frame14.txt" --width 80 --height 80 --output-file frame14-80x80-09.jpg

The OV7670 Cam is full color see image below showing red green blue and black objects 80x80 using the method from the arduino OV767X Github library. Kind of fun challenge to see if I can figure this out. I have written some testing code. The Java Serial Processes program uses this conversion, but I have tried it and the colors are not any better.

*r = ((p >> 11) & 0x1f) << 3;
*g = ((p >> 5) & 0x3f) << 2;
*b = ((p >> 0) & 0x1f) << 3;

image

  1. The code you posted for the Portenta Vision Shield Camera will be useful as that is my next step. Arduino has hinted that a new Camera arduino library is coming out for the Portenta soon.

Thanks for the help.

Note that we’re working on official support for the Portenta, so if you have some time we can save you some porting work.

1 Like

Hey @janjongboom I just got this reply on the arduino Camera 767x github. It might make more sense to you, but sounds like the bytes are flipped on the OV7670. (Big-endian to little-endian).?