├── .gitattributes ├── .gitignore ├── .vscode ├── launch.json └── settings.json ├── Pipfile ├── Pipfile.lock ├── Procfile ├── README.md ├── data ├── Jupyter Notebook │ ├── .ipynb_checkpoints │ │ ├── Handwriting Recognition-checkpoint.ipynb │ │ └── Tutorial-checkpoint.ipynb │ ├── Handwriting Recognition.ipynb │ ├── logs │ │ ├── 1-conv-128-nodes-0-dense-1575819011 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575819012.Michaels-MacBook-Pro.local.4818.252.v2 │ │ │ │ ├── events.out.tfevents.1575819013.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_10-30-13 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575819102.Michaels-MacBook-Pro.local.4818.11500.v2 │ │ ├── 1-conv-128-nodes-1-dense-1575774492 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575774493.Michaels-MacBook-Pro.local.3516.643885.v2 │ │ │ │ ├── events.out.tfevents.1575774494.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_22-08-14 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575774622.Michaels-MacBook-Pro.local.3516.655214.v2 │ │ ├── 1-conv-128-nodes-2-dense-1575813727 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575813728.Michaels-MacBook-Pro.local.3516.1609991.v2 │ │ │ │ ├── events.out.tfevents.1575813729.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_09-02-09 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575813841.Michaels-MacBook-Pro.local.3516.1621401.v2 │ │ ├── 1-conv-32-nodes-0-dense-1575749178 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575749178.Michaels-MacBook-Pro.local.2905.252.v2 │ │ │ │ ├── events.out.tfevents.1575749180.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_15-06-20 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575749206.Michaels-MacBook-Pro.local.2905.11500.v2 │ │ ├── 1-conv-32-nodes-1-dense-1575770888 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575770889.Michaels-MacBook-Pro.local.3516.283.v2 │ │ │ │ ├── events.out.tfevents.1575770891.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_21-08-11 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575770919.Michaels-MacBook-Pro.local.3516.11612.v2 │ │ ├── 1-conv-32-nodes-2-dense-1575779542 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575779543.Michaels-MacBook-Pro.local.3516.965717.v2 │ │ │ │ ├── events.out.tfevents.1575779544.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_23-32-24 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575779569.Michaels-MacBook-Pro.local.3516.977127.v2 │ │ ├── 1-conv-64-nodes-0-dense-1575750304 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575750304.Michaels-MacBook-Pro.local.2905.321717.v2 │ │ │ │ ├── events.out.tfevents.1575750305.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_15-25-05 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575750356.Michaels-MacBook-Pro.local.2905.332965.v2 │ │ ├── 1-conv-64-nodes-1-dense-1575772003 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575772003.Michaels-MacBook-Pro.local.3516.322084.v2 │ │ │ │ ├── events.out.tfevents.1575772004.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_21-26-44 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575772056.Michaels-MacBook-Pro.local.3516.333413.v2 │ │ ├── 1-conv-64-nodes-2-dense-1575821991 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575821991.Michaels-MacBook-Pro.local.4929.314.v2 │ │ │ │ ├── events.out.tfevents.1575821993.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_11-19-53 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575822043.Michaels-MacBook-Pro.local.4929.11724.v2 │ │ ├── 2-conv-128-nodes-0-dense-1575820309 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575820310.Michaels-MacBook-Pro.local.4872.286.v2 │ │ │ │ ├── events.out.tfevents.1575820312.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_10-51-52 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575820471.Michaels-MacBook-Pro.local.4872.11624.v2 │ │ ├── 2-conv-128-nodes-1-dense-0.2-Dropout-1575824173 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575824174.Michaels-MacBook-Pro.local.4988.215033.v2 │ │ │ │ ├── events.out.tfevents.1575824175.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_11-56-15 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575824329.Michaels-MacBook-Pro.local.4988.226501.v2 │ │ ├── 2-conv-128-nodes-1-dense-1575775819 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575775820.Michaels-MacBook-Pro.local.3516.751062.v2 │ │ │ │ ├── events.out.tfevents.1575775821.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_22-30-21 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575776052.Michaels-MacBook-Pro.local.3516.762481.v2 │ │ ├── 2-conv-128-nodes-2-dense-0.2-Dropout-1575826996 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575826998.Michaels-MacBook-Pro.local.4988.537502.v2 │ │ │ │ ├── events.out.tfevents.1575826999.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_12-43-19 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575827149.Michaels-MacBook-Pro.local.4988.549100.v2 │ │ ├── 2-conv-128-nodes-2-dense-1575814862 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575814863.Michaels-MacBook-Pro.local.3516.1717280.v2 │ │ │ │ ├── events.out.tfevents.1575814864.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_09-21-04 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575815020.Michaels-MacBook-Pro.local.3516.1728780.v2 │ │ ├── 2-conv-256-nodes-1-dense-0.2-Dropout-1575829292 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575829293.Michaels-MacBook-Pro.local.5362.345.v2 │ │ │ │ ├── events.out.tfevents.1575829295.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_13-21-35 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575829818.Michaels-MacBook-Pro.local.5362.11813.v2 │ │ ├── 2-conv-256-nodes-2-dense-0.2-Dropout-1575855903 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575855903.Michaels-MacBook-Pro.local.7323.404.v2 │ │ │ │ ├── events.out.tfevents.1575855906.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_20-45-06 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575856379.Michaels-MacBook-Pro.local.7323.12002.v2 │ │ ├── 2-conv-32-nodes-0-dense-1575749454 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575749455.Michaels-MacBook-Pro.local.2905.107317.v2 │ │ │ │ ├── events.out.tfevents.1575749456.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_15-10-56 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575749497.Michaels-MacBook-Pro.local.2905.118655.v2 │ │ ├── 2-conv-32-nodes-1-dense-0.2-Dropout-1575822921 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575822922.Michaels-MacBook-Pro.local.4988.345.v2 │ │ │ │ ├── events.out.tfevents.1575822924.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_11-35-24 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575822963.Michaels-MacBook-Pro.local.4988.11813.v2 │ │ ├── 2-conv-32-nodes-1-dense-1575771145 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575771145.Michaels-MacBook-Pro.local.3516.107460.v2 │ │ │ │ ├── events.out.tfevents.1575771146.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_21-12-26 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575771187.Michaels-MacBook-Pro.local.3516.118879.v2 │ │ ├── 2-conv-32-nodes-2-dense-0.2-Dropout-1575825748 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575825748.Michaels-MacBook-Pro.local.4988.322436.v2 │ │ │ │ ├── events.out.tfevents.1575825750.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_12-22-30 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575825789.Michaels-MacBook-Pro.local.4988.334034.v2 │ │ ├── 2-conv-32-nodes-2-dense-1575779787 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575779788.Michaels-MacBook-Pro.local.3516.1073006.v2 │ │ │ │ ├── events.out.tfevents.1575779789.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_23-36-29 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575779826.Michaels-MacBook-Pro.local.3516.1084506.v2 │ │ ├── 2-conv-64-nodes-0-dense-1575750805 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575750805.Michaels-MacBook-Pro.local.2905.428782.v2 │ │ │ │ ├── events.out.tfevents.1575750807.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_15-33-27 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575750880.Michaels-MacBook-Pro.local.2905.440120.v2 │ │ ├── 2-conv-64-nodes-1-dense-0.2-Dropout-1575823299 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575823300.Michaels-MacBook-Pro.local.4988.107689.v2 │ │ │ │ ├── events.out.tfevents.1575823301.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_11-41-41 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575823382.Michaels-MacBook-Pro.local.4988.119157.v2 │ │ ├── 2-conv-64-nodes-1-dense-1575772553 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575772554.Michaels-MacBook-Pro.local.3516.429261.v2 │ │ │ │ ├── events.out.tfevents.1575772555.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_21-35-55 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575772653.Michaels-MacBook-Pro.local.3516.440680.v2 │ │ ├── 2-conv-64-nodes-2-dense-0.2-Dropout-1575826135 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575826135.Michaels-MacBook-Pro.local.4988.429969.v2 │ │ │ │ ├── events.out.tfevents.1575826136.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_12-28-56 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575826222.Michaels-MacBook-Pro.local.4988.441567.v2 │ │ ├── 2-conv-64-nodes-2-dense-1575812048 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575812049.Michaels-MacBook-Pro.local.3516.1395143.v2 │ │ │ │ ├── events.out.tfevents.1575812050.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_08-34-10 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575812135.Michaels-MacBook-Pro.local.3516.1406643.v2 │ │ ├── 3-conv-128-nodes-0-dense-1575768786 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575768786.Michaels-MacBook-Pro.local.2905.857436.v2 │ │ │ │ ├── events.out.tfevents.1575768788.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_20-33-08 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575768972.Michaels-MacBook-Pro.local.2905.868864.v2 │ │ ├── 3-conv-128-nodes-1-dense-1575777709 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575777709.Michaels-MacBook-Pro.local.3516.858363.v2 │ │ │ │ ├── events.out.tfevents.1575777711.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_23-01-51 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575777904.Michaels-MacBook-Pro.local.3516.869872.v2 │ │ ├── 3-conv-128-nodes-2-dense-1575816444 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575816444.Michaels-MacBook-Pro.local.3516.1824693.v2 │ │ │ │ ├── events.out.tfevents.1575816446.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-08_09-47-26 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575816622.Michaels-MacBook-Pro.local.3516.1836283.v2 │ │ ├── 3-conv-32-nodes-0-dense-1575749879 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575749879.Michaels-MacBook-Pro.local.2905.214506.v2 │ │ │ │ ├── events.out.tfevents.1575749880.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_15-18-00 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575749919.Michaels-MacBook-Pro.local.2905.225934.v2 │ │ ├── 3-conv-32-nodes-1-dense-1575771565 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575771566.Michaels-MacBook-Pro.local.3516.214761.v2 │ │ │ │ ├── events.out.tfevents.1575771567.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_21-19-27 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575771611.Michaels-MacBook-Pro.local.3516.226270.v2 │ │ ├── 3-conv-32-nodes-2-dense-1575780295 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575780296.Michaels-MacBook-Pro.local.3516.1180419.v2 │ │ │ │ ├── events.out.tfevents.1575780298.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_23-44-58 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575780364.Michaels-MacBook-Pro.local.3516.1192009.v2 │ │ ├── 3-conv-64-nodes-0-dense-1575751604 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575751605.Michaels-MacBook-Pro.local.2905.535971.v2 │ │ │ │ ├── events.out.tfevents.1575751606.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_15-46-46 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575751694.Michaels-MacBook-Pro.local.2905.547399.v2 │ │ ├── 3-conv-64-nodes-1-dense-1575773541 │ │ │ ├── train │ │ │ │ ├── events.out.tfevents.1575773542.Michaels-MacBook-Pro.local.3516.536562.v2 │ │ │ │ ├── events.out.tfevents.1575773543.Michaels-MacBook-Pro.local.profile-empty │ │ │ │ └── plugins │ │ │ │ │ └── profile │ │ │ │ │ └── 2019-12-07_21-52-23 │ │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ │ └── events.out.tfevents.1575773635.Michaels-MacBook-Pro.local.3516.548071.v2 │ │ └── 3-conv-64-nodes-2-dense-1575812895 │ │ │ ├── train │ │ │ ├── events.out.tfevents.1575812896.Michaels-MacBook-Pro.local.3516.1502556.v2 │ │ │ ├── events.out.tfevents.1575812897.Michaels-MacBook-Pro.local.profile-empty │ │ │ └── plugins │ │ │ │ └── profile │ │ │ │ └── 2019-12-08_08-48-17 │ │ │ │ └── local.trace │ │ │ └── validation │ │ │ └── events.out.tfevents.1575812980.Michaels-MacBook-Pro.local.3516.1514146.v2 │ ├── results │ │ ├── 5-large-models-result-under-hood.png │ │ └── 5-large-models-result.png │ └── tensorboard-images │ │ ├── first-run-acc.png │ │ ├── first-run-bad-acc.png │ │ ├── first-run-bad-loss.png │ │ ├── first-run-good-acc.png │ │ ├── first-run-good-loss.png │ │ ├── first-run-loss.png │ │ ├── second-run-acc.png │ │ ├── second-run-loss.png │ │ ├── third-run-acc.png │ │ └── third-run-loss.png ├── final-model.png ├── hey-there-prediction.gif ├── model development │ ├── final_model_1.py │ ├── final_model_2.py │ ├── model_permutations_1.py │ ├── model_permutations_2.py │ └── model_permutations_3.py └── screenshot.png ├── db.sqlite3 ├── handwriting ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-36.pyc │ ├── admin.cpython-36.pyc │ ├── models.cpython-36.pyc │ ├── serializers.cpython-36.pyc │ ├── urls.cpython-36.pyc │ └── views.cpython-36.pyc ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_delete_post.py │ ├── 0003_post.py │ ├── 0004_delete_post.py │ ├── __init__.py │ └── __pycache__ │ │ ├── 0001_initial.cpython-36.pyc │ │ ├── 0002_delete_post.cpython-36.pyc │ │ ├── 0003_post.cpython-36.pyc │ │ ├── 0004_delete_post.cpython-36.pyc │ │ └── __init__.cpython-36.pyc ├── models.py ├── testImage.png ├── tests.py ├── urls.py ├── utils │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ ├── center_image.cpython-36.pyc │ │ ├── cut_pictures.cpython-36.pyc │ │ ├── pad_image.cpython-36.pyc │ │ └── predictions.cpython-36.pyc │ ├── center_image.py │ ├── cut_pictures.py │ ├── models │ │ ├── model_1.h5 │ │ ├── model_2.h5 │ │ ├── model_3.h5 │ │ ├── model_4.h5 │ │ └── model_5.h5 │ └── pad_image.py └── views.py ├── handwritingrecognition ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-36.pyc │ ├── __init__.cpython-37.pyc │ ├── settings.cpython-36.pyc │ ├── settings.cpython-37.pyc │ ├── urls.cpython-36.pyc │ ├── wsgi.cpython-36.pyc │ └── wsgi.cpython-37.pyc ├── settings.py ├── urls.py └── wsgi.py ├── manage.py ├── model_3.h5 ├── package.json ├── public ├── favicon.ico ├── index.html ├── manifest.json └── robots.txt ├── requirements.txt ├── runtime.txt ├── src ├── App.css ├── App.js ├── App.test.js ├── components │ ├── Canvas │ │ ├── Canvas.css │ │ ├── Canvas.js │ │ └── testImage.png │ ├── Instructions │ │ ├── Instructions.css │ │ └── Instructions.js │ └── Title │ │ ├── Title.css │ │ └── Title.js ├── images │ ├── github-icon.png │ ├── minus_circle.svg │ ├── plus_circle.svg │ ├── title-image.png │ ├── trash_icon.svg │ ├── tutorial │ │ ├── canvas-writing.png │ │ ├── casing-caveat.png │ │ ├── casing-example.png │ │ ├── horizontal-interference-1.png │ │ ├── horizontal-interference-2.png │ │ ├── horizontal-interference-3.png │ │ └── spacing-example.png │ └── undo_icon.svg ├── index.css ├── index.js └── serviceWorker.js └── static └── handwritingrecognition ├── testImage.png └── user_image.png /.gitattributes: -------------------------------------------------------------------------------- 1 | *.ipynb linguist-vendored -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Python: Django", 9 | "type": "python", 10 | "request": "launch", 11 | "program": "${workspaceFolder}/manage.py", 12 | "args": [ 13 | "runserver", 14 | "--noreload" 15 | ], 16 | "django": true 17 | }, 18 | { 19 | "type": "node", 20 | "request": "attach", 21 | "name": "Attach by Process ID", 22 | "processId": "${command:PickProcess}", 23 | "skipFiles": [ 24 | "/**" 25 | ] 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.pythonPath": "/Users/michaelmccabe/.local/share/virtualenvs/handwriting-recognition-11MHVV4T/bin/python" 3 | } -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | name = "pypi" 3 | url = "https://pypi.org/simple" 4 | verify_ssl = true 5 | 6 | [dev-packages] 7 | 8 | [packages] 9 | dj-database-url = "==0.5.0" 10 | django-cors-headers = "==3.2.0" 11 | django-heroku = "==0.3.1" 12 | djangorestframework = "==3.10.3" 13 | gunicorn = "==20.0.0" 14 | psycopg2 = "==2.8.4" 15 | pytz = "==2019.3" 16 | sqlparse = "==0.3.0" 17 | whitenoise = "==4.1.4" 18 | Django = "==2.2.7" 19 | Pillow = "==6.2.1" 20 | matplotlib = "==3.1.1" 21 | opencv-python-headless = "==4.1.1.26" 22 | tensorflow = "==2.0.0b1" 23 | h5py = "==2.10.0" 24 | absl-py = "==0.8.1" 25 | astor = "==0.8.0" 26 | cachetools = "==3.1.1" 27 | certifi = "==2019.9.11" 28 | chardet = "==3.0.4" 29 | gast = "==0.2.2" 30 | google-auth = "==1.7.1" 31 | google-auth-oauthlib = "==0.4.1" 32 | google-pasta = "==0.1.8" 33 | grpcio = "==1.25.0" 34 | idna = "==2.8" 35 | kiwisolver = "==1.1.0" 36 | numpy = "==1.17.4" 37 | oauthlib = "==3.1.0" 38 | opt-einsum = "==3.1.0" 39 | protobuf = "==3.10.0" 40 | pyasn1 = "==0.4.8" 41 | pyasn1-modules = "==0.2.7" 42 | pyparsing = "==2.4.5" 43 | python-dateutil = "==2.8.1" 44 | requests = "==2.22.0" 45 | requests-oauthlib = "==1.3.0" 46 | requests-toolbelt = "==0.9.1" 47 | rsa = "==4.0" 48 | six = "==1.13.0" 49 | tensorboard = "==2.0.1" 50 | tensorflow-estimator = "==2.0.1" 51 | termcolor = "==1.1.0" 52 | typing = "==3.7.4.1" 53 | urllib3 = "==1.25.7" 54 | webencodings = "==0.5.1" 55 | werkzeug = "==0.16.0" 56 | wrapt = "==1.11.2" 57 | Cycler = "==0.10.0" 58 | Keras-Applications = "==1.0.8" 59 | Keras-Preprocessing = "==1.1.0" 60 | Markdown = "==3.1.1" 61 | SimpleWebSocketServer = "==0.1.1" 62 | websocket_client = "==0.56.0" 63 | 64 | [requires] 65 | python_version = "3.6" 66 | 67 | [pipenv] 68 | allow_prereleases = true 69 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | release: python manage.py migrate 2 | web: gunicorn handwritingrecognition.wsgi --log-file - -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Deep Learning Handwriting Recognition 2 | 3 | A full stack React/JavaScript and Python/Django web application that recognizes handwriting and converts it into text, by incorporating multiple machine learning models that were pre-trained using the [EMNIST Dataset](https://www.kaggle.com/crawford/emnist) on Kaggle. These neural network models recognize all digits, all uppercase letters, and all lowercase letters that are visibly different from their uppercase counterparts. 4 | 5 | The models were trained on the following characters: `0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabdefghnqrt` 6 | 7 | To account for these "left out" lowercase letters that look like their uppercase complement, the final prediction for these characters are converted into lowercase if the character is drawn less than half the height of the canvas. For "tall" versions of these lowercase characters, `klpy`, these characters will be converted into lowercase if their heights are less than 70% of the canvas height. 8 | 9 | The best independent model used inside of this application is more accurate than the rest of the models created by Kaggle users who use Tensorflow/Keras. To extend onto this - when this model, a similar model, and 3 other sub-optimal models (due to Heroku limitations) are combined, accuracy increases another `0.5%`. 10 | 11 | ## The Neural Network Models: Jupyter Notebook 12 | 13 | The [Jupyter Notebook](https://github.com/MikeM711/Deep-Learning-Handwriting-Recognition/blob/master/data/Jupyter%20Notebook/Handwriting%20Recognition.ipynb) inside this repo describes how the neural network models were created for this web application. It goes step by step: from acquiring the outside dataset for learning to Heroku deployment. 14 | 15 | ## Demo 16 | 17 | ![demo](https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/master/data/hey-there-prediction.gif) 18 | 19 | 20 | ## Features 21 | - The following characters can be predicted from handwriting: `0-9, a-z, A-Z` (62 characters) 22 | - Characters can be placed anywhere on the canvas, providing that the character has some horizontal space between other characters 23 | - Whole sentences can be created 24 | - "Broken" and "messy" letters can be detected with pretty good accuracy 25 | - React as the frontend 26 | 27 | Website: [Live Heroku App](https://handwriting-recognition-py-js.herokuapp.com/) 28 | 29 | 30 | 31 | ## How the Incoming Data is Fed Into The Models 32 | 1. Example: A user writes and submits the handwriting, "Hey you", on the client. 33 | 2. The frontend takes the image data found in the canvas element and converts it into a binary blob. 34 | 3. The blob is sent as a `POST` request to Django. 35 | 4. The image is saved in Django and the filepath is loaded into `cv2`. 36 | 5. The entire "Hey you" image is trimmed of excess pixels. 37 | 6. "Hey you" is cut up on each character giving us the 6 images "H", "e", "y", "y", "o", "u". 38 | * Images are cut up where drawing lines in the x-direction are not continuous, and where the space of discontinuity is of a decent size. Small discontinuous spaces are left alone. 39 | * The algorithm will notice a very large discontinuous space in the x-direction between the two "y" letters, which is implied to be a text-space. We will store this knowledge in the variable `space_location`. 40 | 7. Each image is trimmed of excess pixels. The height of each "raw" image is accounted for in the variable `char_img_heights`. 41 | 8. Each image is padded with extra pixels in a way where the image becomes a square shape. This is so that the image will not be warped when the image is resized down during data normalization. 42 | 9. Each image is normalized. Each image is converted to a numpy array, reshaped, and the pixel values range from 0 to 1 instead of 0 to 255. 43 | 10. We loop through all of these images - each model makes a prediction at each image. The most popular prediction between the models will be added to the final character result, `final_prediction`. 44 | * Each model prediction for each image will be an output of a number between `0` through `46` which corresponds to the index of the 47 characters that each model was trained on. (Ex: an output of `17` corresponds to `H` in the mapping). 45 | * The prediction of each model is mapped and compared with the model group. 46 | * The most popular prediction between the models in the group will be the final prediction. 47 | * If the final prediction between the models is alphabetical, we make sure that the lowercase compliment is found inside of the mapping. If it is not, that means we have a letter where the lower and uppercase are similar, the only difference is the size. We need to make a decision on the output casing based on the size of the image, which we get from `char_img_heights`. This decision will be performed on the images "y", "y", "o" and "u". The letter "y" gets a special constraint because its height is larger than the average lowercase letter. 48 | * While iterating, if the number of loop iterations equals a number inside `space_location`, a `" "` is appended to the final result. In this example, `space_location` will have `[2]` signaling that there's a space after "y" - which will give us a `"Hey "` at the end of the first "y" iteration. 49 | 11. Django responds with `final_prediction` to React with `"Hey you"`, and React displays the result on the client. 50 | 51 | ## My Views on Hard-Coded Prediction Tweaks 52 | 53 | After a prediction has been decided by the neural network, I personally try to be as hands-off as possible when it comes to manipulating these results. 54 | 55 | The current prediction manipulations I use are: 56 | 57 | 1. Convert characters to lowercase if a letter is both small, and the lowercase complement of the prediction is not found in the EMNIST dataset. 58 | * The reason for this manipulation is to have access to all lowercase letters as predictions. 59 | 2. If a prediction is `0` and the character is drawn quite small, the prediction is manipulated to a lowercase `o` 60 | * The reason for this manipulation is so that a small `0` will be read as an `o`, much like the manipulation of uppercase `O` 61 | * At this time, I am still hesitant on keeping this manipulation. 62 | 63 | ### If Manipulations Are Your Thing 64 | 65 | I left in commented code where, if either characters `0` or `O` were predicted, the final prediction is dependent on the ratio of height/width of the character image. If a user writes a fat circle, the result will be a capital or lowercase `O`; if a user writes a narrow circle, the result will be the number `0`. 66 | 67 | For determining "i" vs "I" (another issue with the EMNIST dataset), one could cook up some code during the `cv` portion and determine if a character has a hovering dot. One could do a better height estimate for casing by taking the total character height and negating the space between the dot and the base of the "i". 68 | 69 | ## Installation 70 | 71 | 1. Clone the repo: `git clone https://github.com/MikeM711/Deep-Learning-Handwriting-Recognition.git` 72 | 2. Go into the root file: `cd Deep-Learning-Handwriting-Recognition` 73 | 3. Install npm packages for React: `npm install` 74 | 4. Make sure you have pipenv installed via pip: `sudo -H pip install pipenv` 75 | 5. Create a shell inside a virtual environment, at the address of your root: `pipenv shell` 76 | 6. Install packages for Django while inside your virtual environment: `pip install -r requirements.txt` 77 | 7. Run the frontend server: `npm start` 78 | 8. Run backend server within your virtual environment: `python manage.py runserver` 79 | 80 | **Toubleshooting** 81 | - Q: "How do I know that I am in my virtual environment?" 82 | - A: In your terminal tab, you will notice that the address of the folder is in parenthesis. It should look like `(Deep-Learning-Handwriting-Recognition)...` -------------------------------------------------------------------------------- /data/Jupyter Notebook/.ipynb_checkpoints/Tutorial-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-0-dense-1575819011/train/events.out.tfevents.1575819012.Michaels-MacBook-Pro.local.4818.252.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-0-dense-1575819011/train/events.out.tfevents.1575819012.Michaels-MacBook-Pro.local.4818.252.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-0-dense-1575819011/train/events.out.tfevents.1575819013.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-0-dense-1575819011/train/events.out.tfevents.1575819013.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-0-dense-1575819011/train/plugins/profile/2019-12-08_10-30-13/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-0-dense-1575819011/train/plugins/profile/2019-12-08_10-30-13/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-0-dense-1575819011/validation/events.out.tfevents.1575819102.Michaels-MacBook-Pro.local.4818.11500.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-0-dense-1575819011/validation/events.out.tfevents.1575819102.Michaels-MacBook-Pro.local.4818.11500.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-1-dense-1575774492/train/events.out.tfevents.1575774493.Michaels-MacBook-Pro.local.3516.643885.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-1-dense-1575774492/train/events.out.tfevents.1575774493.Michaels-MacBook-Pro.local.3516.643885.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-1-dense-1575774492/train/events.out.tfevents.1575774494.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-1-dense-1575774492/train/events.out.tfevents.1575774494.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-1-dense-1575774492/train/plugins/profile/2019-12-07_22-08-14/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-1-dense-1575774492/train/plugins/profile/2019-12-07_22-08-14/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-1-dense-1575774492/validation/events.out.tfevents.1575774622.Michaels-MacBook-Pro.local.3516.655214.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-1-dense-1575774492/validation/events.out.tfevents.1575774622.Michaels-MacBook-Pro.local.3516.655214.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-2-dense-1575813727/train/events.out.tfevents.1575813728.Michaels-MacBook-Pro.local.3516.1609991.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-2-dense-1575813727/train/events.out.tfevents.1575813728.Michaels-MacBook-Pro.local.3516.1609991.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-2-dense-1575813727/train/events.out.tfevents.1575813729.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-2-dense-1575813727/train/events.out.tfevents.1575813729.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-2-dense-1575813727/train/plugins/profile/2019-12-08_09-02-09/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-2-dense-1575813727/train/plugins/profile/2019-12-08_09-02-09/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-128-nodes-2-dense-1575813727/validation/events.out.tfevents.1575813841.Michaels-MacBook-Pro.local.3516.1621401.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-128-nodes-2-dense-1575813727/validation/events.out.tfevents.1575813841.Michaels-MacBook-Pro.local.3516.1621401.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-0-dense-1575749178/train/events.out.tfevents.1575749178.Michaels-MacBook-Pro.local.2905.252.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-0-dense-1575749178/train/events.out.tfevents.1575749178.Michaels-MacBook-Pro.local.2905.252.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-0-dense-1575749178/train/events.out.tfevents.1575749180.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-0-dense-1575749178/train/events.out.tfevents.1575749180.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-0-dense-1575749178/train/plugins/profile/2019-12-07_15-06-20/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-0-dense-1575749178/train/plugins/profile/2019-12-07_15-06-20/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-0-dense-1575749178/validation/events.out.tfevents.1575749206.Michaels-MacBook-Pro.local.2905.11500.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-0-dense-1575749178/validation/events.out.tfevents.1575749206.Michaels-MacBook-Pro.local.2905.11500.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-1-dense-1575770888/train/events.out.tfevents.1575770889.Michaels-MacBook-Pro.local.3516.283.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-1-dense-1575770888/train/events.out.tfevents.1575770889.Michaels-MacBook-Pro.local.3516.283.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-1-dense-1575770888/train/events.out.tfevents.1575770891.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-1-dense-1575770888/train/events.out.tfevents.1575770891.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-1-dense-1575770888/train/plugins/profile/2019-12-07_21-08-11/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-1-dense-1575770888/train/plugins/profile/2019-12-07_21-08-11/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-1-dense-1575770888/validation/events.out.tfevents.1575770919.Michaels-MacBook-Pro.local.3516.11612.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-1-dense-1575770888/validation/events.out.tfevents.1575770919.Michaels-MacBook-Pro.local.3516.11612.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-2-dense-1575779542/train/events.out.tfevents.1575779543.Michaels-MacBook-Pro.local.3516.965717.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-2-dense-1575779542/train/events.out.tfevents.1575779543.Michaels-MacBook-Pro.local.3516.965717.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-2-dense-1575779542/train/events.out.tfevents.1575779544.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-2-dense-1575779542/train/events.out.tfevents.1575779544.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-2-dense-1575779542/train/plugins/profile/2019-12-07_23-32-24/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-2-dense-1575779542/train/plugins/profile/2019-12-07_23-32-24/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-32-nodes-2-dense-1575779542/validation/events.out.tfevents.1575779569.Michaels-MacBook-Pro.local.3516.977127.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-32-nodes-2-dense-1575779542/validation/events.out.tfevents.1575779569.Michaels-MacBook-Pro.local.3516.977127.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-0-dense-1575750304/train/events.out.tfevents.1575750304.Michaels-MacBook-Pro.local.2905.321717.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-0-dense-1575750304/train/events.out.tfevents.1575750304.Michaels-MacBook-Pro.local.2905.321717.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-0-dense-1575750304/train/events.out.tfevents.1575750305.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-0-dense-1575750304/train/events.out.tfevents.1575750305.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-0-dense-1575750304/train/plugins/profile/2019-12-07_15-25-05/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-0-dense-1575750304/train/plugins/profile/2019-12-07_15-25-05/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-0-dense-1575750304/validation/events.out.tfevents.1575750356.Michaels-MacBook-Pro.local.2905.332965.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-0-dense-1575750304/validation/events.out.tfevents.1575750356.Michaels-MacBook-Pro.local.2905.332965.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-1-dense-1575772003/train/events.out.tfevents.1575772003.Michaels-MacBook-Pro.local.3516.322084.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-1-dense-1575772003/train/events.out.tfevents.1575772003.Michaels-MacBook-Pro.local.3516.322084.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-1-dense-1575772003/train/events.out.tfevents.1575772004.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-1-dense-1575772003/train/events.out.tfevents.1575772004.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-1-dense-1575772003/train/plugins/profile/2019-12-07_21-26-44/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-1-dense-1575772003/train/plugins/profile/2019-12-07_21-26-44/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-1-dense-1575772003/validation/events.out.tfevents.1575772056.Michaels-MacBook-Pro.local.3516.333413.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-1-dense-1575772003/validation/events.out.tfevents.1575772056.Michaels-MacBook-Pro.local.3516.333413.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-2-dense-1575821991/train/events.out.tfevents.1575821991.Michaels-MacBook-Pro.local.4929.314.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-2-dense-1575821991/train/events.out.tfevents.1575821991.Michaels-MacBook-Pro.local.4929.314.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-2-dense-1575821991/train/events.out.tfevents.1575821993.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-2-dense-1575821991/train/events.out.tfevents.1575821993.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-2-dense-1575821991/train/plugins/profile/2019-12-08_11-19-53/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-2-dense-1575821991/train/plugins/profile/2019-12-08_11-19-53/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/1-conv-64-nodes-2-dense-1575821991/validation/events.out.tfevents.1575822043.Michaels-MacBook-Pro.local.4929.11724.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/1-conv-64-nodes-2-dense-1575821991/validation/events.out.tfevents.1575822043.Michaels-MacBook-Pro.local.4929.11724.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-0-dense-1575820309/train/events.out.tfevents.1575820310.Michaels-MacBook-Pro.local.4872.286.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-0-dense-1575820309/train/events.out.tfevents.1575820310.Michaels-MacBook-Pro.local.4872.286.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-0-dense-1575820309/train/events.out.tfevents.1575820312.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-0-dense-1575820309/train/events.out.tfevents.1575820312.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-0-dense-1575820309/train/plugins/profile/2019-12-08_10-51-52/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-0-dense-1575820309/train/plugins/profile/2019-12-08_10-51-52/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-0-dense-1575820309/validation/events.out.tfevents.1575820471.Michaels-MacBook-Pro.local.4872.11624.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-0-dense-1575820309/validation/events.out.tfevents.1575820471.Michaels-MacBook-Pro.local.4872.11624.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-0.2-Dropout-1575824173/train/events.out.tfevents.1575824174.Michaels-MacBook-Pro.local.4988.215033.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-0.2-Dropout-1575824173/train/events.out.tfevents.1575824174.Michaels-MacBook-Pro.local.4988.215033.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-0.2-Dropout-1575824173/train/events.out.tfevents.1575824175.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-0.2-Dropout-1575824173/train/events.out.tfevents.1575824175.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-0.2-Dropout-1575824173/train/plugins/profile/2019-12-08_11-56-15/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-0.2-Dropout-1575824173/train/plugins/profile/2019-12-08_11-56-15/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-0.2-Dropout-1575824173/validation/events.out.tfevents.1575824329.Michaels-MacBook-Pro.local.4988.226501.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-0.2-Dropout-1575824173/validation/events.out.tfevents.1575824329.Michaels-MacBook-Pro.local.4988.226501.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-1575775819/train/events.out.tfevents.1575775820.Michaels-MacBook-Pro.local.3516.751062.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-1575775819/train/events.out.tfevents.1575775820.Michaels-MacBook-Pro.local.3516.751062.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-1575775819/train/events.out.tfevents.1575775821.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-1575775819/train/events.out.tfevents.1575775821.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-1575775819/train/plugins/profile/2019-12-07_22-30-21/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-1575775819/train/plugins/profile/2019-12-07_22-30-21/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-1575775819/validation/events.out.tfevents.1575776052.Michaels-MacBook-Pro.local.3516.762481.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-1-dense-1575775819/validation/events.out.tfevents.1575776052.Michaels-MacBook-Pro.local.3516.762481.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-0.2-Dropout-1575826996/train/events.out.tfevents.1575826998.Michaels-MacBook-Pro.local.4988.537502.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-0.2-Dropout-1575826996/train/events.out.tfevents.1575826998.Michaels-MacBook-Pro.local.4988.537502.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-0.2-Dropout-1575826996/train/events.out.tfevents.1575826999.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-0.2-Dropout-1575826996/train/events.out.tfevents.1575826999.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-0.2-Dropout-1575826996/train/plugins/profile/2019-12-08_12-43-19/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-0.2-Dropout-1575826996/train/plugins/profile/2019-12-08_12-43-19/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-0.2-Dropout-1575826996/validation/events.out.tfevents.1575827149.Michaels-MacBook-Pro.local.4988.549100.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-0.2-Dropout-1575826996/validation/events.out.tfevents.1575827149.Michaels-MacBook-Pro.local.4988.549100.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-1575814862/train/events.out.tfevents.1575814863.Michaels-MacBook-Pro.local.3516.1717280.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-1575814862/train/events.out.tfevents.1575814863.Michaels-MacBook-Pro.local.3516.1717280.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-1575814862/train/events.out.tfevents.1575814864.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-1575814862/train/events.out.tfevents.1575814864.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-1575814862/train/plugins/profile/2019-12-08_09-21-04/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-1575814862/train/plugins/profile/2019-12-08_09-21-04/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-1575814862/validation/events.out.tfevents.1575815020.Michaels-MacBook-Pro.local.3516.1728780.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-128-nodes-2-dense-1575814862/validation/events.out.tfevents.1575815020.Michaels-MacBook-Pro.local.3516.1728780.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-256-nodes-1-dense-0.2-Dropout-1575829292/train/events.out.tfevents.1575829293.Michaels-MacBook-Pro.local.5362.345.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-256-nodes-1-dense-0.2-Dropout-1575829292/train/events.out.tfevents.1575829293.Michaels-MacBook-Pro.local.5362.345.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-256-nodes-1-dense-0.2-Dropout-1575829292/train/events.out.tfevents.1575829295.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-256-nodes-1-dense-0.2-Dropout-1575829292/train/events.out.tfevents.1575829295.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-256-nodes-1-dense-0.2-Dropout-1575829292/train/plugins/profile/2019-12-08_13-21-35/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-256-nodes-1-dense-0.2-Dropout-1575829292/train/plugins/profile/2019-12-08_13-21-35/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-256-nodes-1-dense-0.2-Dropout-1575829292/validation/events.out.tfevents.1575829818.Michaels-MacBook-Pro.local.5362.11813.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-256-nodes-1-dense-0.2-Dropout-1575829292/validation/events.out.tfevents.1575829818.Michaels-MacBook-Pro.local.5362.11813.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-256-nodes-2-dense-0.2-Dropout-1575855903/train/events.out.tfevents.1575855903.Michaels-MacBook-Pro.local.7323.404.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-256-nodes-2-dense-0.2-Dropout-1575855903/train/events.out.tfevents.1575855903.Michaels-MacBook-Pro.local.7323.404.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-256-nodes-2-dense-0.2-Dropout-1575855903/train/events.out.tfevents.1575855906.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-256-nodes-2-dense-0.2-Dropout-1575855903/train/events.out.tfevents.1575855906.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-256-nodes-2-dense-0.2-Dropout-1575855903/train/plugins/profile/2019-12-08_20-45-06/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-256-nodes-2-dense-0.2-Dropout-1575855903/train/plugins/profile/2019-12-08_20-45-06/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-256-nodes-2-dense-0.2-Dropout-1575855903/validation/events.out.tfevents.1575856379.Michaels-MacBook-Pro.local.7323.12002.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-256-nodes-2-dense-0.2-Dropout-1575855903/validation/events.out.tfevents.1575856379.Michaels-MacBook-Pro.local.7323.12002.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-0-dense-1575749454/train/events.out.tfevents.1575749455.Michaels-MacBook-Pro.local.2905.107317.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-0-dense-1575749454/train/events.out.tfevents.1575749455.Michaels-MacBook-Pro.local.2905.107317.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-0-dense-1575749454/train/events.out.tfevents.1575749456.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-0-dense-1575749454/train/events.out.tfevents.1575749456.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-0-dense-1575749454/train/plugins/profile/2019-12-07_15-10-56/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-0-dense-1575749454/train/plugins/profile/2019-12-07_15-10-56/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-0-dense-1575749454/validation/events.out.tfevents.1575749497.Michaels-MacBook-Pro.local.2905.118655.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-0-dense-1575749454/validation/events.out.tfevents.1575749497.Michaels-MacBook-Pro.local.2905.118655.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-0.2-Dropout-1575822921/train/events.out.tfevents.1575822922.Michaels-MacBook-Pro.local.4988.345.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-0.2-Dropout-1575822921/train/events.out.tfevents.1575822922.Michaels-MacBook-Pro.local.4988.345.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-0.2-Dropout-1575822921/train/events.out.tfevents.1575822924.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-0.2-Dropout-1575822921/train/events.out.tfevents.1575822924.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-0.2-Dropout-1575822921/train/plugins/profile/2019-12-08_11-35-24/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-0.2-Dropout-1575822921/train/plugins/profile/2019-12-08_11-35-24/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-0.2-Dropout-1575822921/validation/events.out.tfevents.1575822963.Michaels-MacBook-Pro.local.4988.11813.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-0.2-Dropout-1575822921/validation/events.out.tfevents.1575822963.Michaels-MacBook-Pro.local.4988.11813.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-1575771145/train/events.out.tfevents.1575771145.Michaels-MacBook-Pro.local.3516.107460.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-1575771145/train/events.out.tfevents.1575771145.Michaels-MacBook-Pro.local.3516.107460.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-1575771145/train/events.out.tfevents.1575771146.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-1575771145/train/events.out.tfevents.1575771146.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-1575771145/train/plugins/profile/2019-12-07_21-12-26/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-1575771145/train/plugins/profile/2019-12-07_21-12-26/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-1575771145/validation/events.out.tfevents.1575771187.Michaels-MacBook-Pro.local.3516.118879.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-1-dense-1575771145/validation/events.out.tfevents.1575771187.Michaels-MacBook-Pro.local.3516.118879.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-0.2-Dropout-1575825748/train/events.out.tfevents.1575825748.Michaels-MacBook-Pro.local.4988.322436.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-0.2-Dropout-1575825748/train/events.out.tfevents.1575825748.Michaels-MacBook-Pro.local.4988.322436.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-0.2-Dropout-1575825748/train/events.out.tfevents.1575825750.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-0.2-Dropout-1575825748/train/events.out.tfevents.1575825750.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-0.2-Dropout-1575825748/train/plugins/profile/2019-12-08_12-22-30/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-0.2-Dropout-1575825748/train/plugins/profile/2019-12-08_12-22-30/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-0.2-Dropout-1575825748/validation/events.out.tfevents.1575825789.Michaels-MacBook-Pro.local.4988.334034.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-0.2-Dropout-1575825748/validation/events.out.tfevents.1575825789.Michaels-MacBook-Pro.local.4988.334034.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-1575779787/train/events.out.tfevents.1575779788.Michaels-MacBook-Pro.local.3516.1073006.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-1575779787/train/events.out.tfevents.1575779788.Michaels-MacBook-Pro.local.3516.1073006.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-1575779787/train/events.out.tfevents.1575779789.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-1575779787/train/events.out.tfevents.1575779789.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-1575779787/train/plugins/profile/2019-12-07_23-36-29/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-1575779787/train/plugins/profile/2019-12-07_23-36-29/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-1575779787/validation/events.out.tfevents.1575779826.Michaels-MacBook-Pro.local.3516.1084506.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-32-nodes-2-dense-1575779787/validation/events.out.tfevents.1575779826.Michaels-MacBook-Pro.local.3516.1084506.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-0-dense-1575750805/train/events.out.tfevents.1575750805.Michaels-MacBook-Pro.local.2905.428782.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-0-dense-1575750805/train/events.out.tfevents.1575750805.Michaels-MacBook-Pro.local.2905.428782.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-0-dense-1575750805/train/events.out.tfevents.1575750807.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-0-dense-1575750805/train/events.out.tfevents.1575750807.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-0-dense-1575750805/train/plugins/profile/2019-12-07_15-33-27/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-0-dense-1575750805/train/plugins/profile/2019-12-07_15-33-27/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-0-dense-1575750805/validation/events.out.tfevents.1575750880.Michaels-MacBook-Pro.local.2905.440120.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-0-dense-1575750805/validation/events.out.tfevents.1575750880.Michaels-MacBook-Pro.local.2905.440120.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-0.2-Dropout-1575823299/train/events.out.tfevents.1575823300.Michaels-MacBook-Pro.local.4988.107689.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-0.2-Dropout-1575823299/train/events.out.tfevents.1575823300.Michaels-MacBook-Pro.local.4988.107689.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-0.2-Dropout-1575823299/train/events.out.tfevents.1575823301.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-0.2-Dropout-1575823299/train/events.out.tfevents.1575823301.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-0.2-Dropout-1575823299/train/plugins/profile/2019-12-08_11-41-41/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-0.2-Dropout-1575823299/train/plugins/profile/2019-12-08_11-41-41/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-0.2-Dropout-1575823299/validation/events.out.tfevents.1575823382.Michaels-MacBook-Pro.local.4988.119157.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-0.2-Dropout-1575823299/validation/events.out.tfevents.1575823382.Michaels-MacBook-Pro.local.4988.119157.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-1575772553/train/events.out.tfevents.1575772554.Michaels-MacBook-Pro.local.3516.429261.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-1575772553/train/events.out.tfevents.1575772554.Michaels-MacBook-Pro.local.3516.429261.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-1575772553/train/events.out.tfevents.1575772555.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-1575772553/train/events.out.tfevents.1575772555.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-1575772553/train/plugins/profile/2019-12-07_21-35-55/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-1575772553/train/plugins/profile/2019-12-07_21-35-55/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-1575772553/validation/events.out.tfevents.1575772653.Michaels-MacBook-Pro.local.3516.440680.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-1-dense-1575772553/validation/events.out.tfevents.1575772653.Michaels-MacBook-Pro.local.3516.440680.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-0.2-Dropout-1575826135/train/events.out.tfevents.1575826135.Michaels-MacBook-Pro.local.4988.429969.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-0.2-Dropout-1575826135/train/events.out.tfevents.1575826135.Michaels-MacBook-Pro.local.4988.429969.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-0.2-Dropout-1575826135/train/events.out.tfevents.1575826136.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-0.2-Dropout-1575826135/train/events.out.tfevents.1575826136.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-0.2-Dropout-1575826135/train/plugins/profile/2019-12-08_12-28-56/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-0.2-Dropout-1575826135/train/plugins/profile/2019-12-08_12-28-56/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-0.2-Dropout-1575826135/validation/events.out.tfevents.1575826222.Michaels-MacBook-Pro.local.4988.441567.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-0.2-Dropout-1575826135/validation/events.out.tfevents.1575826222.Michaels-MacBook-Pro.local.4988.441567.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-1575812048/train/events.out.tfevents.1575812049.Michaels-MacBook-Pro.local.3516.1395143.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-1575812048/train/events.out.tfevents.1575812049.Michaels-MacBook-Pro.local.3516.1395143.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-1575812048/train/events.out.tfevents.1575812050.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-1575812048/train/events.out.tfevents.1575812050.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-1575812048/train/plugins/profile/2019-12-08_08-34-10/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-1575812048/train/plugins/profile/2019-12-08_08-34-10/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-1575812048/validation/events.out.tfevents.1575812135.Michaels-MacBook-Pro.local.3516.1406643.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/2-conv-64-nodes-2-dense-1575812048/validation/events.out.tfevents.1575812135.Michaels-MacBook-Pro.local.3516.1406643.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-0-dense-1575768786/train/events.out.tfevents.1575768786.Michaels-MacBook-Pro.local.2905.857436.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-0-dense-1575768786/train/events.out.tfevents.1575768786.Michaels-MacBook-Pro.local.2905.857436.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-0-dense-1575768786/train/events.out.tfevents.1575768788.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-0-dense-1575768786/train/events.out.tfevents.1575768788.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-0-dense-1575768786/train/plugins/profile/2019-12-07_20-33-08/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-0-dense-1575768786/train/plugins/profile/2019-12-07_20-33-08/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-0-dense-1575768786/validation/events.out.tfevents.1575768972.Michaels-MacBook-Pro.local.2905.868864.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-0-dense-1575768786/validation/events.out.tfevents.1575768972.Michaels-MacBook-Pro.local.2905.868864.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-1-dense-1575777709/train/events.out.tfevents.1575777709.Michaels-MacBook-Pro.local.3516.858363.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-1-dense-1575777709/train/events.out.tfevents.1575777709.Michaels-MacBook-Pro.local.3516.858363.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-1-dense-1575777709/train/events.out.tfevents.1575777711.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-1-dense-1575777709/train/events.out.tfevents.1575777711.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-1-dense-1575777709/train/plugins/profile/2019-12-07_23-01-51/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-1-dense-1575777709/train/plugins/profile/2019-12-07_23-01-51/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-1-dense-1575777709/validation/events.out.tfevents.1575777904.Michaels-MacBook-Pro.local.3516.869872.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-1-dense-1575777709/validation/events.out.tfevents.1575777904.Michaels-MacBook-Pro.local.3516.869872.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-2-dense-1575816444/train/events.out.tfevents.1575816444.Michaels-MacBook-Pro.local.3516.1824693.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-2-dense-1575816444/train/events.out.tfevents.1575816444.Michaels-MacBook-Pro.local.3516.1824693.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-2-dense-1575816444/train/events.out.tfevents.1575816446.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-2-dense-1575816444/train/events.out.tfevents.1575816446.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-2-dense-1575816444/train/plugins/profile/2019-12-08_09-47-26/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-2-dense-1575816444/train/plugins/profile/2019-12-08_09-47-26/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-128-nodes-2-dense-1575816444/validation/events.out.tfevents.1575816622.Michaels-MacBook-Pro.local.3516.1836283.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-128-nodes-2-dense-1575816444/validation/events.out.tfevents.1575816622.Michaels-MacBook-Pro.local.3516.1836283.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-0-dense-1575749879/train/events.out.tfevents.1575749879.Michaels-MacBook-Pro.local.2905.214506.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-0-dense-1575749879/train/events.out.tfevents.1575749879.Michaels-MacBook-Pro.local.2905.214506.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-0-dense-1575749879/train/events.out.tfevents.1575749880.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-0-dense-1575749879/train/events.out.tfevents.1575749880.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-0-dense-1575749879/train/plugins/profile/2019-12-07_15-18-00/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-0-dense-1575749879/train/plugins/profile/2019-12-07_15-18-00/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-0-dense-1575749879/validation/events.out.tfevents.1575749919.Michaels-MacBook-Pro.local.2905.225934.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-0-dense-1575749879/validation/events.out.tfevents.1575749919.Michaels-MacBook-Pro.local.2905.225934.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-1-dense-1575771565/train/events.out.tfevents.1575771566.Michaels-MacBook-Pro.local.3516.214761.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-1-dense-1575771565/train/events.out.tfevents.1575771566.Michaels-MacBook-Pro.local.3516.214761.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-1-dense-1575771565/train/events.out.tfevents.1575771567.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-1-dense-1575771565/train/events.out.tfevents.1575771567.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-1-dense-1575771565/train/plugins/profile/2019-12-07_21-19-27/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-1-dense-1575771565/train/plugins/profile/2019-12-07_21-19-27/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-1-dense-1575771565/validation/events.out.tfevents.1575771611.Michaels-MacBook-Pro.local.3516.226270.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-1-dense-1575771565/validation/events.out.tfevents.1575771611.Michaels-MacBook-Pro.local.3516.226270.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-2-dense-1575780295/train/events.out.tfevents.1575780296.Michaels-MacBook-Pro.local.3516.1180419.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-2-dense-1575780295/train/events.out.tfevents.1575780296.Michaels-MacBook-Pro.local.3516.1180419.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-2-dense-1575780295/train/events.out.tfevents.1575780298.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-2-dense-1575780295/train/events.out.tfevents.1575780298.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-2-dense-1575780295/train/plugins/profile/2019-12-07_23-44-58/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-2-dense-1575780295/train/plugins/profile/2019-12-07_23-44-58/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-32-nodes-2-dense-1575780295/validation/events.out.tfevents.1575780364.Michaels-MacBook-Pro.local.3516.1192009.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-32-nodes-2-dense-1575780295/validation/events.out.tfevents.1575780364.Michaels-MacBook-Pro.local.3516.1192009.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-0-dense-1575751604/train/events.out.tfevents.1575751605.Michaels-MacBook-Pro.local.2905.535971.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-0-dense-1575751604/train/events.out.tfevents.1575751605.Michaels-MacBook-Pro.local.2905.535971.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-0-dense-1575751604/train/events.out.tfevents.1575751606.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-0-dense-1575751604/train/events.out.tfevents.1575751606.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-0-dense-1575751604/train/plugins/profile/2019-12-07_15-46-46/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-0-dense-1575751604/train/plugins/profile/2019-12-07_15-46-46/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-0-dense-1575751604/validation/events.out.tfevents.1575751694.Michaels-MacBook-Pro.local.2905.547399.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-0-dense-1575751604/validation/events.out.tfevents.1575751694.Michaels-MacBook-Pro.local.2905.547399.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-1-dense-1575773541/train/events.out.tfevents.1575773542.Michaels-MacBook-Pro.local.3516.536562.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-1-dense-1575773541/train/events.out.tfevents.1575773542.Michaels-MacBook-Pro.local.3516.536562.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-1-dense-1575773541/train/events.out.tfevents.1575773543.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-1-dense-1575773541/train/events.out.tfevents.1575773543.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-1-dense-1575773541/train/plugins/profile/2019-12-07_21-52-23/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-1-dense-1575773541/train/plugins/profile/2019-12-07_21-52-23/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-1-dense-1575773541/validation/events.out.tfevents.1575773635.Michaels-MacBook-Pro.local.3516.548071.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-1-dense-1575773541/validation/events.out.tfevents.1575773635.Michaels-MacBook-Pro.local.3516.548071.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-2-dense-1575812895/train/events.out.tfevents.1575812896.Michaels-MacBook-Pro.local.3516.1502556.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-2-dense-1575812895/train/events.out.tfevents.1575812896.Michaels-MacBook-Pro.local.3516.1502556.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-2-dense-1575812895/train/events.out.tfevents.1575812897.Michaels-MacBook-Pro.local.profile-empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-2-dense-1575812895/train/events.out.tfevents.1575812897.Michaels-MacBook-Pro.local.profile-empty -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-2-dense-1575812895/train/plugins/profile/2019-12-08_08-48-17/local.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-2-dense-1575812895/train/plugins/profile/2019-12-08_08-48-17/local.trace -------------------------------------------------------------------------------- /data/Jupyter Notebook/logs/3-conv-64-nodes-2-dense-1575812895/validation/events.out.tfevents.1575812980.Michaels-MacBook-Pro.local.3516.1514146.v2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/logs/3-conv-64-nodes-2-dense-1575812895/validation/events.out.tfevents.1575812980.Michaels-MacBook-Pro.local.3516.1514146.v2 -------------------------------------------------------------------------------- /data/Jupyter Notebook/results/5-large-models-result-under-hood.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/results/5-large-models-result-under-hood.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/results/5-large-models-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/results/5-large-models-result.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/first-run-acc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/first-run-acc.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/first-run-bad-acc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/first-run-bad-acc.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/first-run-bad-loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/first-run-bad-loss.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/first-run-good-acc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/first-run-good-acc.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/first-run-good-loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/first-run-good-loss.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/first-run-loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/first-run-loss.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/second-run-acc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/second-run-acc.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/second-run-loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/second-run-loss.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/third-run-acc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/third-run-acc.png -------------------------------------------------------------------------------- /data/Jupyter Notebook/tensorboard-images/third-run-loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/Jupyter Notebook/tensorboard-images/third-run-loss.png -------------------------------------------------------------------------------- /data/final-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/final-model.png -------------------------------------------------------------------------------- /data/hey-there-prediction.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/hey-there-prediction.gif -------------------------------------------------------------------------------- /data/model development/final_model_1.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | from tensorflow.keras.models import Sequential 3 | from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten 4 | from tensorflow.keras.layers import Conv2D, MaxPooling2D 5 | from tensorflow.keras.callbacks import TensorBoard 6 | from tensorflow.keras.callbacks import TensorBoard 7 | from sklearn.model_selection import train_test_split 8 | import pickle 9 | import time 10 | 11 | # Constants 12 | HEIGHT = 28 13 | WIDTH = 28 14 | class_num = 47 15 | 16 | train_x = pickle.load(open("train_x.pickle", "rb")) 17 | train_y = pickle.load(open("train_y.pickle", "rb")) 18 | 19 | test_x = pickle.load(open("test_x.pickle", "rb")) 20 | test_y = pickle.load(open("test_y.pickle", "rb")) 21 | 22 | print(test_x.shape) 23 | 24 | # partition to train and val 25 | train_x, val_x, train_y, val_y = train_test_split( 26 | train_x, train_y, test_size=0.10, random_state=7) 27 | 28 | # The final model: 2-conv-128-nodes-2-dense-0.2-Dropout 29 | dense_layers = [2] 30 | layer_sizes = [128] 31 | conv_layers = [2] 32 | 33 | for dense_layer in dense_layers: 34 | for layer_size in layer_sizes: 35 | for conv_layer in conv_layers: 36 | NAME = "Final:{}-conv-{}-nodes-{}-dense-0.2-Dropout-{}".format( 37 | conv_layer, layer_size, dense_layer, int(time.time())) 38 | 39 | # initialize TensorBoard in the loop 40 | tensorboard = TensorBoard(log_dir='logs/{}'.format(NAME)) 41 | print(NAME) # Final:2-conv-128-nodes-2-dense-0.2-Dropout 42 | 43 | # Build the model 44 | model = Sequential() 45 | 46 | # Begin with Conv2D layer 47 | model.add(Conv2D(layer_size, (3, 3), input_shape=(HEIGHT, WIDTH, 1))) 48 | model.add(Activation('relu')) 49 | model.add(MaxPooling2D(pool_size=(2, 2))) 50 | 51 | for l in range(conv_layer - 1): 52 | # Extra Conv2D layers 53 | model.add(Conv2D(layer_size, (3, 3))) 54 | model.add(Activation('relu')) 55 | model.add(MaxPooling2D(pool_size=(2, 2))) 56 | 57 | model.add(Flatten()) 58 | 59 | for l in range(dense_layer): 60 | # Adding dense layers 61 | model.add(Dense(layer_size)) 62 | model.add(Activation('relu')) 63 | model.add(Dropout(0.2)) 64 | 65 | # Output layer 66 | model.add(Dense(units=class_num, activation='softmax')) 67 | 68 | # Train the model 69 | model.compile(optimizer='adam', 70 | loss='categorical_crossentropy', 71 | metrics=['accuracy']) 72 | 73 | model.fit(train_x, train_y, epochs=10, batch_size=32, 74 | validation_data=(val_x, val_y), 75 | callbacks=[tensorboard]) 76 | 77 | model.save('model.h5') 78 | -------------------------------------------------------------------------------- /data/model development/final_model_2.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | from tensorflow.keras.models import Sequential 3 | from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten 4 | from tensorflow.keras.layers import Conv2D, MaxPooling2D 5 | from tensorflow.keras.callbacks import TensorBoard 6 | from tensorflow.keras.callbacks import TensorBoard 7 | from sklearn.model_selection import train_test_split 8 | import pickle 9 | import time 10 | 11 | # Constants 12 | HEIGHT = 28 13 | WIDTH = 28 14 | class_num = 47 15 | 16 | train_x = pickle.load(open("train_x.pickle", "rb")) 17 | train_y = pickle.load(open("train_y.pickle", "rb")) 18 | 19 | test_x = pickle.load(open("test_x.pickle", "rb")) 20 | test_y = pickle.load(open("test_y.pickle", "rb")) 21 | 22 | print(test_x.shape) 23 | 24 | # partition to train and val 25 | train_x, val_x, train_y, val_y = train_test_split( 26 | train_x, train_y, test_size=0.10, random_state=7) 27 | 28 | # The final model: 2-conv-64-nodes-2-dense-0.2-Dropout 29 | dense_layers = [2] 30 | layer_sizes = [64] 31 | conv_layers = [2] 32 | 33 | for dense_layer in dense_layers: 34 | for layer_size in layer_sizes: 35 | for conv_layer in conv_layers: 36 | NAME = "Final:{}-conv-{}-nodes-{}-dense-0.2-Dropout-{}".format( 37 | conv_layer, layer_size, dense_layer, int(time.time())) 38 | 39 | # initialize TensorBoard in the loop 40 | tensorboard = TensorBoard(log_dir='logs/{}'.format(NAME)) 41 | print(NAME) # Final:2-conv-128-nodes-2-dense-0.2-Dropout 42 | 43 | # Build the model 44 | model = Sequential() 45 | 46 | # Begin with Conv2D layer 47 | model.add(Conv2D(layer_size, (3, 3), input_shape=(HEIGHT, WIDTH, 1))) 48 | model.add(Activation('relu')) 49 | model.add(MaxPooling2D(pool_size=(2, 2))) 50 | 51 | for l in range(conv_layer - 1): 52 | # Extra Conv2D layers 53 | model.add(Conv2D(layer_size, (3, 3))) 54 | model.add(Activation('relu')) 55 | model.add(MaxPooling2D(pool_size=(2, 2))) 56 | 57 | model.add(Flatten()) 58 | 59 | for l in range(dense_layer): 60 | # Adding dense layers 61 | model.add(Dense(layer_size)) 62 | model.add(Activation('relu')) 63 | model.add(Dropout(0.2)) 64 | 65 | # Output layer 66 | model.add(Dense(units=class_num, activation='softmax')) 67 | 68 | # Train the model 69 | model.compile(optimizer='adam', 70 | loss='categorical_crossentropy', 71 | metrics=['accuracy']) 72 | 73 | model.fit(train_x, train_y, epochs=10, batch_size=32, 74 | validation_data=(val_x, val_y), 75 | callbacks=[tensorboard]) 76 | 77 | model.save('model.h5') 78 | -------------------------------------------------------------------------------- /data/model development/model_permutations_1.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | from tensorflow.keras.models import Sequential 3 | from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten 4 | from tensorflow.keras.layers import Conv2D, MaxPooling2D 5 | from tensorflow.keras.callbacks import TensorBoard 6 | from sklearn.model_selection import train_test_split 7 | import pickle 8 | import time 9 | 10 | # Constants 11 | HEIGHT = 28 12 | WIDTH = 28 13 | class_num = 47 14 | 15 | train_x = pickle.load(open("train_x.pickle", "rb")) 16 | train_y = pickle.load(open("train_y.pickle", "rb")) 17 | 18 | test_x = pickle.load(open("test_x.pickle", "rb")) 19 | test_y = pickle.load(open("test_y.pickle", "rb")) 20 | 21 | print(test_x.shape) 22 | 23 | # train and val split 24 | train_x, val_x, train_y, val_y = train_test_split( 25 | train_x, train_y, test_size=0.10, random_state=7) 26 | 27 | # 1st run: create the following permutations of models 28 | dense_layers = [0, 1, 2] 29 | layer_sizes = [32, 64, 128] 30 | conv_layers = [1, 2, 3] 31 | 32 | for dense_layer in dense_layers: 33 | for layer_size in layer_sizes: 34 | for conv_layer in conv_layers: 35 | 36 | NAME = "{}-conv-{}-nodes-{}-dense-{}".format( 37 | conv_layer, layer_size, dense_layer, int(time.time())) 38 | 39 | # Initialize TensorBoard in the loop 40 | tensorboard = TensorBoard(log_dir='logs/{}'.format(NAME)) 41 | print(NAME) 42 | 43 | # Build the model 44 | model = Sequential() 45 | 46 | # Begin with Conv2D layer 47 | model.add(Conv2D(layer_size, (3, 3), input_shape=(HEIGHT, WIDTH, 1))) 48 | model.add(Activation('relu')) 49 | model.add(MaxPooling2D(pool_size=(2, 2))) 50 | 51 | for l in range(conv_layer - 1): 52 | # Extra Conv2D layers 53 | model.add(Conv2D(layer_size, (3, 3))) 54 | model.add(Activation('relu')) 55 | model.add(MaxPooling2D(pool_size=(2, 2))) 56 | 57 | model.add(Flatten()) 58 | 59 | for l in range(dense_layer): 60 | # Adding dense layers 61 | model.add(Dense(layer_size)) 62 | model.add(Activation('relu')) 63 | # model.add(Dropout(0.2)) 64 | 65 | # Output layer 66 | model.add(Dense(units=class_num, activation='softmax')) 67 | 68 | # Train the model 69 | model.compile(optimizer='adam', 70 | loss='categorical_crossentropy', 71 | metrics=['accuracy']) 72 | 73 | model.fit(train_x, train_y, epochs=10, batch_size=32, 74 | validation_data=(val_x, val_y), 75 | callbacks=[tensorboard]) -------------------------------------------------------------------------------- /data/model development/model_permutations_2.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | from tensorflow.keras.models import Sequential 3 | from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten 4 | from tensorflow.keras.layers import Conv2D, MaxPooling2D 5 | from tensorflow.keras.callbacks import TensorBoard 6 | from sklearn.model_selection import train_test_split 7 | import pickle 8 | import time 9 | 10 | # Constants 11 | HEIGHT = 28 12 | WIDTH = 28 13 | class_num = 47 14 | 15 | train_x = pickle.load(open("train_x.pickle", "rb")) 16 | train_y = pickle.load(open("train_y.pickle", "rb")) 17 | 18 | test_x = pickle.load(open("test_x.pickle", "rb")) 19 | test_y = pickle.load(open("test_y.pickle", "rb")) 20 | 21 | print(test_x.shape) 22 | 23 | # train and val split 24 | train_x, val_x, train_y, val_y = train_test_split( 25 | train_x, train_y, test_size=0.10, random_state=7) 26 | 27 | # 2nd run: dropouts to all dense layers, only 2 conv layers 28 | dense_layers = [1, 2] 29 | layer_sizes = [32, 64, 128] 30 | conv_layers = [2] 31 | 32 | for dense_layer in dense_layers: 33 | for layer_size in layer_sizes: 34 | for conv_layer in conv_layers: 35 | # Dropout used in the name 36 | NAME = "{}-conv-{}-nodes-{}-dense-0.2-Dropout-{}".format( 37 | conv_layer, layer_size, dense_layer, int(time.time())) 38 | 39 | # Initialize TensorBoard in the loop 40 | tensorboard = TensorBoard(log_dir='logs/{}'.format(NAME)) 41 | print(NAME) 42 | 43 | # Build the model 44 | model = Sequential() 45 | 46 | # Begin with Conv2D layer 47 | model.add(Conv2D(layer_size, (3, 3), input_shape=(HEIGHT, WIDTH, 1))) 48 | model.add(Activation('relu')) 49 | model.add(MaxPooling2D(pool_size=(2, 2))) 50 | 51 | for l in range(conv_layer - 1): 52 | # Extra Conv2D layers 53 | model.add(Conv2D(layer_size, (3, 3))) 54 | model.add(Activation('relu')) 55 | model.add(MaxPooling2D(pool_size=(2, 2))) 56 | 57 | model.add(Flatten()) 58 | 59 | for l in range(dense_layer): 60 | # Adding dense layers 61 | model.add(Dense(layer_size)) 62 | model.add(Activation('relu')) 63 | # Below 2nd time around 64 | model.add(Dropout(0.2)) 65 | 66 | # Output layer 67 | model.add(Dense(units=class_num, activation='softmax')) 68 | 69 | # Train the model 70 | model.compile(optimizer='adam', 71 | loss='categorical_crossentropy', 72 | metrics=['accuracy']) 73 | 74 | model.fit(train_x, train_y, epochs=10, batch_size=32, 75 | validation_data=(val_x, val_y), 76 | callbacks=[tensorboard]) -------------------------------------------------------------------------------- /data/model development/model_permutations_3.py: -------------------------------------------------------------------------------- 1 | import tensorflow as tf 2 | from tensorflow.keras.models import Sequential 3 | from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten 4 | from tensorflow.keras.layers import Conv2D, MaxPooling2D 5 | from tensorflow.keras.callbacks import TensorBoard 6 | from sklearn.model_selection import train_test_split 7 | import pickle 8 | import time 9 | 10 | # Constants 11 | HEIGHT = 28 12 | WIDTH = 28 13 | class_num = 47 14 | 15 | train_x = pickle.load(open("train_x.pickle", "rb")) 16 | train_y = pickle.load(open("train_y.pickle", "rb")) 17 | 18 | test_x = pickle.load(open("test_x.pickle", "rb")) 19 | test_y = pickle.load(open("test_y.pickle", "rb")) 20 | 21 | print(test_x.shape) 22 | 23 | # train and val split 24 | train_x, val_x, train_y, val_y = train_test_split( 25 | train_x, train_y, test_size=0.10, random_state=7) 26 | 27 | # 3rd run: All layers have 256 neurons with dropout 28 | dense_layers = [1, 2] 29 | layer_sizes = [256] 30 | conv_layers = [2] 31 | 32 | for dense_layer in dense_layers: 33 | for layer_size in layer_sizes: 34 | for conv_layer in conv_layers: 35 | # Dropout used in the name 36 | NAME = "{}-conv-{}-nodes-{}-dense-0.2-Dropout-{}".format( 37 | conv_layer, layer_size, dense_layer, int(time.time())) 38 | 39 | # initialize TensorBoard in the loop 40 | tensorboard = TensorBoard(log_dir='logs/{}'.format(NAME)) 41 | print(NAME) 42 | 43 | # Build the model 44 | model = Sequential() 45 | 46 | # Begin with Conv2D layer 47 | model.add(Conv2D(layer_size, (3, 3), input_shape=(HEIGHT, WIDTH, 1))) 48 | model.add(Activation('relu')) 49 | model.add(MaxPooling2D(pool_size=(2, 2))) 50 | 51 | for l in range(conv_layer - 1): 52 | # Extra Conv2D layers 53 | model.add(Conv2D(layer_size, (3, 3))) 54 | model.add(Activation('relu')) 55 | model.add(MaxPooling2D(pool_size=(2, 2))) 56 | 57 | model.add(Flatten()) 58 | 59 | for l in range(dense_layer): 60 | # Adding dense layers 61 | model.add(Dense(layer_size)) 62 | model.add(Activation('relu')) 63 | # Below 2nd time around 64 | model.add(Dropout(0.2)) 65 | 66 | # Output layer 67 | model.add(Dense(units=class_num, activation='softmax')) 68 | 69 | # Train the model 70 | model.compile(optimizer='adam', 71 | loss='categorical_crossentropy', 72 | metrics=['accuracy']) 73 | 74 | model.fit(train_x, train_y, epochs=10, batch_size=32, 75 | validation_data=(val_x, val_y), 76 | callbacks=[tensorboard]) -------------------------------------------------------------------------------- /data/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/data/screenshot.png -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/db.sqlite3 -------------------------------------------------------------------------------- /handwriting/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/__init__.py -------------------------------------------------------------------------------- /handwriting/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/__pycache__/admin.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/__pycache__/admin.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/__pycache__/models.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/__pycache__/models.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/__pycache__/serializers.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/__pycache__/serializers.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/__pycache__/urls.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/__pycache__/urls.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/__pycache__/views.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/__pycache__/views.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. -------------------------------------------------------------------------------- /handwriting/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class HandwritingConfig(AppConfig): 5 | name = 'handwriting' 6 | -------------------------------------------------------------------------------- /handwriting/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.7 on 2019-11-15 02:26 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Post', 16 | fields=[ 17 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('title', models.CharField(max_length=100)), 19 | ('content', models.TextField()), 20 | ('image', models.ImageField(upload_to='post_images')), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /handwriting/migrations/0002_delete_post.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.7 on 2019-11-16 19:57 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('handwriting', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.DeleteModel( 14 | name='Post', 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /handwriting/migrations/0003_post.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.7 on 2019-11-19 00:19 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ('handwriting', '0002_delete_post'), 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Post', 17 | fields=[ 18 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('image', models.ImageField(upload_to='post_images')), 20 | ], 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /handwriting/migrations/0004_delete_post.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.7 on 2019-11-22 00:53 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('handwriting', '0003_post'), 10 | ] 11 | 12 | operations = [ 13 | migrations.DeleteModel( 14 | name='Post', 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /handwriting/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/migrations/__init__.py -------------------------------------------------------------------------------- /handwriting/migrations/__pycache__/0001_initial.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/migrations/__pycache__/0001_initial.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/migrations/__pycache__/0002_delete_post.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/migrations/__pycache__/0002_delete_post.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/migrations/__pycache__/0003_post.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/migrations/__pycache__/0003_post.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/migrations/__pycache__/0004_delete_post.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/migrations/__pycache__/0004_delete_post.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/migrations/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/migrations/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. -------------------------------------------------------------------------------- /handwriting/testImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/testImage.png -------------------------------------------------------------------------------- /handwriting/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /handwriting/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include, re_path 2 | from django.views.generic import TemplateView 3 | 4 | from . import views 5 | 6 | urlpatterns = [ 7 | path('', views.data_return), 8 | ] -------------------------------------------------------------------------------- /handwriting/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/__init__.py -------------------------------------------------------------------------------- /handwriting/utils/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/utils/__pycache__/center_image.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/__pycache__/center_image.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/utils/__pycache__/cut_pictures.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/__pycache__/cut_pictures.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/utils/__pycache__/pad_image.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/__pycache__/pad_image.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/utils/__pycache__/predictions.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/__pycache__/predictions.cpython-36.pyc -------------------------------------------------------------------------------- /handwriting/utils/center_image.py: -------------------------------------------------------------------------------- 1 | def center_image(mod_array): 2 | # Find the top-most part of a letter 3 | 4 | def y_letter_boundary(arr): 5 | is_top_found = False 6 | # get top_arr 7 | for i in range(len(arr)): 8 | for j in range(len(arr[i])): 9 | if arr[i][j] != 0: 10 | is_top_found = True 11 | top_arr = i 12 | break 13 | if is_top_found == True: 14 | break 15 | 16 | # get bottom_arr 17 | is_bottom_found = False 18 | for i in range(len(arr) - 1, 0, -1): 19 | for j in range(len(arr[i])): 20 | if arr[i][j] != 0: 21 | is_bottom_found = True 22 | bottom_arr = i 23 | break 24 | if is_bottom_found == True: 25 | break 26 | 27 | return top_arr, bottom_arr 28 | 29 | y_begin_image, y_end_image = y_letter_boundary(mod_array) 30 | 31 | print('y_begin, y_end', y_begin_image, y_end_image) 32 | 33 | # image trimmed on top and bottom 34 | mod_array = mod_array[y_begin_image:y_end_image] 35 | 36 | def x_letter_boundary(arr): 37 | is_left_found = False 38 | for i in range(len(arr[0])): 39 | for j in range(len(arr)): 40 | if arr[j][i] != 0: 41 | is_left_found = True 42 | left_idx = i 43 | break 44 | if is_left_found == True: 45 | break 46 | 47 | # Get right arr 48 | is_right_found = False 49 | for i in range(len(arr[0]) - 1, 0, -1): 50 | for j in range(len(arr)): 51 | if arr[j][i] != 0: 52 | is_right_found = True 53 | right_idx = i 54 | break 55 | if is_right_found == True: 56 | break 57 | 58 | return left_idx, right_idx 59 | 60 | x_begin_image, x_end_image = x_letter_boundary(mod_array) 61 | 62 | print('x_begin', x_begin_image) 63 | print('x_end', x_end_image) 64 | 65 | # Trim off the left and right of the image 66 | for x in range(len(mod_array)): 67 | mod_array[x] = mod_array[x][x_begin_image:] 68 | img_x_size = x_end_image - x_begin_image 69 | mod_array[x] = mod_array[x][:img_x_size] 70 | 71 | # mod_array number now fits fully in its image 72 | return mod_array -------------------------------------------------------------------------------- /handwriting/utils/cut_pictures.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import numpy as np 3 | import copy 4 | 5 | def cut_pictures(mod_array): 6 | 7 | # columns that are filled with zeroes (blank space) 8 | blank_cols = [] 9 | 10 | for col in range(len(mod_array[0])): 11 | for row in range(len(mod_array)): 12 | #print(row, col) 13 | # find columns that are filled with zeroes 14 | # If we find a value, we will break 15 | pxl_value = mod_array[row][col] 16 | 17 | # break loop if we find a pxl value that is not 0 18 | # we will move on to the next column 19 | if pxl_value != 0: 20 | break 21 | 22 | # If we have traversed the entire row and found all zeroes, we will append that row to the blank_cols array 23 | if row == len(mod_array) - 1: 24 | blank_cols.append(col) 25 | 26 | print(blank_cols) 27 | 28 | LETTER_SEPERATOR = 25 29 | SPACE_SEPERATOR = 125 30 | 31 | # if the user inputs one letter, we will simply return the image back, as an array 32 | # we will also send a space_location as an empty array 33 | if len(blank_cols) == 0: 34 | return [mod_array], [] 35 | 36 | # If the user inputs exactly 2 drawings, but are VERY close to each other vertically, we will return the image back 37 | # We are saing that these 2 drawings are part of one character 38 | 39 | if blank_cols[len(blank_cols) - 1] - blank_cols[0] < LETTER_SEPERATOR: 40 | return [mod_array], [] 41 | 42 | class BlankPxlColSpace: 43 | def __init__(self, start, end): 44 | self.start = start 45 | self.end = end 46 | 47 | grouped_blank_cols = [] 48 | 49 | for i in range(len(blank_cols)): 50 | # initiate a "start" variable when we start the loop, and when the last row is not continuous with the first row 51 | if i == 0 or blank_cols[i] - blank_cols[i-1] != 1: 52 | start = blank_cols[i] 53 | 54 | # we end the group when we are at the end of the loop: blank_cols[len(blank_cols) - 1] 55 | if i == len(blank_cols) - 1 or blank_cols[i+1] - blank_cols[i] != 1: 56 | end = blank_cols[i] 57 | grouped_blank_cols.append(BlankPxlColSpace(start,end)) 58 | 59 | print(grouped_blank_cols) 60 | 61 | # loop through grouped_blank_cols 62 | # Discard any start/end's that are less than LETTER_SEPERATOR 63 | # create an array to hold the position of spaces 64 | 65 | space_location = [] 66 | img_cols_to_seperate = [] 67 | 68 | for idx, group in enumerate(grouped_blank_cols): 69 | 70 | # If the grouping of blank columns are larger than the LETTER_SEPERATOR, bring them into the img_cols_to_seperate array 71 | if group.end - group.start > LETTER_SEPERATOR: 72 | img_cols_to_seperate.append(group) 73 | # If the grouping of blank columns are larger than the SPACE_SEPERATOR, take note of that position in our spaces array 74 | if group.end - group.start > SPACE_SEPERATOR: 75 | print('we have a space!') 76 | space_location.append(idx) 77 | 78 | # If there are no columns to seperate, we can assume that this is one full character 79 | if len(img_cols_to_seperate) == 0: 80 | return [mod_array], [] 81 | 82 | print('space_location', space_location) 83 | print('img_cols_to_seperate', img_cols_to_seperate) 84 | 85 | def slice_image_vertically(start,end,img_arr): 86 | for row in range(len(img_arr)): 87 | img_arr[row] = img_arr[row][start:end] 88 | return img_arr 89 | 90 | characters_from_image = [] 91 | for idx in range(len(img_cols_to_seperate) +1): 92 | 93 | if idx == 0 and len(img_cols_to_seperate) != 0: 94 | letter_begin = 0 95 | letter_end = img_cols_to_seperate[idx].start 96 | elif idx == len(img_cols_to_seperate): 97 | letter_begin = img_cols_to_seperate[idx-1].end 98 | letter_end = len(mod_array[0]) 99 | else: 100 | letter_begin = img_cols_to_seperate[idx-1].end 101 | letter_end = img_cols_to_seperate[idx].start 102 | 103 | mod_array_for_slice = copy.deepcopy(mod_array) 104 | full_character = slice_image_vertically(letter_begin, letter_end, mod_array_for_slice) 105 | 106 | # plt.imshow(full_character, cmap=plt.cm.binary) 107 | # plt.show() 108 | 109 | characters_from_image.append(full_character) 110 | 111 | return characters_from_image, space_location -------------------------------------------------------------------------------- /handwriting/utils/models/model_1.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/models/model_1.h5 -------------------------------------------------------------------------------- /handwriting/utils/models/model_2.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/models/model_2.h5 -------------------------------------------------------------------------------- /handwriting/utils/models/model_3.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/models/model_3.h5 -------------------------------------------------------------------------------- /handwriting/utils/models/model_4.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/models/model_4.h5 -------------------------------------------------------------------------------- /handwriting/utils/models/model_5.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwriting/utils/models/model_5.h5 -------------------------------------------------------------------------------- /handwriting/utils/pad_image.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | # add 1/4 pixles of padding to the top and bottom 4 | def pad_image(arr): 5 | # padding for top and bottom 6 | # we will pad 1/4 pixels of the height 7 | height_pad = len(arr)/4 8 | pre_pad_width = len(arr[0]) 9 | arr_of_zeroes_height = pre_pad_width * [0] 10 | 11 | for px in range(int(height_pad)): 12 | arr.insert(0, arr_of_zeroes_height) 13 | arr.append(arr_of_zeroes_height) 14 | 15 | 16 | # We will now padd the sides so that the image is square 17 | post_pad_height = len(arr) 18 | width_pad = (post_pad_height - pre_pad_width) / 2 19 | arr_of_zeroes_width = int(width_pad) * [0] 20 | 21 | # we will add "width_pad" pixles to both sides of the image 22 | for px_height in range(len(arr)): 23 | # insert loop 24 | # for i in range(int(width_pad)): 25 | # arr[px_height].insert(0) 26 | arr[px_height] = np.insert(arr[px_height], 0, arr_of_zeroes_width) 27 | arr[px_height] = np.append(arr[px_height], arr_of_zeroes_width) 28 | 29 | return arr -------------------------------------------------------------------------------- /handwriting/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.http import HttpResponse 3 | from django.http import HttpRequest 4 | from django.views.decorators.csrf import csrf_exempt 5 | 6 | max_ = max # cv2 * overrides python max function 7 | from PIL import Image 8 | from cv2 import * 9 | import numpy as np 10 | import tensorflow.keras as keras 11 | from rest_framework.decorators import api_view 12 | 13 | from handwriting.utils.center_image import center_image 14 | from handwriting.utils.pad_image import pad_image 15 | from handwriting.utils.cut_pictures import cut_pictures 16 | 17 | # The "model jury" 18 | model_1 = keras.models.load_model("handwriting/utils/models/model_1.h5") 19 | model_2 = keras.models.load_model("handwriting/utils/models/model_2.h5") 20 | model_3 = keras.models.load_model("handwriting/utils/models/model_3.h5") 21 | model_4 = keras.models.load_model("handwriting/utils/models/model_4.h5") 22 | model_5 = keras.models.load_model("handwriting/utils/models/model_5.h5") 23 | 24 | 25 | @api_view(['POST']) 26 | def data_return(request): 27 | 28 | # Function prepares the raw image given by the user for predictions 29 | def prepare(filepath): 30 | IMG_SIZE = 28 31 | img_array = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE) 32 | 33 | mod_array = list(img_array) 34 | 35 | # test to see if anything was drawn 36 | for col in range(len(mod_array[0])): 37 | for row in range(len(mod_array)): 38 | pxl_value = mod_array[row][col] 39 | if pxl_value != 0: 40 | break 41 | if pxl_value != 0: 42 | break 43 | 44 | print(row, col) 45 | if col == len(mod_array[0]) - 1 and row == len(mod_array) - 1: 46 | return False, False, False, False 47 | 48 | # Trim off all excess pixels and center it up 49 | mod_array = center_image(mod_array) 50 | 51 | # Here is where we cut the images up 52 | # We will find where letters start and end and where large spaces are found 53 | array_of_chars, space_location = cut_pictures(mod_array) 54 | 55 | char_img_converted_to_in_sample = [] 56 | char_img_heights = [] 57 | char_img_widths = [] # Helps us differentiate between "O" and "0" if needed. 58 | # I currently have the decision for this commented out below 59 | # As I am having second-thoughts on manipulating the neural net's predictions too much 60 | 61 | for char_img in array_of_chars: 62 | 63 | # trim off all excess pixels and center the char_img up 64 | char_img = center_image(char_img) 65 | 66 | char_img_heights.append(len(char_img)) 67 | char_img_widths.append(len(char_img[0])) 68 | 69 | # we will now begin padding 70 | char_img = pad_image(char_img) 71 | # convert to a numpy array 72 | char_img = np.array(char_img, dtype='float32') 73 | 74 | # resize the image, reshape, make prediction 75 | char_img = cv2.resize(char_img, (IMG_SIZE, IMG_SIZE)) 76 | char_img /= 255 77 | 78 | # plt.imshow(char_img, cmap=plt.cm.binary) 79 | # plt.show() 80 | 81 | char_img = char_img.reshape(-1, IMG_SIZE, IMG_SIZE, 1) 82 | char_img_converted_to_in_sample.append(char_img) 83 | return char_img_converted_to_in_sample, space_location, char_img_heights, char_img_widths 84 | 85 | # Function takes in a model and img and outputs a character prediction 86 | def make_prediction(model, img): 87 | prediction = model.predict(img) 88 | idx_prediction = np.argmax(prediction[0]) 89 | return class_mapping[idx_prediction] 90 | 91 | # This function is where all model predictions come together, the most popular prediction wins 92 | def model_jury_ruling(*argv): 93 | all_predictions = [] 94 | for arg in argv: 95 | all_predictions.append(arg) 96 | 97 | hash = {} 98 | 99 | for prediction in all_predictions: 100 | if prediction not in hash: 101 | hash[prediction] = 1 102 | else: 103 | hash[prediction] += 1 104 | 105 | print(hash) 106 | 107 | # If all models do not have a unanimous vote, majority rules 108 | # Note: If there is a tie, the first item of the tie that is added gets priority over rest of the items 109 | return max_(hash, key=hash.get) 110 | 111 | 112 | # Save the image to a predetermined filepath 113 | image_request = request.data['image'].file 114 | im = Image.open(image_request) 115 | # im.show() 116 | filepath = 'static/handwritingrecognition/user_image.png' 117 | im.save(filepath) 118 | 119 | # The "answer key" 120 | # If a lowercase letter is not found in the string, that means the only difference in casing is the size 121 | class_mapping = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabdefghnqrt' 122 | 123 | # Identifying the what case uniformed-cased letters should be 124 | # Example: when a c should be a C 125 | # We will say that half the canvas dictates the casing 126 | LOWER_CASE = im.height * .50 127 | 128 | # The below letters are special letters 129 | # Not only are their lowercase counterparts the same, they can also be the same height 130 | # These characters need special params to identify upper and lowercase 131 | tall_uniform_lc_letters = 'klpy' 132 | TALL_UNIFORM_LC = im.height * .70 133 | 134 | # Prepare the image 135 | final_images, space_location, char_img_heights, char_img_widths = prepare(filepath) 136 | 137 | # For the case where nothing is drawing 138 | if final_images == False and space_location == False and char_img_heights == False: 139 | return HttpResponse('Please draw something!') 140 | 141 | # Iterate through the images 142 | # All 5 models will make a prediction at each image, and the majority rules 143 | final_prediction = [] 144 | for idx, img in enumerate(final_images): 145 | 146 | char_prediction_1 = make_prediction(model_1, img) 147 | char_prediction_2 = make_prediction(model_2, img) 148 | char_prediction_3 = make_prediction(model_3, img) 149 | char_prediction_4 = make_prediction(model_4, img) 150 | char_prediction_5 = make_prediction(model_5, img) 151 | 152 | print('\n',char_prediction_1, char_prediction_2, char_prediction_3, char_prediction_4, char_prediction_5) 153 | 154 | # Combined prediction 155 | final_char_prediction = model_jury_ruling(char_prediction_1, char_prediction_2, char_prediction_3, char_prediction_4, char_prediction_5) 156 | 157 | 158 | # Differentiate between a "0" and a "O" - commented out for now 159 | # Problem: "O" and "0" have incredibly similar-looking samples, every model has trouble with these 2 classifications 160 | # Solution: The ratio of height and width of all images will determine what is a "0" (narrow) or a "O" (fat) 161 | # if final_char_prediction == "0" or final_char_prediction == "O": 162 | 163 | # HEIGHT_WIDTH_RATIO = 1.2 # upperbound is 0, lowerbound is O 164 | # img_height_width_ratio = char_img_heights[idx] / char_img_widths[idx] 165 | # # print(img_height_width_ratio) 166 | 167 | # if img_height_width_ratio < HEIGHT_WIDTH_RATIO: 168 | # final_char_prediction = "O" 169 | # else: 170 | # final_char_prediction = "0" 171 | 172 | 173 | # Convert letter to lowercase if the final prediction is a character that is drawn small, and is not found in class_mapping 174 | if final_char_prediction.isnumeric() == False and final_char_prediction.lower() not in class_mapping: 175 | if final_char_prediction.lower() in tall_uniform_lc_letters: 176 | if char_img_heights[idx] < TALL_UNIFORM_LC: 177 | final_char_prediction = final_char_prediction.lower() 178 | elif char_img_heights[idx] < LOWER_CASE: 179 | final_char_prediction = final_char_prediction.lower() 180 | 181 | # Typically, "zeroes" (0) are fairly large, we would typically rather have "o" instead if a 0 if a user makes them small 182 | if final_char_prediction == '0' and char_img_heights[idx] < LOWER_CASE: 183 | final_char_prediction = 'o' 184 | 185 | final_prediction.append(final_char_prediction) 186 | # print('we predict the answer is:', final_char_prediction) 187 | if idx in space_location: 188 | final_prediction.append(' ') 189 | 190 | print('Final Prediction: ', final_prediction) 191 | 192 | return HttpResponse(final_prediction) 193 | -------------------------------------------------------------------------------- /handwritingrecognition/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwritingrecognition/__init__.py -------------------------------------------------------------------------------- /handwritingrecognition/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwritingrecognition/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /handwritingrecognition/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwritingrecognition/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /handwritingrecognition/__pycache__/settings.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwritingrecognition/__pycache__/settings.cpython-36.pyc -------------------------------------------------------------------------------- /handwritingrecognition/__pycache__/settings.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwritingrecognition/__pycache__/settings.cpython-37.pyc -------------------------------------------------------------------------------- /handwritingrecognition/__pycache__/urls.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwritingrecognition/__pycache__/urls.cpython-36.pyc -------------------------------------------------------------------------------- /handwritingrecognition/__pycache__/wsgi.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwritingrecognition/__pycache__/wsgi.cpython-36.pyc -------------------------------------------------------------------------------- /handwritingrecognition/__pycache__/wsgi.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/handwritingrecognition/__pycache__/wsgi.cpython-37.pyc -------------------------------------------------------------------------------- /handwritingrecognition/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for handwritingrecognition project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.2.7. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.2/ref/settings/ 11 | """ 12 | 13 | import os 14 | import django_heroku 15 | 16 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 17 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 18 | 19 | 20 | # Quick-start development settings - unsuitable for production 21 | # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ 22 | 23 | # SECURITY WARNING: keep the secret key used in production secret! 24 | SECRET_KEY = '_-di0$0&uf72a*@n_a6x=zzh+^%qv(j=umja0l-^&914_uu0vy' 25 | 26 | # SECURITY WARNING: don't run with debug turned on in production! 27 | DEBUG = True 28 | 29 | ALLOWED_HOSTS = ['handwriting-recognition-py-js.herokuapp.com'] 30 | 31 | 32 | # Application definition 33 | 34 | INSTALLED_APPS = [ 35 | 'whitenoise.runserver_nostatic', # < As per whitenoise documentation 36 | 'django.contrib.admin', 37 | 'django.contrib.auth', 38 | 'django.contrib.contenttypes', 39 | 'django.contrib.sessions', 40 | 'django.contrib.messages', 41 | 'django.contrib.staticfiles', 42 | 'handwriting', 43 | 'rest_framework', 44 | 'corsheaders', 45 | ] 46 | 47 | MIDDLEWARE = [ 48 | 'django.middleware.security.SecurityMiddleware', 49 | 'whitenoise.middleware.WhiteNoiseMiddleware', # Whitenoise Middleware 50 | 'corsheaders.middleware.CorsMiddleware', 51 | 'django.middleware.security.SecurityMiddleware', 52 | 'django.contrib.sessions.middleware.SessionMiddleware', 53 | 'django.middleware.common.CommonMiddleware', 54 | 'django.middleware.csrf.CsrfViewMiddleware', 55 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 56 | 'django.contrib.messages.middleware.MessageMiddleware', 57 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 58 | ] 59 | 60 | CORS_ORIGIN_ALLOW_ALL = True 61 | 62 | ROOT_URLCONF = 'handwritingrecognition.urls' 63 | 64 | TEMPLATES = [ 65 | { 66 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 67 | 'DIRS': [os.path.join(BASE_DIR, 'build')], 68 | 'APP_DIRS': True, 69 | 'OPTIONS': { 70 | 'context_processors': [ 71 | 'django.template.context_processors.debug', 72 | 'django.template.context_processors.request', 73 | 'django.contrib.auth.context_processors.auth', 74 | 'django.contrib.messages.context_processors.messages', 75 | ], 76 | }, 77 | }, 78 | ] 79 | 80 | WSGI_APPLICATION = 'handwritingrecognition.wsgi.application' 81 | 82 | 83 | # Database 84 | # https://docs.djangoproject.com/en/2.2/ref/settings/#databases 85 | 86 | DATABASES = { 87 | 'default': { 88 | 'ENGINE': 'django.db.backends.sqlite3', 89 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 90 | } 91 | } 92 | 93 | 94 | # Password validation 95 | # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators 96 | 97 | AUTH_PASSWORD_VALIDATORS = [ 98 | { 99 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 100 | }, 101 | { 102 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 103 | }, 104 | { 105 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 106 | }, 107 | { 108 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 109 | }, 110 | ] 111 | 112 | 113 | # Internationalization 114 | # https://docs.djangoproject.com/en/2.2/topics/i18n/ 115 | 116 | LANGUAGE_CODE = 'en-us' 117 | 118 | TIME_ZONE = 'UTC' 119 | 120 | USE_I18N = True 121 | 122 | USE_L10N = True 123 | 124 | USE_TZ = True 125 | 126 | # Configure app for Heroku deployment 127 | django_heroku.settings(locals()) 128 | 129 | # Static files (CSS, JavaScript, Images) 130 | # https://docs.djangoproject.com/en/2.2/howto/static-files/ 131 | 132 | STATIC_URL = '/static/' 133 | 134 | # Place static in the same location as webpack build files 135 | STATIC_ROOT = os.path.join(BASE_DIR, 'build', 'static') 136 | STATICFILES_DIRS = [] 137 | 138 | # If you want to serve user uploaded files add these settings 139 | MEDIA_URL = '/media/' 140 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 141 | 142 | STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage' 143 | -------------------------------------------------------------------------------- /handwritingrecognition/urls.py: -------------------------------------------------------------------------------- 1 | """handwritingrecognition URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/2.2/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import include, path, re_path # added include 18 | from django.views.generic import TemplateView 19 | 20 | urlpatterns = [ 21 | path('handwriting/', include('handwriting.urls')), # added 22 | path('admin/', admin.site.urls), 23 | re_path(r'^.*', TemplateView.as_view(template_name='index.html')), 24 | ] 25 | -------------------------------------------------------------------------------- /handwritingrecognition/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for handwritingrecognition project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'handwritingrecognition.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'handwritingrecognition.settings') 9 | try: 10 | from django.core.management import execute_from_command_line 11 | except ImportError as exc: 12 | raise ImportError( 13 | "Couldn't import Django. Are you sure it's installed and " 14 | "available on your PYTHONPATH environment variable? Did you " 15 | "forget to activate a virtual environment?" 16 | ) from exc 17 | execute_from_command_line(sys.argv) 18 | 19 | 20 | if __name__ == '__main__': 21 | main() 22 | -------------------------------------------------------------------------------- /model_3.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/model_3.h5 -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "handwriting-recognition", 3 | "version": "0.1.0", 4 | "private": true, 5 | "engines": { 6 | "npm": "6.8.0", 7 | "node": "8.11.1" 8 | }, 9 | "dependencies": { 10 | "axios": "^0.19.0", 11 | "canvas-toBlob": "^1.0.0", 12 | "file-saver": "^2.0.2", 13 | "p5": "^0.10.2", 14 | "react": "^16.11.0", 15 | "react-collapsible": "^2.6.2", 16 | "react-dom": "^16.11.0", 17 | "react-p5-wrapper": "^2.0.0", 18 | "react-scripts": "3.2.0" 19 | }, 20 | "scripts": { 21 | "start": "react-scripts start", 22 | "build": "react-scripts build", 23 | "test": "react-scripts test", 24 | "eject": "react-scripts eject" 25 | }, 26 | "eslintConfig": { 27 | "extends": "react-app" 28 | }, 29 | "browserslist": { 30 | "production": [ 31 | ">0.2%", 32 | "not dead", 33 | "not op_mini all" 34 | ], 35 | "development": [ 36 | "last 1 chrome version", 37 | "last 1 firefox version", 38 | "last 1 safari version" 39 | ] 40 | }, 41 | "proxy": "http://localhost:8000/" 42 | } 43 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | 25 | 26 | 27 | 28 | Deep Learning Handwriting Recognition 29 | 30 | 31 | 32 | 33 |
34 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | // "icons": [ 5 | // { 6 | // "src": "favicon.ico", 7 | // "sizes": "64x64 32x32 24x24 16x16", 8 | // "type": "image/x-icon" 9 | // }, 10 | // { 11 | // "src": "logo192.png", 12 | // "type": "image/png", 13 | // "sizes": "192x192" 14 | // }, 15 | // { 16 | // "src": "logo512.png", 17 | // "type": "image/png", 18 | // "sizes": "512x512" 19 | // } 20 | // ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | absl-py==0.8.1 2 | astor==0.8.0 3 | cachetools==3.1.1 4 | certifi==2019.9.11 5 | chardet==3.0.4 6 | cycler==0.10.0 7 | dj-database-url==0.5.0 8 | Django==2.2.7 9 | django-cors-headers==3.2.0 10 | django-heroku==0.3.1 11 | djangorestframework==3.10.3 12 | gast==0.2.2 13 | google-auth==1.7.1 14 | google-auth-oauthlib==0.4.1 15 | google-pasta==0.1.8 16 | grpcio==1.25.0 17 | gunicorn==20.0.0 18 | h5py==2.10.0 19 | idna==2.8 20 | Keras-Applications==1.0.8 21 | Keras-Preprocessing==1.1.0 22 | kiwisolver==1.1.0 23 | Markdown==3.1.1 24 | matplotlib==3.1.1 25 | numpy==1.17.4 26 | oauthlib==3.1.0 27 | opencv-python-headless==4.1.1.26 28 | opt-einsum==3.1.0 29 | Pillow==6.2.1 30 | protobuf==3.10.0 31 | psycopg2==2.8.4 32 | pyasn1==0.4.8 33 | pyasn1-modules==0.2.7 34 | pyparsing==2.4.5 35 | python-dateutil==2.8.1 36 | pytz==2019.3 37 | requests==2.22.0 38 | requests-oauthlib==1.3.0 39 | requests-toolbelt==0.9.1 40 | rsa==4.0 41 | SimpleWebSocketServer==0.1.1 42 | six==1.13.0 43 | sqlparse==0.3.0 44 | tb-nightly==1.14.0a20190603 45 | tensorboard==2.0.1 46 | tensorflow==2.0.0b1 47 | tensorflow-estimator==2.0.1 48 | termcolor==1.1.0 49 | tf-estimator-nightly==1.14.0.dev2019060501 50 | typing==3.7.4.1 51 | urllib3==1.25.7 52 | webencodings==0.5.1 53 | websocket-client==0.56.0 54 | Werkzeug==0.16.0 55 | whitenoise==4.1.4 56 | wrapt==1.11.2 57 | -------------------------------------------------------------------------------- /runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.6.6 -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | div.App { 2 | padding-left: 5%; 3 | padding-right: 5% 4 | } -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import './App.css'; 4 | import Title from './components/Title/Title.js' 5 | import Canvas from './components/Canvas/Canvas.js' 6 | import Instructions from './components/Instructions/Instructions.js' 7 | 8 | 9 | function App() { 10 | return ( 11 |
12 | 13 | <Instructions /> 14 | <Canvas /> 15 | </div> 16 | ); 17 | } 18 | 19 | export default App; 20 | -------------------------------------------------------------------------------- /src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(<App />, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /src/components/Canvas/Canvas.css: -------------------------------------------------------------------------------- 1 | div.p5-canvas { 2 | margin-top: 10px; 3 | cursor: pointer; 4 | } 5 | 6 | div.canvas { 7 | padding-top:10px; 8 | padding-bottom: 100px 9 | } 10 | 11 | img.trashIcon { 12 | width: 35px; 13 | padding-top: 4px; 14 | margin-bottom: 6px; 15 | cursor: pointer; 16 | margin-right: 20px; 17 | transition: all 0.15s ease-in-out; 18 | } 19 | 20 | img.trashIcon:active { 21 | background: grey 22 | } 23 | 24 | @media (pointer:fine) { 25 | /* Primary Input is a fine pointer device such as a mouse or stylus */ 26 | img.trashIcon:hover { 27 | opacity: 0.4 28 | } 29 | img.undoIcon:hover { 30 | opacity: 0.4 31 | } 32 | img.plusCircle:hover { 33 | opacity: 0.4 34 | } 35 | img.minusCircle:hover { 36 | opacity: 0.4 37 | } 38 | } 39 | 40 | 41 | img.undoIcon { 42 | left: 2px; 43 | width: 35px; 44 | margin-bottom: 5px; 45 | cursor: pointer; 46 | margin-right: 20px; 47 | transform: rotate(90deg); 48 | transition: all 0.15s ease-in-out; 49 | } 50 | 51 | img.undoIcon:active { 52 | background: grey 53 | } 54 | 55 | img.plusCircle { 56 | width: 35px; 57 | padding-top: 4px; 58 | margin-bottom: 5px; 59 | cursor: pointer; 60 | transition: all 0.15s ease-in-out; 61 | } 62 | 63 | img.plusCircle:active { 64 | background: grey 65 | } 66 | 67 | img.minusCircle { 68 | width: 35px; 69 | padding-top: 4px; 70 | margin-bottom: 5px; 71 | margin-right: 10px; 72 | cursor: pointer; 73 | transition: all 0.15s ease-in-out; 74 | } 75 | 76 | img.minusCircle:active { 77 | background: grey 78 | } 79 | 80 | select.size-dropdown-menu { 81 | width: 175px; 82 | display:inline; 83 | vertical-align: top; 84 | cursor: pointer; 85 | } 86 | 87 | button.submit-prediction { 88 | font-size: 18px; 89 | } 90 | 91 | div.progress { 92 | width: 350px 93 | } -------------------------------------------------------------------------------- /src/components/Canvas/Canvas.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import P5Wrapper from "react-p5-wrapper"; 3 | import axios from "axios"; 4 | 5 | // import testImage from './testImage.png' 6 | import plusCircle from '../../images/plus_circle.svg' 7 | import minusCircle from '../../images/minus_circle.svg' 8 | import trashIcon from '../../images/trash_icon.svg' 9 | import undoIcon from '../../images/undo_icon.svg' 10 | 11 | import "./Canvas.css"; 12 | 13 | class Canvas extends Component { 14 | constructor(props) { 15 | super(props); 16 | this.state = { 17 | drawing: [], 18 | submitted: false, 19 | prediction: "", 20 | canvasLength: localStorage.getItem('width') || 300, 21 | minLength: 300, 22 | maxLength: 2000, 23 | drawings: [], 24 | predictionProgress: '', 25 | predBtnCountdown: 0 26 | }; 27 | this.sketch = this.sketch.bind(this); 28 | this.fileUploadHandler = this.fileUploadHandler.bind(this); 29 | } 30 | 31 | // upload handler 32 | async fileUploadHandler(img) { 33 | 34 | this.setState({ 35 | predictionProgress: 'Your handwriting is being predicted, please wait...', 36 | }) 37 | 38 | function dataURItoBlob(dataURI) { 39 | // convert base64/URLEncoded data component to raw binary data held in a string 40 | var byteString; 41 | if (dataURI.split(",")[0].indexOf("base64") >= 0) 42 | byteString = atob(dataURI.split(",")[1]); 43 | else byteString = unescape(dataURI.split(",")[1]); 44 | // separate out the mime component 45 | var mimeString = dataURI.split(",")[0].split(":")[1].split(";")[0]; 46 | // write the bytes of the string to a typed array 47 | var ia = new Uint8Array(byteString.length); 48 | for (var i = 0; i < byteString.length; i++) { 49 | ia[i] = byteString.charCodeAt(i); 50 | } 51 | return new Blob([ia], { type: mimeString }); 52 | } 53 | 54 | // Get canvas from html 55 | var canvasInput = document.getElementById("defaultCanvas0"); 56 | 57 | // Convert canvas image to Base64 58 | var canvasImg = canvasInput.toDataURL(); 59 | 60 | // Convert the Base64 image to binary 61 | var file = dataURItoBlob(canvasImg); 62 | console.log("file: ", file); 63 | 64 | const fd = new FormData(); 65 | fd.append("image", file); 66 | 67 | var response = await axios.post("handwriting/", fd, { 68 | headers: { 69 | "content-type": "multipart/form-data" 70 | } 71 | }); 72 | 73 | this.setState({ 74 | prediction: response.data, 75 | predictionProgress: '', 76 | }); 77 | 78 | const secCountdown = function () { 79 | return new Promise((resolve, reject) => { 80 | setTimeout(() => { 81 | resolve() 82 | }, 1000) 83 | }) 84 | } 85 | 86 | async function init() { 87 | try { 88 | await secCountdown() 89 | } 90 | catch (err) { 91 | console.log('error: ', err) 92 | } 93 | } 94 | 95 | let time = 5 96 | 97 | this.setState({ 98 | predBtnCountdown: time 99 | }) 100 | 101 | do { 102 | await init() 103 | time-- 104 | this.setState({ 105 | predBtnCountdown: time 106 | }) 107 | 108 | } while(time > 0) 109 | 110 | } 111 | 112 | // sketch function 113 | sketch = p => { 114 | var canvas; 115 | var drawings = this.state.drawings; 116 | 117 | var drawingStorage = localStorage.getItem('drawings') 118 | if (drawingStorage !== null && drawingStorage.length !== 0) { 119 | drawingStorage = JSON.parse(localStorage.getItem('drawings')) 120 | // debugger; 121 | for (let i = 0; i < drawingStorage.length; i++) { 122 | drawings.push(drawingStorage[i]) 123 | } 124 | } 125 | 126 | var currentPath = []; 127 | var isDrawing = false; 128 | p.setup = () => { 129 | // Dev note: If there are touch problems (ie: tablets that are larger than expected - can't write with them), we can use a different callback for touchStarted and mousePressed instead of the same callback and figuring what device is being used based on window size - but instead, figure out if it were "touched" or "mouse pressed" by the functions provided below 130 | canvas = p.createCanvas(this.state.canvasLength, 200); 131 | p.noStroke(); 132 | canvas.mousePressed(p.startPath); 133 | canvas.touchStarted(p.startPath) 134 | canvas.mouseReleased(p.endPath); 135 | canvas.touchEnded(p.endPath) 136 | }; 137 | 138 | p.startPath = () => { 139 | isDrawing = true; 140 | currentPath = []; 141 | drawings.push(currentPath); 142 | this.setState({ 143 | drawings: drawings 144 | }) 145 | 146 | // Get canvas from html 147 | var canvasHTML = document.getElementById("defaultCanvas0"); 148 | 149 | // Prevent scrolling when touching the canvas 150 | document.body.addEventListener("touchstart", function (e) { 151 | if (e.target === canvasHTML) { 152 | console.log('inside touchstart') 153 | e.preventDefault(); 154 | } 155 | }, { passive: false }); 156 | document.body.addEventListener("touchend", function (e) { 157 | if (e.target === canvasHTML) { 158 | // console.log('inside touched') // may delete this and touchmove 159 | e.preventDefault(); 160 | } 161 | }, { passive: false }); 162 | document.body.addEventListener("touchmove", function (e) { 163 | if (e.target === canvasHTML) { 164 | e.preventDefault(); 165 | } 166 | }, { passive: false }); 167 | 168 | }; 169 | 170 | p.endPath = () => { 171 | isDrawing = false; 172 | }; 173 | 174 | p.draw = () => { 175 | // Dev note: P5 does not use touchX or touchY - they use mouse coordinates 176 | var px = p.mouseX 177 | var py = p.mouseY; 178 | p.background(0); 179 | 180 | if (isDrawing) { 181 | let point = { 182 | x1: px, 183 | y1: py, 184 | x2: p.mouseX, 185 | y2: p.mouseY 186 | }; 187 | currentPath.push(point); 188 | } 189 | // re-define drawings to be the state 190 | drawings = this.state.drawings 191 | //Shows the current drawing if there any data in drawing array 192 | for (let i = 0; i < drawings.length; i++) { 193 | let path = drawings[i]; 194 | if (drawings[i].length !== 0) { 195 | p.beginShape(); 196 | for (let j = 0; j < path.length; j++) { 197 | // p.strokeWeight(20); 198 | p.strokeWeight(15) 199 | p.stroke(255); 200 | p.noFill() 201 | 202 | if (window.innerWidth <= 760) { 203 | // for mobile 204 | p.vertex(path[j].x2, path[j].y2); 205 | } else { 206 | // for desktop 207 | p.line(path[j].x1, path[j].y1, path[j].x2, path[j].y2); 208 | } 209 | } 210 | p.endShape(); 211 | } 212 | } 213 | 214 | if (this.state.submitted === true) { 215 | console.log("we are ready to export"); 216 | this.setState({ 217 | submitted: false 218 | }); 219 | const img = canvas.get(); 220 | // img.save(); 221 | // console.log(img) 222 | this.fileUploadHandler(img); 223 | } 224 | }; 225 | }; 226 | 227 | handleSizeChange = e => { 228 | if (e.target.value !== '') { 229 | localStorage.setItem('drawings', JSON.stringify(this.state.drawings)) 230 | const valuePX = e.target.value 231 | const width = Number(valuePX.slice(0, valuePX.length - 2)) 232 | console.log(width) 233 | 234 | localStorage.setItem('width', width); 235 | console.log('canvasLength', this.state.canvasLength) 236 | window.location.reload(); 237 | } 238 | } 239 | 240 | handleSubmitPrediction = e => { 241 | e.preventDefault(); 242 | this.setState({ 243 | submitted: true 244 | }); 245 | }; 246 | 247 | handleOnClickDelete = e => { 248 | this.setState({ 249 | drawings: [], 250 | prediction: '' 251 | }) 252 | } 253 | 254 | handleOnClickUndo = e => { 255 | let drawings = this.state.drawings 256 | drawings = drawings.slice(0, drawings.length - 1) 257 | this.setState({ 258 | drawings: drawings, 259 | }) 260 | } 261 | 262 | handleOnClickAddSize = e => { 263 | localStorage.setItem('drawings', JSON.stringify(this.state.drawings)) 264 | console.log('add on size') 265 | if ((Number(this.state.canvasLength) + 100) <= this.state.maxLength) { 266 | localStorage.setItem('width', Number(this.state.canvasLength) + 100) 267 | // console.log(this.state.canvasLength) 268 | window.location.reload(); 269 | } 270 | } 271 | 272 | handleOnClickSubtractSize = e => { 273 | localStorage.setItem('drawings', JSON.stringify(this.state.drawings)) 274 | console.log('subtract size') 275 | if ((Number(this.state.canvasLength) - 100) >= this.state.minLength) { 276 | localStorage.setItem('width', Number(this.state.canvasLength) - 100) 277 | // console.log(this.state.canvasLength) 278 | window.location.reload(); 279 | } 280 | } 281 | 282 | render() { 283 | 284 | let canvasSizes = [] 285 | const { minLength, maxLength } = this.state 286 | for (let i = minLength; i <= maxLength; i += 100) { 287 | canvasSizes.push(`${i}px`) 288 | } 289 | 290 | const sizeList = canvasSizes.map(size => { 291 | return ( 292 | <option className="canvas-size-dropdown-options" 293 | value={size} 294 | key={size}> 295 | {size}</option> 296 | ); 297 | }); 298 | 299 | const defaultSize = `${this.state.canvasLength}px` 300 | 301 | const disablePredBtn = this.state.predictionProgress === '' 302 | && this.state.predBtnCountdown === 0 ? false : true 303 | 304 | const predCountdown = this.state.predBtnCountdown === 0 ? '' : `: ${this.state.predBtnCountdown}` 305 | 306 | return ( 307 | <div className="canvas"> 308 | <div className="toolbar"> 309 | <img className="trashIcon" 310 | src={trashIcon} 311 | alt="" 312 | onClick={this.handleOnClickDelete}> 313 | </img> 314 | 315 | <img className="undoIcon" 316 | src={undoIcon} 317 | alt="" 318 | onClick={this.handleOnClickUndo}> 319 | </img> 320 | 321 | <img className="plusCircle" 322 | src={plusCircle} 323 | alt="" 324 | onClick={this.handleOnClickAddSize}> 325 | </img> 326 | <img className="minusCircle" 327 | src={minusCircle} 328 | alt="" 329 | onClick={this.handleOnClickSubtractSize}> 330 | </img> 331 | <select className="browser-default size-dropdown-menu" 332 | onChange={this.handleSizeChange} defaultValue={defaultSize}> 333 | <option value=''>-- Choose A Canvas Width --</option> 334 | {sizeList} 335 | </select> 336 | </div> 337 | 338 | <div className="p5-canvas"> 339 | <P5Wrapper className="P5Wrapper" sketch={this.sketch} /> 340 | </div> 341 | 342 | <button 343 | className="btn waves-effect waves-light blue darken-1 submit-prediction" 344 | type="submit" 345 | name="action" 346 | onClick={this.handleSubmitPrediction} 347 | disabled={disablePredBtn} 348 | >Predict{predCountdown}</button> 349 | 350 | {this.state.predictionProgress ? ( 351 | <div className="waiting-for-prediction"> 352 | <h5>{this.state.predictionProgress}</h5> 353 | <div className="progress"> 354 | <div className="indeterminate blue darken-1"></div> 355 | </div> 356 | </div> 357 | ) : ( 358 | <h5 className="prediction-result">Prediction: {this.state.prediction}</h5> 359 | )} 360 | </div> 361 | ); 362 | } 363 | } 364 | 365 | export default Canvas; 366 | -------------------------------------------------------------------------------- /src/components/Canvas/testImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/components/Canvas/testImage.png -------------------------------------------------------------------------------- /src/components/Instructions/Instructions.css: -------------------------------------------------------------------------------- 1 | div.instructions-component{ 2 | padding-top: 20px; 3 | padding-bottom: 20px; 4 | } 5 | 6 | .Collapsible { 7 | width: 350px; 8 | background-color: white; 9 | font-size: 18px; 10 | overflow: hidden; 11 | } 12 | .Collapsible:hover { 13 | cursor: pointer; 14 | } 15 | 16 | .Collapsible__contentInner { 17 | padding: 10px; 18 | overflow: hidden; /*Great! */ 19 | border: 1px solid #ebebeb; 20 | border-top: 0; } 21 | .Collapsible__contentInner:hover { 22 | cursor: default; 23 | } 24 | .Collapsible__contentInner p { 25 | margin-bottom: 10px; 26 | font-size: 14px; 27 | line-height: 20px; } 28 | .Collapsible__contentInner p:last-child { 29 | margin-bottom: 0; } 30 | 31 | .Collapsible__trigger { 32 | display: block; 33 | font-weight: 400; 34 | text-decoration: none; 35 | color: #333333; 36 | position: relative; 37 | border: 1px solid white; 38 | padding: 10px; 39 | background: #6cbee4; 40 | color: white; 41 | transition: 0.3s;} 42 | .Collapsible__trigger:after { 43 | font-family: 'FontAwesome'; 44 | content: '\f107'; 45 | position: absolute; 46 | right: 10px; 47 | top: 10px; 48 | display: block; 49 | transition: transform 300ms; } 50 | .Collapsible__trigger.is-open:after { 51 | transform: rotateZ(180deg); } 52 | .Collapsible__trigger.is-disabled { 53 | opacity: 0.5; 54 | background-color: grey; } 55 | .Collapsible__trigger:hover { 56 | opacity: 0.8; 57 | transition: 0.3s 58 | } 59 | 60 | .CustomTriggerCSS { 61 | background-color: lightcoral; 62 | transition: background-color 200ms ease; } 63 | 64 | .CustomTriggerCSS--open { 65 | background-color: darkslateblue; } 66 | 67 | .Collapsible__custom-sibling { 68 | padding: 5px; 69 | font-size: 12px; 70 | background-color: #CBB700; 71 | color: black; } 72 | 73 | /* img.trashIcon { 74 | width: 35px; 75 | padding-top: 4px; 76 | margin-bottom: 6px; 77 | cursor: pointer; 78 | margin-right: 20px; 79 | transition: all 0.15s ease-in-out; 80 | } */ 81 | 82 | 83 | td.collapsible-items img.trashIcon{ 84 | float:left; 85 | margin-right: 45px; 86 | 87 | } 88 | 89 | td.collapsible-items img.undoIcon{ 90 | float:left; 91 | margin-bottom: 0px; 92 | margin-top: 6px; 93 | margin-right: 45px 94 | } 95 | 96 | td.collapsible-items img.plusCircle{ 97 | float:left; 98 | margin-right: 0px 99 | } 100 | 101 | td.collapsible-items img.minusCircle{ 102 | float:left; 103 | margin-right:12px 104 | } 105 | 106 | td.collapsible-items p{ 107 | font-size: 16px; 108 | 109 | } 110 | div.instructions-toolbar p { 111 | float:left; 112 | margin-top:10px 113 | } 114 | 115 | div.instructions-toolbar br { 116 | clear:both 117 | } 118 | 119 | img.canvasWriting { 120 | max-width:100%; 121 | max-height:100%; 122 | border: 1px solid #ddd; 123 | border-radius: 4px; 124 | } 125 | 126 | img.horiIntf1 { 127 | max-width:100%; 128 | max-height:100%; 129 | border: 1px solid #ddd; 130 | border-radius: 4px; 131 | } 132 | 133 | img.horiIntf2 { 134 | max-width:100%; 135 | max-height:100%; 136 | border: 1px solid #ddd; 137 | border-radius: 4px; 138 | } 139 | 140 | img.horiIntf3 { 141 | max-width:100%; 142 | max-height:100%; 143 | border: 1px solid #ddd; 144 | border-radius: 4px; 145 | } 146 | 147 | img.caseEx { 148 | max-width:100%; 149 | max-height:100%; 150 | border: 1px solid #ddd; 151 | border-radius: 4px; 152 | } 153 | 154 | img.caseCaveat { 155 | max-width:100%; 156 | max-height:100%; 157 | border: 1px solid #ddd; 158 | border-radius: 4px; 159 | } 160 | 161 | img.spaceEx { 162 | max-width:100%; 163 | max-height:100%; 164 | border: 1px solid #ddd; 165 | border-radius: 4px; 166 | } 167 | 168 | div.getting-started li{ 169 | font-size: 16px; 170 | list-style-type:disc!important; 171 | } 172 | 173 | div.best-practices li{ 174 | font-size: 16px; 175 | list-style-type:disc!important; 176 | } 177 | 178 | div.best-practices h6{ 179 | padding-left:20px; 180 | padding-top: 10px 181 | } -------------------------------------------------------------------------------- /src/components/Instructions/Instructions.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import Collapsible from 'react-collapsible'; 3 | 4 | import plusCircle from '../../images/plus_circle.svg'; 5 | import minusCircle from '../../images/minus_circle.svg'; 6 | import trashIcon from '../../images/trash_icon.svg'; 7 | import undoIcon from '../../images/undo_icon.svg'; 8 | 9 | import canvasWriting from '../../images/tutorial/canvas-writing.png'; 10 | import horiIntf1 from '../../images/tutorial/horizontal-interference-1.png'; 11 | import horiIntf2 from '../../images/tutorial/horizontal-interference-2.png'; 12 | import horiIntf3 from '../../images/tutorial/horizontal-interference-3.png'; 13 | import caseEx from '../../images/tutorial/casing-example.png'; 14 | import caseCaveat from '../../images/tutorial/casing-caveat.png'; 15 | import spaceEx from '../../images/tutorial/spacing-example.png'; // not talking about the company 16 | 17 | import './Instructions.css'; 18 | 19 | class Header extends Component { 20 | constructor(props) { 21 | super(props); 22 | this.state = { 23 | placeholder: '', 24 | } 25 | } 26 | 27 | render() { 28 | return ( 29 | <div className="instructions-component"> 30 | 31 | <Collapsible 32 | trigger="How To Use This Application" 33 | transitionTime={50} 34 | open={false}> 35 | <div className="getting-started"> 36 | <h5><u>Getting Started</u></h5> 37 | <p>This application is able to predict the following characters from handwriting:</p> 38 | <p className="center">0-9, a-z, A-Z</p> 39 | <p>Simply draw some text on the canvas below, click "Predict" and see what happens.</p> 40 | <p>Make sure that you:</p> 41 | <ol> 42 | <li>Write legibly</li> 43 | <li>Write one single line</li> 44 | <li>Have some horizontal space between characters</li> 45 | </ol> 46 | <img className="canvasWriting" src={canvasWriting} alt=""></img> 47 | </div> 48 | 49 | <div className="instructions-toolbar"> 50 | <h5><u>Canvas Toolbar</u></h5> 51 | <img className="trashIcon" src={trashIcon} alt=""></img> 52 | <p>Clear canvas</p> 53 | <br/> 54 | <img className="undoIcon" src={undoIcon} alt=""></img> 55 | <p>Undo last drawing line</p> 56 | <br/> 57 | <img className="plusCircle" src={plusCircle} alt=""></img> 58 | <img className="minusCircle" src={minusCircle} alt=""></img> 59 | <p>Resize canvas</p> 60 | <br/> 61 | </div> 62 | </Collapsible> 63 | <Collapsible 64 | trigger="Best Results" 65 | transitionTime={50} 66 | open={false}> 67 | <div className="best-results"> 68 | <p className="center"><i>"How can I achieve the most accurate prediction?"</i></p> 69 | <h5><u>1. Space your characters</u></h5> 70 | <p>The most common pitfall: not having enough horizontal space between characters. The result will be LESS characters than one anticipates.</p> 71 | <p><b>Example #1: Common Scenario</b></p> 72 | <img className="horiIntf1" src={horiIntf1} alt=""></img> 73 | <p><b>Description:</b> The above image will not return what is expected because the "H" and "e" are too close to each other. Fortunately, the space between "e" and "y" is good.</p> 74 | <p><b>Result:</b> "He" will be predicted as one letter, and "y" as another. There will be 2 characters predicted instead of 3.</p> 75 | <p><b>The Fix:</b> Add a little more space between the "H" and the "e" so that all 3 letters will be predicted seperately.</p> 76 | <p><b>Example #2: "Hanging" characters</b></p> 77 | <img className="horiIntf2" src={horiIntf2} alt=""></img> 78 | <p><b>Description:</b> Do not write underneath characters. There needs to be some horizontal space.</p> 79 | <p><b>Result:</b> The first "Tu" will be predicted as one letter. Fortunately, the 2nd "T" and "u" have enough space to be predicted seperately. There will be 3 characters predicted instead of 4.</p> 80 | <p><b>The Fix:</b> Move the 1st "u" out from under the "T", and give it some horizontal space like the 2nd "u".</p> 81 | <p><b>Example #3: A helping hand</b></p> 82 | <img className="horiIntf3" src={horiIntf3} alt=""></img> 83 | <p><b>Description:</b> We are allowed to be a little messy when writing. If we leave a few "breaks" inside of letters, the algorithm will help us out.</p> 84 | <p><b>Result:</b> The broken "H" will be read as one letter. Just as intended!</p> 85 | <h5><u>2. Uppercase vs Lowercase</u></h5> 86 | <p className="center"><i>"What determines a 'c' from a 'C'?"</i></p> 87 | <p>For letters where the only difference in casing is the size - write relatively large for uppercase, and relatively small for lowercase. </p> 88 | <img className="caseEx" src={caseEx} alt=""></img> 89 | <p><b>Casing Caveat:</b></p> 90 | <p>Due to the constrains of the chosen dataset, the lowercase "i" samples rely off of image height to determine casing. The first "i" below would return "i" and the second "i" would return capital "I".</p> 91 | <img className="caseCaveat" src={caseCaveat} alt=""></img> 92 | <p>At the risk of hard-coding the neural net's prediction too much, this result has been left alone.</p> 93 | <h5><u>3. Add spaces in your prediction</u></h5> 94 | <p>For some flair, you can give yourself a large horizontal space to indicate an actual text-space in your prediction.</p> 95 | <img className="spaceEx" src={spaceEx} alt=""></img> 96 | <p><b>Result:</b> The added space will give us the prediction "Hey You" instead of "HeyYou".</p> 97 | <h5><u>4. Write neatly</u></h5> 98 | <p>This app is capable of predicting some messy handwriting. However, if you are aiming for a perfect prediction: write neatly and slowly.</p> 99 | </div> 100 | </Collapsible> 101 | </div> 102 | ) 103 | } 104 | } 105 | 106 | export default Header -------------------------------------------------------------------------------- /src/components/Title/Title.css: -------------------------------------------------------------------------------- 1 | div.main-title{ 2 | background: #b3cefc; 3 | width:fit-content; 4 | height:fit-content; 5 | } 6 | 7 | div.github-repo { 8 | padding-top: 18px; 9 | padding-bottom: 15px; 10 | } 11 | 12 | div.github-repo a { 13 | padding-left: 10px; 14 | font-size: 16px; 15 | } 16 | 17 | .github-repo.github-link:hover { 18 | opacity: 0.4; 19 | } 20 | 21 | div.github-repo img { 22 | vertical-align: middle; 23 | width: 30px; 24 | height: auto; 25 | } 26 | -------------------------------------------------------------------------------- /src/components/Title/Title.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | import './Title.css'; 4 | import gitIcon from '../../images/github-icon.png' 5 | 6 | class Title extends Component { 7 | constructor(props) { 8 | super(props); 9 | this.state = { 10 | postreq: '', 11 | postres: '' 12 | } 13 | } 14 | 15 | render() { 16 | return ( 17 | <div className="title"> 18 | <div className="main-title card-panel blue lighten-5 center"> 19 | <h3 className="center"><b>Deep Learning Handwriting Recognition</b></h3> 20 | <h5 className="center">A handwriting recognition web application, using custom-trained machine learning models</h5> 21 | <div className="github-repo center"> 22 | <img src={gitIcon} alt="" /> 23 | <a className="github-link" href="https://github.com/MikeM711/Deep-Learning-Handwriting-Recognition" 24 | target="_blank" rel="noopener noreferrer">GitHub Repo</a> 25 | </div> 26 | </div> 27 | <div className="title-sub"> 28 | 29 | </div> 30 | </div> 31 | ) 32 | } 33 | } 34 | 35 | export default Title -------------------------------------------------------------------------------- /src/images/github-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/images/github-icon.png -------------------------------------------------------------------------------- /src/images/minus_circle.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M7 11H17V13H7z"/><path d="M12,2C6.486,2,2,6.486,2,12s4.486,10,10,10s10-4.486,10-10S17.514,2,12,2z M12,20c-4.411,0-8-3.589-8-8s3.589-8,8-8 s8,3.589,8,8S16.411,20,12,20z"/></svg> -------------------------------------------------------------------------------- /src/images/plus_circle.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12,2A10,10,0,1,0,22,12,10,10,0,0,0,12,2Zm0,18a8,8,0,1,1,8-8A8,8,0,0,1,12,20Zm4-9H13V8a1,1,0,0,0-2,0v3H8a1,1,0,0,0,0,2h3v3a1,1,0,0,0,2,0V13h3a1,1,0,0,0,0-2Z"/></svg> -------------------------------------------------------------------------------- /src/images/title-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/images/title-image.png -------------------------------------------------------------------------------- /src/images/trash_icon.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10,18a1,1,0,0,0,1-1V11a1,1,0,0,0-2,0v6A1,1,0,0,0,10,18ZM20,6H16V5a3,3,0,0,0-3-3H11A3,3,0,0,0,8,5V6H4A1,1,0,0,0,4,8H5V19a3,3,0,0,0,3,3h8a3,3,0,0,0,3-3V8h1a1,1,0,0,0,0-2ZM10,5a1,1,0,0,1,1-1h2a1,1,0,0,1,1,1V6H10Zm7,14a1,1,0,0,1-1,1H8a1,1,0,0,1-1-1V8H17Zm-3-1a1,1,0,0,0,1-1V11a1,1,0,0,0-2,0v6A1,1,0,0,0,14,18Z"/></svg> -------------------------------------------------------------------------------- /src/images/tutorial/canvas-writing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/images/tutorial/canvas-writing.png -------------------------------------------------------------------------------- /src/images/tutorial/casing-caveat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/images/tutorial/casing-caveat.png -------------------------------------------------------------------------------- /src/images/tutorial/casing-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/images/tutorial/casing-example.png -------------------------------------------------------------------------------- /src/images/tutorial/horizontal-interference-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/images/tutorial/horizontal-interference-1.png -------------------------------------------------------------------------------- /src/images/tutorial/horizontal-interference-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/images/tutorial/horizontal-interference-2.png -------------------------------------------------------------------------------- /src/images/tutorial/horizontal-interference-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/images/tutorial/horizontal-interference-3.png -------------------------------------------------------------------------------- /src/images/tutorial/spacing-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/src/images/tutorial/spacing-example.png -------------------------------------------------------------------------------- /src/images/undo_icon.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.29,15.71a1,1,0,0,0,.33.21,1,1,0,0,0,.76,0,1,1,0,0,0,.33-.21l3-3a1,1,0,0,0-1.42-1.42L13,12.59V9a1,1,0,0,0-2,0v3.59l-1.29-1.3a1,1,0,0,0-1.42,0,1,1,0,0,0,0,1.42ZM12,22A10,10,0,1,0,2,12,10,10,0,0,0,12,22ZM12,4a8,8,0,1,1-8,8A8,8,0,0,1,12,4Z"/></svg> -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", 4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import './index.css'; 4 | import App from './App'; 5 | import * as serviceWorker from './serviceWorker'; 6 | 7 | ReactDOM.render(<App />, document.getElementById('root')); 8 | 9 | // If you want your app to work offline and load faster, you can change 10 | // unregister() to register() below. Note this comes with some pitfalls. 11 | // Learn more about service workers: https://bit.ly/CRA-PWA 12 | serviceWorker.unregister(); 13 | -------------------------------------------------------------------------------- /src/serviceWorker.js: -------------------------------------------------------------------------------- 1 | // This optional code is used to register a service worker. 2 | // register() is not called by default. 3 | 4 | // This lets the app load faster on subsequent visits in production, and gives 5 | // it offline capabilities. However, it also means that developers (and users) 6 | // will only see deployed updates on subsequent visits to a page, after all the 7 | // existing tabs open on the page have been closed, since previously cached 8 | // resources are updated in the background. 9 | 10 | // To learn more about the benefits of this model and instructions on how to 11 | // opt-in, read https://bit.ly/CRA-PWA 12 | 13 | const isLocalhost = Boolean( 14 | window.location.hostname === 'localhost' || 15 | // [::1] is the IPv6 localhost address. 16 | window.location.hostname === '[::1]' || 17 | // 127.0.0.1/8 is considered localhost for IPv4. 18 | window.location.hostname.match( 19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ 20 | ) 21 | ); 22 | 23 | export function register(config) { 24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { 25 | // The URL constructor is available in all browsers that support SW. 26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); 27 | if (publicUrl.origin !== window.location.origin) { 28 | // Our service worker won't work if PUBLIC_URL is on a different origin 29 | // from what our page is served on. This might happen if a CDN is used to 30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 31 | return; 32 | } 33 | 34 | window.addEventListener('load', () => { 35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; 36 | 37 | if (isLocalhost) { 38 | // This is running on localhost. Let's check if a service worker still exists or not. 39 | checkValidServiceWorker(swUrl, config); 40 | 41 | // Add some additional logging to localhost, pointing developers to the 42 | // service worker/PWA documentation. 43 | navigator.serviceWorker.ready.then(() => { 44 | console.log( 45 | 'This web app is being served cache-first by a service ' + 46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA' 47 | ); 48 | }); 49 | } else { 50 | // Is not localhost. Just register service worker 51 | registerValidSW(swUrl, config); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | function registerValidSW(swUrl, config) { 58 | navigator.serviceWorker 59 | .register(swUrl) 60 | .then(registration => { 61 | registration.onupdatefound = () => { 62 | const installingWorker = registration.installing; 63 | if (installingWorker == null) { 64 | return; 65 | } 66 | installingWorker.onstatechange = () => { 67 | if (installingWorker.state === 'installed') { 68 | if (navigator.serviceWorker.controller) { 69 | // At this point, the updated precached content has been fetched, 70 | // but the previous service worker will still serve the older 71 | // content until all client tabs are closed. 72 | console.log( 73 | 'New content is available and will be used when all ' + 74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.' 75 | ); 76 | 77 | // Execute callback 78 | if (config && config.onUpdate) { 79 | config.onUpdate(registration); 80 | } 81 | } else { 82 | // At this point, everything has been precached. 83 | // It's the perfect time to display a 84 | // "Content is cached for offline use." message. 85 | console.log('Content is cached for offline use.'); 86 | 87 | // Execute callback 88 | if (config && config.onSuccess) { 89 | config.onSuccess(registration); 90 | } 91 | } 92 | } 93 | }; 94 | }; 95 | }) 96 | .catch(error => { 97 | console.error('Error during service worker registration:', error); 98 | }); 99 | } 100 | 101 | function checkValidServiceWorker(swUrl, config) { 102 | // Check if the service worker can be found. If it can't reload the page. 103 | fetch(swUrl) 104 | .then(response => { 105 | // Ensure service worker exists, and that we really are getting a JS file. 106 | const contentType = response.headers.get('content-type'); 107 | if ( 108 | response.status === 404 || 109 | (contentType != null && contentType.indexOf('javascript') === -1) 110 | ) { 111 | // No service worker found. Probably a different app. Reload the page. 112 | navigator.serviceWorker.ready.then(registration => { 113 | registration.unregister().then(() => { 114 | window.location.reload(); 115 | }); 116 | }); 117 | } else { 118 | // Service worker found. Proceed as normal. 119 | registerValidSW(swUrl, config); 120 | } 121 | }) 122 | .catch(() => { 123 | console.log( 124 | 'No internet connection found. App is running in offline mode.' 125 | ); 126 | }); 127 | } 128 | 129 | export function unregister() { 130 | if ('serviceWorker' in navigator) { 131 | navigator.serviceWorker.ready.then(registration => { 132 | registration.unregister(); 133 | }); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /static/handwritingrecognition/testImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/static/handwritingrecognition/testImage.png -------------------------------------------------------------------------------- /static/handwritingrecognition/user_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MikeM711/Deep-Learning-Handwriting-Recognition/b53d648686d2ff4a7434d2c9b0bf0139504e6b4a/static/handwritingrecognition/user_image.png --------------------------------------------------------------------------------