ScanBlab is a chess piece image recognizer.
In this repository, a chess piece image recognizer is created using a multilayer neural network trained on the 2D Chessboard and Chess Pieces dataset.
For further information, please visit:
Clone the chesslablab/scanblab
repo into your projects folder:
git clone [email protected]:chesslablab/scanblab.git
Then cd
the scanblab
directory and install the Composer dependencies:
composer install
Make sure to remove all files in the testing
and the training
folders.
php cleanup.php
Prepare 50,000 samples for further training.
php prepare.php 50000 training
Train the neural network.
php train.php
Prepare 20,000 samples for further testing.
php prepare.php 20000 testing
Make predictions.
php validate.php
Below is an excerpt from an example report.
{
"breakdown": {
"overall": {
"accuracy": 0.9994510579306761,
"balanced accuracy": 0.9977038971505224,
"f1 score": 0.9961001544839454,
"precision": 0.9965510770350279,
"recall": 0.9957062828647335,
"specificity": 0.9997015114363115,
"negative predictive value": 0.9997024767903292,
"false discovery rate": 0.003448922964972234,
"miss rate": 0.004293717135266537,
"fall out": 0.00029848856368840636,
"false omission rate": 0.0002975232096707342,
"mcc": 0.9958186303218224,
"informedness": 0.9954077943010451,
"markedness": 0.9962535538253571,
"true positives": 49819,
"true negatives": 597828,
"false positives": 178,
"false negatives": 178,
"cardinality": 49997
},
"classes": {
"1": {
"accuracy": 0.9996995006822651,
"balanced accuracy": 0.9921293527894939,
"f1 score": 0.9908814589665653,
"precision": 0.9975520195838433,
"recall": 0.9842995169082126,
"specificity": 0.999959188670775,
"negative predictive value": 0.9997347858906094,
"false discovery rate": 0.002447980416156681,
"miss rate": 0.0157004830917874,
"fall out": 4.081132922495456e-5,
"false omission rate": 0.0002652141093906213,
"informedness": 0.9842587055789878,
"markedness": 0.9972868054744528,
"mcc": 0.9907513412795808,
"true positives": 815,
"true negatives": 49004,
"false positives": 2,
"false negatives": 13,
"cardinality": 828,
"proportion": 0.016560993659619577
},
"B": {
"accuracy": 0.9984968132440775,
"balanced accuracy": 0.9989570822259015,
"f1 score": 0.9908301748379998,
"precision": 0.9823030303030303,
"recall": 0.9995066600888012,
"specificity": 0.9984075043630017,
"negative predictive value": 0.9999563023006839,
"false discovery rate": 0.017696969696969655,
"miss rate": 0.0004933399111988201,
"fall out": 0.001592495636998259,
"false omission rate": 4.3697699316114225e-5,
"informedness": 0.997914164451803,
"markedness": 0.9822593326037143,
"mcc": 0.9900558070988832,
"true positives": 4052,
"true negatives": 45767,
"false positives": 73,
"false negatives": 2,
"cardinality": 4054,
"proportion": 0.08108486509190552
},
"Q": {
"accuracy": 0.998016747465844,
"balanced accuracy": 0.9989202041795733,
"f1 score": 0.9880014543691674,
"precision": 0.9762874251497006,
"recall": 1,
"specificity": 0.9978404083591467,
"negative predictive value": 1,
"false discovery rate": 0.023712574850299428,
"miss rate": 0,
"fall out": 0.002159591640853331,
"false omission rate": 0,
"informedness": 0.9978404083591466,
"markedness": 0.9762874251497005,
"mcc": 0.9870050876197534,
"true positives": 4076,
"true negatives": 45743,
"false positives": 99,
"false negatives": 0,
"cardinality": 4076,
"proportion": 0.08152489149348961
},
"b": {
"accuracy": 1,
"balanced accuracy": 1,
"f1 score": 1,
"precision": 1,
"recall": 1,
"specificity": 1,
"negative predictive value": 1,
"false discovery rate": 0,
"miss rate": 0,
"fall out": 0,
"false omission rate": 0,
"informedness": 1,
"markedness": 1,
"mcc": 1,
"true positives": 4078,
"true negatives": 45741,
"false positives": 0,
"false negatives": 0,
"cardinality": 4078,
"proportion": 0.08156489389363362
},
"K": {
"accuracy": 0.9988771929824561,
"balanced accuracy": 0.9936700067149988,
"f1 score": 0.9931906614785991,
"precision": 0.9990215264187867,
"recall": 0.9874274661508704,
"specificity": 0.9999125472791273,
"negative predictive value": 0.998864306462533,
"false discovery rate": 0.0009784735812132794,
"miss rate": 0.012572533849129597,
"fall out": 8.745272087273825e-5,
"false omission rate": 0.0011356935374670085,
"informedness": 0.9873400134299977,
"markedness": 0.9978858328813196,
"mcc": 0.9925989178105358,
"true positives": 4084,
"true negatives": 45735,
"false positives": 4,
"false negatives": 52,
"cardinality": 4136,
"proportion": 0.08272496349780988
},
"k": {
"accuracy": 1,
"balanced accuracy": 1,
"f1 score": 1,
"precision": 1,
"recall": 1,
"specificity": 1,
"negative predictive value": 1,
"false discovery rate": 0,
"miss rate": 0,
"fall out": 0,
"false omission rate": 0,
"informedness": 1,
"markedness": 1,
"mcc": 1,
"true positives": 4154,
"true negatives": 45665,
"false positives": 0,
"false negatives": 0,
"cardinality": 4154,
"proportion": 0.08308498509910595
},
"N": {
"accuracy": 0.9993781344032097,
"balanced accuracy": 0.9961700024709661,
"f1 score": 0.9961552771921122,
"precision": 1,
"recall": 0.9923400049419323,
"specificity": 1,
"negative predictive value": 0.9993236462015098,
"false discovery rate": 0,
"miss rate": 0.007659995058067692,
"fall out": 0,
"false omission rate": 0.0006763537984901813,
"informedness": 0.9923400049419322,
"markedness": 0.9993236462015098,
"mcc": 0.9958257036300057,
"true positives": 4016,
"true negatives": 45803,
"false positives": 0,
"false negatives": 31,
"cardinality": 4047,
"proportion": 0.08094485669140149
},
"n": {
"accuracy": 1,
"balanced accuracy": 1,
"f1 score": 1,
"precision": 1,
"recall": 1,
"specificity": 1,
"negative predictive value": 1,
"false discovery rate": 0,
"miss rate": 0,
"fall out": 0,
"false omission rate": 0,
"informedness": 1,
"markedness": 1,
"mcc": 1,
"true positives": 4242,
"true negatives": 45577,
"false positives": 0,
"false negatives": 0,
"cardinality": 4242,
"proportion": 0.08484509070544233
},
"P": {
"accuracy": 0.9987570417593873,
"balanced accuracy": 0.9925444925444926,
"f1 score": 0.9924884904288829,
"precision": 1,
"recall": 0.9850889850889851,
"specificity": 1,
"negative predictive value": 0.9986458447089658,
"false discovery rate": 0,
"miss rate": 0.014911014911014875,
"fall out": 0,
"false omission rate": 0.0013541552910342203,
"informedness": 0.9850889850889852,
"markedness": 0.9986458447089657,
"mcc": 0.991844252706889,
"true positives": 4096,
"true negatives": 45723,
"false positives": 0,
"false negatives": 62,
"cardinality": 4158,
"proportion": 0.08316498989939396
},
"p": {
"accuracy": 1,
"balanced accuracy": 1,
"f1 score": 1,
"precision": 1,
"recall": 1,
"specificity": 1,
"negative predictive value": 1,
"false discovery rate": 0,
"miss rate": 0,
"fall out": 0,
"false omission rate": 0,
"informedness": 1,
"markedness": 1,
"mcc": 1,
"true positives": 4167,
"true negatives": 45652,
"false positives": 0,
"false negatives": 0,
"cardinality": 4167,
"proportion": 0.083345000700042
},
"q": {
"accuracy": 1,
"balanced accuracy": 1,
"f1 score": 1,
"precision": 1,
"recall": 1,
"specificity": 1,
"negative predictive value": 1,
"false discovery rate": 0,
"miss rate": 0,
"fall out": 0,
"false omission rate": 0,
"informedness": 1,
"markedness": 1,
"mcc": 1,
"true positives": 4000,
"true negatives": 45819,
"false positives": 0,
"false negatives": 0,
"cardinality": 4000,
"proportion": 0.08000480028801728
},
"R": {
"accuracy": 0.9996388225615507,
"balanced accuracy": 0.9977595220313666,
"f1 score": 0.9977544910179641,
"precision": 1,
"recall": 0.9955190440627334,
"specificity": 1,
"negative predictive value": 0.9996073127099786,
"false discovery rate": 0,
"miss rate": 0.004480955937266606,
"fall out": 0,
"false omission rate": 0.00039268729002139846,
"informedness": 0.9955190440627333,
"markedness": 0.9996073127099785,
"mcc": 0.9975610840380431,
"true positives": 3999,
"true negatives": 45820,
"false positives": 0,
"false negatives": 18,
"cardinality": 4017,
"proportion": 0.08034482068924136
},
"r": {
"accuracy": 1,
"balanced accuracy": 1,
"f1 score": 1,
"precision": 1,
"recall": 1,
"specificity": 1,
"negative predictive value": 1,
"false discovery rate": 0,
"miss rate": 0,
"fall out": 0,
"false omission rate": 0,
"informedness": 1,
"markedness": 1,
"mcc": 1,
"true positives": 4040,
"true negatives": 45779,
"false positives": 0,
"false negatives": 0,
"cardinality": 4040,
"proportion": 0.08080484829089746
}
}
},
"matrix": {
"1": {
"1": 815,
"B": 0,
"Q": 0,
"b": 0,
"K": 0,
"k": 0,
"N": 0,
"n": 0,
"P": 2,
"p": 0,
"q": 0,
"R": 0,
"r": 0
},
"B": {
"1": 13,
"B": 4052,
"Q": 0,
"b": 0,
"K": 0,
"k": 0,
"N": 0,
"n": 0,
"P": 60,
"p": 0,
"q": 0,
"R": 0,
"r": 0
},
"Q": {
"1": 0,
"B": 2,
"Q": 4076,
"b": 0,
"K": 52,
"k": 0,
"N": 27,
"n": 0,
"P": 0,
"p": 0,
"q": 0,
"R": 18,
"r": 0
},
"b": {
"1": 0,
"B": 0,
"Q": 0,
"b": 4078,
"K": 0,
"k": 0,
"N": 0,
"n": 0,
"P": 0,
"p": 0,
"q": 0,
"R": 0,
"r": 0
},
"K": {
"1": 0,
"B": 0,
"Q": 0,
"b": 0,
"K": 4084,
"k": 0,
"N": 4,
"n": 0,
"P": 0,
"p": 0,
"q": 0,
"R": 0,
"r": 0
},
"k": {
"1": 0,
"B": 0,
"Q": 0,
"b": 0,
"K": 0,
"k": 4154,
"N": 0,
"n": 0,
"P": 0,
"p": 0,
"q": 0,
"R": 0,
"r": 0
},
"N": {
"1": 0,
"B": 0,
"Q": 0,
"b": 0,
"K": 0,
"k": 0,
"N": 4016,
"n": 0,
"P": 0,
"p": 0,
"q": 0,
"R": 0,
"r": 0
},
"n": {
"1": 0,
"B": 0,
"Q": 0,
"b": 0,
"K": 0,
"k": 0,
"N": 0,
"n": 4242,
"P": 0,
"p": 0,
"q": 0,
"R": 0,
"r": 0
},
"P": {
"1": 0,
"B": 0,
"Q": 0,
"b": 0,
"K": 0,
"k": 0,
"N": 0,
"n": 0,
"P": 4096,
"p": 0,
"q": 0,
"R": 0,
"r": 0
},
"p": {
"1": 0,
"B": 0,
"Q": 0,
"b": 0,
"K": 0,
"k": 0,
"N": 0,
"n": 0,
"P": 0,
"p": 4167,
"q": 0,
"R": 0,
"r": 0
},
"q": {
"1": 0,
"B": 0,
"Q": 0,
"b": 0,
"K": 0,
"k": 0,
"N": 0,
"n": 0,
"P": 0,
"p": 0,
"q": 4000,
"R": 0,
"r": 0
},
"R": {
"1": 0,
"B": 0,
"Q": 0,
"b": 0,
"K": 0,
"k": 0,
"N": 0,
"n": 0,
"P": 0,
"p": 0,
"q": 0,
"R": 3999,
"r": 0
},
"r": {
"1": 0,
"B": 0,
"Q": 0,
"b": 0,
"K": 0,
"k": 0,
"N": 0,
"n": 0,
"P": 0,
"p": 0,
"q": 0,
"R": 0,
"r": 4040
}
}
}
The MIT license.